Commit c3a4e38a authored by Ryan Keane's avatar Ryan Keane Committed by Chromium LUCI CQ

[Cast] Use the PushBufferQueue

This CL adds the PushBufferQueue as introduced in
https://chromium-review.googlesource.com/c/chromium/src/+/2509338 to the
ProxyCallTranslator, as defined in
https://chromium-review.googlesource.com/c/chromium/src/+/2519156

Change-Id: I35c1e6c686476b428a12ab500d48bbca223701f4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2581138Reviewed-by: default avatarYuchen Liu <yucliu@chromium.org>
Commit-Queue: Ryan Keane <rwkeane@google.com>
Cr-Commit-Position: refs/heads/master@{#835985}
parent db487ec8
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "third_party/openscreen/src/cast/cast_core/api/runtime/cast_audio_decoder_service.pb.h" #include "third_party/openscreen/src/cast/cast_core/api/runtime/cast_audio_decoder_service.pb.h"
namespace chromecast { namespace chromecast {
...@@ -66,7 +67,7 @@ class CastRuntimeAudioChannelBroker { ...@@ -66,7 +67,7 @@ class CastRuntimeAudioChannelBroker {
// Returns a PushBufferRequest to be sent across the |PushBuffer| RPC. May // Returns a PushBufferRequest to be sent across the |PushBuffer| RPC. May
// only be called if |HasBufferedData()| is true. // only be called if |HasBufferedData()| is true.
virtual PushBufferRequest GetBufferedData() = 0; virtual base::Optional<PushBufferRequest> GetBufferedData() = 0;
virtual bool HasBufferedData() = 0; virtual bool HasBufferedData() = 0;
// Handlers for the responses of the messages defined in // Handlers for the responses of the messages defined in
......
...@@ -143,9 +143,12 @@ cast::media::CastAudioDecoderMode ToGrpcTypes( ...@@ -143,9 +143,12 @@ cast::media::CastAudioDecoderMode ToGrpcTypes(
CastRuntimeAudioChannelBroker::Handler::PushBufferRequest ToGrpcTypes( CastRuntimeAudioChannelBroker::Handler::PushBufferRequest ToGrpcTypes(
scoped_refptr<DecoderBufferBase> buffer) { scoped_refptr<DecoderBufferBase> buffer) {
auto* decode_buffer = new cast::media::AudioDecoderBuffer; auto* decode_buffer = new cast::media::AudioDecoderBuffer;
decode_buffer->set_end_of_stream(buffer->end_of_stream());
if (!buffer->end_of_stream()) {
decode_buffer->set_pts_micros(buffer->timestamp()); decode_buffer->set_pts_micros(buffer->timestamp());
decode_buffer->set_data(buffer->data(), buffer->data_size()); decode_buffer->set_data(buffer->data(), buffer->data_size());
decode_buffer->set_end_of_stream(buffer->end_of_stream()); }
CastRuntimeAudioChannelBroker::Handler::PushBufferRequest request; CastRuntimeAudioChannelBroker::Handler::PushBufferRequest request;
...@@ -257,29 +260,20 @@ void ProxyCallTranslator::SetVolume(float multiplier) { ...@@ -257,29 +260,20 @@ void ProxyCallTranslator::SetVolume(float multiplier) {
} }
bool ProxyCallTranslator::SetConfig(const AudioConfig& config) { bool ProxyCallTranslator::SetConfig(const AudioConfig& config) {
return ProcessPushBufferRequest(ToGrpcTypes(config)); return push_buffer_queue_.PushBuffer(ToGrpcTypes(config));
} }
bool ProxyCallTranslator::PushBuffer(scoped_refptr<DecoderBufferBase> buffer) { bool ProxyCallTranslator::PushBuffer(scoped_refptr<DecoderBufferBase> buffer) {
return ProcessPushBufferRequest(ToGrpcTypes(std::move(buffer))); return push_buffer_queue_.PushBuffer(ToGrpcTypes(std::move(buffer)));
} }
bool ProxyCallTranslator::ProcessPushBufferRequest(PushBufferRequest request) { base::Optional<ProxyCallTranslator::PushBufferRequest>
// TODO(rwkeane) ProxyCallTranslator::GetBufferedData() {
NOTIMPLEMENTED(); return push_buffer_queue_.GetBufferedData();
return false;
}
ProxyCallTranslator::PushBufferRequest ProxyCallTranslator::GetBufferedData() {
// TODO(rwkeane)
NOTIMPLEMENTED();
return PushBufferRequest{};
} }
bool ProxyCallTranslator::HasBufferedData() { bool ProxyCallTranslator::HasBufferedData() {
// TODO(rwkeane) return push_buffer_queue_.HasBufferedData();
NOTIMPLEMENTED();
return false;
} }
void ProxyCallTranslator::HandleInitializeResponse( void ProxyCallTranslator::HandleInitializeResponse(
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "chromecast/media/api/decoder_buffer_base.h" #include "chromecast/media/api/decoder_buffer_base.h"
#include "chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h" #include "chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h"
#include "chromecast/media/cma/backend/proxy/cma_proxy_handler.h" #include "chromecast/media/cma/backend/proxy/cma_proxy_handler.h"
#include "chromecast/media/cma/backend/proxy/push_buffer_queue.h"
namespace chromecast { namespace chromecast {
...@@ -61,7 +62,7 @@ class ProxyCallTranslator : public CmaProxyHandler, ...@@ -61,7 +62,7 @@ class ProxyCallTranslator : public CmaProxyHandler,
std::unique_ptr<CastRuntimeAudioChannelBroker> decoder_channel); std::unique_ptr<CastRuntimeAudioChannelBroker> decoder_channel);
// CastRuntimeAudioChannelBroker::Handler overrides: // CastRuntimeAudioChannelBroker::Handler overrides:
PushBufferRequest GetBufferedData() override; base::Optional<PushBufferRequest> GetBufferedData() override;
bool HasBufferedData() override; bool HasBufferedData() override;
void HandleInitializeResponse( void HandleInitializeResponse(
CastRuntimeAudioChannelBroker::StatusCode status) override; CastRuntimeAudioChannelBroker::StatusCode status) override;
...@@ -79,8 +80,6 @@ class ProxyCallTranslator : public CmaProxyHandler, ...@@ -79,8 +80,6 @@ class ProxyCallTranslator : public CmaProxyHandler,
base::Optional<MediaTime> time, base::Optional<MediaTime> time,
CastRuntimeAudioChannelBroker::StatusCode status) override; CastRuntimeAudioChannelBroker::StatusCode status) override;
bool ProcessPushBufferRequest(PushBufferRequest request);
// Helper to share error handling code. // Helper to share error handling code.
bool HandleError(CastRuntimeAudioChannelBroker::StatusCode status); bool HandleError(CastRuntimeAudioChannelBroker::StatusCode status);
...@@ -90,6 +89,9 @@ class ProxyCallTranslator : public CmaProxyHandler, ...@@ -90,6 +89,9 @@ class ProxyCallTranslator : public CmaProxyHandler,
void OnPipelineStateChangeTask(CmaProxyHandler::PipelineState state); void OnPipelineStateChangeTask(CmaProxyHandler::PipelineState state);
void OnBytesDecodedTask(int64_t decoded_byte_count); void OnBytesDecodedTask(int64_t decoded_byte_count);
// Queue storing data from PushBuffer and SetConfig calls.
PushBufferQueue push_buffer_queue_;
std::unique_ptr<CastRuntimeAudioChannelBroker> decoder_channel_; std::unique_ptr<CastRuntimeAudioChannelBroker> decoder_channel_;
TaskRunner* const client_task_runner_; TaskRunner* const client_task_runner_;
CmaProxyHandler::Client* const client_; CmaProxyHandler::Client* const client_;
......
...@@ -9,8 +9,11 @@ ...@@ -9,8 +9,11 @@
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "base/test/test_simple_task_runner.h" #include "base/test/test_simple_task_runner.h"
#include "chromecast/base/task_runner_impl.h" #include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/base/cast_decoder_buffer_impl.h"
#include "chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h" #include "chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h"
#include "chromecast/media/cma/backend/proxy/cma_proxy_handler.h" #include "chromecast/media/cma/backend/proxy/cma_proxy_handler.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/stream_id.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -139,6 +142,78 @@ TEST_F(ProxyCallTranslatorTest, TestExternalSetVolume) { ...@@ -139,6 +142,78 @@ TEST_F(ProxyCallTranslatorTest, TestExternalSetVolume) {
translator_.SetVolume(multiplier); translator_.SetVolume(multiplier);
} }
TEST_F(ProxyCallTranslatorTest, TestExternalPushBuffer) {
scoped_refptr<CastDecoderBufferImpl> buffer(
new CastDecoderBufferImpl(3, StreamId::kPrimary));
buffer->writable_data()[0] = 1;
buffer->writable_data()[1] = 2;
buffer->writable_data()[2] = 3;
EXPECT_TRUE(translator_.PushBuffer(buffer));
EXPECT_TRUE(translator_.PushBuffer(CastDecoderBufferImpl::CreateEOSBuffer()));
ASSERT_TRUE(translator_as_handler_->HasBufferedData());
auto result = translator_as_handler_->GetBufferedData();
ASSERT_TRUE(result.has_value());
EXPECT_FALSE(result.value().has_audio_config());
ASSERT_TRUE(result.value().has_buffer());
EXPECT_FALSE(result.value().buffer().end_of_stream());
EXPECT_EQ(result.value().buffer().data().size(), size_t{3});
EXPECT_EQ(result.value().buffer().data()[0], 1);
EXPECT_EQ(result.value().buffer().data()[1], 2);
EXPECT_EQ(result.value().buffer().data()[2], 3);
ASSERT_TRUE(translator_as_handler_->HasBufferedData());
result = translator_as_handler_->GetBufferedData();
ASSERT_TRUE(result.has_value());
EXPECT_FALSE(result.value().has_audio_config());
ASSERT_TRUE(result.value().has_buffer());
EXPECT_TRUE(result.value().buffer().end_of_stream());
EXPECT_EQ(result.value().buffer().data().size(), size_t{0});
}
TEST_F(ProxyCallTranslatorTest, TestExternalSetConfig) {
AudioConfig config;
config.codec = AudioCodec::kCodecPCM;
config.channel_layout = ChannelLayout::SURROUND_5_1;
config.sample_format = SampleFormat::kSampleFormatPlanarS16;
config.bytes_per_channel = 42;
config.channel_number = 5;
config.samples_per_second = 5000;
config.extra_data = {1, 2, 3};
config.encryption_scheme = EncryptionScheme::kUnencrypted;
EXPECT_TRUE(translator_.SetConfig(config));
ASSERT_TRUE(translator_as_handler_->HasBufferedData());
auto result = translator_as_handler_->GetBufferedData();
ASSERT_TRUE(result.has_value());
EXPECT_FALSE(result.value().has_buffer());
ASSERT_TRUE(result.value().has_audio_config());
EXPECT_EQ(result.value().audio_config().codec(),
cast::media::AudioConfiguration_AudioCodec_AUDIO_CODEC_PCM);
EXPECT_EQ(result.value().audio_config().channel_layout(),
cast::media::
AudioConfiguration_ChannelLayout_CHANNEL_LAYOUT_SURROUND_5_1);
EXPECT_EQ(
result.value().audio_config().sample_format(),
cast::media::AudioConfiguration_SampleFormat_SAMPLE_FORMAT_PLANAR_S16);
EXPECT_EQ(result.value().audio_config().bytes_per_channel(),
config.bytes_per_channel);
EXPECT_EQ(result.value().audio_config().channel_number(),
config.channel_number);
EXPECT_EQ(result.value().audio_config().samples_per_second(),
config.samples_per_second);
EXPECT_EQ(result.value().audio_config().extra_data().size(),
config.extra_data.size());
EXPECT_EQ(result.value().audio_config().extra_data()[0],
config.extra_data[0]);
EXPECT_EQ(result.value().audio_config().extra_data()[1],
config.extra_data[1]);
EXPECT_EQ(result.value().audio_config().extra_data()[2],
config.extra_data[2]);
}
TEST_F(ProxyCallTranslatorTest, TestInternalHandleInitializeFailure) { TEST_F(ProxyCallTranslatorTest, TestInternalHandleInitializeFailure) {
EXPECT_CALL(translator_client_, OnError()); EXPECT_CALL(translator_client_, OnError());
translator_as_handler_->HandleInitializeResponse(failure_status_); translator_as_handler_->HandleInitializeResponse(failure_status_);
......
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