OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/media/gpu/rtc_video_decoder.h" | 5 #include "content/renderer/media/gpu/rtc_video_decoder.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 if (it == assigned_picture_buffers_.end()) { | 376 if (it == assigned_picture_buffers_.end()) { |
377 NOTREACHED() << "Missing picture buffer: " << id; | 377 NOTREACHED() << "Missing picture buffer: " << id; |
378 return; | 378 return; |
379 } | 379 } |
380 | 380 |
381 media::PictureBuffer buffer_to_dismiss = it->second; | 381 media::PictureBuffer buffer_to_dismiss = it->second; |
382 assigned_picture_buffers_.erase(it); | 382 assigned_picture_buffers_.erase(it); |
383 | 383 |
384 if (!picture_buffers_at_display_.count(id)) { | 384 if (!picture_buffers_at_display_.count(id)) { |
385 // We can delete the texture immediately as it's not being displayed. | 385 // We can delete the texture immediately as it's not being displayed. |
386 factories_->DeleteTexture(buffer_to_dismiss.texture_ids()[0]); | 386 factories_->DeleteTexture(buffer_to_dismiss.client_texture_ids()[0]); |
387 return; | 387 return; |
388 } | 388 } |
389 // Not destroying a texture in display in |picture_buffers_at_display_|. | 389 // Not destroying a texture in display in |picture_buffers_at_display_|. |
390 // Postpone deletion until after it's returned to us. | 390 // Postpone deletion until after it's returned to us. |
391 } | 391 } |
392 | 392 |
393 void RTCVideoDecoder::PictureReady(const media::Picture& picture) { | 393 void RTCVideoDecoder::PictureReady(const media::Picture& picture) { |
394 DVLOG(3) << "PictureReady"; | 394 DVLOG(3) << "PictureReady"; |
395 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); | 395 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
396 | 396 |
(...skipping 20 matching lines...) Expand all Loading... |
417 } | 417 } |
418 | 418 |
419 scoped_refptr<media::VideoFrame> frame = | 419 scoped_refptr<media::VideoFrame> frame = |
420 CreateVideoFrame(picture, pb, timestamp, visible_rect, pixel_format_); | 420 CreateVideoFrame(picture, pb, timestamp, visible_rect, pixel_format_); |
421 if (!frame) { | 421 if (!frame) { |
422 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); | 422 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); |
423 return; | 423 return; |
424 } | 424 } |
425 bool inserted = picture_buffers_at_display_ | 425 bool inserted = picture_buffers_at_display_ |
426 .insert(std::make_pair(picture.picture_buffer_id(), | 426 .insert(std::make_pair(picture.picture_buffer_id(), |
427 pb.texture_ids()[0])) | 427 pb.client_texture_ids()[0])) |
428 .second; | 428 .second; |
429 DCHECK(inserted); | 429 DCHECK(inserted); |
430 | 430 |
431 // Create a WebRTC video frame. | 431 // Create a WebRTC video frame. |
432 webrtc::VideoFrame decoded_image( | 432 webrtc::VideoFrame decoded_image( |
433 new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(frame), timestamp, 0, | 433 new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(frame), timestamp, 0, |
434 webrtc::kVideoRotation_0); | 434 webrtc::kVideoRotation_0); |
435 | 435 |
436 // Invoke decode callback. WebRTC expects no callback after Release. | 436 // Invoke decode callback. WebRTC expects no callback after Release. |
437 { | 437 { |
(...skipping 25 matching lines...) Expand all Loading... |
463 // platform can handle the former format natively. Make sure the | 463 // platform can handle the former format natively. Make sure the |
464 // correct format is used and everyone down the line understands it. | 464 // correct format is used and everyone down the line understands it. |
465 gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = { | 465 gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = { |
466 gpu::MailboxHolder(pb.texture_mailbox(0), gpu::SyncToken(), | 466 gpu::MailboxHolder(pb.texture_mailbox(0), gpu::SyncToken(), |
467 decoder_texture_target_)}; | 467 decoder_texture_target_)}; |
468 scoped_refptr<media::VideoFrame> frame = | 468 scoped_refptr<media::VideoFrame> frame = |
469 media::VideoFrame::WrapNativeTextures( | 469 media::VideoFrame::WrapNativeTextures( |
470 pixel_format, holders, | 470 pixel_format, holders, |
471 media::BindToCurrentLoop(base::Bind( | 471 media::BindToCurrentLoop(base::Bind( |
472 &RTCVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(), | 472 &RTCVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(), |
473 factories_, picture.picture_buffer_id(), pb.texture_ids()[0])), | 473 factories_, picture.picture_buffer_id(), |
| 474 pb.client_texture_ids()[0])), |
474 pb.size(), visible_rect, visible_rect.size(), timestamp_ms); | 475 pb.size(), visible_rect, visible_rect.size(), timestamp_ms); |
475 if (frame && picture.allow_overlay()) { | 476 if (frame && picture.allow_overlay()) { |
476 frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY, | 477 frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY, |
477 true); | 478 true); |
478 } | 479 } |
479 return frame; | 480 return frame; |
480 } | 481 } |
481 | 482 |
482 void RTCVideoDecoder::NotifyEndOfBitstreamBuffer(int32_t id) { | 483 void RTCVideoDecoder::NotifyEndOfBitstreamBuffer(int32_t id) { |
483 DVLOG(3) << "NotifyEndOfBitstreamBuffer. id=" << id; | 484 DVLOG(3) << "NotifyEndOfBitstreamBuffer. id=" << id; |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 | 754 |
754 void RTCVideoDecoder::DestroyTextures() { | 755 void RTCVideoDecoder::DestroyTextures() { |
755 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); | 756 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
756 | 757 |
757 // Not destroying PictureBuffers in |picture_buffers_at_display_| yet, since | 758 // Not destroying PictureBuffers in |picture_buffers_at_display_| yet, since |
758 // their textures may still be in use by the user of this RTCVideoDecoder. | 759 // their textures may still be in use by the user of this RTCVideoDecoder. |
759 for (const auto& picture_buffer_at_display : picture_buffers_at_display_) | 760 for (const auto& picture_buffer_at_display : picture_buffers_at_display_) |
760 assigned_picture_buffers_.erase(picture_buffer_at_display.first); | 761 assigned_picture_buffers_.erase(picture_buffer_at_display.first); |
761 | 762 |
762 for (const auto& assigned_picture_buffer : assigned_picture_buffers_) | 763 for (const auto& assigned_picture_buffer : assigned_picture_buffers_) |
763 factories_->DeleteTexture(assigned_picture_buffer.second.texture_ids()[0]); | 764 factories_->DeleteTexture( |
| 765 assigned_picture_buffer.second.client_texture_ids()[0]); |
764 | 766 |
765 assigned_picture_buffers_.clear(); | 767 assigned_picture_buffers_.clear(); |
766 } | 768 } |
767 | 769 |
768 void RTCVideoDecoder::DestroyVDA() { | 770 void RTCVideoDecoder::DestroyVDA() { |
769 DVLOG(2) << "DestroyVDA"; | 771 DVLOG(2) << "DestroyVDA"; |
770 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); | 772 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
771 if (vda_) | 773 if (vda_) |
772 vda_.release()->Destroy(); | 774 vda_.release()->Destroy(); |
773 DestroyTextures(); | 775 DestroyTextures(); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 } | 886 } |
885 | 887 |
886 void RTCVideoDecoder::ClearPendingBuffers() { | 888 void RTCVideoDecoder::ClearPendingBuffers() { |
887 // Delete WebRTC input buffers. | 889 // Delete WebRTC input buffers. |
888 for (const auto& pending_buffer : pending_buffers_) | 890 for (const auto& pending_buffer : pending_buffers_) |
889 delete[] pending_buffer.first._buffer; | 891 delete[] pending_buffer.first._buffer; |
890 pending_buffers_.clear(); | 892 pending_buffers_.clear(); |
891 } | 893 } |
892 | 894 |
893 } // namespace content | 895 } // namespace content |
OLD | NEW |