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.
This commit is contained in:
jp9000
2014-12-19 07:45:10 -08:00
parent 77f0f6802a
commit 67587fbced
3 changed files with 22 additions and 1 deletions

View File

@@ -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

View File

@@ -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"},