Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1736)

Unified Diff: content/renderer/media/media_stream_video_capturer_source.cc

Issue 195363002: VideoCapturerDelegate: Retrieve supported/in-use format(s) for constraint negotiation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tommi@s comments. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/media_stream_video_capturer_source.cc
diff --git a/content/renderer/media/media_stream_video_capturer_source.cc b/content/renderer/media/media_stream_video_capturer_source.cc
index 722844bdbdf806429d3903c34cbcf552a7296ac5..069703a2478175be7eb46a5be51d21e2213f4910 100644
--- a/content/renderer/media/media_stream_video_capturer_source.cc
+++ b/content/renderer/media/media_stream_video_capturer_source.cc
@@ -20,13 +20,13 @@ struct SourceVideoFormat {
// List of formats used if the source doesn't support capability enumeration.
const SourceVideoFormat kVideoFormats[] = {
- {1920, 1080, 30},
- {1280, 720, 30},
- {960, 720, 30},
- {640, 480, 30},
- {640, 360, 30},
- {320, 240, 30},
- {320, 180, 30}
+ {1920, 1080, 30},
perkj_chrome 2014/03/14 14:29:33 I think the previous indentation was correct excep
mcasas 2014/03/16 10:18:02 Reformatted according to clang-format chromium.
+ {1280, 720, 30},
+ {960, 720, 30},
+ {640, 480, 30},
+ {640, 360, 30},
+ {320, 240, 30},
+ {320, 180, 30}
};
perkj_chrome 2014/03/14 14:29:33 }; should probably be on the previous line.
mcasas 2014/03/16 10:18:02 See above.
} // namespace
@@ -74,18 +74,10 @@ void VideoCapturerDelegate::GetCurrentSupportedFormats(
return;
}
- // This delegate implementation doesn't support capability enumeration.
- // We need to guess what it supports.
- media::VideoCaptureFormats formats;
- for (size_t i = 0; i < arraysize(kVideoFormats); ++i) {
- formats.push_back(
- media::VideoCaptureFormat(
- gfx::Size(kVideoFormats[i].width,
- kVideoFormats[i].height),
- kVideoFormats[i].frame_rate,
- media::PIXEL_FORMAT_I420));
- }
- callback.Run(formats);
+ DCHECK(source_formats_callback_.is_null());
+ source_formats_callback_ = callback;
+ capture_engine_->GetDeviceFormatsInUse(base::Bind(
+ &VideoCapturerDelegate::OnDeviceFormatsInUseReceived, this));
}
void VideoCapturerDelegate::StartDeliver(
@@ -111,6 +103,7 @@ void VideoCapturerDelegate::StopDeliver() {
capture_engine_->StopCapture(this);
new_frame_callback_.Reset();
started_callback_.Reset();
+ source_formats_callback_.Reset();
}
void VideoCapturerDelegate::OnStarted(media::VideoCapture* capture) {
@@ -172,6 +165,45 @@ void VideoCapturerDelegate::OnErrorOnCaptureThread(
started_callback_.Run(false);
}
+void VideoCapturerDelegate::OnDeviceFormatsInUseReceived(
+ const media::VideoCaptureFormats& formats_in_use) {
+ DVLOG(3) << "OnDeviceFormatsInUseReceived: " << formats_in_use.size();
perkj_chrome 2014/03/14 14:29:33 if (source_formats_callback_.is_null()) return;
mcasas 2014/03/16 10:18:02 Done.
+ if (!formats_in_use.empty()) {
+ if (!source_formats_callback_.is_null()) {
+ source_formats_callback_.Run(formats_in_use);
+ source_formats_callback_.Reset();
+ }
+ } else {
+ DCHECK(!source_formats_callback_.is_null());
perkj_chrome 2014/03/14 14:29:33 remove this DCHECK
mcasas 2014/03/16 10:18:02 Done.
+ // If there are no formats in use, try to retrieve the whole list of them.
+ capture_engine_->GetDeviceSupportedFormats(base::Bind(
+ &VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated, this));
+ }
+}
+
+void VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated(
+ const media::VideoCaptureFormats& formats) {
+ DVLOG(3) << "OnDeviceSupportedFormatsEnumerated: " << formats.size()
+ << " received";
perkj_chrome 2014/03/14 14:29:33 use early exist if (source_formats_callback_.is_nu
mcasas 2014/03/16 10:18:02 Done.
+ if (formats.size()) {
+ if (!source_formats_callback_.is_null())
+ source_formats_callback_.Run(formats);
+ } else {
+ // The capture device doesn't seem to support capability enumeration,
+ // compose a fallback list of capabilities.
+ media::VideoCaptureFormats default_formats;
+ for (size_t i = 0; i < arraysize(kVideoFormats); ++i) {
+ default_formats.push_back(media::VideoCaptureFormat(
+ gfx::Size(kVideoFormats[i].width, kVideoFormats[i].height),
+ kVideoFormats[i].frame_rate,
+ media::PIXEL_FORMAT_I420));
+ }
+ if (!source_formats_callback_.is_null())
+ source_formats_callback_.Run(default_formats);
+ }
+ source_formats_callback_.Reset();
+}
+
MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
const StreamDeviceInfo& device_info,
const SourceStoppedCallback& stop_callback,
« no previous file with comments | « content/renderer/media/media_stream_video_capturer_source.h ('k') | content/renderer/media/media_stream_video_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698