Index: content/browser/renderer_host/media/video_capture_controller.cc |
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc |
index 23ee7074a2d73a365000d5369b39d28e50b2adc8..10411fcc8468e18cb2df9cee9295708529503e9c 100644 |
--- a/content/browser/renderer_host/media/video_capture_controller.cc |
+++ b/content/browser/renderer_host/media/video_capture_controller.cc |
@@ -28,6 +28,7 @@ |
using media::VideoCaptureFormat; |
using media::VideoFrame; |
+using media::VideoFrameMetadata; |
namespace content { |
@@ -234,7 +235,8 @@ void VideoCaptureController::ReturnBuffer( |
VideoCaptureControllerID id, |
VideoCaptureControllerEventHandler* event_handler, |
int buffer_id, |
- uint32 sync_point) { |
+ uint32 sync_point, |
+ double consumer_stress_level) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
ControllerClient* client = FindClient(id, event_handler, controller_clients_); |
@@ -247,7 +249,24 @@ void VideoCaptureController::ReturnBuffer( |
NOTREACHED(); |
return; |
} |
+ |
+ // Set the STRESS_LEVEL to the maximum of those provided by each consumer. A |
+ // producer of the VideoFrame may check this value to make quality versus |
+ // performance trade-off decisions. |
scoped_refptr<VideoFrame> frame = iter->second; |
+ if (std::isfinite(consumer_stress_level) && consumer_stress_level >= 0.0) { |
+ double stress_level = -1.0; |
+ if (frame->metadata()->GetDouble(VideoFrameMetadata::STRESS_LEVEL, |
+ &stress_level)) { |
+ frame->metadata()->SetDouble(VideoFrameMetadata::STRESS_LEVEL, |
+ std::max(consumer_stress_level, |
+ stress_level)); |
+ } else { |
+ frame->metadata()->SetDouble(VideoFrameMetadata::STRESS_LEVEL, |
+ consumer_stress_level); |
+ } |
+ } |
+ |
client->active_buffers.erase(iter); |
buffer_pool_->RelinquishConsumerHold(buffer_id, 1); |