summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authormcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-11 04:52:39 +0000
committermcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-11 04:52:39 +0000
commit919d5faa0a15c656e2850935b27e84d11bafb359 (patch)
tree446a29ceb838af5c33a068d7eea82222de8b589d /media
parent593a5696885909c5df5c43e2db89a11eb4ecad7b (diff)
downloadchromium_src-919d5faa0a15c656e2850935b27e84d11bafb359.zip
chromium_src-919d5faa0a15c656e2850935b27e84d11bafb359.tar.gz
chromium_src-919d5faa0a15c656e2850935b27e84d11bafb359.tar.bz2
Win Video Capture: Add support for HDYC pixel format.
This pixel format is a synonym of YUYV and is needed for at least the DeckLink video capture card. This format is not specified in Windows headers probably because this is just a synonym of other pixel formats, IOW they are all the same except for the first word, which is the name read in hex backwards: 30323449 --> 0x30 0x32 0x34 0x49 -> 024I 43594448 --> 0x43 0x59 0x44 0x48 -> CYDH and then all the YUV (422 and 420 alike) use the same trailing sequence ... 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}} HDYC: http://www.fourcc.org/yuv.php#HDYC BUG=380939 Review URL: https://codereview.chromium.org/317073010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276260 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/video/capture/win/sink_filter_win.cc12
-rw-r--r--media/video/capture/win/sink_filter_win.h8
-rw-r--r--media/video/capture/win/video_capture_device_factory_win.cc17
-rw-r--r--media/video/capture/win/video_capture_device_win.cc1
4 files changed, 29 insertions, 9 deletions
diff --git a/media/video/capture/win/sink_filter_win.cc b/media/video/capture/win/sink_filter_win.cc
index e3bb0a5..602a22d4 100644
--- a/media/video/capture/win/sink_filter_win.cc
+++ b/media/video/capture/win/sink_filter_win.cc
@@ -7,15 +7,21 @@
#include "base/logging.h"
#include "media/video/capture/win/sink_input_pin_win.h"
+namespace media {
+
// Define GUID for I420. This is the color format we would like to support but
// it is not defined in the DirectShow SDK.
// http://msdn.microsoft.com/en-us/library/dd757532.aspx
// 30323449-0000-0010-8000-00AA00389B71.
GUID kMediaSubTypeI420 = {
- 0x30323449, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}
+ 0x30323449, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}
+};
+// UYVY synonym with BT709 color components, used in HD video. This variation
+// might appear in non-USB capture cards and it's implemented as a normal YUV
+// pixel format with the characters HDYC encoded in the first array word.
+GUID kMediaSubTypeHDYC = {
+ 0x43594448, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
};
-
-namespace media {
SinkFilterObserver::~SinkFilterObserver() {}
diff --git a/media/video/capture/win/sink_filter_win.h b/media/video/capture/win/sink_filter_win.h
index e454f0b..0fa07b4 100644
--- a/media/video/capture/win/sink_filter_win.h
+++ b/media/video/capture/win/sink_filter_win.h
@@ -16,13 +16,17 @@
#include "media/video/capture/win/filter_base_win.h"
#include "media/video/capture/win/sink_filter_observer_win.h"
+namespace media {
+
// Define GUID for I420. This is the color format we would like to support but
// it is not defined in the DirectShow SDK.
// http://msdn.microsoft.com/en-us/library/dd757532.aspx
// 30323449-0000-0010-8000-00AA00389B71.
extern GUID kMediaSubTypeI420;
-
-namespace media {
+// UYVY synonym with BT709 color components, used in HD video. This variation
+// might appear in non-USB capture cards and it's implemented as a normal YUV
+// pixel format with the characters HDYC encoded in the first array word.
+extern GUID kMediaSubTypeHDYC;
class SinkInputPin;
diff --git a/media/video/capture/win/video_capture_device_factory_win.cc b/media/video/capture/win/video_capture_device_factory_win.cc
index 920126d..4feaea9 100644
--- a/media/video/capture/win/video_capture_device_factory_win.cc
+++ b/media/video/capture/win/video_capture_device_factory_win.cc
@@ -219,13 +219,22 @@ static void GetDeviceSupportedFormatsDirectShow(
continue;
}
+ std::string id;
device_id.Reset();
hr = prop_bag->Read(L"DevicePath", device_id.Receive(), 0);
- if (FAILED(hr)) {
- DVLOG(1) << "Couldn't read a device's DevicePath.";
- return;
+ if (FAILED(hr) || device_id.type() != VT_BSTR) {
+ // If there is no clear DevicePath, try with Description and FriendlyName.
+ ScopedVariant name;
+ if (SUCCEEDED(prop_bag->Read(L"Description", name.Receive(), 0)) ||
+ SUCCEEDED(prop_bag->Read(L"FriendlyName", name.Receive(), 0))) {
+ id = base::SysWideToUTF8(V_BSTR(&name));
+ }
+ } else {
+ DCHECK_EQ(device_id.type(), VT_BSTR);
+ id = base::SysWideToUTF8(V_BSTR(&device_id));
}
- if (device.id() == base::SysWideToUTF8(V_BSTR(&device_id)))
+
+ if (device.id() == id)
break;
moniker.Release();
}
diff --git a/media/video/capture/win/video_capture_device_win.cc b/media/video/capture/win/video_capture_device_win.cc
index b533de9..7dafb7d 100644
--- a/media/video/capture/win/video_capture_device_win.cc
+++ b/media/video/capture/win/video_capture_device_win.cc
@@ -142,6 +142,7 @@ VideoPixelFormat VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat(
{ MEDIASUBTYPE_MJPG, PIXEL_FORMAT_MJPEG },
{ MEDIASUBTYPE_UYVY, PIXEL_FORMAT_UYVY },
{ MEDIASUBTYPE_ARGB32, PIXEL_FORMAT_ARGB },
+ { kMediaSubTypeHDYC, PIXEL_FORMAT_UYVY },
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(pixel_formats); ++i) {
if (sub_type == pixel_formats[i].sub_type)