| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/media/common/video_decoder_wrapper.h" |
| |
| #include <utility> |
| |
| #include "chromecast/media/api/decoder_buffer_base.h" |
| |
| namespace chromecast { |
| namespace media { |
| |
| // This fake VideoDecoder would behave as one with buffer filled |
| // up and the playback is stalled. |
| class VideoDecoderWrapper::RevokedVideoDecoder |
| : public MediaPipelineBackend::VideoDecoder { |
| public: |
| explicit RevokedVideoDecoder(const Statistics& statistics) |
| : statistics_(statistics) {} |
| |
| RevokedVideoDecoder(const RevokedVideoDecoder&) = delete; |
| RevokedVideoDecoder& operator=(const RevokedVideoDecoder&) = delete; |
| |
| ~RevokedVideoDecoder() override = default; |
| |
| private: |
| // MediaPipelineBackend::VideoDecoder implementation: |
| void SetDelegate(Delegate* delegate) override {} |
| |
| BufferStatus PushBuffer(CastDecoderBuffer* buffer) override { |
| return MediaPipelineBackend::kBufferPending; |
| } |
| |
| bool SetConfig(const VideoConfig& config) override { return true; } |
| |
| void GetStatistics(Statistics* statistics) override { |
| *statistics = statistics_; |
| } |
| |
| Statistics statistics_; |
| }; |
| |
| VideoDecoderWrapper::VideoDecoderWrapper( |
| MediaPipelineBackend::VideoDecoder* decoder) |
| : decoder_(decoder) { |
| DCHECK(decoder_); |
| } |
| |
| VideoDecoderWrapper::VideoDecoderWrapper() { |
| Statistics default_statistics; |
| revoked_video_decoder_ = |
| std::make_unique<RevokedVideoDecoder>(default_statistics); |
| decoder_ = revoked_video_decoder_.get(); |
| } |
| |
| void VideoDecoderWrapper::Revoke() { |
| if (!revoked_video_decoder_) { |
| Statistics statistics; |
| decoder_->GetStatistics(&statistics); |
| |
| revoked_video_decoder_ = std::make_unique<RevokedVideoDecoder>(statistics); |
| decoder_ = revoked_video_decoder_.get(); |
| } |
| } |
| |
| VideoDecoderWrapper::~VideoDecoderWrapper() = default; |
| |
| void VideoDecoderWrapper::SetDelegate( |
| media::CmaBackend::VideoDecoder::Delegate* delegate) { |
| decoder_->SetDelegate(delegate); |
| } |
| |
| media::CmaBackend::BufferStatus VideoDecoderWrapper::PushBuffer( |
| scoped_refptr<media::DecoderBufferBase> buffer) { |
| pushed_buffer_ = std::move(buffer); |
| return decoder_->PushBuffer(pushed_buffer_.get()); |
| } |
| |
| bool VideoDecoderWrapper::SetConfig(const media::VideoConfig& config) { |
| return decoder_->SetConfig(config); |
| } |
| |
| void VideoDecoderWrapper::GetStatistics(Statistics* statistics) { |
| decoder_->GetStatistics(statistics); |
| } |
| |
| } // namespace media |
| } // namespace chromecast |