Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 5 #ifndef CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 
| 6 #define CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 6 #define CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 
| 7 | 7 | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 #include <vector> | 9 #include <vector> | 
| 10 | 10 | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 kH264ScalableHigh, | 80 kH264ScalableHigh, | 
| 81 kH264Stereohigh, | 81 kH264Stereohigh, | 
| 82 kH264MultiviewHigh, | 82 kH264MultiviewHigh, | 
| 83 kVP8ProfileAny, | 83 kVP8ProfileAny, | 
| 84 kVP9ProfileAny, | 84 kVP9ProfileAny, | 
| 85 | 85 | 
| 86 kVideoProfileMin = kVideoProfileUnknown, | 86 kVideoProfileMin = kVideoProfileUnknown, | 
| 87 kVideoProfileMax = kVP9ProfileAny, | 87 kVideoProfileMax = kVP9ProfileAny, | 
| 88 }; | 88 }; | 
| 89 | 89 | 
| 90 // TODO(erickung): Remove constructor once CMA backend implementation does't | 90 // Specification of whether and how the stream is encrypted (in whole or part). | 
| 91 struct EncryptionScheme { | |
| 92 // Algorithm and mode that was used to encrypt the stream. | |
| 93 enum CipherMode { | |
| 94 kCipherModeNone, | |
| 95 kCipherModeAesCtr, | |
| 96 kCipherModeAesCbc | |
| 97 }; | |
| 98 | |
| 99 // V3 of the CENC standard will add pattern encryption, through two new | |
| 100 // protection schemes 'cens' (with AES-CTR) and 'cbcs' (with AES-CBC). | |
| 101 // The pattern applies only to the 'encrypted' part of the frame (as | |
| 102 // defined by the relevant subsample entries), and reduces further the | |
| 103 // actual encryption applied through a repeating pattern of (encrypt:skip) | |
| 104 // 16 byte blocks. For example, in a (1:9) pattern, the first block is | |
| 105 // encrypted, and the next nine are skipped. This pattern is applied | |
| 106 // repeatedly until the end of the last 16-byte block in the subsample. | |
| 107 // Any remaining bytes are left clear. | |
| 108 // If either or both of encrypt_blocks or skip_blocks is 0, pattern | |
| 109 // encryption is disabled. | |
| 110 struct PatternSpec { | |
| 111 PatternSpec(); | |
| 112 PatternSpec(uint32_t encrypt_blocks, uint32_t skip_blocks); | |
| 113 ~PatternSpec() {} | |
| 114 uint32_t encrypt_blocks; | |
| 115 uint32_t skip_blocks; | |
| 116 }; | |
| 117 | |
| 118 EncryptionScheme(); | |
| 119 explicit EncryptionScheme(bool is_encrypted); | |
| 
 
halliwell
2016/01/13 03:29:41
same comment as ::media::EncryptionScheme construc
 
dougsteed
2016/02/09 22:58:54
Done.
 
 | |
| 120 explicit EncryptionScheme(CipherMode mode); | |
| 121 EncryptionScheme(CipherMode mode, const PatternSpec& pattern); | |
| 122 ~EncryptionScheme() {} | |
| 123 | |
| 124 CipherMode mode; | |
| 125 PatternSpec pattern; | |
| 126 }; | |
| 127 | |
| 128 inline EncryptionScheme::PatternSpec::PatternSpec() | |
| 129 : encrypt_blocks(0), skip_blocks(0) { | |
| 130 } | |
| 131 | |
| 132 inline EncryptionScheme::PatternSpec::PatternSpec(uint32_t encrypt_blocks, | |
| 133 uint32_t skip_blocks) | |
| 134 : encrypt_blocks(encrypt_blocks), skip_blocks(skip_blocks) { | |
| 135 } | |
| 136 | |
| 137 inline EncryptionScheme::EncryptionScheme() | |
| 138 : mode(kCipherModeNone), pattern() { | |
| 139 } | |
| 140 | |
| 141 inline EncryptionScheme::EncryptionScheme(bool is_encrypted) | |
| 142 : mode(is_encrypted ? kCipherModeAesCtr : kCipherModeNone), | |
| 
 
halliwell
2016/01/13 03:29:41
Don't like 'true' being implicitly AesCtr.  Can we
 
dougsteed
2016/02/09 22:58:54
Done.
 
 | |
