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)