Browse Source

fill in the texture_setimage function, fill in a few other functions, and change certain names to be a little more consistent

jp9000 12 years ago
parent
commit
a43e291577

+ 5 - 5
build/data/effects/default.effect

@@ -21,12 +21,12 @@ VertInOut VSDefault(VertInOut vert_in)
 	return vert_out;
 }
 
-float4 DrawRGB(VertInOut vert_in) : TARGET
+float4 PSDrawRGB(VertInOut vert_in) : TARGET
 {
 	return tex.Sample(def_sampler, vert_in.uv);
 }
 
-float4 DrawYUVToRGB(VertInOut vert_in) : TARGET
+float4 PSDrawYUVToRGB(VertInOut vert_in) : TARGET
 {
 	float4 yuv = tex.Sample(def_sampler, vert_in.uv);
 	return saturate(mul(float4(yuv.xyz, 1.0), yuv_matrix));
@@ -37,15 +37,15 @@ technique DrawRGB
 	pass
 	{
 		vertex_shader = VSDefault(vert_in);
-		pixel_shader  = DrawRGB(vert_in);
+		pixel_shader  = PSDrawRGB(vert_in);
 	}
 }
 
-technique ConvertYUV
+technique DrawYUVToRGB
 {
 	pass
 	{
 		vertex_shader = VSDefault(vert_in);
-		pixel_shader  = DrawYUVToRGB(vert_in);
+		pixel_shader  = PSDrawYUVToRGB(vert_in);
 	}
 }

+ 2 - 2
libobs-d3d11/d3d11-exports.h

@@ -133,7 +133,7 @@ EXPORT void     texture_destroy(texture_t tex);
 EXPORT uint32_t texture_getwidth(texture_t tex);
 EXPORT uint32_t texture_getheight(texture_t tex);
 EXPORT enum gs_color_format texture_getcolorformat(texture_t tex);
-EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *byte_width);
+EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *row_bytes);
 EXPORT void     texture_unmap(texture_t tex);
 
 EXPORT void     cubetexture_destroy(texture_t cubetex);
@@ -151,7 +151,7 @@ EXPORT uint32_t stagesurface_getwidth(stagesurf_t stagesurf);
 EXPORT uint32_t stagesurface_getheight(stagesurf_t stagesurf);
 EXPORT enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf);
 EXPORT bool     stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width);
+		uint32_t *row_bytes);
 EXPORT void     stagesurface_unmap(stagesurf_t stagesurf);
 
 EXPORT void zstencil_destroy(zstencil_t zstencil);

+ 4 - 4
libobs-d3d11/d3d11-subsystem.cpp

@@ -1438,7 +1438,7 @@ enum gs_color_format texture_getcolorformat(texture_t tex)
 	return static_cast<gs_texture_2d*>(tex)->format;
 }
 
-bool texture_map(texture_t tex, void **ptr, uint32_t *byte_width)
+bool texture_map(texture_t tex, void **ptr, uint32_t *row_bytes)
 {
 	HRESULT hr;
 
@@ -1454,7 +1454,7 @@ bool texture_map(texture_t tex, void **ptr, uint32_t *byte_width)
 		return false;
 
 	*ptr = map.pData;
-	*byte_width = map.RowPitch;
+	*row_bytes = map.RowPitch;
 	return true;
 }
 
@@ -1543,7 +1543,7 @@ enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf)
 }
 
 bool stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width)
+		uint32_t *row_bytes)
 {
 	D3D11_MAPPED_SUBRESOURCE map;
 	if (FAILED(stagesurf->device->context->Map(stagesurf->texture, 0,
@@ -1551,7 +1551,7 @@ bool stagesurface_map(stagesurf_t stagesurf, const void **data,
 		return false;
 
 	*data = map.pData;
-	*byte_width = map.RowPitch;
+	*row_bytes = map.RowPitch;
 	return true;
 }
 

+ 2 - 2
libobs-opengl/gl-exports.h

@@ -127,7 +127,7 @@ EXPORT void     texture_destroy(texture_t tex);
 EXPORT uint32_t texture_getwidth(texture_t tex);
 EXPORT uint32_t texture_getheight(texture_t tex);
 EXPORT enum gs_color_format texture_getcolorformat(texture_t tex);
-EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *byte_width);
+EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *row_bytes);
 EXPORT void     texture_unmap(texture_t tex);
 
 EXPORT void     cubetexture_destroy(texture_t cubetex);
@@ -145,7 +145,7 @@ EXPORT uint32_t stagesurface_getwidth(stagesurf_t stagesurf);
 EXPORT uint32_t stagesurface_getheight(stagesurf_t stagesurf);
 EXPORT enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf);
 EXPORT bool     stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width);
+		uint32_t *row_bytes);
 EXPORT void     stagesurface_unmap(stagesurf_t stagesurf);
 
 EXPORT void zstencil_destroy(zstencil_t zstencil);

+ 2 - 2
libobs-opengl/gl-stagesurf.c

@@ -179,7 +179,7 @@ enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf)
 }
 
 bool stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width)
+		uint32_t *row_bytes)
 {
 	if (!gl_bind_buffer(GL_PIXEL_PACK_BUFFER, stagesurf->pack_buffer))
 		goto fail;
@@ -190,7 +190,7 @@ bool stagesurface_map(stagesurf_t stagesurf, const void **data,
 
 	gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0);
 
-	*byte_width = stagesurf->bytes_per_pixel * stagesurf->width;
+	*row_bytes = stagesurf->bytes_per_pixel * stagesurf->width;
 	return true;
 
 fail:

+ 3 - 3
libobs-opengl/gl-texture2d.c

@@ -162,7 +162,7 @@ enum gs_color_format texture_getcolorformat(texture_t tex)
 	return tex->format;
 }
 
-bool texture_map(texture_t tex, void **ptr, uint32_t *byte_width)
+bool texture_map(texture_t tex, void **ptr, uint32_t *row_bytes)
 {
 	struct gs_texture_2d *tex2d = (struct gs_texture_2d*)tex;
 
@@ -183,8 +183,8 @@ bool texture_map(texture_t tex, void **ptr, uint32_t *byte_width)
 
 	gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, 0);
 
-	*byte_width = tex2d->width * gs_get_format_bpp(tex->format) / 8;
-	*byte_width = (*byte_width + 3) & 0xFFFFFFFC;
+	*row_bytes = tex2d->width * gs_get_format_bpp(tex->format) / 8;
+	*row_bytes = (*row_bytes + 3) & 0xFFFFFFFC;
 	return true;
 
 fail:

+ 0 - 6
libobs/graphics/effect.c

@@ -282,12 +282,6 @@ void effect_setint(effect_t effect, eparam_t param, int val)
 	effect_setval_inline(effect, param, &val, sizeof(int));
 }
 
-void effect_setmatrix3(effect_t effect, eparam_t param,
-		const struct matrix3 *val)
-{
-	effect_setval_inline(effect, param, val, sizeof(struct matrix3));
-}
-
 void effect_setmatrix4(effect_t effect, eparam_t param,
 		const struct matrix4 *val)
 {

+ 2 - 2
libobs/graphics/graphics-internal.h

@@ -138,7 +138,7 @@ struct gs_exports {
 	uint32_t (*texture_getheight)(texture_t tex);
 	enum gs_color_format (*texture_getcolorformat)(texture_t tex);
 	bool     (*texture_map)(texture_t tex, void **ptr,
-			uint32_t *byte_width);
+			uint32_t *row_bytes);
 	void     (*texture_unmap)(texture_t tex);
 
 	void     (*cubetexture_destroy)(texture_t cubetex);
@@ -157,7 +157,7 @@ struct gs_exports {
 	enum gs_color_format (*stagesurface_getcolorformat)(
 			stagesurf_t stagesurf);
 	bool     (*stagesurface_map)(stagesurf_t stagesurf, const void **data,
-			uint32_t *byte_width);
+			uint32_t *row_bytes);
 	void     (*stagesurface_unmap)(stagesurf_t stagesurf);
 
 	void (*zstencil_destroy)(zstencil_t zstencil);

+ 33 - 7
libobs/graphics/graphics.c

@@ -722,13 +722,39 @@ void gs_viewport_pop(void)
 	da_pop_back(thread_graphics->viewport_stack);
 }
 
