Commit 77faf633 authored by James West's avatar James West Committed by Commit Bot

[Chromecast] Use DecoderBufferBase in CmaBackend

Avoids downcasting CastDecoderBuffer to DecoderBufferBase in multizone
code.

Bug: internal b/62147653
Test: cast_media_unittests
Change-Id: I4b0fe09bd6aee26c5372405a9052252c39be36e5
Reviewed-on: https://chromium-review.googlesource.com/972429
Commit-Queue: James West <jameswest@chromium.org>
Reviewed-by: default avatarLuke Halliwell <halliwell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#544890}
parent c0e4c38c
......@@ -9,6 +9,7 @@
#include <memory>
#include <utility>
#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/time/time.h"
......@@ -16,8 +17,8 @@
#include "chromecast/media/audio/cast_audio_manager.h"
#include "chromecast/media/audio/cast_audio_mixer.h"
#include "chromecast/media/cma/backend/cma_backend.h"
#include "chromecast/media/cma/base/decoder_buffer_base.h"
#include "chromecast/media/cma/test/mock_cma_backend_factory.h"
#include "chromecast/public/media/cast_decoder_buffer.h"
#include "chromecast/public/task_runner.h"
#include "media/audio/mock_audio_source_callback.h"
#include "media/audio/test_audio_thread.h"
......@@ -71,7 +72,6 @@ class FakeAudioDecoder : public CmaBackend::AudioDecoder {
pipeline_status_(PIPELINE_STATUS_OK),
pending_push_(false),
pushed_buffer_count_(0),
last_buffer_(nullptr),
delegate_(nullptr) {}
~FakeAudioDecoder() override {}
......@@ -80,8 +80,8 @@ class FakeAudioDecoder : public CmaBackend::AudioDecoder {
DCHECK(delegate);
delegate_ = delegate;
}
BufferStatus PushBuffer(CastDecoderBuffer* buffer) override {
last_buffer_ = buffer;
BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override {
last_buffer_ = std::move(buffer);
++pushed_buffer_count_;
switch (pipeline_status_) {
......@@ -126,7 +126,7 @@ class FakeAudioDecoder : public CmaBackend::AudioDecoder {
rendering_delay_ = rendering_delay;
}
unsigned pushed_buffer_count() const { return pushed_buffer_count_; }
CastDecoderBuffer* last_buffer() { return last_buffer_; }
const DecoderBufferBase* last_buffer() { return last_buffer_.get(); }
private:
const MediaPipelineDeviceParams params_;
......@@ -136,7 +136,7 @@ class FakeAudioDecoder : public CmaBackend::AudioDecoder {
PipelineStatus pipeline_status_;
bool pending_push_;
int pushed_buffer_count_;
CastDecoderBuffer* last_buffer_;
scoped_refptr<DecoderBufferBase> last_buffer_;
Delegate* delegate_;
RenderingDelay rendering_delay_;
};
......@@ -387,7 +387,7 @@ TEST_F(CastAudioOutputStreamTest, PushFrame) {
::media::AudioParameters audio_params = GetAudioParams();
const size_t expected_frame_size =
static_cast<size_t>(audio_params.GetBytesPerBuffer());
const CastDecoderBuffer* buffer = audio_decoder->last_buffer();
const DecoderBufferBase* buffer = audio_decoder->last_buffer();
EXPECT_TRUE(buffer->data());
EXPECT_EQ(expected_frame_size, buffer->data_size());
EXPECT_FALSE(buffer->decrypt_config()); // Null because of raw audio.
......
......@@ -30,6 +30,8 @@ cast_source_set("backend") {
"media_pipeline_backend_manager.h",
"media_pipeline_backend_wrapper.cc",
"media_pipeline_backend_wrapper.h",
"video_decoder_wrapper.cc",
"video_decoder_wrapper.h",
]
public_deps = [
......
......@@ -5,8 +5,9 @@
#include "chromecast/media/cma/backend/audio_decoder_software_wrapper.h"
#include "base/test/scoped_task_environment.h"
#include "chromecast/media/cma/test/mock_cma_backend.h"
#include "chromecast/public/media/cast_decoder_buffer.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/media_pipeline_backend.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -17,13 +18,27 @@ using ::testing::_;
namespace chromecast {
namespace media {
namespace {
class MockAudioDecoder : public MediaPipelineBackend::AudioDecoder {
public:
MOCK_METHOD1(SetDelegate, void(Delegate*));
MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*));
MOCK_METHOD1(SetConfig, bool(const AudioConfig&));
MOCK_METHOD1(SetVolume, bool(float));
MOCK_METHOD0(GetRenderingDelay, RenderingDelay());
MOCK_METHOD1(GetStatistics, void(Statistics*));
};
} // namespace
class AudioDecoderSoftwareWrapperTest : public ::testing::Test {
public:
AudioDecoderSoftwareWrapperTest()
: audio_decoder_software_wrapper_(&audio_decoder_) {}
base::test::ScopedTaskEnvironment scoped_task_environment_;
MockCmaBackend::AudioDecoder audio_decoder_;
MockAudioDecoder audio_decoder_;
AudioDecoderSoftwareWrapper audio_decoder_software_wrapper_;
};
......
......@@ -57,14 +57,14 @@ void AudioDecoderWrapper::SetDelegate(Delegate* delegate) {
}
CmaBackend::BufferStatus AudioDecoderWrapper::PushBuffer(
CastDecoderBuffer* buffer) {
scoped_refptr<DecoderBufferBase> buffer) {
if (buffer_delegate_ && buffer_delegate_->IsActive()) {
// Mute the decoder, we are sending audio to delegate.
if (!delegate_active_) {
delegate_active_ = true;
decoder_.SetVolume(0.0);
}
buffer_delegate_->OnPushBuffer(buffer);
buffer_delegate_->OnPushBuffer(buffer.get());
} else {
// Restore original volume.
if (delegate_active_) {
......@@ -75,7 +75,7 @@ CmaBackend::BufferStatus AudioDecoderWrapper::PushBuffer(
}
}
}
return decoder_.PushBuffer(buffer);
return decoder_.PushBuffer(buffer.get());
}
bool AudioDecoderWrapper::SetConfig(const AudioConfig& config) {
......
......@@ -6,6 +6,7 @@
#define CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chromecast/media/cma/backend/audio_decoder_software_wrapper.h"
#include "chromecast/media/cma/backend/cma_backend.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
......@@ -32,7 +33,7 @@ class AudioDecoderWrapper : public CmaBackend::AudioDecoder {
private:
// CmaBackend::AudioDecoder implementation:
void SetDelegate(Delegate* delegate) override;
BufferStatus PushBuffer(CastDecoderBuffer* buffer) override;
BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override;
bool SetConfig(const AudioConfig& config) override;
bool SetVolume(float multiplier) override;
RenderingDelay GetRenderingDelay() override;
......
......@@ -7,6 +7,9 @@
#include <stdint.h>
#include "base/memory/ref_counted.h"
#include "chromecast/media/cma/base/decoder_buffer_base.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/media_pipeline_backend.h"
namespace chromecast {
......@@ -20,11 +23,36 @@ namespace media {
class CmaBackend {
public:
using BufferStatus = MediaPipelineBackend::BufferStatus;
using Decoder = MediaPipelineBackend::Decoder;
using VideoDecoder = MediaPipelineBackend::VideoDecoder;
class AudioDecoder : public MediaPipelineBackend::AudioDecoder {
class Decoder {
public:
using BufferStatus = MediaPipelineBackend::BufferStatus;
using Delegate = MediaPipelineBackend::Decoder::Delegate;
// These methods have the same behavior as the corresponding methods on
// MediaPipelineBackend::Decoder.
// See chromecast/public/media/media_pipeline_backend.h for documentation.
virtual void SetDelegate(Delegate* delegate) = 0;
virtual BufferStatus PushBuffer(
scoped_refptr<DecoderBufferBase> buffer) = 0;
protected:
virtual ~Decoder() = default;
};
class AudioDecoder : public Decoder {
public:
using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay;
using Statistics = MediaPipelineBackend::AudioDecoder::Statistics;
// These methods have the same behavior as the corresponding methods on
// MediaPipelineBackend::AudioDecoder.
// See chromecast/public/media/media_pipeline_backend.h for documentation.
virtual bool SetConfig(const AudioConfig& config) = 0;
virtual bool SetVolume(float multiplier) = 0;
virtual RenderingDelay GetRenderingDelay() = 0;
virtual void GetStatistics(Statistics* statistics) = 0;
// Returns true if the audio decoder requires that encrypted buffers be
// decrypted before being passed to PushBuffer(). The return value may
// change whenever SetConfig() is called or the backend is initialized.
......@@ -34,6 +62,20 @@ class CmaBackend {
~AudioDecoder() override = default;
};
class VideoDecoder : public Decoder {
public:
using Statistics = MediaPipelineBackend::VideoDecoder::Statistics;
// These methods have the same behavior as the corresponding methods on
// MediaPipelineBackend::VideoDecoder.
// See chromecast/public/media/media_pipeline_backend.h for documentation.
virtual bool SetConfig(const VideoConfig& config) = 0;
virtual void GetStatistics(Statistics* statistics) = 0;
protected:
~VideoDecoder() override = default;
};
virtual ~CmaBackend() = default;
// These methods have the same behavior as the corresponding methods on
......
......@@ -8,6 +8,7 @@
#include "base/memory/ptr_util.h"
#include "chromecast/media/cma/backend/audio_decoder_wrapper.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
#include "chromecast/media/cma/backend/video_decoder_wrapper.h"
#include "chromecast/public/cast_media_shlib.h"
#include "chromecast/public/media/media_pipeline_backend.h"
#include "chromecast/public/volume_control.h"
......@@ -25,7 +26,6 @@ MediaPipelineBackendWrapper::MediaPipelineBackendWrapper(
backend_manager_(backend_manager),
audio_stream_type_(params.audio_type),
content_type_(params.content_type),
have_video_decoder_(false),
playing_(false) {
DCHECK(backend_);
DCHECK(backend_manager_);
......@@ -39,7 +39,7 @@ MediaPipelineBackendWrapper::~MediaPipelineBackendWrapper() {
backend_manager_->UpdatePlayingAudioCount(IsSfx(), -1);
}
}
if (have_video_decoder_) {
if (video_decoder_) {
backend_manager_->DecrementDecoderCount(DecoderType::VIDEO_DECODER);
}
}
......@@ -78,13 +78,18 @@ CmaBackend::AudioDecoder* MediaPipelineBackendWrapper::CreateAudioDecoder() {
}
CmaBackend::VideoDecoder* MediaPipelineBackendWrapper::CreateVideoDecoder() {
DCHECK(!have_video_decoder_);
DCHECK(!video_decoder_);
if (!backend_manager_->IncrementDecoderCount(DecoderType::VIDEO_DECODER))
return nullptr;
have_video_decoder_ = true;
MediaPipelineBackend::VideoDecoder* real_decoder =
backend_->CreateVideoDecoder();
if (!real_decoder) {
return nullptr;
}
return backend_->CreateVideoDecoder();
video_decoder_ = std::make_unique<VideoDecoderWrapper>(real_decoder);
return video_decoder_.get();
}
bool MediaPipelineBackendWrapper::Initialize() {
......
......@@ -20,6 +20,7 @@ namespace media {
enum class AudioContentType;
class AudioDecoderWrapper;
class VideoDecoderWrapper;
class MediaPipelineBackend;
class MediaPipelineBackendManager;
......@@ -57,8 +58,8 @@ class MediaPipelineBackendWrapper : public CmaBackend {
const AudioContentType content_type_;
std::unique_ptr<AudioDecoderWrapper> audio_decoder_;
std::unique_ptr<VideoDecoderWrapper> video_decoder_;
bool have_video_decoder_;
bool playing_;
DISALLOW_COPY_AND_ASSIGN(MediaPipelineBackendWrapper);
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/media/cma/backend/video_decoder_wrapper.h"
#include "chromecast/media/cma/base/decoder_buffer_base.h"
namespace chromecast {
namespace media {
VideoDecoderWrapper::VideoDecoderWrapper(
MediaPipelineBackend::VideoDecoder* decoder)
: decoder_(decoder) {
DCHECK(decoder_);
}
VideoDecoderWrapper::~VideoDecoderWrapper() = default;
void VideoDecoderWrapper::SetDelegate(
media::CmaBackend::VideoDecoder::Delegate* delegate) {
decoder_->SetDelegate(delegate);
}
media::CmaBackend::BufferStatus VideoDecoderWrapper::PushBuffer(
scoped_refptr<media::DecoderBufferBase> buffer) {
return decoder_->PushBuffer(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
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_
#define CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chromecast/media/cma/backend/cma_backend.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/media_pipeline_backend.h"
namespace chromecast {
namespace media {
class DecoderBufferBase;
class VideoDecoderWrapper : public CmaBackend::VideoDecoder {
public:
explicit VideoDecoderWrapper(MediaPipelineBackend::VideoDecoder* decoder);
~VideoDecoderWrapper() override;
private:
// CmaBackend::VideoDecoder implementation:
void SetDelegate(Delegate* delegate) override;
BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override;
bool SetConfig(const VideoConfig& config) override;
void GetStatistics(Statistics* statistics) override;
MediaPipelineBackend::VideoDecoder* const decoder_;
DISALLOW_COPY_AND_ASSIGN(VideoDecoderWrapper);
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_CMA_BACKEND_VIDEO_DECODER_WRAPPER_H_
......@@ -277,7 +277,7 @@ void AvPipelineImpl::PushReadyBuffer(scoped_refptr<DecoderBufferBase> buffer) {
pushed_buffer_ = std::move(buffer);
CmaBackend::BufferStatus status = decoder_->PushBuffer(pushed_buffer_.get());
CmaBackend::BufferStatus status = decoder_->PushBuffer(pushed_buffer_);
if (status != CmaBackend::BufferStatus::kBufferPending)
OnPushBufferComplete(status);
......
......@@ -7,7 +7,9 @@
#include <string>
#include "base/memory/ref_counted.h"
#include "chromecast/media/cma/backend/cma_backend.h"
#include "chromecast/media/cma/base/decoder_buffer_base.h"
#include "chromecast/public/graphics_types.h"
#include "testing/gmock/include/gmock/gmock.h"
......@@ -33,7 +35,7 @@ class MockCmaBackend : public CmaBackend {
AudioDecoder();
~AudioDecoder() override;
MOCK_METHOD1(SetDelegate, void(Delegate*));
MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*));
MOCK_METHOD1(PushBuffer, BufferStatus(scoped_refptr<DecoderBufferBase>));
MOCK_METHOD1(SetConfig, bool(const AudioConfig&));
MOCK_METHOD1(SetVolume, bool(float));
MOCK_METHOD0(GetRenderingDelay, RenderingDelay());
......@@ -46,7 +48,7 @@ class MockCmaBackend : public CmaBackend {
VideoDecoder();
~VideoDecoder() override;
MOCK_METHOD1(SetDelegate, void(Delegate*));
MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*));
MOCK_METHOD1(PushBuffer, BufferStatus(scoped_refptr<DecoderBufferBase>));
MOCK_METHOD1(SetConfig, bool(const VideoConfig&));
MOCK_METHOD1(GetStatistics, void(Statistics*));
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment