1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef VIDDEC_MP4_PARSE_H
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define VIDDEC_MP4_PARSE_H
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h"
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_mp4.h"
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Macros for MP4 start code detection */
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define FIRST_STARTCODE_BYTE        0x00
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SECOND_STARTCODE_BYTE       0x00
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define THIRD_STARTCODE_BYTE        0x01
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SHORT_THIRD_STARTCODE_BYTE  0x80
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SC_BYTE_MASK0               0x00ff0000
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SC_BYTE_MASK1               0x000000ff
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* status codes */
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef enum
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_STATUS_OK               =  0,   /* Success */
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_STATUS_PARSE_ERROR      = (1 << 0),   /* Invalid syntax */
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_STATUS_NOTSUPPORT       = (1 << 1),   /* unsupported feature */
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_STATUS_REQD_DATA_ERROR  = (1 << 2),   /* supported data either invalid or missing */
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_Status_t;
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* feature codes */
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef enum
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_FEATURE_DEFAULT =  0,   // Default VOP features, no code image update needed
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_FEATURE_SVH     =  1,   // VOP has Short Video Header
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_FEATURE_DP      =  2    // VOP is Data Partitioned
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_Vop_feature;
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* MPEG-4 start code values: Table 6-3 */
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef enum
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_OBJECT_MIN          = 0x00,
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_OBJECT_MAX          = 0x1F,
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_OBJECT_LAYER_MIN    = 0x20,
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_OBJECT_LAYER_MAX    = 0x2F,
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_FGS_BP_MIN                = 0x40, /* Unsupported */
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_FGS_BP_MAX                = 0x5F, /* Unsupported */
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VISUAL_OBJECT_SEQUENCE    = 0xB0,
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VISUAL_OBJECT_SEQUENCE_EC = 0xB1,
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_USER_DATA                 = 0xB2,
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_GROUP_OF_VOP              = 0xB3,
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_SESSION_ERROR       = 0xB4,
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VISUAL_OBJECT             = 0xB5,
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_VIDEO_OBJECT_PLANE        = 0xB6,
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SLICE                     = 0xB7, /* Unsupported */
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_EXTENSION                 = 0xB8, /* Unsupported */
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_FGS_VOP                   = 0xB9, /* Unsupported */
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_FBA_OBJECT                = 0xBA, /* Unsupported */
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_FBA_OBJECT_PLANE          = 0xBB, /* Unsupported */
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_MESH_OBJECT               = 0xBC, /* Unsupported */
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_MESH_OBJECT_PLANE         = 0xBD, /* Unsupported */
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_STILL_TEXTURE_OBJECT      = 0xBE, /* Unsupported */
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_TEXTURE_SPATIAL_LAYER     = 0xBF, /* Unsupported */
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_TEXTURE_SNR_LAYER         = 0xC0, /* Unsupported */
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_TEXTURE_TILE              = 0xC1, /* Unsupported */
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_TEXTURE_SHAPE_LAYER       = 0xC2, /* Unsupported */
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_STUFFING                  = 0xC3,
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SYTEM_MIN                 = 0xC6, /* Unsupported */
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SYTEM_MAX                 = 0xFF, /* Unsupported */
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_INVALID                   = 0x100, /* Invalid */
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mp4_start_code_values_t;
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* MPEG-4 code values
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   ISO/IEC 14496-2:2004 table 6-6 */
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VISUAL_OBJECT_TYPE_VIDEO     = 1,
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VISUAL_OBJECT_TYPE_TEXTURE   = 2,
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VISUAL_OBJECT_TYPE_MESH      = 3,
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VISUAL_OBJECT_TYPE_FBA       = 4,
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VISUAL_OBJECT_TYPE_3DMESH    = 5
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-7 */
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_COMPONENT      = 0,
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_PAL            = 1,
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_NTSC           = 2,
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_SECAM          = 3,
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_MAC            = 4,
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_FORMAT_UNSPECIFIED    = 5
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-8..10 */
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_FORBIDDEN         = 0,
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_ITU_R_BT_709      = 1,
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_UNSPECIFIED       = 2,
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_RESERVED          = 3,
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_ITU_R_BT_470_2_M  = 4,
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_ITU_R_BT_470_2_BG = 5,
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_SMPTE_170M        = 6,
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_SMPTE_240M        = 7,
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_COLORS_GENERIC_FILM      = 8
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-11 */
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_SIMPLE                     = 1,
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_SIMPLE_SCALABLE            = 2,
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_CORE                       = 3,
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_MAIN                       = 4,
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_NBIT                       = 5,
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_2DTEXTURE                  = 6,
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_2DMESH                     = 7,
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_SIMPLE_FACE                = 8,
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_STILL_SCALABLE_TEXTURE     = 9,
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_ADVANCED_REAL_TIME_SIMPLE  = 10,
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_CORE_SCALABLE              = 11,
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_ADVANCED_CODING_EFFICIENCY = 12,
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_ADVANCED_SCALABLE_TEXTURE  = 13,
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_SIMPLE_FBA                 = 14,
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_SIMPLE_STUDIO              = 15,
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_CORE_STUDIO                = 16,
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_ADVANCED_SIMPLE            = 17,
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VIDEO_OBJECT_TYPE_FINE_GRANULARITY_SCALABLE  = 18
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*  ISO/IEC 14496-2:2004 table 6.17 (maximum defined video_object_layer_shape_extension) */
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_SHAPE_EXT_NUM 13
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-14 */
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_FORBIDDEN  = 0,
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_1_1        = 1,
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_12_11      = 2,
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_10_11      = 3,
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_16_11      = 4,
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_40_33      = 5,
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ASPECT_RATIO_EXTPAR     = 15
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-15 */
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_CHROMA_FORMAT_420    1
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-16 */
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SHAPE_TYPE_RECTANGULAR  = 0,
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SHAPE_TYPE_BINARY       = 1,
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SHAPE_TYPE_BINARYONLY   = 2,
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SHAPE_TYPE_GRAYSCALE    = 3
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-19 */
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_SPRITE_STATIC   1
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_SPRITE_GMC      2
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-24 */
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_TYPE_I  = 0,
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_TYPE_P  = 1,
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_TYPE_B  = 2,
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_VOP_TYPE_S  = 3,
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 6-26 */
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SPRITE_TRANSMIT_MODE_STOP   = 0,
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SPRITE_TRANSMIT_MODE_PIECE  = 1,
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SPRITE_TRANSMIT_MODE_UPDATE = 2,
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SPRITE_TRANSMIT_MODE_PAUSE  = 3
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table 7-3 */
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_MVDSZ_NOUPDATE  = 0,
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_MVDSNZ_NOUPDATE = 1,
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_TRANSPARENT     = 2,
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_OPAQUE          = 3,
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_INTRACAE        = 4,
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_MVDSZ_INTERCAE  = 5,
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BAB_TYPE_MVDSNZ_INTERCAE = 6
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_DC_MARKER  0x6B001 // 110 1011 0000 0000 0001
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_MV_MARKER  0x1F001 //   1 1111 0000 0000 0001
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ISO/IEC 14496-2:2004 table G.1 */
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_1                     = 0x01,
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_2                     = 0x02,
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_3                     = 0x03,
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_4a                    = 0x04,
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_5                     = 0x05,
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_6                     = 0x06,
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SIMPLE_PROFILE_LEVEL_0                     = 0x08,
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_CORE_PROFILE_LEVEL_1                       = 0x21,
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_CORE_PROFILE_LEVEL_2                       = 0x22,
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_MAIN_PROFILE_LEVEL_2                       = 0x32,
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_MAIN_PROFILE_LEVEL_3                       = 0x33,
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_MAIN_PROFILE_LEVEL_4                       = 0x34,
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_1  = 0x91,
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_2  = 0x92,
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_3  = 0x93,
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_4  = 0x94,
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_1 = 0xB1,
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_2 = 0xB2,
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_3 = 0xB3,
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_4 = 0xB4,
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CORE_PROFILE_LEVEL_1              = 0xC1,
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_CORE_PROFILE_LEVEL_2              = 0xC2,
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_0            = 0xF0,
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_1            = 0xF1,
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_2            = 0xF2,
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3            = 0xF3,
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_4            = 0xF4,
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_5            = 0xF5,
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3B           = 0xF7
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Group Of Video Object Plane Info */
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t closed_gov;
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t broken_link;
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t time_code_hours;
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t time_code_minutes;
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t time_code_seconds;
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t dummy1;
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t dummy2;
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t time_base;
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_GroupOfVideoObjectPlane_t;
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Video Object Plane Info */
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_coding_type;
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t    modulo_time_base;
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_time_increment;
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_coded;
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_id;
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_id_for_prediction;
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     is_vop_id_for_prediction_indication;
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_rounding_type;
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_reduced_resolution;
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     align_dummy;
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_width;
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_height;
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_horizontal_mc_spatial_ref;
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_vertical_mc_spatial_ref;
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     background_composition;
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     change_conv_ratio_disable;
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     is_vop_constant_alpha;
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_constant_alpha_value;
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     intra_dc_vlc_thr;
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     top_field_first;
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     alternate_vertical_scan_flag;
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     sprite_transmit_mode;
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int32_t     brightness_change_factor;
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    vop_quant;
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_fcode_forward;
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vop_fcode_backward;
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    warping_mv_code_du[4];
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    warping_mv_code_dv[4];
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VideoObjectPlane_t;
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* VOLControlParameters Info */
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     chroma_format;
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     low_delay;
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     vbv_parameters;
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t     align_dummy1;
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t    bit_rate;
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t    vbv_buffer_size;
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t    vbv_occupancy;
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VOLControlParameters_t;
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Video Object Plane with short header Info */
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct _mp4_VideoObjectPlaneH263
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         temporal_reference;
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         split_screen_indicator;
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         document_camera_indicator;
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         full_picture_freeze_release;
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         source_format;
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         picture_coding_type;
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         vop_quant;
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t        num_gobs_in_vop;
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t        num_macroblocks_in_gob;
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         num_rows_in_gob;
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t         gob_number;
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int         gob_header_empty;
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int         gob_frame_id;
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int         quant_scale;
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VideoObjectPlaneH263;
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_width;
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_height;
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_left_coordinate;
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_top_coordinate;
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  no_of_sprite_warping_points;
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_warping_accuracy;
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  sprite_brightness_change;
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                  low_latency_sprite_enable;
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mp4_VOLSpriteInfo_t;
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                  load_intra_quant_mat;
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                  load_nonintra_quant_mat;
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                 align_dummy1;
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                  intra_quant_mat[64];
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                  nonintra_quant_mat[64];
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}mp4_VOLQuant_mat_t;
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Video Object Layer Info */
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     video_object_layer_id; /* Last 4 bits of start code. */
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     short_video_header;
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     random_accessible_vol;
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     video_object_type_indication;
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     is_object_layer_identifier;
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     video_object_layer_verid;
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     video_object_layer_priority;
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     aspect_ratio_info;
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     aspect_ratio_info_par_width;
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     aspect_ratio_info_par_height;
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     align_dummy1;
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     is_vol_control_parameters;
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VOLControlParameters_t  VOLControlParameters;
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     video_object_layer_shape;
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                    vop_time_increment_resolution;
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     vop_time_increment_resolution_bits;
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     fixed_vop_rate;
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                    fixed_vop_time_increment;
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                    video_object_layer_width;
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t                    video_object_layer_height;
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     interlaced;
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     obmc_disable;
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     sprite_enable;
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VOLSpriteInfo_t         sprite_info;
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     not_8_bit;
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     quant_precision;
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     bits_per_pixel;
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     quant_type;
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VOLQuant_mat_t          quant_mat_info;
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     quarter_sample;
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     complexity_estimation_disable;
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     resync_marker_disable;
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     data_partitioned;
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     reversible_vlc;
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     newpred_enable;
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     reduced_resolution_vop_enable;  // verid != 1
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     scalability;
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                     low_latency_sprite_enable;
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_GroupOfVideoObjectPlane_t  GroupOfVideoObjectPlane;
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VideoObjectPlane_t      VideoObjectPlane;
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VideoObjectPlaneH263    VideoObjectPlaneH263;
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // for interlaced B-VOP direct mode
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t                         Tframe;
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // for B-VOP direct mode
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t                         TRB, TRD;
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // time increment of past and future VOP for B-VOP
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t                      pastFrameTime, futureFrameTime;
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // VOP global time
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t                      vop_sync_time, vop_sync_time_b;
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VideoObjectLayer_t;
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* video_signal_type Info */
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t is_video_signal_type;
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t video_format;
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t video_range;
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t is_colour_description;
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t colour_primaries;
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t transfer_characteristics;
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t matrix_coefficients;
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VideoSignalType_t;
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct _mp4_Frame {
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    long long int    time;
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_Frame;
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Visual Object Info */
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                 is_visual_object_identifier;
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                 visual_object_verid;
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                 visual_object_priority;
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t                 visual_object_type;
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VideoSignalType_t   VideoSignalType;
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VideoObjectLayer_t  VideoObject;
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_Frame               currentFrame;      // current
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_Frame               pastFrame;      // reference in past
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_Frame               futureFrame;      // reference in future
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_VisualObject_t;
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Full Info */
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_VisualObject_t    VisualObject;
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t               profile_and_level_indication;
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} mp4_Info_t;
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SEEN_INVALID = 0x0,
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SEEN_VOL = 0x1,
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SEEN_VOP = 0x2,
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_SC_SEEN_SVH = 0x4,
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeenum
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_NONE =          (0 << 0),
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_HDR_PARSE =     (1 << 0),
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_HDR_NONDEC =    (1 << 1),
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_HDR_UNSUP =     (1 << 2),
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_FRM_PARSE =     (1 << 3),
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_FRM_NONDEC =    (1 << 4),
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MP4_BS_ERROR_FRM_UNSUP =     (1 << 5),
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MP4_HDR_ERROR_MASK (MP4_BS_ERROR_HDR_PARSE | MP4_BS_ERROR_HDR_NONDEC | MP4_BS_ERROR_HDR_UNSUP)
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef enum
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   VIDDEC_MP4_INDX_0 = 0,
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   VIDDEC_MP4_INDX_1 = 1,
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   VIDDEC_MP4_INDX_2 = 2,
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   VIDDEC_MP4_INDX_MAX = 3,
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} viddec_fw_mp4_ref_index_t;
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   uint8_t is_field;
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} viddec_mp4_ref_info_t;
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // The relevant bitstream data for current stream
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mp4_Info_t info;
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // The previous start code (without the prefix)
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t   prev_sc;
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // The current start code (without the prefix)
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // TODO: Revisit for SVH
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t   current_sc;
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates if we look for both short and long video header or just the long video header
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // If false, sc detection looks for both short and long video headers.
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // If true, long video header has been seen and sc detection does not look for short video header any more.
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t    ignore_scs;
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates if the current start code prefix is long (if true).
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t    cur_sc_prefix;
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates if the next start code prefix is long (if true).
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t    next_sc_prefix;
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates start of a frame
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t    is_frame_start;
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates which start codes were seen for this workload
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t    sc_seen;
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    // Indicates bitstream errors if any
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint16_t    bitstream_error;
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   // Reference frame information
503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   viddec_mp4_ref_info_t ref_frame[VIDDEC_MP4_INDX_MAX];
504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}viddec_mp4_parser_t;
506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define BREAK_GETBITS_FAIL(x, ret) {            \
508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(x == -1){                            \
509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            FWTRACE;                            \
510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = MP4_STATUS_PARSE_ERROR;       \
511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;}                             \
512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define BREAK_GETBITS_REQD_MISSING(x, ret) {            \
515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(x == -1){                            \
516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            FWTRACE;                            \
517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = MP4_STATUS_REQD_DATA_ERROR;       \
518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            break;}                             \
519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
521bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeextern void *memset(void *s, int32_t c, uint32_t n);
522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
523bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_fw_mp4_emit_workload(void *parent, void *ctxt);
524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
525bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mp4_set_hdr_bitstream_error(viddec_mp4_parser_t *parser, uint8_t hdr_flag, mp4_Status_t parse_status);
526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
528