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