diff options
author | mcasas <mcasas@chromium.org> | 2015-09-09 02:00:03 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-09 09:01:25 +0000 |
commit | 6015405a94b144471eb0128779ad3c107192f445 (patch) | |
tree | 5927584bc1954429fee5f4da7d0604d6ab571b19 | |
parent | b51c75c2fce420e9540a5d2fb72e6a006e74e7ff (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | media/capture/video/win/sink_filter_win.h | 2 | ||||
-rw-r--r-- | media/capture/video/win/sink_input_pin_win.cc | 38 | ||||
-rw-r--r-- | media/capture/video/win/sink_input_pin_win.h | 4 |
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; |