| 143 pattern() { | |
| 144 } | |
| 145 | |
| 146 inline EncryptionScheme::EncryptionScheme(CipherMode mode) | |
| 147 : mode(mode), pattern() { | |
| 148 } | |
| 149 | |
| 150 inline EncryptionScheme::EncryptionScheme(CipherMode mode, | |
| 151 const PatternSpec& pattern) | |
| 152 : mode(mode), pattern(pattern) { | |
| 153 } | |
| 154 | |
| 155 // TODO(erickung): Remove constructor once CMA backend implementation doesn't | |
| 91 // create a new object to reset the configuration and use IsValidConfig() to | 156 // create a new object to reset the configuration and use IsValidConfig() to | 
| 92 // determine if the configuration is still valid or not. | 157 // determine if the configuration is still valid or not. | 
| 93 struct AudioConfig { | 158 struct AudioConfig { | 
| 94 AudioConfig(); | 159 AudioConfig(); | 
| 95 ~AudioConfig(); | 160 ~AudioConfig(); | 
| 96 | 161 | 
| 162 bool is_encrypted() const; | |
| 163 | |
| 97 // Stream id. | 164 // Stream id. | 
| 98 StreamId id; | 165 StreamId id; | 
| 99 // Audio codec. | 166 // Audio codec. | 
| 100 AudioCodec codec; | 167 AudioCodec codec; | 
| 101 // The format of each audio sample. | 168 // The format of each audio sample. | 
| 102 SampleFormat sample_format; | 169 SampleFormat sample_format; | 
| 103 // Number of bytes in each channel. | 170 // Number of bytes in each channel. | 
| 104 int bytes_per_channel; | 171 int bytes_per_channel; | 
| 105 // Number of channels in this audio stream. | 172 // Number of channels in this audio stream. | 
| 106 int channel_number; | 173 int channel_number; | 
| 107 // Number of audio samples per second. | 174 // Number of audio samples per second. | 
| 108 int samples_per_second; | 175 int samples_per_second; | 
| 109 // Extra data buffer for certain codec initialization. | 176 // Extra data buffer for certain codec initialization. | 
| 110 std::vector<uint8_t> extra_data; | 177 std::vector<uint8_t> extra_data; | 
| 111 // content is encrypted or not. | 178 // Encryption scheme (if any) used for the content. | 
| 112 bool is_encrypted; | 179 EncryptionScheme encryption_scheme; | 
| 113 }; | 180 }; | 
| 114 | 181 | 
| 115 inline AudioConfig::AudioConfig() | 182 inline AudioConfig::AudioConfig() | 
| 116 : id(kPrimary), | 183 : id(kPrimary), | 
| 117 codec(kAudioCodecUnknown), | 184 codec(kAudioCodecUnknown), | 
| 118 sample_format(kUnknownSampleFormat), | 185 sample_format(kUnknownSampleFormat), | 
| 119 bytes_per_channel(0), | 186 bytes_per_channel(0), | 
| 120 channel_number(0), | 187 channel_number(0), | 
| 121 samples_per_second(0), | 188 samples_per_second(0), | 
| 122 is_encrypted(false) { | 189 encryption_scheme(false) { | 
| 
 
halliwell
2016/01/13 03:29:41
default initialisation of encryption_scheme should
 
dougsteed
2016/02/09 22:58:54
Done.
 
 | |
| 123 } | 190 } | 
| 124 | 191 | 
| 125 inline AudioConfig::~AudioConfig() { | 192 inline AudioConfig::~AudioConfig() { | 
| 126 } | 193 } | 
| 127 | 194 | 
| 195 // Normally a struct would not have a simple function member like this. However, | |
| 196 // the member |encryption_scheme| replaced a simple boolean, and a lot of code | |
| 197 // sites are only interested in whether encryption has been applied or not. | |
| 
 
halliwell
2016/01/13 03:29:41
let's just delete this comment, doesn't add any va
 
dougsteed
2016/02/09 22:58:54
Done.
 
 | |
