Fix WebM not encrypted when clear lead is set to 0

- Also regenerated test content to insert an iframe every one
  second: ffmpeg -i source.webm -auto-alt-ref 1 -g 30 out.webm
  This makes sure the content is actually encrypted with one
  second clear lead in end to end test.

Change-Id: I488143c148e2d6c45ba1586f6d0d835dc46db86e
This commit is contained in:
Kongqun Yang 2016-09-15 14:46:05 -07:00 committed by KongQun Yang
parent 47363dd06a
commit 5edd290694
4 changed files with 14 additions and 9 deletions

View File

@ -135,26 +135,20 @@ Status Segmenter::AddSample(scoped_refptr<MediaSample> sample) {
Status status; Status status;
bool wrote_frame = false; bool wrote_frame = false;
bool new_segment = false;
if (!cluster_) { if (!cluster_) {
status = NewSegment(sample->pts()); status = NewSegment(sample->pts());
new_segment = true;
// First frame, so no previous frame to write. // First frame, so no previous frame to write.
wrote_frame = true; wrote_frame = true;
} else if (segment_length_sec_ >= options_.segment_duration) { } else if (segment_length_sec_ >= options_.segment_duration) {
if (sample->is_key_frame() || !options_.segment_sap_aligned) { if (sample->is_key_frame() || !options_.segment_sap_aligned) {
status = WriteFrame(true /* write_duration */); status = WriteFrame(true /* write_duration */);
status.Update(NewSegment(sample->pts())); status.Update(NewSegment(sample->pts()));
new_segment = true;
segment_length_sec_ = 0; segment_length_sec_ = 0;
cluster_length_sec_ = 0; cluster_length_sec_ = 0;
wrote_frame = true; wrote_frame = true;
if (encryptor_ && !enable_encryption_) {
if (sample->pts() - first_timestamp_ >=
clear_lead_ * info_->time_scale()) {
enable_encryption_ = true;
if (muxer_listener_)
muxer_listener_->OnEncryptionStart();
}
}
} }
} else if (cluster_length_sec_ >= options_.fragment_duration) { } else if (cluster_length_sec_ >= options_.fragment_duration) {
if (sample->is_key_frame() || !options_.fragment_sap_aligned) { if (sample->is_key_frame() || !options_.fragment_sap_aligned) {
@ -172,6 +166,17 @@ Status Segmenter::AddSample(scoped_refptr<MediaSample> sample) {
// Encrypt the frame. // Encrypt the frame.
if (encryptor_) { if (encryptor_) {
// Don't enable encryption in the middle of a segment, i.e. only at the
// first frame of a segment.
if (new_segment && !enable_encryption_) {
if (sample->pts() - first_timestamp_ >=
clear_lead_ * info_->time_scale()) {
enable_encryption_ = true;
if (muxer_listener_)
muxer_listener_->OnEncryptionStart();
}
}
status = encryptor_->EncryptFrame(sample, enable_encryption_); status = encryptor_->EncryptFrame(sample, enable_encryption_);
if (!status.ok()) { if (!status.ok()) {
LOG(ERROR) << "Error encrypting frame."; LOG(ERROR) << "Error encrypting frame.";