1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #include "gtest/gtest.h"
9*103e46e4SHarish Mahendrakar
10*103e46e4SHarish Mahendrakar #include <array>
11*103e46e4SHarish Mahendrakar #include <cstdint>
12*103e46e4SHarish Mahendrakar #include <cstdio>
13*103e46e4SHarish Mahendrakar #include <cstring>
14*103e46e4SHarish Mahendrakar #include <iomanip>
15*103e46e4SHarish Mahendrakar #include <string>
16*103e46e4SHarish Mahendrakar
17*103e46e4SHarish Mahendrakar #include "common/hdr_util.h"
18*103e46e4SHarish Mahendrakar #include "mkvparser/mkvparser.h"
19*103e46e4SHarish Mahendrakar #include "mkvparser/mkvreader.h"
20*103e46e4SHarish Mahendrakar #include "testing/test_util.h"
21*103e46e4SHarish Mahendrakar
22*103e46e4SHarish Mahendrakar using mkvparser::AudioTrack;
23*103e46e4SHarish Mahendrakar using mkvparser::Block;
24*103e46e4SHarish Mahendrakar using mkvparser::BlockEntry;
25*103e46e4SHarish Mahendrakar using mkvparser::BlockGroup;
26*103e46e4SHarish Mahendrakar using mkvparser::Cluster;
27*103e46e4SHarish Mahendrakar using mkvparser::CuePoint;
28*103e46e4SHarish Mahendrakar using mkvparser::Cues;
29*103e46e4SHarish Mahendrakar using mkvparser::MkvReader;
30*103e46e4SHarish Mahendrakar using mkvparser::Segment;
31*103e46e4SHarish Mahendrakar using mkvparser::SegmentInfo;
32*103e46e4SHarish Mahendrakar using mkvparser::Track;
33*103e46e4SHarish Mahendrakar using mkvparser::Tracks;
34*103e46e4SHarish Mahendrakar using mkvparser::VideoTrack;
35*103e46e4SHarish Mahendrakar
36*103e46e4SHarish Mahendrakar namespace test {
37*103e46e4SHarish Mahendrakar
38*103e46e4SHarish Mahendrakar // Base class containing boiler plate stuff.
39*103e46e4SHarish Mahendrakar class ParserTest : public testing::Test {
40*103e46e4SHarish Mahendrakar public:
ParserTest()41*103e46e4SHarish Mahendrakar ParserTest() : is_reader_open_(false), segment_(NULL) {
42*103e46e4SHarish Mahendrakar memset(dummy_data_, -1, kFrameLength);
43*103e46e4SHarish Mahendrakar memset(gold_frame_, 0, kFrameLength);
44*103e46e4SHarish Mahendrakar }
45*103e46e4SHarish Mahendrakar
~ParserTest()46*103e46e4SHarish Mahendrakar virtual ~ParserTest() {
47*103e46e4SHarish Mahendrakar CloseReader();
48*103e46e4SHarish Mahendrakar if (segment_ != NULL) {
49*103e46e4SHarish Mahendrakar delete segment_;
50*103e46e4SHarish Mahendrakar segment_ = NULL;
51*103e46e4SHarish Mahendrakar }
52*103e46e4SHarish Mahendrakar }
53*103e46e4SHarish Mahendrakar
CloseReader()54*103e46e4SHarish Mahendrakar void CloseReader() {
55*103e46e4SHarish Mahendrakar if (is_reader_open_) {
56*103e46e4SHarish Mahendrakar reader_.Close();
57*103e46e4SHarish Mahendrakar }
58*103e46e4SHarish Mahendrakar is_reader_open_ = false;
59*103e46e4SHarish Mahendrakar }
60*103e46e4SHarish Mahendrakar
CreateAndLoadSegment(const std::string & filename,int expected_doc_type_ver)61*103e46e4SHarish Mahendrakar bool CreateAndLoadSegment(const std::string& filename,
62*103e46e4SHarish Mahendrakar int expected_doc_type_ver) {
63*103e46e4SHarish Mahendrakar filename_ = GetTestFilePath(filename);
64*103e46e4SHarish Mahendrakar if (reader_.Open(filename_.c_str())) {
65*103e46e4SHarish Mahendrakar return false;
66*103e46e4SHarish Mahendrakar }
67*103e46e4SHarish Mahendrakar is_reader_open_ = true;
68*103e46e4SHarish Mahendrakar pos_ = 0;
69*103e46e4SHarish Mahendrakar mkvparser::EBMLHeader ebml_header;
70*103e46e4SHarish Mahendrakar ebml_header.Parse(&reader_, pos_);
71*103e46e4SHarish Mahendrakar EXPECT_EQ(1, ebml_header.m_version);
72*103e46e4SHarish Mahendrakar EXPECT_EQ(1, ebml_header.m_readVersion);
73*103e46e4SHarish Mahendrakar EXPECT_STREQ("webm", ebml_header.m_docType);
74*103e46e4SHarish Mahendrakar EXPECT_EQ(expected_doc_type_ver, ebml_header.m_docTypeVersion);
75*103e46e4SHarish Mahendrakar EXPECT_EQ(2, ebml_header.m_docTypeReadVersion);
76*103e46e4SHarish Mahendrakar
77*103e46e4SHarish Mahendrakar if (mkvparser::Segment::CreateInstance(&reader_, pos_, segment_)) {
78*103e46e4SHarish Mahendrakar return false;
79*103e46e4SHarish Mahendrakar }
80*103e46e4SHarish Mahendrakar return !HasFailure() && segment_->Load() >= 0;
81*103e46e4SHarish Mahendrakar }
82*103e46e4SHarish Mahendrakar
CreateAndLoadSegment(const std::string & filename)83*103e46e4SHarish Mahendrakar bool CreateAndLoadSegment(const std::string& filename) {
84*103e46e4SHarish Mahendrakar return CreateAndLoadSegment(filename, 4);
85*103e46e4SHarish Mahendrakar }
86*103e46e4SHarish Mahendrakar
CreateSegmentNoHeaderChecks(const std::string & filename)87*103e46e4SHarish Mahendrakar void CreateSegmentNoHeaderChecks(const std::string& filename) {
88*103e46e4SHarish Mahendrakar filename_ = GetTestFilePath(filename);
89*103e46e4SHarish Mahendrakar ASSERT_NE(0u, filename_.length());
90*103e46e4SHarish Mahendrakar ASSERT_EQ(0, reader_.Open(filename_.c_str()));
91*103e46e4SHarish Mahendrakar mkvparser::EBMLHeader ebml_header;
92*103e46e4SHarish Mahendrakar ASSERT_EQ(0, ebml_header.Parse(&reader_, pos_));
93*103e46e4SHarish Mahendrakar ASSERT_EQ(0, mkvparser::Segment::CreateInstance(&reader_, pos_, segment_));
94*103e46e4SHarish Mahendrakar }
95*103e46e4SHarish Mahendrakar
CompareBlockContents(const Cluster * const cluster,const Block * const block,std::uint64_t timestamp,int track_number,bool is_key,int frame_count)96*103e46e4SHarish Mahendrakar void CompareBlockContents(const Cluster* const cluster,
97*103e46e4SHarish Mahendrakar const Block* const block, std::uint64_t timestamp,
98*103e46e4SHarish Mahendrakar int track_number, bool is_key, int frame_count) {
99*103e46e4SHarish Mahendrakar ASSERT_TRUE(block != NULL);
100*103e46e4SHarish Mahendrakar EXPECT_EQ(track_number, block->GetTrackNumber());
101*103e46e4SHarish Mahendrakar EXPECT_EQ(static_cast<long long>(timestamp), block->GetTime(cluster));
102*103e46e4SHarish Mahendrakar EXPECT_EQ(is_key, block->IsKey());
103*103e46e4SHarish Mahendrakar EXPECT_EQ(frame_count, block->GetFrameCount());
104*103e46e4SHarish Mahendrakar const Block::Frame& frame = block->GetFrame(0);
105*103e46e4SHarish Mahendrakar EXPECT_EQ(kFrameLength, frame.len);
106*103e46e4SHarish Mahendrakar std::memset(dummy_data_, -1, kFrameLength);
107*103e46e4SHarish Mahendrakar frame.Read(&reader_, dummy_data_);
108*103e46e4SHarish Mahendrakar EXPECT_EQ(0, std::memcmp(gold_frame_, dummy_data_, kFrameLength));
109*103e46e4SHarish Mahendrakar }
110*103e46e4SHarish Mahendrakar
CompareCuePointContents(const Track * const track,const CuePoint * const cue_point,std::uint64_t timestamp,int track_number,std::uint64_t pos)111*103e46e4SHarish Mahendrakar void CompareCuePointContents(const Track* const track,
112*103e46e4SHarish Mahendrakar const CuePoint* const cue_point,
113*103e46e4SHarish Mahendrakar std::uint64_t timestamp, int track_number,
114*103e46e4SHarish Mahendrakar std::uint64_t pos) {
115*103e46e4SHarish Mahendrakar ASSERT_TRUE(cue_point != NULL);
116*103e46e4SHarish Mahendrakar EXPECT_EQ(static_cast<long long>(timestamp), cue_point->GetTime(segment_));
117*103e46e4SHarish Mahendrakar const CuePoint::TrackPosition* const track_position =
118*103e46e4SHarish Mahendrakar cue_point->Find(track);
119*103e46e4SHarish Mahendrakar EXPECT_EQ(track_number, track_position->m_track);
120*103e46e4SHarish Mahendrakar EXPECT_EQ(static_cast<long long>(pos), track_position->m_pos);
121*103e46e4SHarish Mahendrakar }
122*103e46e4SHarish Mahendrakar
123*103e46e4SHarish Mahendrakar protected:
124*103e46e4SHarish Mahendrakar MkvReader reader_;
125*103e46e4SHarish Mahendrakar bool is_reader_open_;
126*103e46e4SHarish Mahendrakar Segment* segment_;
127*103e46e4SHarish Mahendrakar std::string filename_;
128*103e46e4SHarish Mahendrakar long long pos_;
129*103e46e4SHarish Mahendrakar std::uint8_t dummy_data_[kFrameLength];
130*103e46e4SHarish Mahendrakar std::uint8_t gold_frame_[kFrameLength];
131*103e46e4SHarish Mahendrakar };
132*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,SegmentInfo)133*103e46e4SHarish Mahendrakar TEST_F(ParserTest, SegmentInfo) {
134*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("segment_info.webm"));
135*103e46e4SHarish Mahendrakar const SegmentInfo* const info = segment_->GetInfo();
136*103e46e4SHarish Mahendrakar EXPECT_EQ(kTimeCodeScale, info->GetTimeCodeScale());
137*103e46e4SHarish Mahendrakar EXPECT_STREQ(kAppString, info->GetMuxingAppAsUTF8());
138*103e46e4SHarish Mahendrakar EXPECT_STREQ(kAppString, info->GetWritingAppAsUTF8());
139*103e46e4SHarish Mahendrakar }
140*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,TrackEntries)141*103e46e4SHarish Mahendrakar TEST_F(ParserTest, TrackEntries) {
142*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("tracks.webm"));
143*103e46e4SHarish Mahendrakar const Tracks* const tracks = segment_->GetTracks();
144*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 2;
145*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, tracks->GetTracksCount());
146*103e46e4SHarish Mahendrakar for (int i = 0; i < 2; ++i) {
147*103e46e4SHarish Mahendrakar const Track* const track = tracks->GetTrackByIndex(i);
148*103e46e4SHarish Mahendrakar ASSERT_TRUE(track != NULL);
149*103e46e4SHarish Mahendrakar EXPECT_STREQ(kTrackName, track->GetNameAsUTF8());
150*103e46e4SHarish Mahendrakar if (track->GetType() == Track::kVideo) {
151*103e46e4SHarish Mahendrakar const VideoTrack* const video_track =
152*103e46e4SHarish Mahendrakar dynamic_cast<const VideoTrack*>(track);
153*103e46e4SHarish Mahendrakar EXPECT_EQ(kWidth, static_cast<int>(video_track->GetWidth()));
154*103e46e4SHarish Mahendrakar EXPECT_EQ(kHeight, static_cast<int>(video_track->GetHeight()));
155*103e46e4SHarish Mahendrakar EXPECT_STREQ(kVP8CodecId, video_track->GetCodecId());
156*103e46e4SHarish Mahendrakar EXPECT_DOUBLE_EQ(kVideoFrameRate, video_track->GetFrameRate());
157*103e46e4SHarish Mahendrakar const unsigned int kTrackUid = 1;
158*103e46e4SHarish Mahendrakar EXPECT_EQ(kTrackUid, video_track->GetUid());
159*103e46e4SHarish Mahendrakar } else if (track->GetType() == Track::kAudio) {
160*103e46e4SHarish Mahendrakar const AudioTrack* const audio_track =
161*103e46e4SHarish Mahendrakar dynamic_cast<const AudioTrack*>(track);
162*103e46e4SHarish Mahendrakar EXPECT_EQ(kSampleRate, audio_track->GetSamplingRate());
163*103e46e4SHarish Mahendrakar EXPECT_EQ(kChannels, audio_track->GetChannels());
164*103e46e4SHarish Mahendrakar EXPECT_EQ(kBitDepth, audio_track->GetBitDepth());
165*103e46e4SHarish Mahendrakar EXPECT_STREQ(kVorbisCodecId, audio_track->GetCodecId());
166*103e46e4SHarish Mahendrakar const unsigned int kTrackUid = 2;
167*103e46e4SHarish Mahendrakar EXPECT_EQ(kTrackUid, audio_track->GetUid());
168*103e46e4SHarish Mahendrakar }
169*103e46e4SHarish Mahendrakar }
170*103e46e4SHarish Mahendrakar }
171*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,SimpleBlock)172*103e46e4SHarish Mahendrakar TEST_F(ParserTest, SimpleBlock) {
173*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("simple_block.webm"));
174*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
175*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
176*103e46e4SHarish Mahendrakar
177*103e46e4SHarish Mahendrakar // Get the cluster
178*103e46e4SHarish Mahendrakar const Cluster* cluster = segment_->GetFirst();
179*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
180*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
181*103e46e4SHarish Mahendrakar
182*103e46e4SHarish Mahendrakar // Get the first block
183*103e46e4SHarish Mahendrakar const BlockEntry* block_entry;
184*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
185*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
186*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
187*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 0, kVideoTrackNumber,
188*103e46e4SHarish Mahendrakar false, 1);
189*103e46e4SHarish Mahendrakar
190*103e46e4SHarish Mahendrakar // Get the second block
191*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
192*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
193*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
194*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 2000000,
195*103e46e4SHarish Mahendrakar kVideoTrackNumber, false, 1);
196*103e46e4SHarish Mahendrakar
197*103e46e4SHarish Mahendrakar // End of Stream
198*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
199*103e46e4SHarish Mahendrakar ASSERT_EQ(NULL, block_entry);
200*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
201*103e46e4SHarish Mahendrakar EXPECT_TRUE(cluster->EOS());
202*103e46e4SHarish Mahendrakar }
203*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,MultipleClusters)204*103e46e4SHarish Mahendrakar TEST_F(ParserTest, MultipleClusters) {
205*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("force_new_cluster.webm"));
206*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
207*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
208*103e46e4SHarish Mahendrakar
209*103e46e4SHarish Mahendrakar // Get the first cluster
210*103e46e4SHarish Mahendrakar const Cluster* cluster = segment_->GetFirst();
211*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
212*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
213*103e46e4SHarish Mahendrakar
214*103e46e4SHarish Mahendrakar // Get the first block
215*103e46e4SHarish Mahendrakar const BlockEntry* block_entry;
216*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
217*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
218*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
219*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 0, kVideoTrackNumber,
220*103e46e4SHarish Mahendrakar false, 1);
221*103e46e4SHarish Mahendrakar
222*103e46e4SHarish Mahendrakar // Get the second cluster
223*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
224*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, block_entry);
225*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
226*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
227*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
228*103e46e4SHarish Mahendrakar
229*103e46e4SHarish Mahendrakar // Get the second block
230*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
231*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
232*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
233*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 2000000,
234*103e46e4SHarish Mahendrakar kVideoTrackNumber, false, 1);
235*103e46e4SHarish Mahendrakar
236*103e46e4SHarish Mahendrakar // Get the third block
237*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
238*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
239*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
240*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 4000000,
241*103e46e4SHarish Mahendrakar kVideoTrackNumber, false, 1);
242*103e46e4SHarish Mahendrakar
243*103e46e4SHarish Mahendrakar // Get the third cluster
244*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
245*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, block_entry);
246*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
247*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
248*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
249*103e46e4SHarish Mahendrakar
250*103e46e4SHarish Mahendrakar // Get the fourth block
251*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
252*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
253*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
254*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_entry->GetBlock(), 6000000,
255*103e46e4SHarish Mahendrakar kVideoTrackNumber, false, 1);
256*103e46e4SHarish Mahendrakar
257*103e46e4SHarish Mahendrakar // End of Stream
258*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
259*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, block_entry);
260*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
261*103e46e4SHarish Mahendrakar EXPECT_TRUE(cluster->EOS());
262*103e46e4SHarish Mahendrakar }
263*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,BlockGroup)264*103e46e4SHarish Mahendrakar TEST_F(ParserTest, BlockGroup) {
265*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("metadata_block.webm"));
266*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
267*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
268*103e46e4SHarish Mahendrakar
269*103e46e4SHarish Mahendrakar // Get the cluster
270*103e46e4SHarish Mahendrakar const Cluster* cluster = segment_->GetFirst();
271*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
272*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
273*103e46e4SHarish Mahendrakar
274*103e46e4SHarish Mahendrakar // Get the first block
275*103e46e4SHarish Mahendrakar const BlockEntry* block_entry;
276*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
277*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
278*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
279*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::Kind::kBlockGroup, block_entry->GetKind());
280*103e46e4SHarish Mahendrakar const BlockGroup* block_group = static_cast<const BlockGroup*>(block_entry);
281*103e46e4SHarish Mahendrakar EXPECT_EQ(2, block_group->GetDurationTimeCode());
282*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_group->GetBlock(), 0,
283*103e46e4SHarish Mahendrakar kMetadataTrackNumber, true, 1);
284*103e46e4SHarish Mahendrakar
285*103e46e4SHarish Mahendrakar // Get the second block
286*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
287*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
288*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
289*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::Kind::kBlockGroup, block_entry->GetKind());
290*103e46e4SHarish Mahendrakar block_group = static_cast<const BlockGroup*>(block_entry);
291*103e46e4SHarish Mahendrakar EXPECT_EQ(6, block_group->GetDurationTimeCode());
292*103e46e4SHarish Mahendrakar CompareBlockContents(cluster, block_group->GetBlock(), 2000000,
293*103e46e4SHarish Mahendrakar kMetadataTrackNumber, true, 1);
294*103e46e4SHarish Mahendrakar
295*103e46e4SHarish Mahendrakar // End of Stream
296*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
297*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, block_entry);
298*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
299*103e46e4SHarish Mahendrakar EXPECT_TRUE(cluster->EOS());
300*103e46e4SHarish Mahendrakar }
301*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Cues)302*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Cues) {
303*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("output_cues.webm"));
304*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
305*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
306*103e46e4SHarish Mahendrakar
307*103e46e4SHarish Mahendrakar const Track* const track = segment_->GetTracks()->GetTrackByIndex(0);
308*103e46e4SHarish Mahendrakar const Cues* const cues = segment_->GetCues();
309*103e46e4SHarish Mahendrakar ASSERT_TRUE(cues != NULL);
310*103e46e4SHarish Mahendrakar while (!cues->DoneParsing()) {
311*103e46e4SHarish Mahendrakar cues->LoadCuePoint();
312*103e46e4SHarish Mahendrakar }
313*103e46e4SHarish Mahendrakar EXPECT_EQ(3, cues->GetCount());
314*103e46e4SHarish Mahendrakar
315*103e46e4SHarish Mahendrakar // Get first Cue Point
316*103e46e4SHarish Mahendrakar const CuePoint* cue_point = cues->GetFirst();
317*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 0, kVideoTrackNumber, 206);
318*103e46e4SHarish Mahendrakar
319*103e46e4SHarish Mahendrakar // Get second Cue Point
320*103e46e4SHarish Mahendrakar cue_point = cues->GetNext(cue_point);
321*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 6000000, kVideoTrackNumber, 269);
322*103e46e4SHarish Mahendrakar
323*103e46e4SHarish Mahendrakar // Get third (also last) Cue Point
324*103e46e4SHarish Mahendrakar cue_point = cues->GetNext(cue_point);
325*103e46e4SHarish Mahendrakar const CuePoint* last_cue_point = cues->GetLast();
326*103e46e4SHarish Mahendrakar EXPECT_TRUE(cue_point == last_cue_point);
327*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 4000000, kVideoTrackNumber, 269);
328*103e46e4SHarish Mahendrakar
329*103e46e4SHarish Mahendrakar EXPECT_TRUE(ValidateCues(segment_, &reader_));
330*103e46e4SHarish Mahendrakar }
331*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,CuesBeforeClusters)332*103e46e4SHarish Mahendrakar TEST_F(ParserTest, CuesBeforeClusters) {
333*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("cues_before_clusters.webm"));
334*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
335*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
336*103e46e4SHarish Mahendrakar
337*103e46e4SHarish Mahendrakar const Track* const track = segment_->GetTracks()->GetTrackByIndex(0);
338*103e46e4SHarish Mahendrakar const Cues* const cues = segment_->GetCues();
339*103e46e4SHarish Mahendrakar ASSERT_TRUE(cues != NULL);
340*103e46e4SHarish Mahendrakar while (!cues->DoneParsing()) {
341*103e46e4SHarish Mahendrakar cues->LoadCuePoint();
342*103e46e4SHarish Mahendrakar }
343*103e46e4SHarish Mahendrakar EXPECT_EQ(2, cues->GetCount());
344*103e46e4SHarish Mahendrakar
345*103e46e4SHarish Mahendrakar // Get first Cue Point
346*103e46e4SHarish Mahendrakar const CuePoint* cue_point = cues->GetFirst();
347*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 0, kVideoTrackNumber, 238);
348*103e46e4SHarish Mahendrakar
349*103e46e4SHarish Mahendrakar // Get second (also last) Cue Point
350*103e46e4SHarish Mahendrakar cue_point = cues->GetNext(cue_point);
351*103e46e4SHarish Mahendrakar const CuePoint* last_cue_point = cues->GetLast();
352*103e46e4SHarish Mahendrakar EXPECT_TRUE(cue_point == last_cue_point);
353*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 6000000, kVideoTrackNumber, 301);
354*103e46e4SHarish Mahendrakar
355*103e46e4SHarish Mahendrakar EXPECT_TRUE(ValidateCues(segment_, &reader_));
356*103e46e4SHarish Mahendrakar }
357*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,CuesTrackNumber)358*103e46e4SHarish Mahendrakar TEST_F(ParserTest, CuesTrackNumber) {
359*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("set_cues_track_number.webm"));
360*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
361*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
362*103e46e4SHarish Mahendrakar
363*103e46e4SHarish Mahendrakar const Track* const track = segment_->GetTracks()->GetTrackByIndex(0);
364*103e46e4SHarish Mahendrakar const Cues* const cues = segment_->GetCues();
365*103e46e4SHarish Mahendrakar ASSERT_TRUE(cues != NULL);
366*103e46e4SHarish Mahendrakar while (!cues->DoneParsing()) {
367*103e46e4SHarish Mahendrakar cues->LoadCuePoint();
368*103e46e4SHarish Mahendrakar }
369*103e46e4SHarish Mahendrakar EXPECT_EQ(2, cues->GetCount());
370*103e46e4SHarish Mahendrakar
371*103e46e4SHarish Mahendrakar // Get first Cue Point
372*103e46e4SHarish Mahendrakar const CuePoint* cue_point = cues->GetFirst();
373*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 0, 10, 206);
374*103e46e4SHarish Mahendrakar
375*103e46e4SHarish Mahendrakar // Get second (also last) Cue Point
376*103e46e4SHarish Mahendrakar cue_point = cues->GetNext(cue_point);
377*103e46e4SHarish Mahendrakar const CuePoint* last_cue_point = cues->GetLast();
378*103e46e4SHarish Mahendrakar EXPECT_TRUE(cue_point == last_cue_point);
379*103e46e4SHarish Mahendrakar CompareCuePointContents(track, cue_point, 6000000, 10, 269);
380*103e46e4SHarish Mahendrakar
381*103e46e4SHarish Mahendrakar EXPECT_TRUE(ValidateCues(segment_, &reader_));
382*103e46e4SHarish Mahendrakar }
383*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Opus)384*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Opus) {
385*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("bbb_480p_vp9_opus_1second.webm", 4));
386*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 2;
387*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
388*103e46e4SHarish Mahendrakar
389*103e46e4SHarish Mahendrakar // --------------------------------------------------------------------------
390*103e46e4SHarish Mahendrakar // Track Header validation.
391*103e46e4SHarish Mahendrakar const Tracks* const tracks = segment_->GetTracks();
392*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, tracks->GetTracksCount());
393*103e46e4SHarish Mahendrakar for (int i = 0; i < 2; ++i) {
394*103e46e4SHarish Mahendrakar const Track* const track = tracks->GetTrackByIndex(i);
395*103e46e4SHarish Mahendrakar ASSERT_TRUE(track != NULL);
396*103e46e4SHarish Mahendrakar
397*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, track->GetNameAsUTF8());
398*103e46e4SHarish Mahendrakar EXPECT_STREQ("und", track->GetLanguage());
399*103e46e4SHarish Mahendrakar EXPECT_EQ(i + 1, track->GetNumber());
400*103e46e4SHarish Mahendrakar EXPECT_FALSE(track->GetLacing());
401*103e46e4SHarish Mahendrakar
402*103e46e4SHarish Mahendrakar if (track->GetType() == Track::kVideo) {
403*103e46e4SHarish Mahendrakar const VideoTrack* const video_track =
404*103e46e4SHarish Mahendrakar dynamic_cast<const VideoTrack*>(track);
405*103e46e4SHarish Mahendrakar EXPECT_EQ(854, static_cast<int>(video_track->GetWidth()));
406*103e46e4SHarish Mahendrakar EXPECT_EQ(480, static_cast<int>(video_track->GetHeight()));
407*103e46e4SHarish Mahendrakar EXPECT_STREQ(kVP9CodecId, video_track->GetCodecId());
408*103e46e4SHarish Mahendrakar EXPECT_DOUBLE_EQ(0., video_track->GetFrameRate());
409*103e46e4SHarish Mahendrakar EXPECT_EQ(41666666,
410*103e46e4SHarish Mahendrakar static_cast<int>(video_track->GetDefaultDuration())); // 24.000
411*103e46e4SHarish Mahendrakar const unsigned int kVideoUid = kVideoTrackNumber;
412*103e46e4SHarish Mahendrakar EXPECT_EQ(kVideoUid, video_track->GetUid());
413*103e46e4SHarish Mahendrakar const unsigned int kCodecDelay = 0;
414*103e46e4SHarish Mahendrakar EXPECT_EQ(kCodecDelay, video_track->GetCodecDelay());
415*103e46e4SHarish Mahendrakar const unsigned int kSeekPreRoll = 0;
416*103e46e4SHarish Mahendrakar EXPECT_EQ(kSeekPreRoll, video_track->GetSeekPreRoll());
417*103e46e4SHarish Mahendrakar
418*103e46e4SHarish Mahendrakar size_t video_codec_private_size;
419*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, video_track->GetCodecPrivate(video_codec_private_size));
420*103e46e4SHarish Mahendrakar const unsigned int kPrivateSize = 0;
421*103e46e4SHarish Mahendrakar EXPECT_EQ(kPrivateSize, video_codec_private_size);
422*103e46e4SHarish Mahendrakar } else if (track->GetType() == Track::kAudio) {
423*103e46e4SHarish Mahendrakar const AudioTrack* const audio_track =
424*103e46e4SHarish Mahendrakar dynamic_cast<const AudioTrack*>(track);
425*103e46e4SHarish Mahendrakar EXPECT_EQ(48000, audio_track->GetSamplingRate());
426*103e46e4SHarish Mahendrakar EXPECT_EQ(6, audio_track->GetChannels());
427*103e46e4SHarish Mahendrakar EXPECT_EQ(32, audio_track->GetBitDepth());
428*103e46e4SHarish Mahendrakar EXPECT_STREQ(kOpusCodecId, audio_track->GetCodecId());
429*103e46e4SHarish Mahendrakar EXPECT_EQ(kAudioTrackNumber, static_cast<int>(audio_track->GetUid()));
430*103e46e4SHarish Mahendrakar const unsigned int kDefaultDuration = 0;
431*103e46e4SHarish Mahendrakar EXPECT_EQ(kDefaultDuration, audio_track->GetDefaultDuration());
432*103e46e4SHarish Mahendrakar EXPECT_EQ(kOpusCodecDelay, audio_track->GetCodecDelay());
433*103e46e4SHarish Mahendrakar EXPECT_EQ(kOpusSeekPreroll, audio_track->GetSeekPreRoll());
434*103e46e4SHarish Mahendrakar
435*103e46e4SHarish Mahendrakar size_t audio_codec_private_size;
436*103e46e4SHarish Mahendrakar EXPECT_TRUE(audio_track->GetCodecPrivate(audio_codec_private_size) !=
437*103e46e4SHarish Mahendrakar NULL);
438*103e46e4SHarish Mahendrakar EXPECT_GE(audio_codec_private_size, kOpusPrivateDataSizeMinimum);
439*103e46e4SHarish Mahendrakar }
440*103e46e4SHarish Mahendrakar }
441*103e46e4SHarish Mahendrakar
442*103e46e4SHarish Mahendrakar // --------------------------------------------------------------------------
443*103e46e4SHarish Mahendrakar // Parse the file to do block-level validation.
444*103e46e4SHarish Mahendrakar const Cluster* cluster = segment_->GetFirst();
445*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
446*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
447*103e46e4SHarish Mahendrakar
448*103e46e4SHarish Mahendrakar for (; cluster != NULL && !cluster->EOS();
449*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster)) {
450*103e46e4SHarish Mahendrakar // Get the first block
451*103e46e4SHarish Mahendrakar const BlockEntry* block_entry;
452*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
453*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
454*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
455*103e46e4SHarish Mahendrakar
456*103e46e4SHarish Mahendrakar while (block_entry != NULL && !block_entry->EOS()) {
457*103e46e4SHarish Mahendrakar const Block* const block = block_entry->GetBlock();
458*103e46e4SHarish Mahendrakar ASSERT_TRUE(block != NULL);
459*103e46e4SHarish Mahendrakar EXPECT_FALSE(block->IsInvisible());
460*103e46e4SHarish Mahendrakar EXPECT_EQ(Block::kLacingNone, block->GetLacing());
461*103e46e4SHarish Mahendrakar
462*103e46e4SHarish Mahendrakar const std::uint32_t track_number =
463*103e46e4SHarish Mahendrakar static_cast<std::uint32_t>(block->GetTrackNumber());
464*103e46e4SHarish Mahendrakar const Track* const track = tracks->GetTrackByNumber(track_number);
465*103e46e4SHarish Mahendrakar ASSERT_TRUE(track != NULL);
466*103e46e4SHarish Mahendrakar EXPECT_EQ(track->GetNumber(), block->GetTrackNumber());
467*103e46e4SHarish Mahendrakar const unsigned int kContentEncodingCount = 0;
468*103e46e4SHarish Mahendrakar EXPECT_EQ(kContentEncodingCount,
469*103e46e4SHarish Mahendrakar track->GetContentEncodingCount()); // no encryption
470*103e46e4SHarish Mahendrakar
471*103e46e4SHarish Mahendrakar const std::int64_t track_type = track->GetType();
472*103e46e4SHarish Mahendrakar EXPECT_TRUE(track_type == Track::kVideo || track_type == Track::kAudio);
473*103e46e4SHarish Mahendrakar if (track_type == Track::kVideo) {
474*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::kBlockSimple, block_entry->GetKind());
475*103e46e4SHarish Mahendrakar EXPECT_EQ(0, block->GetDiscardPadding());
476*103e46e4SHarish Mahendrakar } else {
477*103e46e4SHarish Mahendrakar EXPECT_TRUE(block->IsKey());
478*103e46e4SHarish Mahendrakar const std::int64_t kLastAudioTimecode = 1001;
479*103e46e4SHarish Mahendrakar const std::int64_t timecode = block->GetTimeCode(cluster);
480*103e46e4SHarish Mahendrakar // Only the final Opus block should have discard padding.
481*103e46e4SHarish Mahendrakar if (timecode == kLastAudioTimecode) {
482*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::kBlockGroup, block_entry->GetKind());
483*103e46e4SHarish Mahendrakar EXPECT_EQ(13500000, block->GetDiscardPadding());
484*103e46e4SHarish Mahendrakar } else {
485*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::kBlockSimple, block_entry->GetKind());
486*103e46e4SHarish Mahendrakar EXPECT_EQ(0, block->GetDiscardPadding());
487*103e46e4SHarish Mahendrakar }
488*103e46e4SHarish Mahendrakar }
489*103e46e4SHarish Mahendrakar
490*103e46e4SHarish Mahendrakar const int frame_count = block->GetFrameCount();
491*103e46e4SHarish Mahendrakar const Block::Frame& frame = block->GetFrame(0);
492*103e46e4SHarish Mahendrakar EXPECT_EQ(1, frame_count);
493*103e46e4SHarish Mahendrakar EXPECT_GT(frame.len, 0);
494*103e46e4SHarish Mahendrakar
495*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
496*103e46e4SHarish Mahendrakar }
497*103e46e4SHarish Mahendrakar }
498*103e46e4SHarish Mahendrakar
499*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
500*103e46e4SHarish Mahendrakar EXPECT_TRUE(cluster->EOS());
501*103e46e4SHarish Mahendrakar }
502*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,DiscardPadding)503*103e46e4SHarish Mahendrakar TEST_F(ParserTest, DiscardPadding) {
504*103e46e4SHarish Mahendrakar // Test an artificial file with some extreme DiscardPadding values.
505*103e46e4SHarish Mahendrakar const std::string file = "discard_padding.webm";
506*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment(file, 4));
507*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
508*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
509*103e46e4SHarish Mahendrakar
510*103e46e4SHarish Mahendrakar // --------------------------------------------------------------------------
511*103e46e4SHarish Mahendrakar // Track Header validation.
512*103e46e4SHarish Mahendrakar const Tracks* const tracks = segment_->GetTracks();
513*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, tracks->GetTracksCount());
514*103e46e4SHarish Mahendrakar const Track* const track = tracks->GetTrackByIndex(0);
515*103e46e4SHarish Mahendrakar ASSERT_TRUE(track != NULL);
516*103e46e4SHarish Mahendrakar
517*103e46e4SHarish Mahendrakar EXPECT_STREQ(NULL, track->GetNameAsUTF8());
518*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, track->GetLanguage());
519*103e46e4SHarish Mahendrakar EXPECT_EQ(kAudioTrackNumber, track->GetNumber());
520*103e46e4SHarish Mahendrakar EXPECT_TRUE(track->GetLacing());
521*103e46e4SHarish Mahendrakar
522*103e46e4SHarish Mahendrakar EXPECT_EQ(Track::kAudio, track->GetType());
523*103e46e4SHarish Mahendrakar const AudioTrack* const audio_track = dynamic_cast<const AudioTrack*>(track);
524*103e46e4SHarish Mahendrakar EXPECT_EQ(30, audio_track->GetSamplingRate());
525*103e46e4SHarish Mahendrakar EXPECT_EQ(2, audio_track->GetChannels());
526*103e46e4SHarish Mahendrakar EXPECT_STREQ(kOpusCodecId, audio_track->GetCodecId());
527*103e46e4SHarish Mahendrakar EXPECT_EQ(kAudioTrackNumber, static_cast<int>(audio_track->GetUid()));
528*103e46e4SHarish Mahendrakar const unsigned int kDefaultDuration = 0;
529*103e46e4SHarish Mahendrakar EXPECT_EQ(kDefaultDuration, audio_track->GetDefaultDuration());
530*103e46e4SHarish Mahendrakar const unsigned int kCodecDelay = 0;
531*103e46e4SHarish Mahendrakar EXPECT_EQ(kCodecDelay, audio_track->GetCodecDelay());
532*103e46e4SHarish Mahendrakar const unsigned int kSeekPreRoll = 0;
533*103e46e4SHarish Mahendrakar EXPECT_EQ(kSeekPreRoll, audio_track->GetSeekPreRoll());
534*103e46e4SHarish Mahendrakar
535*103e46e4SHarish Mahendrakar size_t audio_codec_private_size;
536*103e46e4SHarish Mahendrakar EXPECT_EQ(NULL, audio_track->GetCodecPrivate(audio_codec_private_size));
537*103e46e4SHarish Mahendrakar const unsigned int kPrivateSize = 0;
538*103e46e4SHarish Mahendrakar EXPECT_EQ(kPrivateSize, audio_codec_private_size);
539*103e46e4SHarish Mahendrakar
540*103e46e4SHarish Mahendrakar // --------------------------------------------------------------------------
541*103e46e4SHarish Mahendrakar // Parse the file to do block-level validation.
542*103e46e4SHarish Mahendrakar const Cluster* cluster = segment_->GetFirst();
543*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
544*103e46e4SHarish Mahendrakar EXPECT_FALSE(cluster->EOS());
545*103e46e4SHarish Mahendrakar const unsigned int kSegmentCount = 1;
546*103e46e4SHarish Mahendrakar EXPECT_EQ(kSegmentCount, segment_->GetCount());
547*103e46e4SHarish Mahendrakar
548*103e46e4SHarish Mahendrakar // Get the first block
549*103e46e4SHarish Mahendrakar const BlockEntry* block_entry;
550*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetFirst(block_entry));
551*103e46e4SHarish Mahendrakar ASSERT_TRUE(block_entry != NULL);
552*103e46e4SHarish Mahendrakar EXPECT_FALSE(block_entry->EOS());
553*103e46e4SHarish Mahendrakar
554*103e46e4SHarish Mahendrakar const std::array<int, 3> discard_padding = {{12810000, 127, -128}};
555*103e46e4SHarish Mahendrakar int index = 0;
556*103e46e4SHarish Mahendrakar while (block_entry != NULL && !block_entry->EOS()) {
557*103e46e4SHarish Mahendrakar const Block* const block = block_entry->GetBlock();
558*103e46e4SHarish Mahendrakar ASSERT_TRUE(block != NULL);
559*103e46e4SHarish Mahendrakar EXPECT_FALSE(block->IsInvisible());
560*103e46e4SHarish Mahendrakar EXPECT_EQ(Block::kLacingNone, block->GetLacing());
561*103e46e4SHarish Mahendrakar
562*103e46e4SHarish Mahendrakar const std::uint32_t track_number =
563*103e46e4SHarish Mahendrakar static_cast<std::uint32_t>(block->GetTrackNumber());
564*103e46e4SHarish Mahendrakar const Track* const track = tracks->GetTrackByNumber(track_number);
565*103e46e4SHarish Mahendrakar ASSERT_TRUE(track != NULL);
566*103e46e4SHarish Mahendrakar EXPECT_EQ(track->GetNumber(), block->GetTrackNumber());
567*103e46e4SHarish Mahendrakar const unsigned int kContentEncodingCount = 0;
568*103e46e4SHarish Mahendrakar EXPECT_EQ(kContentEncodingCount,
569*103e46e4SHarish Mahendrakar track->GetContentEncodingCount()); // no encryption
570*103e46e4SHarish Mahendrakar
571*103e46e4SHarish Mahendrakar const std::int64_t track_type = track->GetType();
572*103e46e4SHarish Mahendrakar EXPECT_EQ(Track::kAudio, track_type);
573*103e46e4SHarish Mahendrakar EXPECT_TRUE(block->IsKey());
574*103e46e4SHarish Mahendrakar
575*103e46e4SHarish Mahendrakar // All blocks have DiscardPadding.
576*103e46e4SHarish Mahendrakar EXPECT_EQ(BlockEntry::kBlockGroup, block_entry->GetKind());
577*103e46e4SHarish Mahendrakar ASSERT_LT(index, static_cast<int>(discard_padding.size()));
578*103e46e4SHarish Mahendrakar EXPECT_EQ(discard_padding[index], block->GetDiscardPadding());
579*103e46e4SHarish Mahendrakar ++index;
580*103e46e4SHarish Mahendrakar
581*103e46e4SHarish Mahendrakar const int frame_count = block->GetFrameCount();
582*103e46e4SHarish Mahendrakar const Block::Frame& frame = block->GetFrame(0);
583*103e46e4SHarish Mahendrakar EXPECT_EQ(1, frame_count);
584*103e46e4SHarish Mahendrakar EXPECT_GT(frame.len, 0);
585*103e46e4SHarish Mahendrakar
586*103e46e4SHarish Mahendrakar EXPECT_EQ(0, cluster->GetNext(block_entry, block_entry));
587*103e46e4SHarish Mahendrakar }
588*103e46e4SHarish Mahendrakar
589*103e46e4SHarish Mahendrakar cluster = segment_->GetNext(cluster);
590*103e46e4SHarish Mahendrakar ASSERT_TRUE(cluster != NULL);
591*103e46e4SHarish Mahendrakar EXPECT_TRUE(cluster->EOS());
592*103e46e4SHarish Mahendrakar }
593*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,StereoModeParsedCorrectly)594*103e46e4SHarish Mahendrakar TEST_F(ParserTest, StereoModeParsedCorrectly) {
595*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("test_stereo_left_right.webm"));
596*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
597*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
598*103e46e4SHarish Mahendrakar
599*103e46e4SHarish Mahendrakar const VideoTrack* const video_track = dynamic_cast<const VideoTrack*>(
600*103e46e4SHarish Mahendrakar segment_->GetTracks()->GetTrackByIndex(0));
601*103e46e4SHarish Mahendrakar
602*103e46e4SHarish Mahendrakar EXPECT_EQ(1, video_track->GetStereoMode());
603*103e46e4SHarish Mahendrakar EXPECT_EQ(256, video_track->GetWidth());
604*103e46e4SHarish Mahendrakar EXPECT_EQ(144, video_track->GetHeight());
605*103e46e4SHarish Mahendrakar EXPECT_EQ(128, video_track->GetDisplayWidth());
606*103e46e4SHarish Mahendrakar EXPECT_EQ(144, video_track->GetDisplayHeight());
607*103e46e4SHarish Mahendrakar }
608*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,CanParseColour)609*103e46e4SHarish Mahendrakar TEST_F(ParserTest, CanParseColour) {
610*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("colour.webm"));
611*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
612*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
613*103e46e4SHarish Mahendrakar const VideoTrack* const video_track = dynamic_cast<const VideoTrack*>(
614*103e46e4SHarish Mahendrakar segment_->GetTracks()->GetTrackByIndex(0));
615*103e46e4SHarish Mahendrakar
616*103e46e4SHarish Mahendrakar const mkvparser::Colour* const colour = video_track->GetColour();
617*103e46e4SHarish Mahendrakar ASSERT_TRUE(colour != nullptr);
618*103e46e4SHarish Mahendrakar EXPECT_EQ(0u, colour->matrix_coefficients);
619*103e46e4SHarish Mahendrakar EXPECT_EQ(1u, colour->bits_per_channel);
620*103e46e4SHarish Mahendrakar EXPECT_EQ(2u, colour->chroma_subsampling_horz);
621*103e46e4SHarish Mahendrakar EXPECT_EQ(3u, colour->chroma_subsampling_vert);
622*103e46e4SHarish Mahendrakar EXPECT_EQ(4u, colour->cb_subsampling_horz);
623*103e46e4SHarish Mahendrakar EXPECT_EQ(5u, colour->cb_subsampling_vert);
624*103e46e4SHarish Mahendrakar EXPECT_EQ(1u, colour->chroma_siting_horz);
625*103e46e4SHarish Mahendrakar EXPECT_EQ(1u, colour->chroma_siting_vert);
626*103e46e4SHarish Mahendrakar EXPECT_EQ(2u, colour->range);
627*103e46e4SHarish Mahendrakar EXPECT_EQ(9u, colour->transfer_characteristics);
628*103e46e4SHarish Mahendrakar EXPECT_EQ(10u, colour->primaries);
629*103e46e4SHarish Mahendrakar EXPECT_EQ(11u, colour->max_cll);
630*103e46e4SHarish Mahendrakar EXPECT_EQ(12u, colour->max_fall);
631*103e46e4SHarish Mahendrakar
632*103e46e4SHarish Mahendrakar const mkvparser::MasteringMetadata* const mm =
633*103e46e4SHarish Mahendrakar video_track->GetColour()->mastering_metadata;
634*103e46e4SHarish Mahendrakar ASSERT_TRUE(mm != nullptr);
635*103e46e4SHarish Mahendrakar ASSERT_TRUE(mm->r != nullptr);
636*103e46e4SHarish Mahendrakar ASSERT_TRUE(mm->g != nullptr);
637*103e46e4SHarish Mahendrakar ASSERT_TRUE(mm->b != nullptr);
638*103e46e4SHarish Mahendrakar ASSERT_TRUE(mm->white_point != nullptr);
639*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.1, mm->r->x);
640*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.2, mm->r->y);
641*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.1, mm->g->x);
642*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.2, mm->g->y);
643*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.1, mm->b->x);
644*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.2, mm->b->y);
645*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.1, mm->white_point->x);
646*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(.2, mm->white_point->y);
647*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(30.0, mm->luminance_min);
648*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(40.0, mm->luminance_max);
649*103e46e4SHarish Mahendrakar }
650*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,CanParseProjection)651*103e46e4SHarish Mahendrakar TEST_F(ParserTest, CanParseProjection) {
652*103e46e4SHarish Mahendrakar ASSERT_TRUE(CreateAndLoadSegment("projection.webm"));
653*103e46e4SHarish Mahendrakar const unsigned int kTracksCount = 1;
654*103e46e4SHarish Mahendrakar EXPECT_EQ(kTracksCount, segment_->GetTracks()->GetTracksCount());
655*103e46e4SHarish Mahendrakar const VideoTrack* const video_track =
656*103e46e4SHarish Mahendrakar static_cast<const VideoTrack*>(segment_->GetTracks()->GetTrackByIndex(0));
657*103e46e4SHarish Mahendrakar
658*103e46e4SHarish Mahendrakar const mkvparser::Projection* const projection = video_track->GetProjection();
659*103e46e4SHarish Mahendrakar ASSERT_TRUE(projection != nullptr);
660*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::Projection::kRectangular, projection->type);
661*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(1, projection->pose_yaw);
662*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(2, projection->pose_pitch);
663*103e46e4SHarish Mahendrakar EXPECT_FLOAT_EQ(3, projection->pose_roll);
664*103e46e4SHarish Mahendrakar EXPECT_EQ(1u, projection->private_data_length);
665*103e46e4SHarish Mahendrakar ASSERT_TRUE(projection->private_data != nullptr);
666*103e46e4SHarish Mahendrakar EXPECT_EQ(4u, projection->private_data[0]);
667*103e46e4SHarish Mahendrakar }
668*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecLevelTest)669*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecLevelTest) {
670*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 3;
671*103e46e4SHarish Mahendrakar const uint8_t good_codec_private_level[kCodecPrivateLength] = {2, 1, 11};
672*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
673*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&good_codec_private_level[0],
674*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
675*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.profile);
676*103e46e4SHarish Mahendrakar EXPECT_EQ(11, features.level);
677*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.bit_depth);
678*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent,
679*103e46e4SHarish Mahendrakar features.chroma_subsampling);
680*103e46e4SHarish Mahendrakar }
681*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecProfileTest)682*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecProfileTest) {
683*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 3;
684*103e46e4SHarish Mahendrakar const uint8_t good_codec_private_profile[kCodecPrivateLength] = {1, 1, 1};
685*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
686*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&good_codec_private_profile[0],
687*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
688*103e46e4SHarish Mahendrakar EXPECT_EQ(1, features.profile);
689*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.level);
690*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.bit_depth);
691*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent,
692*103e46e4SHarish Mahendrakar features.chroma_subsampling);
693*103e46e4SHarish Mahendrakar }
694*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecBitDepthTest)695*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecBitDepthTest) {
696*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 3;
697*103e46e4SHarish Mahendrakar const uint8_t good_codec_private_profile[kCodecPrivateLength] = {3, 1, 8};
698*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
699*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&good_codec_private_profile[0],
700*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
701*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.profile);
702*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.level);
703*103e46e4SHarish Mahendrakar EXPECT_EQ(8, features.bit_depth);
704*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent,
705*103e46e4SHarish Mahendrakar features.chroma_subsampling);
706*103e46e4SHarish Mahendrakar }
707*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecChromaSubsamplingTest)708*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecChromaSubsamplingTest) {
709*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 3;
710*103e46e4SHarish Mahendrakar const uint8_t good_codec_private_profile[kCodecPrivateLength] = {4, 1, 0};
711*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
712*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&good_codec_private_profile[0],
713*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
714*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.profile);
715*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.level);
716*103e46e4SHarish Mahendrakar EXPECT_EQ(libwebm::Vp9CodecFeatures::kValueNotPresent, features.bit_depth);
717*103e46e4SHarish Mahendrakar EXPECT_EQ(0, features.chroma_subsampling);
718*103e46e4SHarish Mahendrakar }
719*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecProfileLevelTest)720*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecProfileLevelTest) {
721*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 6;
722*103e46e4SHarish Mahendrakar const uint8_t codec_private[kCodecPrivateLength] = {1, 1, 1, 2, 1, 11};
723*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
724*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&codec_private[0],
725*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
726*103e46e4SHarish Mahendrakar EXPECT_EQ(1, features.profile);
727*103e46e4SHarish Mahendrakar EXPECT_EQ(11, features.level);
728*103e46e4SHarish Mahendrakar }
729*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecAllTest)730*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecAllTest) {
731*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 12;
732*103e46e4SHarish Mahendrakar const uint8_t codec_private[kCodecPrivateLength] = {1, 1, 1, 2, 1, 11,
733*103e46e4SHarish Mahendrakar 3, 1, 8, 4, 1, 0};
734*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
735*103e46e4SHarish Mahendrakar EXPECT_TRUE(libwebm::ParseVpxCodecPrivate(&codec_private[0],
736*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
737*103e46e4SHarish Mahendrakar EXPECT_EQ(1, features.profile);
738*103e46e4SHarish Mahendrakar EXPECT_EQ(11, features.level);
739*103e46e4SHarish Mahendrakar EXPECT_EQ(8, features.bit_depth);
740*103e46e4SHarish Mahendrakar EXPECT_EQ(0, features.chroma_subsampling);
741*103e46e4SHarish Mahendrakar }
742*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,Vp9CodecPrivateBadTest)743*103e46e4SHarish Mahendrakar TEST_F(ParserTest, Vp9CodecPrivateBadTest) {
744*103e46e4SHarish Mahendrakar const int kCodecPrivateLength = 3;
745*103e46e4SHarish Mahendrakar libwebm::Vp9CodecFeatures features;
746*103e46e4SHarish Mahendrakar // Test invalid codec private data; all of these should return false.
747*103e46e4SHarish Mahendrakar const uint8_t bad_codec_private[kCodecPrivateLength] = {0, 0, 0};
748*103e46e4SHarish Mahendrakar EXPECT_FALSE(
749*103e46e4SHarish Mahendrakar libwebm::ParseVpxCodecPrivate(NULL, kCodecPrivateLength, &features));
750*103e46e4SHarish Mahendrakar EXPECT_FALSE(
751*103e46e4SHarish Mahendrakar libwebm::ParseVpxCodecPrivate(&bad_codec_private[0], 0, &features));
752*103e46e4SHarish Mahendrakar EXPECT_FALSE(libwebm::ParseVpxCodecPrivate(&bad_codec_private[0],
753*103e46e4SHarish Mahendrakar kCodecPrivateLength, &features));
754*103e46e4SHarish Mahendrakar const uint8_t good_codec_private_level[kCodecPrivateLength] = {2, 1, 11};
755*103e46e4SHarish Mahendrakar
756*103e46e4SHarish Mahendrakar // Test parse of codec private chunks, but lie about length.
757*103e46e4SHarish Mahendrakar EXPECT_FALSE(
758*103e46e4SHarish Mahendrakar libwebm::ParseVpxCodecPrivate(&bad_codec_private[0], 0, &features));
759*103e46e4SHarish Mahendrakar EXPECT_FALSE(libwebm::ParseVpxCodecPrivate(&good_codec_private_level[0], 0,
760*103e46e4SHarish Mahendrakar &features));
761*103e46e4SHarish Mahendrakar EXPECT_FALSE(libwebm::ParseVpxCodecPrivate(&good_codec_private_level[0],
762*103e46e4SHarish Mahendrakar kCodecPrivateLength, NULL));
763*103e46e4SHarish Mahendrakar }
764*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidTruncatedChapterString)765*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidTruncatedChapterString) {
766*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(CreateSegmentNoHeaderChecks(
767*103e46e4SHarish Mahendrakar "invalid/chapters_truncated_chapter_string.mkv"));
768*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_PARSE_FAILED, segment_->Load());
769*103e46e4SHarish Mahendrakar }
770*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidTruncatedChapterString2)771*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidTruncatedChapterString2) {
772*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(CreateSegmentNoHeaderChecks(
773*103e46e4SHarish Mahendrakar "invalid/chapters_truncated_chapter_string_2.mkv"));
774*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID, segment_->Load());
775*103e46e4SHarish Mahendrakar }
776*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidFixedLacingSize)777*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidFixedLacingSize) {
778*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(
779*103e46e4SHarish Mahendrakar CreateSegmentNoHeaderChecks("invalid/fixed_lacing_bad_lace_size.mkv"));
780*103e46e4SHarish Mahendrakar ASSERT_EQ(0, segment_->Load());
781*103e46e4SHarish Mahendrakar const mkvparser::BlockEntry* block_entry = NULL;
782*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID,
783*103e46e4SHarish Mahendrakar segment_->GetFirst()->GetFirst(block_entry));
784*103e46e4SHarish Mahendrakar }
785*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidBlockEndsBeyondCluster)786*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidBlockEndsBeyondCluster) {
787*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(
788*103e46e4SHarish Mahendrakar CreateSegmentNoHeaderChecks("invalid/block_ends_beyond_cluster.mkv"));
789*103e46e4SHarish Mahendrakar ASSERT_EQ(0, segment_->Load());
790*103e46e4SHarish Mahendrakar const mkvparser::BlockEntry* block_entry = NULL;
791*103e46e4SHarish Mahendrakar EXPECT_EQ(0, segment_->GetFirst()->GetFirst(block_entry));
792*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID,
793*103e46e4SHarish Mahendrakar segment_->GetFirst()->GetNext(block_entry, block_entry));
794*103e46e4SHarish Mahendrakar }
795*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidBlockGroupBlockEndsBlockGroup)796*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidBlockGroupBlockEndsBlockGroup) {
797*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(CreateSegmentNoHeaderChecks(
798*103e46e4SHarish Mahendrakar "invalid/blockgroup_block_ends_beyond_blockgroup.mkv"));
799*103e46e4SHarish Mahendrakar ASSERT_EQ(0, segment_->Load());
800*103e46e4SHarish Mahendrakar const mkvparser::BlockEntry* block_entry = NULL;
801*103e46e4SHarish Mahendrakar EXPECT_EQ(0, segment_->GetFirst()->GetFirst(block_entry));
802*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID,
803*103e46e4SHarish Mahendrakar segment_->GetFirst()->GetNext(block_entry, block_entry));
804*103e46e4SHarish Mahendrakar }
805*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidProjectionFloatOverflow)806*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidProjectionFloatOverflow) {
807*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(
808*103e46e4SHarish Mahendrakar CreateSegmentNoHeaderChecks("invalid/projection_float_overflow.webm"));
809*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID, segment_->Load());
810*103e46e4SHarish Mahendrakar }
811*103e46e4SHarish Mahendrakar
TEST_F(ParserTest,InvalidPrimaryChromaticityParseFail)812*103e46e4SHarish Mahendrakar TEST_F(ParserTest, InvalidPrimaryChromaticityParseFail) {
813*103e46e4SHarish Mahendrakar ASSERT_NO_FATAL_FAILURE(CreateSegmentNoHeaderChecks(
814*103e46e4SHarish Mahendrakar "invalid/primarychromaticity_fieldtoolarge.webm"));
815*103e46e4SHarish Mahendrakar EXPECT_EQ(mkvparser::E_FILE_FORMAT_INVALID, segment_->Load());
816*103e46e4SHarish Mahendrakar }
817*103e46e4SHarish Mahendrakar
818*103e46e4SHarish Mahendrakar } // namespace test
819*103e46e4SHarish Mahendrakar
main(int argc,char * argv[])820*103e46e4SHarish Mahendrakar int main(int argc, char* argv[]) {
821*103e46e4SHarish Mahendrakar ::testing::InitGoogleTest(&argc, argv);
822*103e46e4SHarish Mahendrakar return RUN_ALL_TESTS();
823*103e46e4SHarish Mahendrakar }
824