Index: media/renderers/video_renderer_impl.cc |
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
index a447efbd15e62d91f43bd9c18a7a6dee9b005a22..e216f2a8f0816fbfe3e235662be454ce9345b4cd 100644 |
--- a/media/renderers/video_renderer_impl.cc |
+++ b/media/renderers/video_renderer_impl.cc |
@@ -60,6 +60,8 @@ VideoRendererImpl::VideoRendererImpl( |
render_first_frame_and_stop_(false), |
posted_maybe_stop_after_first_paint_(false), |
last_video_memory_usage_(0), |
+ have_renderered_frames_(false), |
+ last_frame_opaque_(false), |
weak_factory_(this) { |
if (gpu_factories && |
gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { |
@@ -141,6 +143,7 @@ void VideoRendererImpl::Initialize( |
DCHECK(!posted_maybe_stop_after_first_paint_); |
DCHECK(!was_background_rendering_); |
DCHECK(!time_progressing_); |
+ DCHECK(!have_renderered_frames_); |
low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE); |
UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_); |
@@ -179,6 +182,24 @@ scoped_refptr<VideoFrame> VideoRendererImpl::Render( |
// we've had a proper startup sequence. |
DCHECK(result); |
+ // Notify client of size and opacity changes if this is the first frame |
+ // or if those have changed from the last frame. |
+ if (!have_renderered_frames_ || |
+ (last_frame_natural_size_ != result->natural_size())) { |
+ last_frame_natural_size_ = result->natural_size(); |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&VideoRendererImpl::OnVideoNaturalSizeChange, |
+ weak_factory_.GetWeakPtr(), last_frame_natural_size_)); |
+ } |
+ if (!have_renderered_frames_ || |
+ (last_frame_opaque_ != IsOpaque(result->format()))) { |
+ last_frame_opaque_ = IsOpaque(result->format()); |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&VideoRendererImpl::OnVideoOpacityChange, |
+ weak_factory_.GetWeakPtr(), last_frame_opaque_)); |
+ } |
+ |
// Declare HAVE_NOTHING if we reach a state where we can't progress playback |
// any further. We don't want to do this if we've already done so, reached |
// end of stream, or have frames available. We also don't want to do this in |
@@ -237,6 +258,7 @@ scoped_refptr<VideoFrame> VideoRendererImpl::Render( |
task_runner_->PostTask(FROM_HERE, base::Bind(&VideoRendererImpl::AttemptRead, |
weak_factory_.GetWeakPtr())); |
+ have_renderered_frames_ = true; |
return result; |
} |
@@ -294,6 +316,16 @@ void VideoRendererImpl::OnWaitingForDecryptionKey() { |
client_->OnWaitingForDecryptionKey(); |
} |
+void VideoRendererImpl::OnVideoNaturalSizeChange(const gfx::Size& size) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnVideoNaturalSizeChange(size); |
+} |
+ |
+void VideoRendererImpl::OnVideoOpacityChange(bool opaque) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnVideoOpacityChange(opaque); |
+} |
+ |
void VideoRendererImpl::SetTickClockForTesting( |
std::unique_ptr<base::TickClock> tick_clock) { |
tick_clock_.swap(tick_clock); |