1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*-------------------------------------------------------------------------- 2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved. 3e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRedistribution and use in source and binary forms, with or without 5e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellymodification, are permitted provided that the following conditions are met: 6e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Redistributions of source code must retain the above copyright 7e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly notice, this list of conditions and the following disclaimer. 8e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Redistributions in binary form must reproduce the above copyright 9e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly notice, this list of conditions and the following disclaimer in the 10e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly documentation and/or other materials provided with the distribution. 11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand * Neither the name of Code Aurora nor 12e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly the names of its contributors may be used to endorse or promote 13e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly products derived from this software without specific prior written 14e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly permission. 15e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 16e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly--------------------------------------------------------------------------*/ 28e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifndef H264_UTILS_H 29e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define H264_UTILS_H 30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*======================================================================== 32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly O p e n M M 34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 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 35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//** @file H264_Utils.h 37e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyThis module contains H264 video decoder utilities and helper routines. 38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//*====================================================================== */ 40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================= 42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly INCLUDE FILES FOR MODULE 44e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 45e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 46e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdio.h> 47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "Map.h" 48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "qtypes.h" 49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_Core.h" 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "OMX_QCOMExtns.h" 51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 52e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define STD_MIN(x,y) (((x) < (y)) ? (x) : (y)) 53e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 54e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_720P_HEIGHT 720 55e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_720P_WIDTH 1280 56e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PANSCAN_HDLR 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 59e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================= 60e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 61e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DATA DECLARATIONS 62e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 63e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 64e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 65e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ----------------------------------------------------------------------- 66e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** Constant / Define Declarations 67e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** ----------------------------------------------------------------------- */ 68e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Common format block header definitions 69e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_META_STREAM_HEADER 0x00 70e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_MEDIA_STREAM_HEADER 0x01 71e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_META_MEDIA_STREAM_HEADER 0x02 72e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 73e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// H.264 format block header definitions 74e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_ACCESS_UNIT_FORMAT 0x00 75e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_NAL_FORMT 0x01 76e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_BYTE_FORMAT 0x02 77e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_BYTE_STREAM_FORMAT 0x00 78e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_NAL_UNIT_STREAM_FORMAT 0x01 79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H264_FORMAT_BLOCK_HEADER_SIZE 18 80e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 81e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// MPEG-4 format block header definitions 82e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_MPEG4_VOP_FORMAT 0x00 83e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_MPEG4_SLICE_FORMAT 0x01 84e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_MPEG4_BYTE_FORMAT 0x02 85e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_MPEG4_FORMAT_BLOCK_HEADER_SIZE 15 86e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 87e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// H.263 format block header definitions 88e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H263_PICTURE_FORMAT 0x00 89e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H263_GOB_FORMAT 0x01 90e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H263_SLICE_STRUCTURED_FORMAT 0x02 91e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H263_BYTE_FORMAT 0x03 92e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MT_VIDEO_H263_FORMAT_BLOCK_HEADER_SIZE 16 93e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 94e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================= 95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** Function Declarations 96e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** ======================================================================= */ 97e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 98e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ----------------------------------------------------------------------- 99e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** Type Declarations 100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly** ----------------------------------------------------------------------- */ 101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// This type is used when parsing an H.264 bitstream to collect H.264 NAL 103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// units that need to go in the meta data. 104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystruct H264ParamNalu { 105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 picSetID; 106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 seqSetID; 107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 picOrderCntType; 108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool frameMbsOnlyFlag; 109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool picOrderPresentFlag; 110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 picWidthInMbsMinus1; 111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 picHeightInMapUnitsMinus1; 112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 log2MaxFrameNumMinus4; 113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 log2MaxPicOrderCntLsbMinus4; 114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool deltaPicOrderAlwaysZeroFlag; 115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //std::vector<uint8> nalu; 116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 nalu; 117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 crop_left; 118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 crop_right; 119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 crop_top; 120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 crop_bot; 121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}; 122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//typedef map<uint32, H264ParamNalu> H264ParamNaluSet; 123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef Map<uint32, H264ParamNalu *> H264ParamNaluSet; 124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef enum { 126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_UNSPECIFIED = 0, 127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_NON_IDR, 128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_PARTITION_A, 129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_PARTITION_B, 130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_PARTITION_C, 131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_IDR, 132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_SEI, 133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_SPS, 134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_PPS, 135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_ACCESS_DELIM, 136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_EOSEQ, 137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_EOSTREAM, 138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_FILLER_DATA, 139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU_TYPE_RESERVED, 140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} NALU_TYPE; 141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// NAL header information 143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef struct { 144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 nal_ref_idc; 145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 nalu_type; 146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 forbidden_zero_bit; 147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} NALU; 148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// This structure contains persistent information about an H.264 stream as it 150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// is parsed. 151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//struct H264StreamInfo { 152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// H264ParamNaluSet pic; 153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// H264ParamNaluSet seq; 154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//}; 155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevclass extra_data_parser; 157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyclass RbspParser 159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/****************************************************************************** 160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ** This class is used to convert an H.264 NALU (network abstraction layer 161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ** unit) into RBSP (raw byte sequence payload) and extract bits from it. 162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *****************************************************************************/ 163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypublic: 165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly RbspParser (const uint8 *begin, const uint8 *end); 166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly virtual ~RbspParser (); 168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 next (); 170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly void advance (); 171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 u (uint32 n); 172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 ue (); 173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int32 se (); 174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyprivate: 176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly const uint8 *begin, *end; 177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int32 pos; 178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 bit; 179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint32 cursor; 180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool advanceNeeded; 181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}; 182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyclass H264_Utils 184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypublic: 186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly H264_Utils(); 187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ~H264_Utils(); 188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly void initialize_frame_checking_environment(); 189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly void allocate_rbsp_buffer(uint32 inputBufferSize); 190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr, 191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 size_of_nal_length_field, 192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_BOOL &isNewFrame); 193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev uint32 nalu_type; 194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyprivate: 196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly boolean extract_rbsp(OMX_IN OMX_U8 *buffer, 197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 buffer_length, 198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 size_of_nal_length_field, 199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_U8 *rbsp_bistream, 200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_U32 *rbsp_length, 201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT NALU *nal_unit); 202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned m_height; 204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned m_width; 205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly H264ParamNaluSet pic; 206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly H264ParamNaluSet seq; 207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint8 *m_rbspBytes; 208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NALU m_prv_nalu; 209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool m_forceToStichNextNAL; 210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool m_au_data; 211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}; 212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevclass perf_metrics 214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev public: 216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev perf_metrics() : 217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev start_time(0), 218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_time(0), 219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev active(false) 220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ~perf_metrics() {}; 223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void start(); 224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void stop(); 225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void end(OMX_U32 units_cntr = 0); 226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void reset(); 227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U64 processing_time_us(); 228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private: 229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev inline OMX_U64 get_act_time(); 230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U64 start_time; 231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U64 proc_time; 232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool active; 233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EMULATION_PREVENTION_THREE_BYTE 0x03 236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_CPB_COUNT 32 237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define NO_PAN_SCAN_BIT 0x00000100 238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_PAN_SCAN_RECT 3 239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VALID_TS(ts) ((ts < LLONG_MAX)? true : false) 240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define NALU_TYPE_VUI (NALU_TYPE_RESERVED + 1) 241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevenum SEI_PAYLOAD_TYPE 243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BUFFERING_PERIOD = 0, 245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PIC_TIMING, 246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PAN_SCAN_RECT, 247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FILLER_PAYLOAD, 248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev USER_DATA_REGISTERED_ITU_T_T35, 249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev USER_DATA_UNREGISTERED, 250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev RECOVERY_POINT, 251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEC_REF_PIC_MARKING_REPETITION, 252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SPARE_PIC, 253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SCENE_INFO, 254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SUB_SEQ_INFO, 255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SUB_SEQ_LAYER_CHARACTERISTICS, 256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SUB_SEQ_CHARACTERISTICS, 257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FULL_FRAME_FREEZE, 258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FULL_FRAME_FREEZE_RELEASE, 259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FULL_FRAME_SNAPSHOT, 260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROGRESSIVE_REFINEMENT_SEGMENT_START, 261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROGRESSIVE_REFINEMENT_SEGMENT_END, 262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT = 0x2D 263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 cpb_cnt; 268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 bit_rate_scale; 269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 cpb_size_scale; 270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bit_rate_value[MAX_CPB_COUNT]; 271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 cpb_size_value[MAX_CPB_COUNT]; 272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 cbr_flag[MAX_CPB_COUNT]; 273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 initial_cpb_removal_delay_length; 274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 cpb_removal_delay_length; 275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 dpb_output_delay_length; 276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 time_offset_length; 277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_hrd_param; 278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 aspect_ratio_idc; 282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 aspect_ratio_x; 283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 aspect_ratio_y; 284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_aspect_ratio_info; 285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 aspect_ratio_info_present_flag; 289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_aspect_ratio_info aspect_ratio_info; 290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 timing_info_present_flag; 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_units_in_tick; 292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 time_scale; 293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 fixed_frame_rate_flag; 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 nal_hrd_parameters_present_flag; 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_hrd_param nal_hrd_parameters; 296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 vcl_hrd_parameters_present_flag; 297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_hrd_param vcl_hrd_parameters; 298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 low_delay_hrd_flag; 299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 pic_struct_present_flag; 300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 fixed_fps_prev_ts; 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_vui_param; 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 cpb_removal_delay; 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 dpb_output_delay; 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 pic_struct; 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_clock_ts; 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool clock_ts_flag; 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 ct_type; 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nuit_field_based_flag; 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 counting_type; 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 full_timestamp_flag; 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 discontinuity_flag; 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 cnt_dropped_flag; 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 n_frames; 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 seconds_value; 318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 minutes_value; 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 hours_value; 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 time_offset; 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool is_valid; 322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_sei_pic_timing; 323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 initial_cpb_removal_delay[MAX_CPB_COUNT]; 327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 initial_cpb_removal_delay_offset[MAX_CPB_COUNT]; 328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 au_cntr; 329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 reference_ts; 330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool is_valid; 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_sei_buf_period; 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 rect_id; 336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 rect_cancel_flag; 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 cnt; 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 rect_left_offset[MAX_PAN_SCAN_RECT]; 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 rect_right_offset[MAX_PAN_SCAN_RECT]; 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 rect_top_offset[MAX_PAN_SCAN_RECT]; 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 rect_bottom_offset[MAX_PAN_SCAN_RECT]; 342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 rect_repetition_period; 343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} h264_pan_scan; 344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtemplate <class NODE_STRUCT> 347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevclass omx_dl_list 348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevpublic: 350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_dl_list() { head = tail = NULL; } ; 351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ~omx_dl_list() {}; 352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void add_multiple(NODE_STRUCT *data_arr, int data_num); 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NODE_STRUCT *remove_first(); 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NODE_STRUCT *remove_last(); 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void add_last(NODE_STRUCT *data_ptr); 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NODE_STRUCT *watch_first(); 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NODE_STRUCT *watch_last(); 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevprivate: 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NODE_STRUCT *head, *tail; 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevclass panscan_handler 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevpublic: 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev panscan_handler(); 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ~panscan_handler(); 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool initialize(int num_data); 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_pan_scan *get_free(); 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_pan_scan *get_populated(OMX_S64 frame_ts); 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void update_last(OMX_S64 frame_ts); 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevprivate: 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev typedef struct PANSCAN_NODE 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_pan_scan pan_scan_param; 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 start_ts, end_ts; 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool active; 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PANSCAN_NODE *next, *prev; 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } PANSCAN_NODE; 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_dl_list<PANSCAN_NODE> panscan_used; 380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_dl_list<PANSCAN_NODE> panscan_free; 381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PANSCAN_NODE *panscan_data; 382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1 // Debug panscan data 385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PRINT_PANSCAN_PARAM(H264_PARAM) 387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PRINT_PANSCAN_DATA(NODE) 388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PRINT_PANSCAN_PARAM(H264_PARAM) \ 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevdo {\ 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ALOGE("%s(): left_off(%ld) right_off(%ld) top_off(%ld) bottom_off(%ld)",\ 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev __FUNCTION__,\ 395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (H264_PARAM).rect_left_offset[0],\ 396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (H264_PARAM).rect_right_offset[0],\ 397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (H264_PARAM).rect_top_offset[0],\ 398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (H264_PARAM).rect_bottom_offset[0]);\ 399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}while(0) 400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PRINT_PANSCAN_DATA(NODE) \ 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevdo {\ 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (NODE) {\ 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ALOGE("%s(): PANSCAN DATA start_ts(%lld) end_ts(%lld)", __FUNCTION__,\ 405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (NODE)->start_ts, (NODE)->end_ts);\ 406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PRINT_PANSCAN_PARAM(NODE->pan_scan_param);\ 407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }\ 408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}while(0) 409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // End debug panscan data 411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevclass h264_stream_parser 415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev public: 417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_stream_parser(); 418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ~h264_stream_parser(); 419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void reset(); 420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp); 421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio); 422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void parse_nal(OMX_U8* data_ptr, OMX_U32 data_len, 423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nal_type = NALU_TYPE_UNSPECIFIED, 424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool enable_emu_sc = true); 425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 process_ts_with_sei_vui(OMX_S64 timestamp); 426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack); 427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool is_mbaff(); 428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void get_frame_rate(OMX_U32 *frame_rate); 429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void update_panscan_data(OMX_S64 timestamp); 431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private: 433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void init_bitstream(OMX_U8* data, OMX_U32 size); 434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 extract_bits(OMX_U32 n); 435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev inline bool more_bits(); 436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void read_word(); 437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 uev(); 438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 sev(); 439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 iv(OMX_U32 n_bits); 440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void parse_sps(); 441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void parse_vui(bool vui_in_extradata = true); 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void aspect_ratio_info(); 443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void hrd_parameters(h264_hrd_param *hrd_param); 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void parse_sei(); 445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void sei_buffering_period(); 446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void sei_picture_timing(); 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void sei_pan_scan(); 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void scaling_list(OMX_U32 size_of_scaling_list); 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void print_pan_data(h264_pan_scan *pan_scan_param); 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void print_frame_pack(); 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 get_nal_unit_type(OMX_U32 *nal_unit_type); 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 calculate_buf_period_ts(OMX_S64 timestamp); 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor); 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void parse_frame_pack(); 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 curr_32_bit; 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bits_read; 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 zero_cntr; 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 emulation_code_skip_cntr; 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8* bitstream; 463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bitstream_bytes; 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 frame_rate; 465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool emulation_sc_enabled; 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_vui_param vui_param; 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_sei_buf_period sei_buf_period; 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_sei_pic_timing sei_pic_timing; 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev panscan_handler *panscan_hdl; 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_pan_scan panscan_param; 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement; 476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool mbaff_flag; 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif /* H264_UTILS_H */ 480