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