blob: 540dd072cabe1780f29488c1fa31b32e74de9ea7 [file] [log] [blame]
// Copyright 2015 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_PUBLIC_MEDIA_DECODER_CONFIG_H_
#define CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_
#include <stdint.h>
#include <vector>
#include "stream_id.h"
namespace chromecast {
namespace media {
// Maximum audio bytes per sample.
static const int kMaxBytesPerSample = 4;
// Maximum audio sampling rate.
static const int kMaxSampleRate = 192000;
enum AudioCodec : int {
kAudioCodecUnknown = 0,
kCodecAAC,
kCodecMP3,
kCodecPCM,
kCodecPCM_S16BE,
kCodecVorbis,
kCodecOpus,
kCodecEAC3,
kCodecAC3,
kCodecDTS,
kCodecFLAC,
kAudioCodecMin = kAudioCodecUnknown,
kAudioCodecMax = kCodecFLAC,
};
enum SampleFormat : int {
kUnknownSampleFormat = 0,
kSampleFormatU8, // Unsigned 8-bit w/ bias of 128.
kSampleFormatS16, // Signed 16-bit.
kSampleFormatS32, // Signed 32-bit.
kSampleFormatF32, // Float 32-bit.
kSampleFormatPlanarS16, // Signed 16-bit planar.
kSampleFormatPlanarF32, // Float 32-bit planar.
kSampleFormatPlanarS32, // Signed 32-bit planar.
kSampleFormatS24, // Signed 24-bit.
kSampleFormatMin = kUnknownSampleFormat,
kSampleFormatMax = kSampleFormatS24,
};
enum VideoCodec : int {
kVideoCodecUnknown = 0,
kCodecH264,
kCodecVC1,
kCodecMPEG2,
kCodecMPEG4,
kCodecTheora,
kCodecVP8,
kCodecVP9,
kCodecHEVC,
kCodecDolbyVisionH264,
kCodecDolbyVisionHEVC,
kVideoCodecMin = kVideoCodecUnknown,
kVideoCodecMax = kCodecDolbyVisionHEVC,
};
// Profile for Video codec.
enum VideoProfile : int {
kVideoProfileUnknown = 0,
kH264Baseline,
kH264Main,
kH264Extended,
kH264High,
kH264High10,
kH264High422,
kH264High444Predictive,
kH264ScalableBaseline,
kH264ScalableHigh,
kH264Stereohigh,
kH264MultiviewHigh,
kVP8ProfileAny,
kVP9Profile0,
kVP9Profile1,
kVP9Profile2,
kVP9Profile3,
kDolbyVisionCompatible_EL_MD,
kDolbyVisionCompatible_BL_EL_MD,
kDolbyVisionNonCompatible_BL_MD,
kDolbyVisionNonCompatible_BL_EL_MD,
kVideoProfileMin = kVideoProfileUnknown,
kVideoProfileMax = kDolbyVisionNonCompatible_BL_EL_MD,
};
// Specification of whether and how the stream is encrypted (in whole or part).
struct EncryptionScheme {
// Algorithm and mode that was used to encrypt the stream.
enum CipherMode {
CIPHER_MODE_UNENCRYPTED,
CIPHER_MODE_AES_CTR,
CIPHER_MODE_AES_CBC
};
// CENC 3rd Edition adds pattern encryption, through two new protection
// schemes: 'cens' (with AES-CTR) and 'cbcs' (with AES-CBC).
// The pattern applies independently to each 'encrypted' part of the frame (as
// defined by the relevant subsample entries), and reduces further the
// actual encryption applied through a repeating pattern of (encrypt:skip)
// 16 byte blocks. For example, in a (1:9) pattern, the first block is
// encrypted, and the next nine are skipped. This pattern is applied
// repeatedly until the end of the last 16-byte block in the subsample.
// Any remaining bytes are left clear.
// If either of encrypt_blocks or skip_blocks is 0, pattern encryption is
// disabled.
struct Pattern {
Pattern() {}
Pattern(uint32_t encrypt_blocks, uint32_t skip_blocks);
~Pattern() {}
bool IsInEffect() const;
uint32_t encrypt_blocks = 0;
uint32_t skip_blocks = 0;
};
EncryptionScheme() {}
EncryptionScheme(CipherMode mode, const Pattern& pattern);
~EncryptionScheme() {}
bool is_encrypted() const { return mode != CIPHER_MODE_UNENCRYPTED; }
CipherMode mode = CIPHER_MODE_UNENCRYPTED;
Pattern pattern;
};
inline EncryptionScheme::Pattern::Pattern(uint32_t encrypt_blocks,
uint32_t skip_blocks)
: encrypt_blocks(encrypt_blocks), skip_blocks(skip_blocks) {
}
inline bool EncryptionScheme::Pattern::IsInEffect() const {
return encrypt_blocks != 0 && skip_blocks != 0;
}
inline EncryptionScheme::EncryptionScheme(CipherMode mode,
const Pattern& pattern)
: mode(mode), pattern(pattern) {
}
inline EncryptionScheme Unencrypted() {
return EncryptionScheme();
}
inline EncryptionScheme AesCtrEncryptionScheme() {
return EncryptionScheme(EncryptionScheme::CIPHER_MODE_AES_CTR,
EncryptionScheme::Pattern());
}
// TODO(erickung): Remove constructor once CMA backend implementation doesn't
// create a new object to reset the configuration and use IsValidConfig() to
// determine if the configuration is still valid or not.
struct AudioConfig {
AudioConfig();
AudioConfig(const AudioConfig& other);
~AudioConfig();
bool is_encrypted() const { return encryption_scheme.is_encrypted(); }
// Stream id.
StreamId id;
// Audio codec.
AudioCodec codec;
// The format of each audio sample.
SampleFormat sample_format;
// Number of bytes in each channel.
int bytes_per_channel;
// Number of channels in this audio stream.
int channel_number;
// Number of audio samples per second.
int samples_per_second;
// Extra data buffer for certain codec initialization.
std::vector<uint8_t> extra_data;
// Encryption scheme (if any) used for the content.
EncryptionScheme encryption_scheme;
};
inline AudioConfig::AudioConfig()
: id(kPrimary),
codec(kAudioCodecUnknown),
sample_format(kUnknownSampleFormat),
bytes_per_channel(0),
channel_number(0),
samples_per_second(0) {
}
inline AudioConfig::AudioConfig(const AudioConfig& other) = default;
inline AudioConfig::~AudioConfig() {
}
// TODO(erickung): Remove constructor once CMA backend implementation does't
// create a new object to reset the configuration and use IsValidConfig() to
// determine if the configuration is still valid or not.
struct VideoConfig {
VideoConfig();
VideoConfig(const VideoConfig& other);
~VideoConfig();
bool is_encrypted() const { return encryption_scheme.is_encrypted(); }
// Stream Id.
StreamId id;
// Video codec.
VideoCodec codec;
// Video codec profile.
VideoProfile profile;
// Additional video config for the video stream if available. Consumers of
// this structure should make an explicit copy of |additional_config| if it
// will be used after SetConfig() finishes.
VideoConfig* additional_config;
// Extra data buffer for certain codec initialization.
std::vector<uint8_t> extra_data;
// Encryption scheme (if any) used for the content.
EncryptionScheme encryption_scheme;
};
inline VideoConfig::VideoConfig()
: id(kPrimary),
codec(kVideoCodecUnknown),
profile(kVideoProfileUnknown),
additional_config(nullptr) {
}
inline VideoConfig::VideoConfig(const VideoConfig& other) = default;
inline VideoConfig::~VideoConfig() {
}
// TODO(erickung): Remove following two inline IsValidConfig() functions. These
// are to keep existing CMA backend implementation consistent until the clean up
// is done. These SHOULD NOT be used in New CMA backend implementation.
inline bool IsValidConfig(const AudioConfig& config) {
return config.codec >= kAudioCodecMin &&
config.codec <= kAudioCodecMax &&
config.codec != kAudioCodecUnknown &&
config.sample_format >= kSampleFormatMin &&
config.sample_format <= kSampleFormatMax &&
config.sample_format != kUnknownSampleFormat &&
config.channel_number > 0 &&
config.bytes_per_channel > 0 &&
config.bytes_per_channel <= kMaxBytesPerSample &&
config.samples_per_second > 0 &&
config.samples_per_second <= kMaxSampleRate;
}
inline bool IsValidConfig(const VideoConfig& config) {
return config.codec >= kVideoCodecMin &&
config.codec <= kVideoCodecMax &&
config.codec != kVideoCodecUnknown;
}
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_