-void texture_setimage(texture_t tex, const void *data, uint32_t byte_width)
+void texture_setimage(texture_t tex, const void *data, uint32_t row_bytes,
+		bool flip)
 {
-	/* TODO */
+	void *ptr;
+	uint32_t row_bytes_out;
+	uint32_t row_copy;
+	int32_t height = (int32_t)texture_getheight(tex);
+	int32_t y;
+
+	if (!texture_map(tex, &ptr, &row_bytes_out))
+		return;
+
+	row_copy = (row_bytes < row_bytes_out) ? row_bytes : row_bytes_out;
+
+	if (flip) {
+		for (y = height-1; y >= 0; y--)
+			memcpy((uint8_t*)ptr  + (uint32_t)y * row_bytes_out,
+			       (uint8_t*)data + (uint32_t)y * row_bytes,
+			       row_copy);
+
+	} else if (row_bytes == row_bytes_out) {
+		memcpy(ptr, data, row_copy * height);
+
+	} else {
+		for (y = 0; y < height; y++)
+			memcpy((uint8_t*)ptr  + (uint32_t)y * row_bytes_out,
+			       (uint8_t*)data + (uint32_t)y * row_bytes,
+			       row_copy);
+	}
 }
 
 void cubetexture_setimage(texture_t cubetex, uint32_t side, const void *data,
-		uint32_t byte_width)
+		uint32_t row_bytes, bool invert)
 {
 	/* TODO */
 }
@@ -1347,10 +1373,10 @@ enum gs_color_format texture_getcolorformat(texture_t tex)
 	return graphics->exports.texture_getcolorformat(tex);
 }
 
-bool texture_map(texture_t tex, void **ptr, uint32_t *byte_width)
+bool texture_map(texture_t tex, void **ptr, uint32_t *row_bytes)
 {
 	graphics_t graphics = thread_graphics;
-	return graphics->exports.texture_map(tex, ptr, byte_width);
+	return graphics->exports.texture_map(tex, ptr, row_bytes);
 }
 
 void texture_unmap(texture_t tex)
@@ -1432,10 +1458,10 @@ enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf)
 }
 
 bool stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width)
+		uint32_t *row_bytes)
 {
 	graphics_t graphics = thread_graphics;
-	return graphics->exports.stagesurface_map(stagesurf, data, byte_width);
+	return graphics->exports.stagesurface_map(stagesurf, data, row_bytes);
 }
 
 void stagesurface_unmap(stagesurf_t stagesurf)

+ 5 - 7
libobs/graphics/graphics.h

@@ -366,8 +366,6 @@ EXPORT eparam_t effect_getworldmatrix(effect_t effect);
 EXPORT void effect_setbool(effect_t effect, eparam_t param, bool val);
 EXPORT void effect_setfloat(effect_t effect, eparam_t param, float val);
 EXPORT void effect_setint(effect_t effect, eparam_t param, int val);
