1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are met: 6 * Redistributions of source code must retain the above copyright 7 notice, this list of conditions and the following disclaimer. 8 * Redistributions in binary form must reproduce the above copyright 9 notice, this list of conditions and the following disclaimer in the 10 documentation and/or other materials provided with the distribution. 11 * Neither the name of The Linux Foundation nor 12 the names of its contributors may be used to endorse or promote 13 products derived from this software without specific prior written 14 permission. 15 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 --------------------------------------------------------------------------*/ 28 #ifndef H264_UTILS_H 29 #define H264_UTILS_H 30 31 /*======================================================================== 32 33 O p e n M M 34 U t i l i t i e s a n d H e l p e r R o u t i n e s 35 36 *//** @file H264_Utils.h 37 This module contains H264 video decoder utilities and helper routines. 38 39 *//*====================================================================== */ 40 41 /* ======================================================================= 42 43 INCLUDE FILES FOR MODULE 44 45 ========================================================================== */ 46 #include <stdio.h> 47 #include "Map.h" 48 #include "qtypes.h" 49 #include "OMX_Core.h" 50 #include "OMX_QCOMExtns.h" 51 52 #define STD_MIN(x,y) (((x) < (y)) ? (x) : (y)) 53 54 #define OMX_CORE_720P_HEIGHT 720 55 #define OMX_CORE_720P_WIDTH 1280 56 57 #define SIZE_NAL_FIELD_MAX 4 58 #define BASELINE_PROFILE 66 59 #define MAIN_PROFILE 77 60 #define HIGH_PROFILE 100 61 62 #define PANSCAN_HDLR 63 64 /* ======================================================================= 65 66 DATA DECLARATIONS 67 68 ========================================================================== */ 69 70 /* ----------------------------------------------------------------------- 71 ** Constant / Define Declarations 72 ** ----------------------------------------------------------------------- */ 73 // Common format block header definitions 74 #define MT_VIDEO_META_STREAM_HEADER 0x00 75 #define MT_VIDEO_MEDIA_STREAM_HEADER 0x01 76 #define MT_VIDEO_META_MEDIA_STREAM_HEADER 0x02 77 78 // H.264 format block header definitions 79 #define MT_VIDEO_H264_ACCESS_UNIT_FORMAT 0x00 80 #define MT_VIDEO_H264_NAL_FORMT 0x01 81 #define MT_VIDEO_H264_BYTE_FORMAT 0x02 82 #define MT_VIDEO_H264_BYTE_STREAM_FORMAT 0x00 83 #define MT_VIDEO_H264_NAL_UNIT_STREAM_FORMAT 0x01 84 #define MT_VIDEO_H264_FORMAT_BLOCK_HEADER_SIZE 18 85 86 // MPEG-4 format block header definitions 87 #define MT_VIDEO_MPEG4_VOP_FORMAT 0x00 88 #define MT_VIDEO_MPEG4_SLICE_FORMAT 0x01 89 #define MT_VIDEO_MPEG4_BYTE_FORMAT 0x02 90 #define MT_VIDEO_MPEG4_FORMAT_BLOCK_HEADER_SIZE 15 91 92 // H.263 format block header definitions 93 #define MT_VIDEO_H263_PICTURE_FORMAT 0x00 94 #define MT_VIDEO_H263_GOB_FORMAT 0x01 95 #define MT_VIDEO_H263_SLICE_STRUCTURED_FORMAT 0x02 96 #define MT_VIDEO_H263_BYTE_FORMAT 0x03 97 #define MT_VIDEO_H263_FORMAT_BLOCK_HEADER_SIZE 16 98 99 /* ======================================================================= 100 ** Function Declarations 101 ** ======================================================================= */ 102 103 /* ----------------------------------------------------------------------- 104 ** Type Declarations 105 ** ----------------------------------------------------------------------- */ 106 107 // This type is used when parsing an H.264 bitstream to collect H.264 NAL 108 // units that need to go in the meta data. 109 struct H264ParamNalu { 110 uint32 picSetID; 111 uint32 seqSetID; 112 uint32 picOrderCntType; 113 bool frameMbsOnlyFlag; 114 bool picOrderPresentFlag; 115 uint32 picWidthInMbsMinus1; 116 uint32 picHeightInMapUnitsMinus1; 117 uint32 log2MaxFrameNumMinus4; 118 uint32 log2MaxPicOrderCntLsbMinus4; 119 bool deltaPicOrderAlwaysZeroFlag; 120 //std::vector<uint8> nalu; 121 uint32 nalu; 122 uint32 crop_left; 123 uint32 crop_right; 124 uint32 crop_top; 125 uint32 crop_bot; 126 }; 127 //typedef map<uint32, H264ParamNalu> H264ParamNaluSet; 128 typedef Map<uint32, H264ParamNalu *> H264ParamNaluSet; 129 130 typedef enum { 131 NALU_TYPE_UNSPECIFIED = 0, 132 NALU_TYPE_NON_IDR, 133 NALU_TYPE_PARTITION_A, 134 NALU_TYPE_PARTITION_B, 135 NALU_TYPE_PARTITION_C, 136 NALU_TYPE_IDR, 137 NALU_TYPE_SEI, 138 NALU_TYPE_SPS, 139 NALU_TYPE_PPS, 140 NALU_TYPE_ACCESS_DELIM, 141 NALU_TYPE_EOSEQ, 142 NALU_TYPE_EOSTREAM, 143 NALU_TYPE_FILLER_DATA, 144 NALU_TYPE_RESERVED, 145 } NALU_TYPE; 146 147 // NAL header information 148 typedef struct { 149 uint32 nal_ref_idc; 150 uint32 nalu_type; 151 uint32 forbidden_zero_bit; 152 } NALU; 153 154 // This structure contains persistent information about an H.264 stream as it 155 // is parsed. 156 //struct H264StreamInfo { 157 // H264ParamNaluSet pic; 158 // H264ParamNaluSet seq; 159 //}; 160 161 class extra_data_parser; 162 163 class RbspParser 164 /****************************************************************************** 165 ** This class is used to convert an H.264 NALU (network abstraction layer 166 ** unit) into RBSP (raw byte sequence payload) and extract bits from it. 167 *****************************************************************************/ 168 { 169 public: 170 RbspParser (const uint8 *begin, const uint8 *end); 171 172 virtual ~RbspParser (); 173 174 uint32 next (); 175 void advance (); 176 uint32 u (uint32 n); 177 uint32 ue (); 178 int32 se (); 179 180 private: 181 const uint8 *begin, *end; 182 int32 pos; 183 uint32 bit; 184 uint32 cursor; 185 bool advanceNeeded; 186 }; 187 188 class H264_Utils 189 { 190 public: 191 H264_Utils(); 192 ~H264_Utils(); 193 void initialize_frame_checking_environment(); 194 void allocate_rbsp_buffer(uint32 inputBufferSize); 195 bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr, 196 OMX_IN OMX_U32 size_of_nal_length_field, 197 OMX_OUT OMX_BOOL &isNewFrame); 198 uint32 nalu_type; 199 200 private: 201 boolean extract_rbsp(OMX_IN OMX_U8 *buffer, 202 OMX_IN OMX_U32 buffer_length, 203 OMX_IN OMX_U32 size_of_nal_length_field, 204 OMX_OUT OMX_U8 *rbsp_bistream, 205 OMX_OUT OMX_U32 *rbsp_length, 206 OMX_OUT NALU *nal_unit); 207 208 unsigned m_height; 209 unsigned m_width; 210 H264ParamNaluSet pic; 211 H264ParamNaluSet seq; 212 uint8 *m_rbspBytes; 213 NALU m_prv_nalu; 214 bool m_forceToStichNextNAL; 215 bool m_au_data; 216 }; 217 218 class perf_metrics 219 { 220 public: perf_metrics()221 perf_metrics() : 222 start_time(0), 223 proc_time(0), 224 active(false) { 225 }; ~perf_metrics()226 ~perf_metrics() {}; 227 void start(); 228 void stop(); 229 void end(OMX_U32 units_cntr = 0); 230 void reset(); 231 OMX_U64 processing_time_us(); 232 private: 233 inline OMX_U64 get_act_time(); 234 OMX_U64 start_time; 235 OMX_U64 proc_time; 236 bool active; 237 }; 238 239 #define EMULATION_PREVENTION_THREE_BYTE 0x03 240 #define MAX_CPB_COUNT 32 241 #define NO_PAN_SCAN_BIT 0x00000100 242 #define MAX_PAN_SCAN_RECT 3 243 #define VALID_TS(ts) ((ts < LLONG_MAX)? true : false) 244 #define NALU_TYPE_VUI (NALU_TYPE_RESERVED + 1) 245 246 enum SEI_PAYLOAD_TYPE { 247 BUFFERING_PERIOD = 0, 248 PIC_TIMING, 249 PAN_SCAN_RECT, 250 FILLER_PAYLOAD, 251 USER_DATA_REGISTERED_ITU_T_T35, 252 USER_DATA_UNREGISTERED, 253 RECOVERY_POINT, 254 DEC_REF_PIC_MARKING_REPETITION, 255 SPARE_PIC, 256 SCENE_INFO, 257 SUB_SEQ_INFO, 258 SUB_SEQ_LAYER_CHARACTERISTICS, 259 SUB_SEQ_CHARACTERISTICS, 260 FULL_FRAME_FREEZE, 261 FULL_FRAME_FREEZE_RELEASE, 262 FULL_FRAME_SNAPSHOT, 263 PROGRESSIVE_REFINEMENT_SEGMENT_START, 264 PROGRESSIVE_REFINEMENT_SEGMENT_END, 265 SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT = 0x2D 266 }; 267 268 typedef struct { 269 OMX_U32 cpb_cnt; 270 OMX_U8 bit_rate_scale; 271 OMX_U8 cpb_size_scale; 272 OMX_U32 bit_rate_value[MAX_CPB_COUNT]; 273 OMX_U32 cpb_size_value[MAX_CPB_COUNT]; 274 OMX_U8 cbr_flag[MAX_CPB_COUNT]; 275 OMX_U8 initial_cpb_removal_delay_length; 276 OMX_U8 cpb_removal_delay_length; 277 OMX_U8 dpb_output_delay_length; 278 OMX_U8 time_offset_length; 279 } h264_hrd_param; 280 281 typedef struct { 282 OMX_U32 aspect_ratio_idc; 283 OMX_U32 aspect_ratio_x; 284 OMX_U32 aspect_ratio_y; 285 } h264_aspect_ratio_info; 286 287 typedef struct { 288 OMX_U8 aspect_ratio_info_present_flag; 289 h264_aspect_ratio_info aspect_ratio_info; 290 OMX_U8 timing_info_present_flag; 291 OMX_U32 num_units_in_tick; 292 OMX_U32 time_scale; 293 OMX_U8 fixed_frame_rate_flag; 294 OMX_U8 nal_hrd_parameters_present_flag; 295 h264_hrd_param nal_hrd_parameters; 296 OMX_U8 vcl_hrd_parameters_present_flag; 297 h264_hrd_param vcl_hrd_parameters; 298 OMX_U8 low_delay_hrd_flag; 299 OMX_U8 pic_struct_present_flag; 300 OMX_S64 fixed_fps_prev_ts; 301 } h264_vui_param; 302 303 typedef struct { 304 OMX_U32 cpb_removal_delay; 305 OMX_U32 dpb_output_delay; 306 OMX_U8 pic_struct; 307 OMX_U32 num_clock_ts; 308 bool clock_ts_flag; 309 OMX_U8 ct_type; 310 OMX_U32 nuit_field_based_flag; 311 OMX_U8 counting_type; 312 OMX_U8 full_timestamp_flag; 313 OMX_U8 discontinuity_flag; 314 OMX_U8 cnt_dropped_flag; 315 OMX_U32 n_frames; 316 OMX_U32 seconds_value; 317 OMX_U32 minutes_value; 318 OMX_U32 hours_value; 319 OMX_S32 time_offset; 320 bool is_valid; 321 } h264_sei_pic_timing; 322 323 typedef struct { 324 OMX_U32 initial_cpb_removal_delay[MAX_CPB_COUNT]; 325 OMX_U32 initial_cpb_removal_delay_offset[MAX_CPB_COUNT]; 326 OMX_U32 au_cntr; 327 OMX_S64 reference_ts; 328 bool is_valid; 329 } h264_sei_buf_period; 330 331 typedef struct { 332 OMX_U32 rect_id; 333 OMX_U8 rect_cancel_flag; 334 OMX_U32 cnt; 335 OMX_S32 rect_left_offset[MAX_PAN_SCAN_RECT]; 336 OMX_S32 rect_right_offset[MAX_PAN_SCAN_RECT]; 337 OMX_S32 rect_top_offset[MAX_PAN_SCAN_RECT]; 338 OMX_S32 rect_bottom_offset[MAX_PAN_SCAN_RECT]; 339 OMX_U32 rect_repetition_period; 340 } h264_pan_scan; 341 342 #ifdef PANSCAN_HDLR 343 template <class NODE_STRUCT> 344 class omx_dl_list 345 { 346 public: omx_dl_list()347 omx_dl_list() { 348 head = tail = NULL; 349 } ; ~omx_dl_list()350 ~omx_dl_list() {}; 351 void add_multiple(NODE_STRUCT *data_arr, int data_num); 352 NODE_STRUCT *remove_first(); 353 NODE_STRUCT *remove_last(); 354 void add_last(NODE_STRUCT *data_ptr); 355 NODE_STRUCT *watch_first(); 356 NODE_STRUCT *watch_last(); 357 private: 358 NODE_STRUCT *head, *tail; 359 }; 360 361 class panscan_handler 362 { 363 public: 364 panscan_handler(); 365 ~panscan_handler(); 366 bool initialize(int num_data); 367 h264_pan_scan *get_free(); 368 h264_pan_scan *get_populated(OMX_S64 frame_ts); 369 void update_last(OMX_S64 frame_ts); 370 private: 371 typedef struct PANSCAN_NODE { 372 h264_pan_scan pan_scan_param; 373 OMX_S64 start_ts, end_ts; 374 bool active; 375 PANSCAN_NODE *next, *prev; 376 } PANSCAN_NODE; 377 omx_dl_list<PANSCAN_NODE> panscan_used; 378 omx_dl_list<PANSCAN_NODE> panscan_free; 379 PANSCAN_NODE *panscan_data; 380 }; 381 382 #if 1 // Debug panscan data 383 384 #define PRINT_PANSCAN_PARAM(H264_PARAM) 385 #define PRINT_PANSCAN_DATA(NODE) 386 387 #else 388 389 #define PRINT_PANSCAN_PARAM(H264_PARAM) \ 390 do {\ 391 ALOGE("%s(): left_off(%ld) right_off(%ld) top_off(%ld) bottom_off(%ld)",\ 392 __FUNCTION__,\ 393 (H264_PARAM).rect_left_offset[0],\ 394 (H264_PARAM).rect_right_offset[0],\ 395 (H264_PARAM).rect_top_offset[0],\ 396 (H264_PARAM).rect_bottom_offset[0]);\ 397 }while(0) 398 399 #define PRINT_PANSCAN_DATA(NODE) \ 400 do {\ 401 if (NODE) {\ 402 ALOGE("%s(): PANSCAN DATA start_ts(%lld) end_ts(%lld)", __FUNCTION__,\ 403 (NODE)->start_ts, (NODE)->end_ts);\ 404 PRINT_PANSCAN_PARAM(NODE->pan_scan_param);\ 405 }\ 406 }while(0) 407 408 #endif // End debug panscan data 409 410 #endif 411 412 class h264_stream_parser 413 { 414 public: 415 h264_stream_parser(); 416 ~h264_stream_parser(); 417 void reset(); 418 void fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp); 419 void fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio); 420 void parse_nal(OMX_U8* data_ptr, OMX_U32 data_len, 421 OMX_U32 nal_type = NALU_TYPE_UNSPECIFIED, 422 bool enable_emu_sc = true); 423 OMX_S64 process_ts_with_sei_vui(OMX_S64 timestamp); 424 void get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack); 425 bool is_mbaff(); 426 void get_frame_rate(OMX_U32 *frame_rate); 427 OMX_U32 get_profile(); 428 #ifdef PANSCAN_HDLR 429 void update_panscan_data(OMX_S64 timestamp); 430 #endif 431 432 private: 433 void init_bitstream(OMX_U8* data, OMX_U32 size); 434 OMX_U32 extract_bits(OMX_U32 n); 435 inline bool more_bits(); 436 void read_word(); 437 OMX_U32 uev(); 438 OMX_S32 sev(); 439 OMX_S32 iv(OMX_U32 n_bits); 440 void parse_sps(); 441 void parse_vui(bool vui_in_extradata = true); 442 void aspect_ratio_info(); 443 void hrd_parameters(h264_hrd_param *hrd_param); 444 void parse_sei(); 445 void sei_buffering_period(); 446 void sei_picture_timing(); 447 void sei_pan_scan(); 448 void scaling_list(OMX_U32 size_of_scaling_list); 449 450 void print_pan_data(h264_pan_scan *pan_scan_param); 451 void print_frame_pack(); 452 453 OMX_U32 get_nal_unit_type(OMX_U32 *nal_unit_type); 454 OMX_S64 calculate_buf_period_ts(OMX_S64 timestamp); 455 OMX_S64 calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor); 456 void parse_frame_pack(); 457 458 OMX_U32 curr_32_bit; 459 OMX_U32 bits_read; 460 OMX_U32 profile; 461 OMX_U32 zero_cntr; 462 OMX_U32 emulation_code_skip_cntr; 463 OMX_U8* bitstream; 464 OMX_U32 bitstream_bytes; 465 OMX_U32 frame_rate; 466 bool emulation_sc_enabled; 467 468 h264_vui_param vui_param; 469 h264_sei_buf_period sei_buf_period; 470 h264_sei_pic_timing sei_pic_timing; 471 #ifdef PANSCAN_HDLR 472 panscan_handler *panscan_hdl; 473 #else 474 h264_pan_scan panscan_param; 475 #endif 476 OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement; 477 bool mbaff_flag; 478 }; 479 480 #endif /* H264_UTILS_H */ 481