/*--------------------------------------------------------------------------
Copyright (c) 2010, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of Code Aurora nor
the names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#ifndef H264_UTILS_H
#define H264_UTILS_H
/*========================================================================
O p e n M M
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
*//** @file H264_Utils.h
This module contains H264 video decoder utilities and helper routines.
*//*====================================================================== */
/* =======================================================================
INCLUDE FILES FOR MODULE
========================================================================== */
#include <stdio.h>
#include "Map.h"
#include "qtypes.h"
#include "OMX_Core.h"
#define STD_MIN(x,y) (((x) < (y)) ? (x) : (y))
#define OMX_CORE_720P_HEIGHT 720
#define OMX_CORE_720P_WIDTH 1280
/* =======================================================================
DATA DECLARATIONS
========================================================================== */
/* -----------------------------------------------------------------------
** Constant / Define Declarations
** ----------------------------------------------------------------------- */
// Common format block header definitions
#define MT_VIDEO_META_STREAM_HEADER 0x00
#define MT_VIDEO_MEDIA_STREAM_HEADER 0x01
#define MT_VIDEO_META_MEDIA_STREAM_HEADER 0x02
// H.264 format block header definitions
#define MT_VIDEO_H264_ACCESS_UNIT_FORMAT 0x00
#define MT_VIDEO_H264_NAL_FORMT 0x01
#define MT_VIDEO_H264_BYTE_FORMAT 0x02
#define MT_VIDEO_H264_BYTE_STREAM_FORMAT 0x00
#define MT_VIDEO_H264_NAL_UNIT_STREAM_FORMAT 0x01
#define MT_VIDEO_H264_FORMAT_BLOCK_HEADER_SIZE 18
// MPEG-4 format block header definitions
#define MT_VIDEO_MPEG4_VOP_FORMAT 0x00
#define MT_VIDEO_MPEG4_SLICE_FORMAT 0x01
#define MT_VIDEO_MPEG4_BYTE_FORMAT 0x02
#define MT_VIDEO_MPEG4_FORMAT_BLOCK_HEADER_SIZE 15
// H.263 format block header definitions
#define MT_VIDEO_H263_PICTURE_FORMAT 0x00
#define MT_VIDEO_H263_GOB_FORMAT 0x01
#define MT_VIDEO_H263_SLICE_STRUCTURED_FORMAT 0x02
#define MT_VIDEO_H263_BYTE_FORMAT 0x03
#define MT_VIDEO_H263_FORMAT_BLOCK_HEADER_SIZE 16
/* =======================================================================
** Function Declarations
** ======================================================================= */
/* -----------------------------------------------------------------------
** Type Declarations
** ----------------------------------------------------------------------- */
// This type is used when parsing an H.264 bitstream to collect H.264 NAL
// units that need to go in the meta data.
struct H264ParamNalu {
uint32 picSetID;
uint32 seqSetID;
uint32 picOrderCntType;
bool frameMbsOnlyFlag;
bool picOrderPresentFlag;
uint32 picWidthInMbsMinus1;
uint32 picHeightInMapUnitsMinus1;
uint32 log2MaxFrameNumMinus4;
uint32 log2MaxPicOrderCntLsbMinus4;
bool deltaPicOrderAlwaysZeroFlag;
//std::vector<uint8> nalu;
uint32 nalu;
uint32 crop_left;
uint32 crop_right;
uint32 crop_top;
uint32 crop_bot;
};
//typedef map<uint32, H264ParamNalu> H264ParamNaluSet;
typedef Map<uint32, H264ParamNalu *> H264ParamNaluSet;
typedef enum {
NALU_TYPE_UNSPECIFIED = 0,
NALU_TYPE_NON_IDR,
NALU_TYPE_PARTITION_A,
NALU_TYPE_PARTITION_B,
NALU_TYPE_PARTITION_C,
NALU_TYPE_IDR,
NALU_TYPE_SEI,
NALU_TYPE_SPS,
NALU_TYPE_PPS,
NALU_TYPE_ACCESS_DELIM,
NALU_TYPE_EOSEQ,
NALU_TYPE_EOSTREAM,
NALU_TYPE_FILLER_DATA,
NALU_TYPE_RESERVED,
} NALU_TYPE;
// NAL header information
typedef struct {
uint32 nal_ref_idc;
uint32 nalu_type;
uint32 forbidden_zero_bit;
} NALU;
// This structure contains persistent information about an H.264 stream as it
// is parsed.
//struct H264StreamInfo {
// H264ParamNaluSet pic;
// H264ParamNaluSet seq;
//};
class RbspParser
/******************************************************************************
** This class is used to convert an H.264 NALU (network abstraction layer
** unit) into RBSP (raw byte sequence payload) and extract bits from it.
*****************************************************************************/
{
public:
RbspParser (const uint8 *begin, const uint8 *end);
virtual ~RbspParser ();
uint32 next ();
void advance ();
uint32 u (uint32 n);
uint32 ue ();
int32 se ();
private:
const uint8 *begin, *end;
int32 pos;
uint32 bit;
uint32 cursor;
bool advanceNeeded;
};
class H264_Utils
{
public:
H264_Utils();
~H264_Utils();
void initialize_frame_checking_environment();
void allocate_rbsp_buffer(uint32 inputBufferSize);
bool isNewFrame(OMX_IN OMX_U8 *bitstream,
OMX_IN OMX_U32 bitstream_length,
OMX_IN OMX_U32 size_of_nal_length_field,
OMX_OUT OMX_BOOL &isNewFrame);
private:
boolean extract_rbsp(OMX_IN OMX_U8 *buffer,
OMX_IN OMX_U32 buffer_length,
OMX_IN OMX_U32 size_of_nal_length_field,
OMX_OUT OMX_U8 *rbsp_bistream,
OMX_OUT OMX_U32 *rbsp_length,
OMX_OUT NALU *nal_unit);
unsigned m_height;
unsigned m_width;
H264ParamNaluSet pic;
H264ParamNaluSet seq;
uint8 *m_rbspBytes;
NALU m_prv_nalu;
bool m_forceToStichNextNAL;
bool m_au_data;
};
#endif /* H264_UTILS_H */