11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/ipc_streamer/audio_decoder_config_marshaller.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/ipc/media_message.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/audio_decoder_config.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media {
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst size_t kMaxExtraDataSize = 16 * 1024;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AudioDecoderConfigMarshaller::Write(
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ::media::AudioDecoderConfig& config, MediaMessage* msg) {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.codec()));
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.channel_layout()));
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.samples_per_second()));
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.sample_format()));
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.is_encrypted()));
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->WritePod(config.extra_data_size()));
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (config.extra_data_size() > 0)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(msg->WriteBuffer(config.extra_data(), config.extra_data_size()));
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci::media::AudioDecoderConfig AudioDecoderConfigMarshaller::Read(
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MediaMessage* msg) {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::media::AudioCodec codec;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::media::SampleFormat sample_format;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::media::ChannelLayout channel_layout;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int samples_per_second;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_encrypted;
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t extra_data_size;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<uint8[]> extra_data;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&codec));
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&channel_layout));
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&samples_per_second));
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&sample_format));
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&is_encrypted));
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(msg->ReadPod(&extra_data_size));
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_GE(codec, ::media::kUnknownAudioCodec);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LE(codec, ::media::kAudioCodecMax);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_GE(channel_layout, ::media::CHANNEL_LAYOUT_NONE);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LE(channel_layout, ::media::CHANNEL_LAYOUT_MAX);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_GE(sample_format, ::media::kUnknownSampleFormat);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LE(sample_format, ::media::kSampleFormatMax);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_LT(extra_data_size, kMaxExtraDataSize);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (extra_data_size > 0) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    extra_data.reset(new uint8[extra_data_size]);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(msg->ReadBuffer(extra_data.get(), extra_data_size));
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ::media::AudioDecoderConfig(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      codec, sample_format,
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      channel_layout, samples_per_second,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extra_data.get(), extra_data_size,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      is_encrypted);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace chromecast
71