diff options
author | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-12 01:04:33 +0000 |
---|---|---|
committer | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-12 01:04:33 +0000 |
commit | 37141711d11b09cef8405c4c2384549dad316fe9 (patch) | |
tree | 82c6e743cb9b011d5e600069ebb42e4098b1ec81 /media/webm/webm_stream_parser.cc | |
parent | 8f92ac14a5a83d336f97317a7292394f187d5c16 (diff) | |
download | chromium_src-37141711d11b09cef8405c4c2384549dad316fe9.zip chromium_src-37141711d11b09cef8405c4c2384549dad316fe9.tar.gz chromium_src-37141711d11b09cef8405c4c2384549dad316fe9.tar.bz2 |
Support encrypted audio stream in demuxer.
BUG=123421
TEST=updated media_unittest
Review URL: https://chromiumcodereview.appspot.com/11088047
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@161465 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm/webm_stream_parser.cc')
-rw-r--r-- | media/webm/webm_stream_parser.cc | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc index b0a18e3..2e34ed9 100644 --- a/media/webm/webm_stream_parser.cc +++ b/media/webm/webm_stream_parser.cc @@ -351,6 +351,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(tracks_parser.audio_encryption_key_id()); + } 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 +387,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(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 +401,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); @@ -455,4 +469,12 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) { return bytes_parsed; } +void WebMStreamParser::FireNeedKey(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); +} + } // namespace media |