15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mp4/box_reader.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mp4/rcheck.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace mp4 { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kSkipBox[] = { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Top-level test box containing three children 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x00, 0x00, 0x40, 's', 'k', 'i', 'p', 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xf9, 0x0a, 0x0b, 0x0c, 0xfd, 0x0e, 0x0f, 0x10, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ordinary (8-byte header) child box 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x00, 0x00, 0x0c, 'p', 's', 's', 'h', 0xde, 0xad, 0xbe, 0xef, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extended-size header child box 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x00, 0x00, 0x01, 'p', 's', 's', 'h', 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xfa, 0xce, 0xca, 0xfe, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty free box 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x00, 0x00, 0x08, 'f', 'r', 'e', 'e', 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trailing garbage 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00 }; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FreeBox : Box { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Parse(BoxReader* reader) OVERRIDE { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FourCC BoxType() const OVERRIDE { return FOURCC_FREE; } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PsshBox : Box { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 val; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Parse(BoxReader* reader) OVERRIDE { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reader->Read4(&val); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FourCC BoxType() const OVERRIDE { return FOURCC_PSSH; } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SkipBox : Box { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 a, b; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 c; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 d; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 e; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PsshBox> kids; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeBox mpty; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Parse(BoxReader* reader) OVERRIDE { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RCHECK(reader->ReadFullBoxHeader() && 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->Read1(&a) && 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->Read1(&b) && 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->Read2(&c) && 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->Read4s(&d) && 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->Read4sInto8s(&e)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reader->ScanChildren() && 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ReadChildren(&kids) && 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->MaybeReadChild(&mpty); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FourCC BoxType() const OVERRIDE { return FOURCC_SKIP; } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkipBox(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SkipBox(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkipBox::SkipBox() {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkipBox::~SkipBox() {} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoxReaderTest : public testing::Test { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> GetBuf() { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::vector<uint8>(kSkipBox, kSkipBox + sizeof(kSkipBox)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, ExpectedOperationTest) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> reader( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(err); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader.get()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkipBox box; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(box.Parse(reader.get())); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x01, reader->version()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x020304u, reader->flags()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x05, box.a); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x06, box.b); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x0708, box.c); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int32>(0xf90a0b0c), box.d); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int32>(0xfd0e0f10), box.e); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, box.kids.size()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0xdeadbeef, box.kids[0].val); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0xfacecafe, box.kids[1].val); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accounting for the extra byte outside of the box above 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buf.size(), static_cast<uint64>(reader->size() + 1)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, OuterTooShortTest) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a soft failure by truncating the outer box. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> r( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size() - 2, LogCB(), &err)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(err); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.get()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, InnerTooLongTest) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make an inner box too big for its outer box. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[25] = 1; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> reader( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkipBox box; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(box.Parse(reader.get())); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, WrongFourCCTest) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an unrecognized top-level FourCC. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[5] = 1; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> reader( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.get()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(err); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, ScanChildrenTest) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> reader( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->SkipBytes(16) && reader->ScanChildren()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeBox free; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->ReadChild(&free)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader->ReadChild(&free)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->MaybeReadChild(&free)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PsshBox> kids; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->ReadChildren(&kids)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, kids.size()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kids.clear(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader->ReadChildren(&kids)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->MaybeReadChildren(&kids)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxReaderTest, ReadAllChildrenTest) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buf = GetBuf(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify buffer to exclude its last 'free' box 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[3] = 0x38; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BoxReader> reader( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PsshBox> kids; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader->SkipBytes(16) && reader->ReadAllChildren(&kids)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, kids.size()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kids[0].val, 0xdeadbeef); // Ensure order is preserved 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic void TestTopLevelBox(const uint8* data, int size, uint32 fourCC) { 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<uint8> buf(data, data + size); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool err; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<BoxReader> reader( 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BoxReader::ReadTopLevelBox(&buf[0], buf.size(), LogCB(), &err)); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(err); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(reader); 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(fourCC, reader->type()); 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(reader->size(), size); 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 198effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(BoxReaderTest, SkippingBloc) { 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static const uint8 kData[] = { 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x09, 'b', 'l', 'o', 'c', 0x00 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestTopLevelBox(kData, sizeof(kData), FOURCC_BLOC); 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 206effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(BoxReaderTest, SkippingEmsg) { 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static const uint8 kData[] = { 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x24, 'e', 'm', 's', 'g', 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, // version = 0 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, // flags = 0 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x61, 0x00, // scheme_id_uri = "a" 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x61, 0x00, // value = "a" 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x01, // timescale = 1 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x02, // presentation_time_delta = 2 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x03, // event_duration = 3 216e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 0x00, 0x00, 0x00, 0x04, // id = 4 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x05, 0x06, 0x07, 0x08, // message_data[4] = 0x05060708 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestTopLevelBox(kData, sizeof(kData), FOURCC_EMSG); 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 223effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(BoxReaderTest, SkippingUuid) { 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static const uint8 kData[] = { 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 0x00, 0x00, 0x19, 'u', 'u', 'i', 'd', 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, // usertype 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0x00, 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestTopLevelBox(kData, sizeof(kData), FOURCC_UUID); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace mp4 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 236