Make CENC behavior of VP8/9 in ISO-BMFF the same as in WebM

- Disable subsample encryption for VP8 in ISO-BMFF
- Apply block alignment to all subsamples for VP9 in ISO-BMFF,
  instead of just superframes.

Change-Id: I8dd31cc16e87abc4d538330eaff9acb0509497df
This commit is contained in:
Kongqun Yang 2017-03-08 11:56:09 -08:00 committed by KongQun Yang
parent 95ef816740
commit b891e0271e
5 changed files with 14 additions and 24 deletions

View File

@ -7,7 +7,7 @@
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
</ContentProtection>
<Representation id="0" bandwidth="342199" codecs="vp08.00.00.08.01.01.00.00" mimeType="video/mp4" sar="1:1">
<Representation id="0" bandwidth="340983" codecs="vp08.00.00.08.01.01.00.00" mimeType="video/mp4" sar="1:1">
<BaseURL>output_video.mp4</BaseURL>
<SegmentBase indexRange="1019-1086" timescale="1000000">
<Initialization range="0-1018"/>

View File

@ -141,9 +141,6 @@ Status EncryptionHandler::ProcessStreamInfo(StreamInfo* stream_info) {
*stream_info, encryption_options_.max_sd_pixels,
encryption_options_.max_hd_pixels, encryption_options_.max_uhd1_pixels);
switch (video_codec_) {
case kCodecVP8:
vpx_parser_.reset(new VP8Parser);
break;
case kCodecVP9:
vpx_parser_.reset(new VP9Parser);
break;
@ -156,7 +153,7 @@ Status EncryptionHandler::ProcessStreamInfo(StreamInfo* stream_info) {
header_parser_.reset(new H265VideoSliceHeaderParser);
break;
default:
// Expect an audio codec with nalu length size == 0.
// Other codecs should have nalu length size == 0.
if (nalu_length_size_ > 0) {
LOG(WARNING) << "Unknown video codec '" << video_codec_ << "'";
return Status(error::ENCRYPTION_FAILURE, "Unknown video codec.");
@ -299,7 +296,8 @@ bool EncryptionHandler::CreateEncryptor(EncryptionKey* encryption_key) {
return initialized;
}
bool EncryptionHandler::EncryptVpxFrame(const std::vector<VPxFrameInfo>& vpx_frames,
bool EncryptionHandler::EncryptVpxFrame(
const std::vector<VPxFrameInfo>& vpx_frames,
MediaSample* sample,
DecryptConfig* decrypt_config) {
uint8_t* data = sample->writable_data();
@ -317,12 +315,10 @@ bool EncryptionHandler::EncryptVpxFrame(const std::vector<VPxFrameInfo>& vpx_fra
// ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
// The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
// avoid partial blocks in Subsamples.
if (is_superframe || encryption_options_.protection_scheme == FOURCC_cbc1 ||
encryption_options_.protection_scheme == FOURCC_cens) {
// For consistency, apply block alignment to all frames.
const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
clear_bytes += misalign_bytes;
cipher_bytes -= misalign_bytes;
}
decrypt_config->AddSubsample(clear_bytes, cipher_bytes);
if (cipher_bytes > 0)

View File

@ -79,9 +79,6 @@ EncryptingFragmenter::EncryptingFragmenter(
listener_(listener) {
DCHECK(encryption_key_);
switch (video_codec_) {
case kCodecVP8:
vpx_parser_.reset(new VP8Parser);
break;
case kCodecVP9:
vpx_parser_.reset(new VP9Parser);
break;
@ -280,13 +277,10 @@ Status EncryptingFragmenter::EncryptSample(
// ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
// The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
// avoid partial blocks in Subsamples.
if (is_superframe || protection_scheme_ == FOURCC_cbc1 ||
protection_scheme_ == FOURCC_cens) {
const uint16_t misalign_bytes =
subsample.cipher_bytes % kCencBlockSize;
// For consistency, apply block alignment to all frames.
const uint16_t misalign_bytes = subsample.cipher_bytes % kCencBlockSize;
subsample.clear_bytes += misalign_bytes;
subsample.cipher_bytes -= misalign_bytes;
}
sample_encryption_entry.subsamples.push_back(subsample);
if (subsample.cipher_bytes > 0)