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