| /*-------------------------------------------------------------------------- |
| Copyright (c) 2010 - 2013, The Linux Foundation. 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 The Linux Foundation 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 MP4_UTILS_H |
| #define MP4_UTILS_H |
| #include "OMX_Core.h" |
| #include "OMX_QCOMExtns.h" |
| typedef signed long long int64; |
| typedef unsigned int uint32; /* Unsigned 32 bit value */ |
| typedef unsigned short uint16; /* Unsigned 16 bit value */ |
| typedef unsigned char uint8; /* Unsigned 8 bit value */ |
| |
| typedef int int32; /* Signed 32 bit value */ |
| typedef signed short int16; /* Signed 16 bit value */ |
| typedef signed char int8; /* Signed 8 bit value */ |
| |
| typedef unsigned char byte; /* Unsigned 8 bit value type. */ |
| #define SIMPLE_PROFILE_LEVEL0 0x08 |
| #define SIMPLE_PROFILE_LEVEL1 0x01 |
| #define SIMPLE_PROFILE_LEVEL2 0x02 |
| #define SIMPLE_PROFILE_LEVEL3 0x03 |
| #define SIMPLE_PROFILE_LEVEL4A 0x04 |
| #define SIMPLE_PROFILE_LEVEL5 0x05 |
| #define SIMPLE_PROFILE_LEVEL6 0x06 |
| #define SIMPLE_PROFILE_LEVEL0B 0x09 |
| |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 |
| |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 |
| #define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL0 0xF0 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL1 0xF1 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL2 0xF2 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL3 0xF3 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL4 0xF4 |
| #define ADVANCED_SIMPLE_PROFILE_LEVEL5 0xF5 |
| |
| #define VISUAL_OBJECT_SEQUENCE_START_CODE 0x000001B0 |
| #define MP4ERROR_SUCCESS 0 |
| |
| #define VIDEO_OBJECT_LAYER_START_CODE_MASK 0xFFFFFFF0 |
| #define VIDEO_OBJECT_LAYER_START_CODE 0x00000120 |
| #define VOP_START_CODE_MASK 0xFFFFFFFF |
| #define VOP_START_CODE 0x000001B6 |
| #define GOV_START_CODE 0x000001B3 |
| #define SHORT_HEADER_MASK 0xFFFFFC00 |
| #define SHORT_HEADER_START_MARKER 0x00008000 |
| #define SHORT_HEADER_START_CODE 0x00008000 |
| #define SPARK1_START_CODE 0x00008400 |
| #define MPEG4_SHAPE_RECTANGULAR 0x00 |
| #define EXTENDED_PAR 0xF |
| #define SHORT_VIDEO_START_MARKER 0x20 |
| #define MP4_INVALID_VOL_PARAM (0x0001) // unsupported VOL parameter |
| #define MP4ERROR_UNSUPPORTED_UFEP -1068 |
| #define MP4ERROR_UNSUPPORTED_SOURCE_FORMAT -1069 |
| #define MASK(x) (0xFFFFFFFF >> (32 - (x))) |
| #define VISUAL_OBJECT_TYPE_VIDEO_ID 0x1 |
| #define VISUAL_OBJECT_START_CODE 0x000001B5 |
| #define VIDEO_OBJECT_START_CODE_MASK 0xFFFFFFE0 |
| #define VIDEO_OBJECT_START_CODE 0x00000100 |
| |
| #define RESERVED_OBJECT_TYPE 0x0 |
| #define SIMPLE_OBJECT_TYPE 0x1 |
| #define SIMPLE_SCALABLE_OBJECT_TYPE 0x2 |
| #define CORE_OBJECT_TYPE 0x3 |
| #define MAIN_OBJECT_TYPE 0x4 |
| #define N_BIT_OBJECT_TYPE 0x5 |
| #define BASIC_ANIMATED_2D_TEXTURE 0x6 |
| #define ANIMATED_2D_MESH 0x7 |
| #define ADVANCED_SIMPLE 0x11 |
| |
| |
| #define SIMPLE_L1_MAX_VBVBUFFERSIZE 10 /* VBV Max Buffer size=10 (p. 498) */ |
| #define SIMPLE_L1_MAX_BITRATE 160 /* is is 64kpbs or 160 400bits/sec units */ |
| #define SIMPLE_L2_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ |
| #define SIMPLE_L2_MAX_BITRATE 320 /* 320 400bps units = 128kpbs */ |
| #define SIMPLE_L3_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ |
| #define SIMPLE_L3_MAX_BITRATE 960 /* 960 400bps units = 384kpbs */ |
| |
| /* The MP4 decoder currently supports Simple Profile@L3 */ |
| #define MAX_VBVBUFFERSIZE (SIMPLE_L3_MAX_VBVBUFFERSIZE) |
| #define MAX_BITRATE (SIMPLE_L3_MAX_BITRATE) |
| |
| #define MAX_QUANTPRECISION 9 |
| #define MIN_QUANTPRECISION 3 |
| |
| #define MP4_VGA_WIDTH 640 |
| #define MP4_VGA_HEIGHT 480 |
| #define MP4_WVGA_WIDTH 800 |
| #define MP4_WVGA_HEIGHT 480 |
| #define MP4_720P_WIDTH 1280 |
| #define MP4_720P_HEIGHT 720 |
| |
| #define MP4_MAX_DECODE_WIDTH MP4_720P_WIDTH |
| #define MP4_MAX_DECODE_HEIGHT MP4_720P_HEIGHT |
| |
| typedef struct { |
| unsigned char *data; |
| unsigned long int numBytes; |
| } mp4StreamType; |
| |
| #define MAX_FRAMES_IN_CHUNK 10 |
| #define VOP_START_CODE 0x000001B6 |
| #define VOL_START_CODE 0x000001B0 |
| |
| typedef enum VOPTYPE { |
| NO_VOP = -1, // bitstream contains no VOP. |
| MPEG4_I_VOP = 0, // bitstream contains an MPEG4 I-VOP |
| MPEG4_P_VOP = 1, // bitstream contains an MPEG4 P-VOP |
| MPEG4_B_VOP = 2, // bitstream contains an MPEG4 B-VOP |
| MPEG4_S_VOP = 3, // bitstream contains an MPEG4 S-VOP |
| } VOP_TYPE; |
| |
| typedef struct { |
| uint32 timestamp_increment; |
| uint32 offset; |
| uint32 size; |
| VOP_TYPE vopType; |
| } mp4_frame_info_type; |
| |
| class MP4_Utils |
| { |
| private: |
| struct posInfoType { |
| uint8 *bytePtr; |
| uint8 bitPos; |
| }; |
| |
| posInfoType m_posInfo; |
| byte *m_dataBeginPtr; |
| unsigned int vop_time_resolution; |
| bool vop_time_found; |
| uint16 m_SrcWidth, m_SrcHeight; // Dimensions of the source clip |
| public: |
| MP4_Utils(); |
| ~MP4_Utils(); |
| int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits); |
| bool parseHeader(mp4StreamType * psBits); |
| static uint32 read_bit_field(posInfoType * posPtr, uint32 size); |
| bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len); |
| }; |
| #endif |