Browse Source

win-dshow: Allow use of YV12 video format

Previously, due to a bug in libdshowcapture, the NV12 format was
actually being used for YV12 erroneously, and no actual support for YV12
existed.  This fixes the bug with NV12 and adds support for YV12.
jp9000 11 years ago
parent
commit
67587fbced

+ 5 - 0
plugins/win-dshow/CMakeLists.txt

@@ -13,8 +13,11 @@ set(win-dshow_SOURCES
 
 set(libdshowcapture_SOURCES
 	libdshowcapture/source/capture-filter.cpp
+	libdshowcapture/source/output-filter.cpp
 	libdshowcapture/source/dshowcapture.cpp
+	libdshowcapture/source/dshowencode.cpp
 	libdshowcapture/source/device.cpp
+	libdshowcapture/source/encoder.cpp
 	libdshowcapture/source/dshow-base.cpp
 	libdshowcapture/source/dshow-demux.cpp
 	libdshowcapture/source/dshow-enum.cpp
@@ -27,7 +30,9 @@ set(libdshowcapture_HEADERS
 	libdshowcapture/dshowcapture.hpp
 	libdshowcapture/source/IVideoCaptureFilter.h
 	libdshowcapture/source/capture-filter.hpp
+	libdshowcapture/source/output-filter.hpp
 	libdshowcapture/source/device.hpp
+	libdshowcapture/source/encoder.hpp
 	libdshowcapture/source/dshow-base.hpp
 	libdshowcapture/source/dshow-demux.hpp
 	libdshowcapture/source/dshow-device-defs.hpp

+ 1 - 1
plugins/win-dshow/libdshowcapture

@@ -1 +1 @@
-Subproject commit 6b7e8e02c53d0755f55a0901637da709c213bdfe
+Subproject commit 020e36d882cb1e1049bde9417591c21ad573ae2c

+ 16 - 0
plugins/win-dshow/win-dshow.cpp

@@ -323,6 +323,7 @@ static inline video_format ConvertVideoFormat(VideoFormat format)
 	case VideoFormat::ARGB:  return VIDEO_FORMAT_BGRA;
 	case VideoFormat::XRGB:  return VIDEO_FORMAT_BGRX;
 	case VideoFormat::I420:  return VIDEO_FORMAT_I420;
+	case VideoFormat::YV12:  return VIDEO_FORMAT_I420;
 	case VideoFormat::NV12:  return VIDEO_FORMAT_NV12;
 	case VideoFormat::YVYU:  return VIDEO_FORMAT_YVYU;
 	case VideoFormat::YUY2:  return VIDEO_FORMAT_YUY2;
@@ -412,6 +413,20 @@ void DShowInput::OnVideoData(const VideoConfig &config,
 		frame.linesize[1] = cx / 2;
 		frame.linesize[2] = cx / 2;
 
+	} else if (videoConfig.format == VideoFormat::YV12) {
+		frame.data[0] = data;
+		frame.data[2] = frame.data[0] + (cx * cy);
+		frame.data[1] = frame.data[2] + (cx * cy / 4);
+		frame.linesize[0] = cx;
+		frame.linesize[1] = cx / 2;
+		frame.linesize[2] = cx / 2;
+
+	} else if (videoConfig.format == VideoFormat::NV12) {
+		frame.data[0] = data;
+		frame.data[1] = frame.data[0] + (cx * cy);
+		frame.linesize[0] = cx;
+		frame.linesize[1] = cx;
+
 	} else {
 		/* TODO: other formats */
 		return;
@@ -960,6 +975,7 @@ static const VideoFormatName videoFormatNames[] = {
 	/* planar YUV formats */
 	{VideoFormat::I420,  "I420"},
 	{VideoFormat::NV12,  "NV12"},
+	{VideoFormat::YV12,  "YV12"},
 
 	/* packed YUV formats */
 	{VideoFormat::YVYU,  "YVYU"},