OLD | NEW |
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 Loading... |
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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 GL_RGBA, GL_UNSIGNED_BYTE, rgba); | 212 GL_RGBA, GL_UNSIGNED_BYTE, rgba); |
211 } | 213 } |
212 } | 214 } |
213 | 215 |
214 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture( | 216 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture( |
215 const media::PictureBuffer& picture_buffer) { | 217 const media::PictureBuffer& picture_buffer) { |
216 AVDACodecImage* avda_image = | 218 AVDACodecImage* avda_image = |
217 shared_state_->GetImageForPicture(picture_buffer.id()); | 219 shared_state_->GetImageForPicture(picture_buffer.id()); |
218 RETURN_IF_NULL(avda_image); | 220 RETURN_IF_NULL(avda_image); |
219 | 221 |
| 222 if (!avda_image) |
| 223 return; |
| 224 |
220 // See if there is a media codec buffer still attached to this image. | 225 // See if there is a media codec buffer still attached to this image. |
221 const int32_t codec_buffer = avda_image->GetMediaCodecBufferIndex(); | 226 const int32_t codec_buffer = avda_image->GetMediaCodecBufferIndex(); |
222 | 227 |
223 if (codec_buffer >= 0) { | 228 if (codec_buffer >= 0) { |
224 // PictureBuffer wasn't displayed, so release the buffer. | 229 // PictureBuffer wasn't displayed, so release the buffer. |
225 media_codec_->ReleaseOutputBuffer(codec_buffer, false); | 230 media_codec_->ReleaseOutputBuffer(codec_buffer, false); |
226 avda_image->SetMediaCodecBufferIndex(-1); | 231 avda_image->SetMediaCodecBufferIndex(-1); |
227 } | 232 } |
228 } | 233 } |
229 | 234 |
230 void AndroidDeferredRenderingBackingStrategy::ReuseOnePictureBuffer( | 235 void AndroidDeferredRenderingBackingStrategy::ReuseOnePictureBuffer( |
231 const media::PictureBuffer& picture_buffer) { | 236 const media::PictureBuffer& picture_buffer) { |
232 // At this point, the CC must be done with the picture. We can't really | 237 // At this point, the CC must be done with the picture. We can't really |
233 // check for that here directly. it's guaranteed in gpu_video_decoder.cc, | 238 // check for that here directly. it's guaranteed in gpu_video_decoder.cc, |
234 // when it waits on the sync point before releasing the mailbox. That sync | 239 // when it waits on the sync point before releasing the mailbox. That sync |
235 // point is inserted by destroying the resource in VideoLayerImpl::DidDraw. | 240 // point is inserted by destroying the resource in VideoLayerImpl::DidDraw. |
236 ReleaseCodecBufferForPicture(picture_buffer); | 241 ReleaseCodecBufferForPicture(picture_buffer); |
237 } | 242 } |
238 | 243 |
| 244 void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBuffers( |
| 245 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) { |
| 246 for (const std::pair<int, media::PictureBuffer>& entry : buffers) |
| 247 ReleaseCodecBufferForPicture(entry.second); |
| 248 } |
| 249 |
239 void AndroidDeferredRenderingBackingStrategy::CodecChanged( | 250 void AndroidDeferredRenderingBackingStrategy::CodecChanged( |
240 media::VideoCodecBridge* codec) { | 251 media::VideoCodecBridge* codec) { |
241 media_codec_ = codec; | 252 media_codec_ = codec; |
242 shared_state_->CodecChanged(codec); | 253 shared_state_->CodecChanged(codec); |
243 } | 254 } |
244 | 255 |
245 void AndroidDeferredRenderingBackingStrategy::OnFrameAvailable() { | 256 void AndroidDeferredRenderingBackingStrategy::OnFrameAvailable() { |
246 shared_state_->SignalFrameAvailable(); | 257 shared_state_->SignalFrameAvailable(); |
247 } | 258 } |
248 | 259 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 return !feature_info->workarounds().avda_dont_copy_pictures; | 392 return !feature_info->workarounds().avda_dont_copy_pictures; |
382 } | 393 } |
383 } | 394 } |
384 } | 395 } |
385 | 396 |
386 // Assume so. | 397 // Assume so. |
387 return true; | 398 return true; |
388 } | 399 } |
389 | 400 |
390 } // namespace content | 401 } // namespace content |
OLD | NEW |