summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormcasas <mcasas@chromium.org>2015-09-09 02:00:03 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-09 09:01:25 +0000
commit6015405a94b144471eb0128779ad3c107192f445 (patch)
tree5927584bc1954429fee5f4da7d0604d6ab571b19
parentb51c75c2fce420e9540a5d2fb72e6a006e74e7ff (diff)
downloadchromium_src-6015405a94b144471eb0128779ad3c107192f445.zip
chromium_src-6015405a94b144471eb0128779ad3c107192f445.tar.gz
chromium_src-6015405a94b144471eb0128779ad3c107192f445.tar.bz2
Win Video Capture: add UYVY pixel format to Cr sink filter pin capabilities
This format is already supported in the rest of the capture path. Bluefish 444 is the capture card using it. BUG=508413 TEST=Capture using a Bluefish 444 capture card Review URL: https://codereview.chromium.org/1325303004 Cr-Commit-Position: refs/heads/master@{#347861}
-rw-r--r--media/capture/video/win/sink_filter_win.cc4
-rw-r--r--media/capture/video/win/sink_filter_win.h2
-rw-r--r--media/capture/video/win/sink_input_pin_win.cc38
-rw-r--r--media/capture/video/win/sink_input_pin_win.h4
4 files changed, 33 insertions, 15 deletions
diff --git a/media/capture/video/win/sink_filter_win.cc b/media/capture/video/win/sink_filter_win.cc
index 8e3f910..90c4ae0 100644
--- a/media/capture/video/win/sink_filter_win.cc
+++ b/media/capture/video/win/sink_filter_win.cc
@@ -39,8 +39,8 @@ void SinkFilter::SetRequestedMediaFormat(VideoPixelFormat pixel_format,
input_pin_->SetRequestedMediaFormat(pixel_format, frame_rate, info_header);
}
-const VideoCaptureFormat& SinkFilter::ResultingFormat() {
- return input_pin_->ResultingFormat();
+const VideoCaptureFormat& SinkFilter::ResultingFormat() const {
+ return input_pin_->resulting_format();
}
size_t SinkFilter::NoOfPins() {
diff --git a/media/capture/video/win/sink_filter_win.h b/media/capture/video/win/sink_filter_win.h
index f718f01..ec8d6b4 100644
--- a/media/capture/video/win/sink_filter_win.h
+++ b/media/capture/video/win/sink_filter_win.h
@@ -41,7 +41,7 @@ class __declspec(uuid("88cdbbdc-a73b-4afa-acbf-15d5e2ce12c3")) SinkFilter
const BITMAPINFOHEADER& info_header);
// Returns the format that is negotiated when this
// filter is connected to a media filter.
- const VideoCaptureFormat& ResultingFormat();
+ const VideoCaptureFormat& ResultingFormat() const;
// Implement FilterBase.
size_t NoOfPins() override;
diff --git a/media/capture/video/win/sink_input_pin_win.cc b/media/capture/video/win/sink_input_pin_win.cc
index 9c515a3..cbfaa82 100644
--- a/media/capture/video/win/sink_input_pin_win.cc
+++ b/media/capture/video/win/sink_input_pin_win.cc
@@ -36,21 +36,17 @@ void SinkInputPin::SetRequestedMediaFormat(
resulting_format_.pixel_format = PIXEL_FORMAT_UNKNOWN;
}
-const VideoCaptureFormat& SinkInputPin::ResultingFormat() {
- return resulting_format_;
-}
-
bool SinkInputPin::IsMediaTypeValid(const AM_MEDIA_TYPE* media_type) {
- GUID type = media_type->majortype;
+ const GUID type = media_type->majortype;
if (type != MEDIATYPE_Video)
return false;
- GUID format_type = media_type->formattype;
+ const GUID format_type = media_type->formattype;
if (format_type != FORMAT_VideoInfo)
return false;
// Check for the sub types we support.
- GUID sub_type = media_type->subtype;
+ const GUID sub_type = media_type->subtype;
VIDEOINFOHEADER* pvi =
reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
if (pvi == NULL)
@@ -75,6 +71,12 @@ bool SinkInputPin::IsMediaTypeValid(const AM_MEDIA_TYPE* media_type) {
resulting_format_.pixel_format = PIXEL_FORMAT_YUY2;
return true;
}
+ // This format is added after http:/crbug.com/508413.
+ if (sub_type == MEDIASUBTYPE_UYVY &&
+ pvi->bmiHeader.biCompression == MAKEFOURCC('U', 'Y', 'V', 'Y')) {
+ resulting_format_.pixel_format = PIXEL_FORMAT_UYVY;
+ return true;
+ }
if (sub_type == MEDIASUBTYPE_MJPG &&
pvi->bmiHeader.biCompression == MAKEFOURCC('M', 'J', 'P', 'G')) {
resulting_format_.pixel_format = PIXEL_FORMAT_MJPEG;
@@ -90,6 +92,12 @@ bool SinkInputPin::IsMediaTypeValid(const AM_MEDIA_TYPE* media_type) {
resulting_format_.pixel_format = PIXEL_FORMAT_RGB32;
return true;
}
+
+#ifndef NDEBUG
+ WCHAR guid_str[128];
+ StringFromGUID2(sub_type, guid_str, arraysize(guid_str));
+ DVLOG(2) << __FUNCTION__ << " unsupported media type: " << guid_str;
+#endif
return false;
}
@@ -97,7 +105,7 @@ bool SinkInputPin::GetValidMediaType(int index, AM_MEDIA_TYPE* media_type) {
if (media_type->cbFormat < sizeof(VIDEOINFOHEADER))
return false;
- VIDEOINFOHEADER* pvi =
+ VIDEOINFOHEADER* const pvi =
reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));
@@ -105,9 +113,8 @@ bool SinkInputPin::GetValidMediaType(int index, AM_MEDIA_TYPE* media_type) {
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biClrImportant = 0;
pvi->bmiHeader.biClrUsed = 0;
- if (requested_frame_rate_ > 0) {
+ if (requested_frame_rate_ > 0)
pvi->AvgTimePerFrame = kSecondsToReferenceTime / requested_frame_rate_;
- }
media_type->majortype = MEDIATYPE_Video;
media_type->formattype = FORMAT_VideoInfo;
@@ -144,6 +151,15 @@ bool SinkInputPin::GetValidMediaType(int index, AM_MEDIA_TYPE* media_type) {
break;
}
case 2: {
+ pvi->bmiHeader.biCompression = MAKEFOURCC('U', 'Y', 'V', 'Y');
+ pvi->bmiHeader.biBitCount = 16;
+ pvi->bmiHeader.biWidth = requested_info_header_.biWidth;
+ pvi->bmiHeader.biHeight = requested_info_header_.biHeight;
+ pvi->bmiHeader.biSizeImage = GetArea(requested_info_header_) * 2;
+ media_type->subtype = MEDIASUBTYPE_UYVY;
+ break;
+ }
+ case 3: {
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biWidth = requested_info_header_.biWidth;
@@ -152,7 +168,7 @@ bool SinkInputPin::GetValidMediaType(int index, AM_MEDIA_TYPE* media_type) {
media_type->subtype = MEDIASUBTYPE_RGB24;
break;
}
- case 3: {
+ case 4: {
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 32;
pvi->bmiHeader.biWidth = requested_info_header_.biWidth;
diff --git a/media/capture/video/win/sink_input_pin_win.h b/media/capture/video/win/sink_input_pin_win.h
index 3a2bf7b..2d62783 100644
--- a/media/capture/video/win/sink_input_pin_win.h
+++ b/media/capture/video/win/sink_input_pin_win.h
@@ -28,7 +28,9 @@ class SinkInputPin : public PinBase {
const BITMAPINFOHEADER& info_header);
// Returns the capability that is negotiated when this
// pin is connected to a media filter.
- const VideoCaptureFormat& ResultingFormat();
+ const VideoCaptureFormat& resulting_format() const {
+ return resulting_format_;
+ }
// Implement PinBase.
bool IsMediaTypeValid(const AM_MEDIA_TYPE* media_type) override;