Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1122)

Side by Side Diff: content/common/gpu/media/android_deferred_rendering_backing_strategy.cc

Issue 1862303002: Delay actual flush and reset in AVDA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Uses drain with EOS instead of abitrary delay Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/gpu/media/android_deferred_rendering_backing_strategy.h " 5 #include "content/common/gpu/media/android_deferred_rendering_backing_strategy.h "
6 6
7 #include <EGL/egl.h> 7 #include <EGL/egl.h>
8 #include <EGL/eglext.h> 8 #include <EGL/eglext.h>
9 9
10 #include "base/android/build_info.h" 10 #include "base/android/build_info.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 72
73 void AndroidDeferredRenderingBackingStrategy::Cleanup( 73 void AndroidDeferredRenderingBackingStrategy::Cleanup(
74 bool have_context, 74 bool have_context,
75 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) { 75 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
76 // If we failed before Initialize, then do nothing. 76 // If we failed before Initialize, then do nothing.
77 if (!shared_state_) 77 if (!shared_state_)
78 return; 78 return;
79 79
80 // Make sure that no PictureBuffer textures refer to the SurfaceTexture or to 80 // Make sure that no PictureBuffer textures refer to the SurfaceTexture or to
81 // the service_id that we created for it. 81 // the service_id that we created for it.
82 for (const std::pair<int, media::PictureBuffer>& entry : buffers) 82 for (const std::pair<int, media::PictureBuffer>& entry : buffers) {
83 ReleaseCodecBufferForPicture(entry.second);
83 SetImageForPicture(entry.second, nullptr); 84 SetImageForPicture(entry.second, nullptr);
85 }
84 86
85 // If we're rendering to a SurfaceTexture we can make a copy of the current 87 // If we're rendering to a SurfaceTexture we can make a copy of the current
86 // front buffer so that the PictureBuffer textures are still valid. 88 // front buffer so that the PictureBuffer textures are still valid.
87 if (surface_texture_ && have_context && ShouldCopyPictures()) 89 if (surface_texture_ && have_context && ShouldCopyPictures())
88 CopySurfaceTextureToPictures(buffers); 90 CopySurfaceTextureToPictures(buffers);
89 91
90 // Now that no AVDACodecImages refer to the SurfaceTexture's texture, delete 92 // Now that no AVDACodecImages refer to the SurfaceTexture's texture, delete
91 // the texture name. 93 // the texture name.
92 GLuint service_id = shared_state_->surface_texture_service_id(); 94 GLuint service_id = shared_state_->surface_texture_service_id();
93 if (service_id > 0 && have_context) 95 if (service_id > 0 && have_context)
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 glBindTexture(GL_TEXTURE_2D, picture_buffer.texture_ids()[0]); 219 glBindTexture(GL_TEXTURE_2D, picture_buffer.texture_ids()[0]);
218 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0, 220 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0,
219 GL_RGBA, GL_UNSIGNED_BYTE, rgba); 221 GL_RGBA, GL_UNSIGNED_BYTE, rgba);
220 } 222 }
221 } 223 }
222 224
223 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture( 225 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture(
224 const media::PictureBuffer& picture_buffer) { 226 const media::PictureBuffer& picture_buffer) {
225 AVDACodecImage* avda_image = GetImageForPicture(picture_buffer); 227 AVDACodecImage* avda_image = GetImageForPicture(picture_buffer);
226 228
229 if (!avda_image)
230 return;
231
227 // See if there is a media codec buffer still attached to this image. 232 // See if there is a media codec buffer still attached to this image.
228 const int32_t codec_buffer = avda_image->GetMediaCodecBufferIndex(); 233 const int32_t codec_buffer = avda_image->GetMediaCodecBufferIndex();
229 234
230 if (codec_buffer >= 0) { 235 if (codec_buffer >= 0) {
231 // PictureBuffer wasn't displayed, so release the buffer. 236 // PictureBuffer wasn't displayed, so release the buffer.
232 media_codec_->ReleaseOutputBuffer(codec_buffer, false); 237 media_codec_->ReleaseOutputBuffer(codec_buffer, false);
233 avda_image->SetMediaCodecBufferIndex(-1); 238 avda_image->SetMediaCodecBufferIndex(-1);
234 } 239 }
235 } 240 }
236 241
237 void AndroidDeferredRenderingBackingStrategy::ReuseOnePictureBuffer( 242 void AndroidDeferredRenderingBackingStrategy::ReuseOnePictureBuffer(
238 const media::PictureBuffer& picture_buffer) { 243 const media::PictureBuffer& picture_buffer) {
239 // At this point, the CC must be done with the picture. We can't really 244 // At this point, the CC must be done with the picture. We can't really
240 // check for that here directly. it's guaranteed in gpu_video_decoder.cc, 245 // check for that here directly. it's guaranteed in gpu_video_decoder.cc,
241 // when it waits on the sync point before releasing the mailbox. That sync 246 // when it waits on the sync point before releasing the mailbox. That sync
242 // point is inserted by destroying the resource in VideoLayerImpl::DidDraw. 247 // point is inserted by destroying the resource in VideoLayerImpl::DidDraw.
243 ReleaseCodecBufferForPicture(picture_buffer); 248 ReleaseCodecBufferForPicture(picture_buffer);
244 } 249 }
245 250
251 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBuffers(
252 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
253 for (const std::pair<int, media::PictureBuffer>& entry : buffers)
254 ReleaseCodecBufferForPicture(entry.second);
255 }
256
246 void AndroidDeferredRenderingBackingStrategy::CodecChanged( 257 void AndroidDeferredRenderingBackingStrategy::CodecChanged(
247 media::VideoCodecBridge* codec, 258 media::VideoCodecBridge* codec,
248 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) { 259 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
249 // Clear any outstanding codec buffer indices, since the new codec (if any) 260 // Clear any outstanding codec buffer indices, since the new codec (if any)
250 // doesn't know about them. 261 // doesn't know about them.
251 media_codec_ = codec; 262 media_codec_ = codec;
252 for (const std::pair<int, media::PictureBuffer>& entry : buffers) { 263 for (const std::pair<int, media::PictureBuffer>& entry : buffers) {
253 AVDACodecImage* avda_image = GetImageForPicture(entry.second); 264 AVDACodecImage* avda_image = GetImageForPicture(entry.second);
254 avda_image->SetMediaCodec(codec); 265 avda_image->SetMediaCodec(codec);
255 avda_image->SetMediaCodecBufferIndex(-1); 266 avda_image->SetMediaCodecBufferIndex(-1);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 return !feature_info->workarounds().avda_dont_copy_pictures; 408 return !feature_info->workarounds().avda_dont_copy_pictures;
398 } 409 }
399 } 410 }
400 } 411 }
401 412
402 // Assume so. 413 // Assume so.
403 return true; 414 return true;
404 } 415 }
405 416
406 } // namespace content 417 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698