-EXPORT void effect_setmatrix3(effect_t effect, eparam_t param,
-		const struct matrix3 *val);
 EXPORT void effect_setmatrix4(effect_t effect, eparam_t param,
 		const struct matrix4 *val);
 EXPORT void effect_setvec2(effect_t effect, eparam_t param,
@@ -377,7 +375,7 @@ EXPORT void effect_setvec3(effect_t effect, eparam_t param,
 EXPORT void effect_setvec4(effect_t effect, eparam_t param,
 		const struct vec4 *val);
 EXPORT void effect_settexture(effect_t effect, eparam_t param, texture_t val);
-EXPORT void effect_setval(effect_t shader, eparam_t param, const void *val,
+EXPORT void effect_setval(effect_t effect, eparam_t param, const void *val,
 		size_t size);
 EXPORT void effect_setdefault(effect_t effect, eparam_t param);
 
@@ -498,9 +496,9 @@ EXPORT void gs_viewport_push(void);
 EXPORT void gs_viewport_pop(void);
 
 EXPORT void texture_setimage(texture_t tex, const void *data,
-		uint32_t byte_width);
+		uint32_t row_bytes, bool invert);
 EXPORT void cubetexture_setimage(texture_t cubetex, uint32_t side,
-		const void *data, uint32_t byte_width);
+		const void *data, uint32_t row_bytes, bool invert);
 
 EXPORT void gs_perspective(float fovy, float aspect, float znear, float zfar);
 
@@ -623,7 +621,7 @@ EXPORT void     texture_destroy(texture_t tex);
 EXPORT uint32_t texture_getwidth(texture_t tex);
 EXPORT uint32_t texture_getheight(texture_t tex);
 EXPORT enum gs_color_format texture_getcolorformat(texture_t tex);
-EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *byte_width);
+EXPORT bool     texture_map(texture_t tex, void **ptr, uint32_t *row_bytes);
 EXPORT void     texture_unmap(texture_t tex);
 
 EXPORT void     cubetexture_destroy(texture_t cubetex);
@@ -641,7 +639,7 @@ EXPORT uint32_t stagesurface_getwidth(stagesurf_t stagesurf);
 EXPORT uint32_t stagesurface_getheight(stagesurf_t stagesurf);
 EXPORT enum gs_color_format stagesurface_getcolorformat(stagesurf_t stagesurf);
 EXPORT bool     stagesurface_map(stagesurf_t stagesurf, const void **data,
-		uint32_t *byte_width);
+		uint32_t *row_bytes);
 EXPORT void     stagesurface_unmap(stagesurf_t stagesurf);
 
 EXPORT void     zstencil_destroy(zstencil_t zstencil);

+ 1 - 0
libobs/makefile

@@ -34,6 +34,7 @@ SRCFILES=util/bmem.c \
 	 media-io/video-io.c \
 	 media-io/audio-io.c \
 	 media-io/media-io.c \
+	 media-io/format-conversion.c \
 	 obs-module.c \
 	 obs-output.c \
 	 obs-source.c \

+ 15 - 6
libobs/media-io/video-io.h

