summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authormcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-10 17:30:18 +0000
committermcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-10 17:30:18 +0000
commitc51265bb1a4007d857d621b38787cf42b001a1e8 (patch)
treedbb149263dfe19776ab3238d264d9b5541273f59 /media
parentdfddd026cde67c855e2042ceed96a0e3cc050df5 (diff)
downloadchromium_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')
-rw-r--r--media/video/capture/win/capability_list_win.cc6
-rw-r--r--media/video/capture/win/capability_list_win.h9
-rw-r--r--media/video/capture/win/video_capture_device_mf_win.cc27
-rw-r--r--media/video/capture/win/video_capture_device_win.cc4
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) {