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