Chromium Code Reviews| Index: media/webm/webm_stream_parser.cc |
| diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc |
| index b0a18e3659860bd0a653bacc1981b274960b9464..514f9401fa339f4281b48569e7b9c803aa0d8adc 100644 |
| --- a/media/webm/webm_stream_parser.cc |
| +++ b/media/webm/webm_stream_parser.cc |
| @@ -19,6 +19,16 @@ |
| namespace media { |
| +// Fire needkey event through the |need_key_cb|. |
| +static void FireNeedKey(const StreamParser::NeedKeyCB& need_key_cb, |
| + const std::string& key_id) { |
| + int key_id_size = key_id.size(); |
| + DCHECK_GT(key_id_size, 0); |
| + scoped_array<uint8> key_id_array(new uint8[key_id_size]); |
| + memcpy(key_id_array.get(), key_id.data(), key_id_size); |
| + need_key_cb.Run(key_id_array.Pass(), key_id_size); |
| +} |
| + |
| // Helper class that uses FFmpeg to create AudioDecoderConfig & |
| // VideoDecoderConfig objects. |
| // |
| @@ -351,6 +361,25 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { |
| return -1; |
| } |
| + bool is_audio_encrypted = !tracks_parser.audio_encryption_key_id().empty(); |
| + AudioDecoderConfig audio_config; |
| + if (is_audio_encrypted) { |
| + const AudioDecoderConfig& original_audio_config = |
| + config_helper.audio_config(); |
| + |
| + audio_config.Initialize(original_audio_config.codec(), |
| + original_audio_config.bits_per_channel(), |
| + original_audio_config.channel_layout(), |
| + original_audio_config.samples_per_second(), |
| + original_audio_config.extra_data(), |
| + original_audio_config.extra_data_size(), |
| + is_audio_encrypted, false); |
| + |
| + FireNeedKey(need_key_cb_, tracks_parser.audio_encryption_key_id()); |
|
acolwell GONE FROM CHROMIUM
2012/10/11 01:11:24
nit: Why are you using a static function here inst
xhwang
2012/10/11 16:36:10
Done.
|
| + } else { |
| + audio_config.CopyFrom(config_helper.audio_config()); |
| + } |
| + |
| // TODO(xhwang): Support decryption of audio (see http://crbug.com/123421). |
| bool is_video_encrypted = !tracks_parser.video_encryption_key_id().empty(); |
| @@ -368,18 +397,12 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { |
| original_video_config.extra_data_size(), |
| is_video_encrypted, false); |
| - // Fire needkey event. |
| - std::string key_id = tracks_parser.video_encryption_key_id(); |
| - int key_id_size = key_id.size(); |
| - DCHECK_GT(key_id_size, 0); |
| - scoped_array<uint8> key_id_array(new uint8[key_id_size]); |
| - memcpy(key_id_array.get(), key_id.data(), key_id_size); |
| - need_key_cb_.Run(key_id_array.Pass(), key_id_size); |
| + FireNeedKey(need_key_cb_, tracks_parser.video_encryption_key_id()); |
| } else { |
| video_config.CopyFrom(config_helper.video_config()); |
| } |
| - if (!config_cb_.Run(config_helper.audio_config(), video_config)) { |
| + if (!config_cb_.Run(audio_config, video_config)) { |
| DVLOG(1) << "New config data isn't allowed."; |
| return -1; |
| } |
| @@ -388,6 +411,7 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { |
| info_parser.timecode_scale(), |
| tracks_parser.audio_track_num(), |
| tracks_parser.video_track_num(), |
| + tracks_parser.audio_encryption_key_id(), |
| tracks_parser.video_encryption_key_id())); |
| ChangeState(kParsingClusters); |