| Index: media/filters/gpu_video_decoder.cc
|
| diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
|
| index 339d5910cd6f36115b88e12344c88f6fe55d57ab..35fd15993f05382aafe9244a99c998ae15313bf8 100644
|
| --- a/media/filters/gpu_video_decoder.cc
|
| +++ b/media/filters/gpu_video_decoder.cc
|
| @@ -321,9 +321,8 @@ void GpuVideoDecoder::NotifyInitializationComplete(bool success) {
|
|
|
| void GpuVideoDecoder::DestroyPictureBuffers(PictureBufferMap* buffers) {
|
| DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent();
|
| - for (PictureBufferMap::iterator it = buffers->begin(); it != buffers->end();
|
| - ++it) {
|
| - for (uint32_t id : it->second.texture_ids())
|
| + for (const auto& kv : *buffers) {
|
| + for (uint32_t id : kv.second.client_texture_ids())
|
| factories_->DeleteTexture(id);
|
| }
|
|
|
| @@ -337,12 +336,8 @@ void GpuVideoDecoder::DestroyVDA() {
|
|
|
| // Not destroying PictureBuffers in |picture_buffers_at_display_| yet, since
|
| // their textures may still be in use by the user of this GpuVideoDecoder.
|
| - for (PictureBufferTextureMap::iterator it =
|
| - picture_buffers_at_display_.begin();
|
| - it != picture_buffers_at_display_.end();
|
| - ++it) {
|
| - assigned_picture_buffers_.erase(it->first);
|
| - }
|
| + for (const auto& kv : picture_buffers_at_display_)
|
| + assigned_picture_buffers_.erase(kv.first);
|
| DestroyPictureBuffers(&assigned_picture_buffers_);
|
| }
|
|
|
| @@ -538,15 +533,16 @@ void GpuVideoDecoder::DismissPictureBuffer(int32_t id) {
|
| PictureBuffer buffer_to_dismiss = it->second;
|
| assigned_picture_buffers_.erase(it);
|
|
|
| - if (!picture_buffers_at_display_.count(id)) {
|
| - // We can delete the texture immediately as it's not being displayed.
|
| - for (uint32_t id : buffer_to_dismiss.texture_ids())
|
| - factories_->DeleteTexture(id);
|
| - CHECK_GT(available_pictures_, 0);
|
| - --available_pictures_;
|
| - }
|
| - // Not destroying a texture in display in |picture_buffers_at_display_|.
|
| - // Postpone deletion until after it's returned to us.
|
| + // If it's in |picture_buffers_at_display_|, postpone deletion of it until
|
| + // it's returned to us.
|
| + if (picture_buffers_at_display_.count(id))
|
| + return;
|
| +
|
| + // Otherwise, we can delete the texture immediately.
|
| + for (uint32_t id : buffer_to_dismiss.client_texture_ids())
|
| + factories_->DeleteTexture(id);
|
| + CHECK_GT(available_pictures_, 0);
|
| + --available_pictures_;
|
| }
|
|
|
| void GpuVideoDecoder::PictureReady(const media::Picture& picture) {
|
| @@ -595,17 +591,18 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) {
|
| DCHECK(decoder_texture_target_);
|
|
|
| gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes];
|
| - for (size_t i = 0; i < pb.texture_ids().size(); ++i) {
|
| + for (size_t i = 0; i < pb.client_texture_ids().size(); ++i) {
|
| mailbox_holders[i] = gpu::MailboxHolder(pb.texture_mailbox(i), sync_token_,
|
| decoder_texture_target_);
|
| }
|
|
|
| scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTextures(
|
| pixel_format_, mailbox_holders,
|
| - base::Bind(&ReleaseMailboxTrampoline, factories_->GetTaskRunner(),
|
| - base::Bind(&GpuVideoDecoder::ReleaseMailbox,
|
| - weak_factory_.GetWeakPtr(), factories_,
|
| - picture.picture_buffer_id(), pb.texture_ids())),
|
| + base::Bind(
|
| + &ReleaseMailboxTrampoline, factories_->GetTaskRunner(),
|
| + base::Bind(&GpuVideoDecoder::ReleaseMailbox,
|
| + weak_factory_.GetWeakPtr(), factories_,
|
| + picture.picture_buffer_id(), pb.client_texture_ids())),
|
| pb.size(), visible_rect, natural_size, timestamp));
|
| if (!frame) {
|
| DLOG(ERROR) << "Create frame failed for: " << picture.picture_buffer_id();
|
| @@ -624,10 +621,10 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) {
|
| CHECK_GT(available_pictures_, 0);
|
| --available_pictures_;
|
|
|
| - bool inserted =
|
| - picture_buffers_at_display_
|
| - .insert(std::make_pair(picture.picture_buffer_id(), pb.texture_ids()))
|
| - .second;
|
| + bool inserted = picture_buffers_at_display_
|
| + .insert(std::make_pair(picture.picture_buffer_id(),
|
| + pb.client_texture_ids()))
|
| + .second;
|
| DCHECK(inserted);
|
|
|
| DeliverFrame(frame);
|
|
|