1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
6#define MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "media/base/media_export.h"
12
13namespace media {
14
15class BitReader;
16
17namespace mp4 {
18
19// The following values are extracted from ISO 14496 Part 1 Table 5 -
20// objectTypeIndication Values. Only values currently in use are included.
21enum ObjectType {
22  kForbidden = 0,
23  kISO_14496_3 = 0x40,  // MPEG4 AAC
24  kISO_13818_7_AAC_LC = 0x67  // MPEG2 AAC-LC
25};
26
27// This class parse object type and decoder specific information from an
28// elementary stream descriptor, which is usually contained in an esds box.
29// Please refer to ISO 14496 Part 1 7.2.6.5 for more details.
30class MEDIA_EXPORT ESDescriptor {
31 public:
32  // Utility function to check if the given object type is AAC.
33  static bool IsAAC(uint8 object_type);
34
35  ESDescriptor();
36  ~ESDescriptor();
37
38  bool Parse(const std::vector<uint8>& data);
39
40  uint8 object_type() const;
41  const std::vector<uint8>& decoder_specific_info() const;
42
43 private:
44  enum Tag {
45    kESDescrTag = 0x03,
46    kDecoderConfigDescrTag = 0x04,
47    kDecoderSpecificInfoTag = 0x05
48  };
49
50  bool ParseDecoderConfigDescriptor(BitReader* reader);
51  bool ParseDecoderSpecificInfo(BitReader* reader);
52
53  uint8 object_type_;
54  std::vector<uint8> decoder_specific_info_;
55};
56
57}  // namespace mp4
58
59}  // namespace media
60
61#endif  // MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
62