Commit 272aec14 authored by acolwell's avatar acolwell Committed by Commit bot

Fix TrackRunIterator to generate a parse error when it encounters a reserved dependency value.

Replaces a CHECK() with a parser error when reserved "depends on" values
appear in the sample flags.

BUG=410404
TESTS=TrackRunIteratorTest.SampleInfoTest_ReservedInSampleFlags,
 TrackRunIteratorTest.SampleInfoTest_ReservedInDefaultSampleFlags

Review URL: https://codereview.chromium.org/540503003

Cr-Commit-Position: refs/heads/master@{#293596}
parent 3f1281e5
...@@ -88,13 +88,14 @@ TrackRunIterator::TrackRunIterator(const Movie* moov, ...@@ -88,13 +88,14 @@ TrackRunIterator::TrackRunIterator(const Movie* moov,
TrackRunIterator::~TrackRunIterator() {} TrackRunIterator::~TrackRunIterator() {}
static void PopulateSampleInfo(const TrackExtends& trex, static bool PopulateSampleInfo(const TrackExtends& trex,
const TrackFragmentHeader& tfhd, const TrackFragmentHeader& tfhd,
const TrackFragmentRun& trun, const TrackFragmentRun& trun,
const int64 edit_list_offset, const int64 edit_list_offset,
const uint32 i, const uint32 i,
SampleInfo* sample_info, SampleInfo* sample_info,
const SampleDependsOn sdtp_sample_depends_on) { const SampleDependsOn sdtp_sample_depends_on,
const LogCB& log_cb) {
if (i < trun.sample_sizes.size()) { if (i < trun.sample_sizes.size()) {
sample_info->size = trun.sample_sizes[i]; sample_info->size = trun.sample_sizes[i];
} else if (tfhd.default_sample_size > 0) { } else if (tfhd.default_sample_size > 0) {
...@@ -156,8 +157,10 @@ static void PopulateSampleInfo(const TrackExtends& trex, ...@@ -156,8 +157,10 @@ static void PopulateSampleInfo(const TrackExtends& trex,
break; break;
case kSampleDependsOnReserved: case kSampleDependsOnReserved:
CHECK(false); MEDIA_LOG(log_cb) << "Reserved value used in sample dependency info.";
return false;
} }
return true;
} }
// In well-structured encrypted media, each track run will be immediately // In well-structured encrypted media, each track run will be immediately
...@@ -300,8 +303,13 @@ bool TrackRunIterator::Init(const MovieFragment& moof) { ...@@ -300,8 +303,13 @@ bool TrackRunIterator::Init(const MovieFragment& moof) {
tri.samples.resize(trun.sample_count); tri.samples.resize(trun.sample_count);
for (size_t k = 0; k < trun.sample_count; k++) { for (size_t k = 0; k < trun.sample_count; k++) {
PopulateSampleInfo(*trex, traf.header, trun, edit_list_offset, if (!PopulateSampleInfo(*trex, traf.header, trun, edit_list_offset,
k, &tri.samples[k], traf.sdtp.sample_depends_on(k)); k, &tri.samples[k],
traf.sdtp.sample_depends_on(k),
log_cb_)) {
return false;
}
run_start_dts += tri.samples[k].duration; run_start_dts += tri.samples[k].duration;
if (!is_sample_to_group_valid) { if (!is_sample_to_group_valid) {
......
...@@ -108,6 +108,9 @@ class TrackRunIteratorTest : public testing::Test { ...@@ -108,6 +108,9 @@ class TrackRunIteratorTest : public testing::Test {
case 'N': case 'N':
sample_depends_on = kSampleDependsOnNoOther; sample_depends_on = kSampleDependsOnNoOther;
break; break;
case 'R':
sample_depends_on = kSampleDependsOnReserved;
break;
default: default:
CHECK(false) << "Invalid sample dependency character '" CHECK(false) << "Invalid sample dependency character '"
<< str[0] << "'"; << str[0] << "'";
...@@ -369,6 +372,25 @@ TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) { ...@@ -369,6 +372,25 @@ TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) {
EXPECT_EQ("2 KR P P P P P P P P P", KeyframeAndRAPInfo(iter_.get())); EXPECT_EQ("2 KR P P P P P P P P P", KeyframeAndRAPInfo(iter_.get()));
} }
// Verify that parsing fails if a reserved value is in the sample flags.
TEST_F(TrackRunIteratorTest, SampleInfoTest_ReservedInSampleFlags) {
iter_.reset(new TrackRunIterator(&moov_, log_cb_));
MovieFragment moof = CreateFragment();
// Change the "depends on" field on one of the samples to a
// reserved value.
moof.tracks[1].runs[0].sample_flags[0] = ToSampleFlags("RS");
ASSERT_FALSE(iter_->Init(moof));
}
// Verify that parsing fails if a reserved value is in the default sample flags.
TEST_F(TrackRunIteratorTest, SampleInfoTest_ReservedInDefaultSampleFlags) {
iter_.reset(new TrackRunIterator(&moov_, log_cb_));
MovieFragment moof = CreateFragment();
// Set the default flag to contain a reserved "depends on" value.
moof.tracks[0].header.default_sample_flags = ToSampleFlags("RN");
ASSERT_FALSE(iter_->Init(moof));
}
TEST_F(TrackRunIteratorTest, ReorderingTest) { TEST_F(TrackRunIteratorTest, ReorderingTest) {
// Test frame reordering and edit list support. The frames have the following // Test frame reordering and edit list support. The frames have the following
// decode timestamps: // decode timestamps:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment