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