summaryrefslogtreecommitdiffstats
path: root/media/webm/webm_stream_parser.cc
diff options
context:
space:
mode:
authorxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-12 01:04:33 +0000
committerxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-12 01:04:33 +0000
commit37141711d11b09cef8405c4c2384549dad316fe9 (patch)
tree82c6e743cb9b011d5e600069ebb42e4098b1ec81 /media/webm/webm_stream_parser.cc
parent8f92ac14a5a83d336f97317a7292394f187d5c16 (diff)
downloadchromium_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.cc38
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