Chromium Code Reviews| Index: media/filters/gpu_video_decoder.cc |
| diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc |
| index b74ba5ba82e5c8a2563b6b7f84459d7402b24c55..ff713c801ea37771d5f87a508ed73fd8ac9751d5 100644 |
| --- a/media/filters/gpu_video_decoder.cc |
| +++ b/media/filters/gpu_video_decoder.cc |
| @@ -432,15 +432,20 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) { |
| GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, |
| &natural_size); |
| DCHECK(decoder_texture_target_); |
| + |
| + gpu::Mailbox mailbox = factories_->ProduceTextureToMailbox(pb.texture_id()); |
|
piman
2013/04/11 22:57:58
The first time you produce (or when you consume),
danakj
2013/04/12 00:01:39
Oh okay. I had in my head that Gen and Produce are
|
| + |
| scoped_refptr<VideoFrame> frame( |
| VideoFrame::WrapNativeTexture( |
| - pb.texture_id(), decoder_texture_target_, pb.size(), visible_rect, |
| + mailbox, decoder_texture_target_, |
| + pb.size(), visible_rect, |
| natural_size, timestamp, |
| base::Bind(&Factories::ReadPixels, factories_, pb.texture_id(), |
| decoder_texture_target_, |
| gfx::Size(visible_rect.width(), visible_rect.height())), |
| base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, |
| - picture.picture_buffer_id()))); |
| + picture.picture_buffer_id(), |
| + mailbox))); |
| CHECK_GT(available_pictures_, 0); |
| available_pictures_--; |
| @@ -468,10 +473,14 @@ void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
| ready_video_frames_.pop_front(); |
| } |
| -void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) { |
| +void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id, |
| + gpu::Mailbox mailbox) { |
| if (!gvd_loop_proxy_->BelongsToCurrentThread()) { |
| gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
| - &GpuVideoDecoder::ReusePictureBuffer, this, picture_buffer_id)); |
| + &GpuVideoDecoder::ReusePictureBuffer, |
| + this, |
| + picture_buffer_id, |
| + mailbox)); |
| return; |
| } |
| CHECK_GE(available_pictures_, 0); |
| @@ -479,6 +488,17 @@ void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) { |
| if (!vda_.get()) |
| return; |
| + |
| + std::map<int32, PictureBuffer>::iterator it = |
| + picture_buffers_in_decoder_.find(picture_buffer_id); |
| + if (it == picture_buffers_in_decoder_.end()) { |
| + NOTREACHED() << "Missing picture buffer: " << picture_buffer_id; |
| + NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); |
| + return; |
| + } |
| + const PictureBuffer& pb = it->second; |
| + factories_->ConsumeMailboxToTexture(mailbox, pb.texture_id()); |
| + |
| vda_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
| &VideoDecodeAccelerator::ReusePictureBuffer, weak_vda_, |
| picture_buffer_id)); |