| 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..e29319c2b71b38d90795dd287bf52fbd629b6c19 100644
|
| --- a/media/filters/gpu_video_decoder.cc
|
| +++ b/media/filters/gpu_video_decoder.cc
|
| @@ -368,9 +368,13 @@ void GpuVideoDecoder::ProvidePictureBuffers(uint32 count,
|
| }
|
|
|
| std::vector<uint32> texture_ids;
|
| + std::vector<gpu::Mailbox> texture_mailboxes;
|
| decoder_texture_target_ = texture_target;
|
| - if (!factories_->CreateTextures(
|
| - count, size, &texture_ids, decoder_texture_target_)) {
|
| + if (!factories_->CreateTextures(count,
|
| + size,
|
| + &texture_ids,
|
| + &texture_mailboxes,
|
| + decoder_texture_target_)) {
|
| NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE);
|
| return;
|
| }
|
| @@ -384,7 +388,7 @@ void GpuVideoDecoder::ProvidePictureBuffers(uint32 count,
|
| std::vector<PictureBuffer> picture_buffers;
|
| for (size_t i = 0; i < texture_ids.size(); ++i) {
|
| picture_buffers.push_back(PictureBuffer(
|
| - next_picture_buffer_id_++, size, texture_ids[i]));
|
| + next_picture_buffer_id_++, size, texture_ids[i], texture_mailboxes[i]));
|
| bool inserted = picture_buffers_in_decoder_.insert(std::make_pair(
|
| picture_buffers.back().id(), picture_buffers.back())).second;
|
| DCHECK(inserted);
|
| @@ -432,15 +436,24 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) {
|
| GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect,
|
| &natural_size);
|
| DCHECK(decoder_texture_target_);
|
| +
|
| + uint32 sync_point = factories_->ProduceTextureToMailbox(
|
| + pb.texture_mailbox(),
|
| + pb.texture_id(),
|
| + decoder_texture_target_);
|
| +
|
| scoped_refptr<VideoFrame> frame(
|
| VideoFrame::WrapNativeTexture(
|
| - pb.texture_id(), decoder_texture_target_, pb.size(), visible_rect,
|
| + pb.texture_mailbox(), sync_point,
|
| + 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()),
|
| + base::Closure()));
|
| CHECK_GT(available_pictures_, 0);
|
| available_pictures_--;
|
|
|
| @@ -468,10 +481,14 @@ void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery(
|
| ready_video_frames_.pop_front();
|
| }
|
|
|
| -void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) {
|
| +void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id,
|
| + uint32 sync_point) {
|
| 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,
|
| + sync_point));
|
| return;
|
| }
|
| CHECK_GE(available_pictures_, 0);
|
| @@ -479,6 +496,20 @@ 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(pb.texture_mailbox(),
|
| + pb.texture_id(),
|
| + decoder_texture_target_,
|
| + sync_point);
|
| +
|
| vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
|
| &VideoDecodeAccelerator::ReusePictureBuffer, weak_vda_,
|
| picture_buffer_id));
|
|
|