| 198 inline bool AudioConfig::is_encrypted() const { | |
| 199 return encryption_scheme.mode != EncryptionScheme::kCipherModeNone; | |
| 200 } | |
| 201 | |
| 128 // TODO(erickung): Remove constructor once CMA backend implementation does't | 202 // TODO(erickung): Remove constructor once CMA backend implementation does't | 
| 129 // create a new object to reset the configuration and use IsValidConfig() to | 203 // create a new object to reset the configuration and use IsValidConfig() to | 
| 130 // determine if the configuration is still valid or not. | 204 // determine if the configuration is still valid or not. | 
| 131 struct VideoConfig { | 205 struct VideoConfig { | 
| 132 VideoConfig(); | 206 VideoConfig(); | 
| 133 ~VideoConfig(); | 207 ~VideoConfig(); | 
| 134 | 208 | 
| 209 bool is_encrypted() const; | |
| 210 | |
| 135 // Stream Id. | 211 // Stream Id. | 
| 136 StreamId id; | 212 StreamId id; | 
| 137 // Video codec. | 213 // Video codec. | 
| 138 VideoCodec codec; | 214 VideoCodec codec; | 
| 139 // Video codec profile. | 215 // Video codec profile. | 
| 140 VideoProfile profile; | 216 VideoProfile profile; | 
| 141 // Additional video config for the video stream if available. Consumers of | 217 // Additional video config for the video stream if available. Consumers of | 
| 142 // this structure should make an explicit copy of |additional_config| if it | 218 // this structure should make an explicit copy of |additional_config| if it | 
| 143 // will be used after SetConfig() finishes. | 219 // will be used after SetConfig() finishes. | 
| 144 VideoConfig* additional_config; | 220 VideoConfig* additional_config; | 
| 145 // Extra data buffer for certain codec initialization. | 221 // Extra data buffer for certain codec initialization. | 
| 146 std::vector<uint8_t> extra_data; | 222 std::vector<uint8_t> extra_data; | 
| 147 // content is encrypted or not. | 223 // Encryption scheme (if any) used for the content. | 
| 148 bool is_encrypted; | 224 EncryptionScheme encryption_scheme; | 
| 149 }; | 225 }; | 
| 150 | 226 | 
| 151 inline VideoConfig::VideoConfig() | 227 inline VideoConfig::VideoConfig() | 
| 152 : id(kPrimary), | 228 : id(kPrimary), | 
| 153 codec(kVideoCodecUnknown), | 229 codec(kVideoCodecUnknown), | 
| 154 profile(kVideoProfileUnknown), | 230 profile(kVideoProfileUnknown), | 
| 155 additional_config(nullptr), | 231 additional_config(nullptr), | 
| 156 is_encrypted(false) { | 232 encryption_scheme(false) { | 
| 157 } | 233 } | 
| 158 | 234 | 
| 159 inline VideoConfig::~VideoConfig() { | 235 inline VideoConfig::~VideoConfig() { | 
| 160 } | 236 } | 
| 161 | 237 | 
| 238 // See comment above for AudioConfig::is_encrypted(). | |
| 
 
halliwell
2016/01/13 03:29:41
delete
 
dougsteed
2016/02/09 22:58:53
Done.
 
 | |
| 239 inline bool VideoConfig::is_encrypted() const { | |
| 240 return encryption_scheme.mode != EncryptionScheme::kCipherModeNone; | |
| 241 } | |
| 242 | |
| 243 | |
| 162 // TODO(erickung): Remove following two inline IsValidConfig() functions. These | 244 // TODO(erickung): Remove following two inline IsValidConfig() functions. These | 
| 163 // are to keep existing CMA backend implementation consistent until the clean up | 245 // are to keep existing CMA backend implementation consistent until the clean up | 
| 164 // is done. These SHOULD NOT be used in New CMA backend implementation. | 246 // is done. These SHOULD NOT be used in New CMA backend implementation. | 
| 165 inline bool IsValidConfig(const AudioConfig& config) { | 247 inline bool IsValidConfig(const AudioConfig& config) { | 
| 166 return config.codec >= kAudioCodecMin && | 248 return config.codec >= kAudioCodecMin && | 
| 167 config.codec <= kAudioCodecMax && | 249 config.codec <= kAudioCodecMax && | 
| 168 config.codec != kAudioCodecUnknown && | 250 config.codec != kAudioCodecUnknown && | 
| 169 config.sample_format >= kSampleFormatMin && | 251 config.sample_format >= kSampleFormatMin && | 
| 170 config.sample_format <= kSampleFormatMax && | 252 config.sample_format <= kSampleFormatMax && | 
| 171 config.sample_format != kUnknownSampleFormat && | 253 config.sample_format != kUnknownSampleFormat && | 
| 172 config.channel_number > 0 && | 254 config.channel_number > 0 && | 
| 173 config.bytes_per_channel > 0 && | 255 config.bytes_per_channel > 0 && | 
| 174 config.bytes_per_channel <= kMaxBytesPerSample && | 256 config.bytes_per_channel <= kMaxBytesPerSample && | 
| 175 config.samples_per_second > 0 && | 257 config.samples_per_second > 0 && | 
| 176 config.samples_per_second <= kMaxSampleRate; | 258 config.samples_per_second <= kMaxSampleRate; | 
| 177 } | 259 } | 
| 178 | 260 | 
| 179 inline bool IsValidConfig(const VideoConfig& config) { | 261 inline bool IsValidConfig(const VideoConfig& config) { | 
| 180 return config.codec >= kVideoCodecMin && | 262 return config.codec >= kVideoCodecMin && | 
| 181 config.codec <= kVideoCodecMax && | 263 config.codec <= kVideoCodecMax && | 
| 182 config.codec != kVideoCodecUnknown; | 264 config.codec != kVideoCodecUnknown; | 
| 183 } | 265 } | 
| 184 | 266 | 
| 185 } // namespace media | 267 } // namespace media | 
| 186 } // namespace chromecast | 268 } // namespace chromecast | 
| 187 | 269 | 
| 188 #endif // CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 270 #endif // CHROMECAST_PUBLIC_MEDIA_DECODER_CONFIG_H_ | 
| OLD | NEW |