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:
@@ -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
|
||||
|
Submodule plugins/win-dshow/libdshowcapture updated: 6b7e8e02c5...020e36d882
@@ -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"},
|
||||
|
Reference in New Issue
Block a user