Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/video/capture/win/video_capture_device_mf_win.h" | 5 #include "media/video/capture/win/video_capture_device_mf_win.h" |
| 6 | 6 |
| 7 #include <mfapi.h> | 7 #include <mfapi.h> |
| 8 #include <mferror.h> | 8 #include <mferror.h> |
| 9 | 9 |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 const size_t kVidPidSize = 4; | 27 const size_t kVidPidSize = 4; |
| 28 | 28 |
| 29 static bool GetFrameSize(IMFMediaType* type, gfx::Size* frame_size) { | 29 static bool GetFrameSize(IMFMediaType* type, gfx::Size* frame_size) { |
| 30 UINT32 width32, height32; | 30 UINT32 width32, height32; |
| 31 if (FAILED(MFGetAttributeSize(type, MF_MT_FRAME_SIZE, &width32, &height32))) | 31 if (FAILED(MFGetAttributeSize(type, MF_MT_FRAME_SIZE, &width32, &height32))) |
| 32 return false; | 32 return false; |
| 33 frame_size->SetSize(width32, height32); | 33 frame_size->SetSize(width32, height32); |
| 34 return true; | 34 return true; |
| 35 } | 35 } |
| 36 | 36 |
| 37 static bool GetFrameRate(IMFMediaType* type, | 37 static bool GetFrameRate(IMFMediaType* type, float* frame_rate) { |
|
mcasas
2014/09/10 16:52:28
const IMFMediaType* type ?
tommi (sloooow) - chröme
2014/09/10 17:41:09
COM doesn't have a concept of 'const' for objects
| |
| 38 int* frame_rate_numerator, | |
| 39 int* frame_rate_denominator) { | |
| 40 UINT32 numerator, denominator; | 38 UINT32 numerator, denominator; |
| 41 if (FAILED(MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, | 39 if (FAILED(MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, |
| 42 &denominator))|| | 40 &denominator))|| |
| 43 !denominator) { | 41 !denominator) { |
| 44 return false; | 42 return false; |
| 45 } | 43 } |
| 46 *frame_rate_numerator = numerator; | 44 *frame_rate = static_cast<float>(numerator) / denominator; |
| 47 *frame_rate_denominator = denominator; | |
| 48 return true; | 45 return true; |
| 49 } | 46 } |
| 50 | 47 |
| 51 static bool FillCapabilitiesFromType(IMFMediaType* type, | 48 static bool FillCapabilitiesFromType(IMFMediaType* type, |
|
mcasas
2014/09/10 16:52:28
s/FillCapabilities/FillFormat/
const IMFMediaType
| |
| 52 VideoCaptureCapabilityWin* capability) { | 49 VideoCaptureFormat* format) { |
| 53 GUID type_guid; | 50 GUID type_guid; |
| 54 if (FAILED(type->GetGUID(MF_MT_SUBTYPE, &type_guid)) || | 51 if (FAILED(type->GetGUID(MF_MT_SUBTYPE, &type_guid)) || |
| 55 !GetFrameSize(type, &capability->supported_format.frame_size) || | 52 !GetFrameSize(type, &format->frame_size) || |
| 56 !GetFrameRate(type, | 53 !GetFrameRate(type, &format->frame_rate) || |
| 57 &capability->frame_rate_numerator, | |
| 58 &capability->frame_rate_denominator) || | |
| 59 !VideoCaptureDeviceMFWin::FormatFromGuid(type_guid, | 54 !VideoCaptureDeviceMFWin::FormatFromGuid(type_guid, |
| 60 &capability->supported_format.pixel_format)) { | 55 &format->pixel_format)) { |
| 61 return false; | 56 return false; |
| 62 } | 57 } |
| 63 capability->supported_format.frame_rate = | |
| 64 capability->frame_rate_numerator / capability->frame_rate_denominator; | |
| 65 | 58 |
| 66 return true; | 59 return true; |
| 67 } | 60 } |
| 68 | 61 |
| 69 HRESULT FillCapabilities(IMFSourceReader* source, | 62 HRESULT FillCapabilities(IMFSourceReader* source, |
| 70 CapabilityList* capabilities) { | 63 CapabilityList* capabilities) { |
| 71 DWORD stream_index = 0; | 64 DWORD stream_index = 0; |
| 72 ScopedComPtr<IMFMediaType> type; | 65 ScopedComPtr<IMFMediaType> type; |
| 73 HRESULT hr; | 66 HRESULT hr; |
| 74 for (hr = source->GetNativeMediaType(kFirstVideoStream, stream_index, | 67 while (SUCCEEDED(hr = source->GetNativeMediaType( |
| 75 type.Receive()); | 68 kFirstVideoStream, stream_index, type.Receive()))) { |
| 76 SUCCEEDED(hr); | 69 VideoCaptureFormat format; |
| 77 hr = source->GetNativeMediaType(kFirstVideoStream, stream_index, | 70 if (FillCapabilitiesFromType(type, &format)) |
| 78 type.Receive())) { | 71 capabilities->push_back(VideoCaptureCapabilityWin(stream_index, format)); |
| 79 VideoCaptureCapabilityWin capability(stream_index++); | |
| 80 if (FillCapabilitiesFromType(type, &capability)) | |
| 81 capabilities->Add(capability); | |
| 82 type.Release(); | 72 type.Release(); |
| 73 stream_index++; | |
|
tommi (sloooow) - chröme
2014/09/09 20:11:11
++stream_index;
magjed_chromium
2014/09/10 18:34:21
Done.
| |
| 83 } | 74 } |
| 84 | 75 |
| 85 if (capabilities->empty() && (SUCCEEDED(hr) || hr == MF_E_NO_MORE_TYPES)) | 76 if (capabilities->empty() && (SUCCEEDED(hr) || hr == MF_E_NO_MORE_TYPES)) |
| 86 hr = HRESULT_FROM_WIN32(ERROR_EMPTY); | 77 hr = HRESULT_FROM_WIN32(ERROR_EMPTY); |
| 87 | 78 |
| 88 return (hr == MF_E_NO_MORE_TYPES) ? S_OK : hr; | 79 return (hr == MF_E_NO_MORE_TYPES) ? S_OK : hr; |
| 89 } | 80 } |
| 90 | 81 |
| 91 | 82 |
| 92 class MFReaderCallback FINAL | 83 class MFReaderCallback FINAL |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 244 base::AutoLock lock(lock_); | 235 base::AutoLock lock(lock_); |
| 245 | 236 |
| 246 client_ = client.Pass(); | 237 client_ = client.Pass(); |
| 247 DCHECK_EQ(capture_, false); | 238 DCHECK_EQ(capture_, false); |
| 248 | 239 |
| 249 CapabilityList capabilities; | 240 CapabilityList capabilities; |
| 250 HRESULT hr = S_OK; | 241 HRESULT hr = S_OK; |
| 251 if (reader_) { | 242 if (reader_) { |
| 252 hr = FillCapabilities(reader_, &capabilities); | 243 hr = FillCapabilities(reader_, &capabilities); |
| 253 if (SUCCEEDED(hr)) { | 244 if (SUCCEEDED(hr)) { |
| 254 VideoCaptureCapabilityWin found_capability = | 245 const VideoCaptureCapabilityWin& found_capability = |
| 255 capabilities.GetBestMatchedFormat( | 246 *GetBestMatchedFormat(params.requested_format, capabilities); |
| 256 params.requested_format.frame_size.width(), | |
| 257 params.requested_format.frame_size.height(), | |
| 258 params.requested_format.frame_rate); | |
| 259 | |
| 260 ScopedComPtr<IMFMediaType> type; | 247 ScopedComPtr<IMFMediaType> type; |
| 261 hr = reader_->GetNativeMediaType( | 248 hr = reader_->GetNativeMediaType( |
| 262 kFirstVideoStream, found_capability.stream_index, type.Receive()); | 249 kFirstVideoStream, found_capability.first, type.Receive()); |
| 263 if (SUCCEEDED(hr)) { | 250 if (SUCCEEDED(hr)) { |
| 264 hr = reader_->SetCurrentMediaType(kFirstVideoStream, NULL, type); | 251 hr = reader_->SetCurrentMediaType(kFirstVideoStream, NULL, type); |
| 265 if (SUCCEEDED(hr)) { | 252 if (SUCCEEDED(hr)) { |
| 266 hr = reader_->ReadSample(kFirstVideoStream, 0, NULL, NULL, NULL, | 253 hr = reader_->ReadSample(kFirstVideoStream, 0, NULL, NULL, NULL, |
| 267 NULL); | 254 NULL); |
| 268 if (SUCCEEDED(hr)) { | 255 if (SUCCEEDED(hr)) { |
| 269 capture_format_ = found_capability.supported_format; | 256 capture_format_ = found_capability.second; |
| 270 capture_ = true; | 257 capture_ = true; |
| 271 return; | 258 return; |
| 272 } | 259 } |
| 273 } | 260 } |
| 274 } | 261 } |
| 275 } | 262 } |
| 276 } | 263 } |
| 277 | 264 |
| 278 OnError(hr); | 265 OnError(hr); |
| 279 } | 266 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 | 320 |
| 334 void VideoCaptureDeviceMFWin::OnError(HRESULT hr) { | 321 void VideoCaptureDeviceMFWin::OnError(HRESULT hr) { |
| 335 if (client_.get()) { | 322 if (client_.get()) { |
| 336 client_->OnError( | 323 client_->OnError( |
| 337 base::StringPrintf("VideoCaptureDeviceMFWin: %s", | 324 base::StringPrintf("VideoCaptureDeviceMFWin: %s", |
| 338 logging::SystemErrorCodeToString(hr).c_str())); | 325 logging::SystemErrorCodeToString(hr).c_str())); |
| 339 } | 326 } |
| 340 } | 327 } |
| 341 | 328 |
| 342 } // namespace media | 329 } // namespace media |
| OLD | NEW |