Index: chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.cc |
diff --git a/chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.cc b/chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.cc |
index 14eb742495f1ed97dd648749e14ba1252257d641..dc1f8f5714e926e16f254295000ddfe72d73b0ee 100644 |
--- a/chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.cc |
+++ b/chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.cc |
@@ -141,8 +141,24 @@ void DecoderBufferBaseMarshaller::Write( |
(buffer->decrypt_config() != NULL && |
buffer->decrypt_config()->iv().size() > 0); |
CHECK(msg->WritePod(has_decrypt_config)); |
- if (has_decrypt_config) |
- DecryptConfigMarshaller::Write(*buffer->decrypt_config(), msg); |
+ |
+ if (has_decrypt_config) { |
+ // DecryptConfig may contain 0 subsamples if all content is encrypted. |
+ // Map this case to a single fully-encrypted "subsample" for more consistent |
+ // backend handling. |
+ if (buffer->decrypt_config()->subsamples().empty()) { |
+ std::vector< ::media::SubsampleEntry> encrypted_subsample_list(1); |
+ encrypted_subsample_list[0].clear_bytes = 0; |
+ encrypted_subsample_list[0].cypher_bytes = buffer->data_size(); |
+ ::media::DecryptConfig full_sample_config( |
+ buffer->decrypt_config()->key_id(), |
+ buffer->decrypt_config()->iv(), |
+ encrypted_subsample_list); |
+ DecryptConfigMarshaller::Write(full_sample_config, msg); |
+ } else { |
+ DecryptConfigMarshaller::Write(*buffer->decrypt_config(), msg); |
+ } |
+ } |
CHECK(msg->WritePod(buffer->data_size())); |
CHECK(msg->WriteBuffer(buffer->data(), buffer->data_size())); |