@@ -34,18 +34,27 @@ typedef struct video_output *video_t;
 
 enum video_type {
 	VIDEO_FORMAT_UNKNOWN,
-	VIDEO_FORMAT_YUV444,
-	VIDEO_FORMAT_YUV422,
-	VIDEO_FORMAT_YUV420,
+
+	/* planar 420 format */
+	VIDEO_FORMAT_I420, /* planar 4:2:0 */
+	VIDEO_FORMAT_NV12, /* two-plane lum and packed chroma */
+
+	/* packed 422 formats */
+	VIDEO_FORMAT_YVYU,
+	VIDEO_FORMAT_YUY2, /* YUYV */
+	VIDEO_FORMAT_UYVY,
+
+	/* packed uncompressed formats */
+	VIDEO_FORMAT_UYVX, /* packed UYV */
 	VIDEO_FORMAT_RGBA,
 	VIDEO_FORMAT_BGRA,
 	VIDEO_FORMAT_BGRX,
 };
 
 struct video_frame {
-	const void *data;
-	uint32_t   row_size;
-	uint64_t   timestamp;
+	const void      *data;
+	uint32_t        row_size;  /* for RGB/BGR formats and UYVX */
+	uint64_t        timestamp;
 };
 
 struct video_info {

+ 1 - 0
libobs/obs-data.h

@@ -55,6 +55,7 @@ struct obs_data {
 	/* graphics */
 	graphics_t  graphics;
 	stagesurf_t copy_surfaces[NUM_TEXTURES];
+	effect_t    default_effect;
 	bool        textures_copied[NUM_TEXTURES];
 	bool        copy_mapped;
 	int         cur_texture;

+ 51 - 5
libobs/obs-source.c

@@ -179,12 +179,14 @@ void obs_source_destroy(obs_source_t source)
 		texture_destroy(source->output_texture);
 		gs_leavecontext();
 
-		da_free(source->filters);
 		if (source->data)
 			source->callbacks.destroy(source->data);
 
 		audio_line_destroy(source->audio_line);
 
+		da_free(source->video_frames);
+		da_free(source->audio_buffer);
+		da_free(source->filters);
 		pthread_mutex_destroy(&source->filter_mutex);
 		pthread_mutex_destroy(&source->audio_mutex);
 		pthread_mutex_destroy(&source->video_mutex);
@@ -278,6 +280,51 @@ static void obs_source_flush_audio_buffer(obs_source_t source)
 	pthread_mutex_unlock(&source->audio_mutex);
 }
 
+static bool set_texture_size(obs_source_t source, struct source_frame *frame)
+{
+	if (source->output_texture) {
+		uint32_t width  = texture_getwidth(source->output_texture);
+		uint32_t height = texture_getheight(source->output_texture);
+
+		if (width == frame->width && height == frame->height)
+			return true;
+	}
+
+	texture_destroy(source->output_texture);
+	source->output_texture = gs_create_texture(frame->width, frame->height,
+			GS_RGBA, 1, NULL, GS_DYNAMIC);
+
+	return source->output_texture != NULL;
+}
+
+static void obs_source_draw_texture(texture_t tex, struct source_frame *frame)
+{
+	effect_t    effect = obs->default_effect;
+	const char  *type = frame->yuv ? "DrawYUVToRGB" : "DrawRGB";
+	technique_t tech;
+	eparam_t param;
+
+	texture_setimage(tex, frame->data, frame->row_bytes, frame->flip);
+
+	tech = effect_gettechnique(effect, type);
+	technique_begin(tech);
+	technique_beginpass(tech, 0);
+
+	if (frame->yuv) {
+		param = effect_getparambyname(effect, "yuv_matrix");
+		effect_setval(effect, param, frame->yuv_matrix,
+				sizeof(float) * 16);
+	}
+
+	param = effect_getparambyname(effect, "diffuse");
+	effect_settexture(effect, param, tex);
+
+	gs_draw_sprite(tex);
+
+	technique_endpass(tech);
+	technique_end(tech);
+}
+
 static void obs_source_render_async_video(obs_source_t source)
 {
 	struct source_frame *frame = obs_source_getframe(source);
@@ -288,9 +335,8 @@ static void obs_source_render_async_video(obs_source_t source)
 	if (!source->timing_set && source->audio_buffer.num)
 		obs_source_flush_audio_buffer(source);
 
-	if (!source->output_texture) {
-		/* TODO */
-	}
+	if (set_texture_size(source, frame))
+		obs_source_draw_texture(source->output_texture, frame);
 
 	obs_source_releaseframe(source, frame);
 }
@@ -469,7 +515,7 @@ static inline struct filter_frame *filter_async_video(obs_source_t source,
 static struct filter_frame *process_video(obs_source_t source,
 		const struct source_video *frame)
 {
-	/* TODO: convert to YUV444 or RGB */
+	/* TODO: convert to UYV444 or RGB */
 	return NULL;
 }
 

+ 10 - 2
libobs/obs.c

@@ -25,6 +25,7 @@ static bool obs_init_graphics(const char *graphics_module,
 		struct gs_init_data *graphics_data, struct video_info *vi)
 {
 	int errorcode;
+	bool success = true;
 	size_t i;
 
 	errorcode = gs_create(&obs->graphics, graphics_module, graphics_data);
@@ -41,11 +42,18 @@ static bool obs_init_graphics(const char *graphics_module,
 		obs->copy_surfaces[i] = gs_create_stagesurface(vi->width,
 				vi->height, graphics_data->format);
 		if (!obs->copy_surfaces[i])
-			return false;
+			success = false;
+	}
+
+	if (success) {
+		obs->default_effect = gs_create_effect_from_file(
+				"build/data/default.effect", NULL);
+		if (!obs->default_effect)
+			success = false;
 	}
 
 	gs_leavecontext();
-	return true;
+	return success;
 }
 
 static bool obs_init_media(struct video_info *vi, struct audio_info *ai)

+ 3 - 0
libobs/obs.h

@@ -70,8 +70,10 @@ struct source_video {
 
 	enum video_type    type;
 	float              yuv_matrix[16];
+	bool               flip;
 };
 
+/* differs from source_video in that it's YUV444 or RGB only */
 struct source_frame {
 	void               *data;
 	uint32_t           width;
@@ -81,6 +83,7 @@ struct source_frame {
 
 	bool               yuv;
 	float              yuv_matrix[16];
+	bool               flip;
 };
 
 static inline void source_frame_destroy(struct source_frame *frame)

+ 2 - 0
vs/2010/libobs/libobs.vcxproj

@@ -37,6 +37,7 @@
     <ClInclude Include="..\..\..\libobs\graphics\vec3.h" />
     <ClInclude Include="..\..\..\libobs\graphics\vec4.h" />
     <ClInclude Include="..\..\..\libobs\media-io\audio-io.h" />
+    <ClInclude Include="..\..\..\libobs\media-io\format-conversion.h" />
     <ClInclude Include="..\..\..\libobs\media-io\media-io.h" />
     <ClInclude Include="..\..\..\libobs\media-io\video-io.h" />
     <ClInclude Include="..\..\..\libobs\obs-data.h" />
@@ -80,6 +81,7 @@
     <ClCompile Include="..\..\..\libobs\graphics\vec3.c" />
     <ClCompile Include="..\..\..\libobs\graphics\vec4.c" />
     <ClCompile Include="..\..\..\libobs\media-io\audio-io.c" />
+    <ClCompile Include="..\..\..\libobs\media-io\format-conversion.c" />
     <ClCompile Include="..\..\..\libobs\media-io\media-io.c" />
     <ClCompile Include="..\..\..\libobs\media-io\video-io.c" />
     <ClCompile Include="..\..\..\libobs\obs-display.c" />

+ 13 - 7
vs/2010/libobs/libobs.vcxproj.filters

@@ -25,10 +25,6 @@
       <UniqueIdentifier>{c90a618f-1096-41f5-9ce5-f2f78d978983}</UniqueIdentifier>
       <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
     </Filter>
-    <Filter Include="media-io\Soruce Files">
-      <UniqueIdentifier>{21a99cbb-e167-4baf-82ae-47d23dc12c7d}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
     <Filter Include="graphics\Header Files">
       <UniqueIdentifier>{b7228a18-6051-4cab-b53b-ff299eb969c0}</UniqueIdentifier>
       <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
@@ -49,6 +45,10 @@
       <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
       <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
     </Filter>
+    <Filter Include="media-io\Source Files">
+      <UniqueIdentifier>{21a99cbb-e167-4baf-82ae-47d23dc12c7d}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\libobs\obs-module.h">
@@ -177,6 +177,9 @@
     <ClInclude Include="..\..\..\libobs\graphics\effect-parser.h">
       <Filter>graphics\Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\libobs\media-io\format-conversion.h">
+      <Filter>media-io\Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\..\libobs\obs-output.c">
@@ -198,13 +201,13 @@
       <Filter>libobs\Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\..\..\libobs\media-io\video-io.c">
-      <Filter>media-io\Soruce Files</Filter>
+      <Filter>media-io\Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\..\..\libobs\media-io\audio-io.c">
-      <Filter>media-io\Soruce Files</Filter>
+      <Filter>media-io\Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\..\..\libobs\media-io\media-io.c">
-      <Filter>media-io\Soruce Files</Filter>
+      <Filter>media-io\Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\..\..\libobs\util\config-file.c">
       <Filter>util\Source Files</Filter>
@@ -290,5 +293,8 @@
     <ClCompile Include="..\..\..\libobs\graphics\texture-render.c">
       <Filter>graphics\Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\libobs\media-io\format-conversion.c">
+      <Filter>media-io\Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>