1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2010 - 2013, The Linux Foundation. All rights reserved. 3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without 5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met: 6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions of source code must retain the above copyright 7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer. 8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions in binary form must reproduce the above copyright 9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer in the 10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev documentation and/or other materials provided with the distribution. 116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal * Neither the name of The Linux Foundation nor 12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the names of its contributors may be used to endorse or promote 13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev products derived from this software without specific prior written 14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev permission. 15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/ 28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef MP4_UTILS_H 29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_UTILS_H 30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "OMX_Core.h" 31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "OMX_QCOMExtns.h" 32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef signed long long int64; 3340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgetypedef unsigned int uint32; /* Unsigned 32 bit value */ 34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef unsigned short uint16; /* Unsigned 16 bit value */ 35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef unsigned char uint8; /* Unsigned 8 bit value */ 36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgetypedef int int32; /* Signed 32 bit value */ 38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef signed short int16; /* Signed 16 bit value */ 39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef signed char int8; /* Signed 8 bit value */ 40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef unsigned char byte; /* Unsigned 8 bit value type. */ 42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL0 0x08 43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL1 0x01 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL2 0x02 45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL3 0x03 46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL4A 0x04 47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL5 0x05 48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL6 0x06 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_PROFILE_LEVEL0B 0x09 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL0 0xF0 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL1 0xF1 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL2 0xF2 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL3 0xF3 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL4 0xF4 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE_PROFILE_LEVEL5 0xF5 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VISUAL_OBJECT_SEQUENCE_START_CODE 0x000001B0 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4ERROR_SUCCESS 0 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VIDEO_OBJECT_LAYER_START_CODE_MASK 0xFFFFFFF0 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VIDEO_OBJECT_LAYER_START_CODE 0x00000120 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VOP_START_CODE_MASK 0xFFFFFFFF 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VOP_START_CODE 0x000001B6 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define GOV_START_CODE 0x000001B3 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SHORT_HEADER_MASK 0xFFFFFC00 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SHORT_HEADER_START_MARKER 0x00008000 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SHORT_HEADER_START_CODE 0x00008000 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SPARK1_START_CODE 0x00008400 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_SHAPE_RECTANGULAR 0x00 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EXTENDED_PAR 0xF 79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SHORT_VIDEO_START_MARKER 0x20 80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_INVALID_VOL_PARAM (0x0001) // unsupported VOL parameter 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4ERROR_UNSUPPORTED_UFEP -1068 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4ERROR_UNSUPPORTED_SOURCE_FORMAT -1069 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MASK(x) (0xFFFFFFFF >> (32 - (x))) 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VISUAL_OBJECT_TYPE_VIDEO_ID 0x1 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VISUAL_OBJECT_START_CODE 0x000001B5 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VIDEO_OBJECT_START_CODE_MASK 0xFFFFFFE0 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VIDEO_OBJECT_START_CODE 0x00000100 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define RESERVED_OBJECT_TYPE 0x0 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_OBJECT_TYPE 0x1 91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_SCALABLE_OBJECT_TYPE 0x2 92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define CORE_OBJECT_TYPE 0x3 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAIN_OBJECT_TYPE 0x4 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define N_BIT_OBJECT_TYPE 0x5 95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define BASIC_ANIMATED_2D_TEXTURE 0x6 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ANIMATED_2D_MESH 0x7 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ADVANCED_SIMPLE 0x11 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L1_MAX_VBVBUFFERSIZE 10 /* VBV Max Buffer size=10 (p. 498) */ 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L1_MAX_BITRATE 160 /* is is 64kpbs or 160 400bits/sec units */ 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L2_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L2_MAX_BITRATE 320 /* 320 400bps units = 128kpbs */ 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L3_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define SIMPLE_L3_MAX_BITRATE 960 /* 960 400bps units = 384kpbs */ 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* The MP4 decoder currently supports Simple Profile@L3 */ 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_VBVBUFFERSIZE (SIMPLE_L3_MAX_VBVBUFFERSIZE) 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_BITRATE (SIMPLE_L3_MAX_BITRATE) 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_QUANTPRECISION 9 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MIN_QUANTPRECISION 3 113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_VGA_WIDTH 640 115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_VGA_HEIGHT 480 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_WVGA_WIDTH 800 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_WVGA_HEIGHT 480 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_720P_WIDTH 1280 119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_720P_HEIGHT 720 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_MAX_DECODE_WIDTH MP4_720P_WIDTH 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MP4_MAX_DECODE_HEIGHT MP4_720P_HEIGHT 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevtypedef struct { 12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *data; 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long int numBytes; 127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} mp4StreamType; 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_FRAMES_IN_CHUNK 10 130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VOP_START_CODE 0x000001B6 131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VOL_START_CODE 0x000001B0 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavantypedef enum VOPTYPE { 13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NO_VOP = -1, // bitstream contains no VOP. 13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MPEG4_I_VOP = 0, // bitstream contains an MPEG4 I-VOP 13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MPEG4_P_VOP = 1, // bitstream contains an MPEG4 P-VOP 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MPEG4_B_VOP = 2, // bitstream contains an MPEG4 B-VOP 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MPEG4_S_VOP = 3, // bitstream contains an MPEG4 S-VOP 139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} VOP_TYPE; 140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavantypedef struct { 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 timestamp_increment; 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 offset; 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 size; 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VOP_TYPE vopType; 146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} mp4_frame_info_type; 147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanclass MP4_Utils 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private: 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct posInfoType { 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *bytePtr; 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 bitPos; 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan }; 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan posInfoType m_posInfo; 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte *m_dataBeginPtr; 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int vop_time_resolution; 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool vop_time_found; 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint16 m_SrcWidth, m_SrcHeight; // Dimensions of the source clip 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan public: 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MP4_Utils(); 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ~MP4_Utils(); 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits); 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool parseHeader(mp4StreamType * psBits); 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan static uint32 read_bit_field(posInfoType * posPtr, uint32 size); 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len); 168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}; 169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 170