diff options
author | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-10 17:30:18 +0000 |
---|---|---|
committer | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-10 17:30:18 +0000 |
commit | c51265bb1a4007d857d621b38787cf42b001a1e8 (patch) | |
tree | dbb149263dfe19776ab3238d264d9b5541273f59 /media | |
parent | dfddd026cde67c855e2042ceed96a0e3cc050df5 (diff) | |
download | chromium_src-c51265bb1a4007d857d621b38787cf42b001a1e8.zip chromium_src-c51265bb1a4007d857d621b38787cf42b001a1e8.tar.gz chromium_src-c51265bb1a4007d857d621b38787cf42b001a1e8.tar.bz2 |
Video capture device MF Windows frame rate setting.
-VideoCaptureCapabilityWin added two fields, frame_rate_numerator and frame_rate_denominator. These are supposed to be used internally to Windows, while keeping VideoCaptureCapability::frame_rate integer counterpart also updated.
- video_capture_device_mf_win.cc uses these two in FillCapabilitiesFromType(), GetFrameRate();
- video_capture_device_win.cc updates them in CreateCapabilityMap().
- CapabilityList::GetBestMatchedCapability() uses the numerator denominator frame_rate for calculating the best matched frame_rate.
Second try to fix this bug, first go was https://codereview.chromium.org/15792020/
BUG=246928
Review URL: https://chromiumcodereview.appspot.com/18991006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210877 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
4 files changed, 36 insertions, 10 deletions
diff --git a/media/video/capture/win/capability_list_win.cc b/media/video/capture/win/capability_list_win.cc index 63bd69b..18325bb 100644 --- a/media/video/capture/win/capability_list_win.cc +++ b/media/video/capture/win/capability_list_win.cc @@ -67,7 +67,11 @@ const VideoCaptureCapabilityWin& CapabilityList::GetBestMatchedCapability( diff.capability = &(*it); diff.diff_width = it->width - requested_width; diff.diff_height = it->height - requested_height; - diff.diff_frame_rate = it->frame_rate - requested_frame_rate; + // The 1000 allows using integer arithmetic for f.i. 29.971 fps. + diff.diff_frame_rate = + 1000 * ((static_cast<float>(it->frame_rate_numerator) / + it->frame_rate_denominator) - + requested_frame_rate); diff_list.push_back(diff); } diff --git a/media/video/capture/win/capability_list_win.h b/media/video/capture/win/capability_list_win.h index 6f96942..c07b220 100644 --- a/media/video/capture/win/capability_list_win.h +++ b/media/video/capture/win/capability_list_win.h @@ -17,8 +17,15 @@ namespace media { struct VideoCaptureCapabilityWin : public VideoCaptureCapability { - explicit VideoCaptureCapabilityWin(int index) : stream_index(index) {} + explicit VideoCaptureCapabilityWin(int index) + : stream_index(index), + frame_rate_numerator(0), + frame_rate_denominator(1) {} int stream_index; + // Internally to Media Foundation Api type devices we use rational framerates + // so framerates can be properly represented, f.i. 29.971fps= 30000/1001. + int frame_rate_numerator; + int frame_rate_denominator; }; class CapabilityList : public base::NonThreadSafe { diff --git a/media/video/capture/win/video_capture_device_mf_win.cc b/media/video/capture/win/video_capture_device_mf_win.cc index b2f47bc..fbfaf6a 100644 --- a/media/video/capture/win/video_capture_device_mf_win.cc +++ b/media/video/capture/win/video_capture_device_mf_win.cc @@ -97,30 +97,37 @@ bool GetFrameSize(IMFMediaType* type, int* width, int* height) { return true; } -bool GetFrameRate(IMFMediaType* type, int* frame_rate) { +bool GetFrameRate(IMFMediaType* type, + int* frame_rate_numerator, + int* frame_rate_denominator) { UINT32 numerator, denominator; if (FAILED(MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, - &denominator))) { + &denominator))|| + !denominator) { return false; } - - *frame_rate = denominator ? numerator / denominator : 0; - + *frame_rate_numerator = numerator; + *frame_rate_denominator = denominator; return true; } bool FillCapabilitiesFromType(IMFMediaType* type, - VideoCaptureCapability* capability) { + VideoCaptureCapabilityWin* capability) { GUID type_guid; if (FAILED(type->GetGUID(MF_MT_SUBTYPE, &type_guid)) || !FormatFromGuid(type_guid, &capability->color) || !GetFrameSize(type, &capability->width, &capability->height) || - !GetFrameRate(type, &capability->frame_rate)) { + !GetFrameRate(type, + &capability->frame_rate_numerator, + &capability->frame_rate_denominator)) { return false; } + // Keep the integer version of the frame_rate for (potential) returns. + capability->frame_rate = + capability->frame_rate_numerator / capability->frame_rate_denominator; capability->expected_capture_delay = 0; // Currently not used. - capability->interlaced = false; // Currently not used. + capability->interlaced = false; // Currently not used. return true; } @@ -332,6 +339,10 @@ void VideoCaptureDeviceMFWin::Allocate( const VideoCaptureCapabilityWin& found_capability = capabilities.GetBestMatchedCapability(width, height, frame_rate); + DLOG(INFO) << "Chosen capture format= (" << found_capability.width << "x" + << found_capability.height << ")@(" + << found_capability.frame_rate_numerator << "/" + << found_capability.frame_rate_denominator << ")fps"; ScopedComPtr<IMFMediaType> type; if (FAILED(hr = reader_->GetNativeMediaType( diff --git a/media/video/capture/win/video_capture_device_win.cc b/media/video/capture/win/video_capture_device_win.cc index 32ac70c..e364aa2 100644 --- a/media/video/capture/win/video_capture_device_win.cc +++ b/media/video/capture/win/video_capture_device_win.cc @@ -576,6 +576,10 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap() { capability.frame_rate = (time_per_frame > 0) ? static_cast<int>(kSecondsToReferenceTime / time_per_frame) : 0; } + // DirectShow works at the moment only on integer frame_rate but the + // best capability matching class works on rational frame rates. + capability.frame_rate_numerator = capability.frame_rate; + capability.frame_rate_denominator = 1; // We can't switch MEDIATYPE :~(. if (media_type->subtype == kMediaSubTypeI420) { |