audio_decoder_config_marshaller.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromecast/media/cma/ipc_streamer/audio_decoder_config_marshaller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromecast/media/cma/ipc/media_message.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_decoder_config.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromecast { 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace media { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)namespace { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const size_t kMaxExtraDataSize = 16 * 1024; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioDecoderConfigMarshaller::Write( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ::media::AudioDecoderConfig& config, MediaMessage* msg) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(msg->WritePod(config.codec())); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WritePod(config.channel_layout())); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WritePod(config.samples_per_second())); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WritePod(config.sample_format())); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WritePod(config.is_encrypted())); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WritePod(config.extra_data_size())); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config.extra_data_size() > 0) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->WriteBuffer(config.extra_data(), config.extra_data_size())); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)::media::AudioDecoderConfig AudioDecoderConfigMarshaller::Read( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaMessage* msg) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::media::AudioCodec codec; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::media::SampleFormat sample_format; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::media::ChannelLayout channel_layout; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int samples_per_second; 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_encrypted; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t extra_data_size; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<uint8[]> extra_data; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&codec)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&channel_layout)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&samples_per_second)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&sample_format)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&is_encrypted)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadPod(&extra_data_size)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_GE(codec, ::media::kUnknownAudioCodec); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_LE(codec, ::media::kAudioCodecMax); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_GE(channel_layout, ::media::CHANNEL_LAYOUT_NONE); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_LE(channel_layout, ::media::CHANNEL_LAYOUT_MAX); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_GE(sample_format, ::media::kUnknownSampleFormat); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_LE(sample_format, ::media::kSampleFormatMax); 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK_LT(extra_data_size, kMaxExtraDataSize); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra_data_size > 0) { 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extra_data.reset(new uint8[extra_data_size]); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(msg->ReadBuffer(extra_data.get(), extra_data_size)); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ::media::AudioDecoderConfig( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codec, sample_format, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_layout, samples_per_second, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data.get(), extra_data_size, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_encrypted); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromecast 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)