1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010 - 2013, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are met: 6 * Redistributions of source code must retain the above copyright 7 notice, this list of conditions and the following disclaimer. 8 * Redistributions in binary form must reproduce the above copyright 9 notice, this list of conditions and the following disclaimer in the 10 documentation and/or other materials provided with the distribution. 11 * Neither the name of The Linux Foundation nor 12 the names of its contributors may be used to endorse or promote 13 products derived from this software without specific prior written 14 permission. 15 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 --------------------------------------------------------------------------*/ 28 #ifndef MP4_UTILS_H 29 #define MP4_UTILS_H 30 #include "OMX_Core.h" 31 #include "OMX_QCOMExtns.h" 32 typedef signed long long int64; 33 typedef unsigned int uint32; /* Unsigned 32 bit value */ 34 typedef unsigned short uint16; /* Unsigned 16 bit value */ 35 typedef unsigned char uint8; /* Unsigned 8 bit value */ 36 37 typedef int int32; /* Signed 32 bit value */ 38 typedef signed short int16; /* Signed 16 bit value */ 39 typedef signed char int8; /* Signed 8 bit value */ 40 41 typedef unsigned char byte; /* Unsigned 8 bit value type. */ 42 #define SIMPLE_PROFILE_LEVEL0 0x08 43 #define SIMPLE_PROFILE_LEVEL1 0x01 44 #define SIMPLE_PROFILE_LEVEL2 0x02 45 #define SIMPLE_PROFILE_LEVEL3 0x03 46 #define SIMPLE_PROFILE_LEVEL4A 0x04 47 #define SIMPLE_PROFILE_LEVEL5 0x05 48 #define SIMPLE_PROFILE_LEVEL6 0x06 49 #define SIMPLE_PROFILE_LEVEL0B 0x09 50 51 #define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 52 #define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 53 #define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 54 55 #define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10 56 #define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11 57 #define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12 58 #define ADVANCED_SIMPLE_PROFILE_LEVEL0 0xF0 59 #define ADVANCED_SIMPLE_PROFILE_LEVEL1 0xF1 60 #define ADVANCED_SIMPLE_PROFILE_LEVEL2 0xF2 61 #define ADVANCED_SIMPLE_PROFILE_LEVEL3 0xF3 62 #define ADVANCED_SIMPLE_PROFILE_LEVEL4 0xF4 63 #define ADVANCED_SIMPLE_PROFILE_LEVEL5 0xF5 64 65 #define VISUAL_OBJECT_SEQUENCE_START_CODE 0x000001B0 66 #define MP4ERROR_SUCCESS 0 67 68 #define VIDEO_OBJECT_LAYER_START_CODE_MASK 0xFFFFFFF0 69 #define VIDEO_OBJECT_LAYER_START_CODE 0x00000120 70 #define VOP_START_CODE_MASK 0xFFFFFFFF 71 #define VOP_START_CODE 0x000001B6 72 #define GOV_START_CODE 0x000001B3 73 #define SHORT_HEADER_MASK 0xFFFFFC00 74 #define SHORT_HEADER_START_MARKER 0x00008000 75 #define SHORT_HEADER_START_CODE 0x00008000 76 #define SPARK1_START_CODE 0x00008400 77 #define MPEG4_SHAPE_RECTANGULAR 0x00 78 #define EXTENDED_PAR 0xF 79 #define SHORT_VIDEO_START_MARKER 0x20 80 #define MP4_INVALID_VOL_PARAM (0x0001) // unsupported VOL parameter 81 #define MP4ERROR_UNSUPPORTED_UFEP -1068 82 #define MP4ERROR_UNSUPPORTED_SOURCE_FORMAT -1069 83 #define MASK(x) (0xFFFFFFFF >> (32 - (x))) 84 #define VISUAL_OBJECT_TYPE_VIDEO_ID 0x1 85 #define VISUAL_OBJECT_START_CODE 0x000001B5 86 #define VIDEO_OBJECT_START_CODE_MASK 0xFFFFFFE0 87 #define VIDEO_OBJECT_START_CODE 0x00000100 88 89 #define RESERVED_OBJECT_TYPE 0x0 90 #define SIMPLE_OBJECT_TYPE 0x1 91 #define SIMPLE_SCALABLE_OBJECT_TYPE 0x2 92 #define CORE_OBJECT_TYPE 0x3 93 #define MAIN_OBJECT_TYPE 0x4 94 #define N_BIT_OBJECT_TYPE 0x5 95 #define BASIC_ANIMATED_2D_TEXTURE 0x6 96 #define ANIMATED_2D_MESH 0x7 97 #define ADVANCED_SIMPLE 0x11 98 99 100 #define SIMPLE_L1_MAX_VBVBUFFERSIZE 10 /* VBV Max Buffer size=10 (p. 498) */ 101 #define SIMPLE_L1_MAX_BITRATE 160 /* is is 64kpbs or 160 400bits/sec units */ 102 #define SIMPLE_L2_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ 103 #define SIMPLE_L2_MAX_BITRATE 320 /* 320 400bps units = 128kpbs */ 104 #define SIMPLE_L3_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */ 105 #define SIMPLE_L3_MAX_BITRATE 960 /* 960 400bps units = 384kpbs */ 106 107 /* The MP4 decoder currently supports Simple Profile@L3 */ 108 #define MAX_VBVBUFFERSIZE (SIMPLE_L3_MAX_VBVBUFFERSIZE) 109 #define MAX_BITRATE (SIMPLE_L3_MAX_BITRATE) 110 111 #define MAX_QUANTPRECISION 9 112 #define MIN_QUANTPRECISION 3 113 114 #define MP4_VGA_WIDTH 640 115 #define MP4_VGA_HEIGHT 480 116 #define MP4_WVGA_WIDTH 800 117 #define MP4_WVGA_HEIGHT 480 118 #define MP4_720P_WIDTH 1280 119 #define MP4_720P_HEIGHT 720 120 121 #define MP4_MAX_DECODE_WIDTH MP4_720P_WIDTH 122 #define MP4_MAX_DECODE_HEIGHT MP4_720P_HEIGHT 123 124 typedef struct { 125 unsigned char *data; 126 unsigned long int numBytes; 127 } mp4StreamType; 128 129 #define MAX_FRAMES_IN_CHUNK 10 130 #define VOP_START_CODE 0x000001B6 131 #define VOL_START_CODE 0x000001B0 132 133 typedef enum VOPTYPE { 134 NO_VOP = -1, // bitstream contains no VOP. 135 MPEG4_I_VOP = 0, // bitstream contains an MPEG4 I-VOP 136 MPEG4_P_VOP = 1, // bitstream contains an MPEG4 P-VOP 137 MPEG4_B_VOP = 2, // bitstream contains an MPEG4 B-VOP 138 MPEG4_S_VOP = 3, // bitstream contains an MPEG4 S-VOP 139 } VOP_TYPE; 140 141 typedef struct { 142 uint32 timestamp_increment; 143 uint32 offset; 144 uint32 size; 145 VOP_TYPE vopType; 146 } mp4_frame_info_type; 147 148 class MP4_Utils 149 { 150 private: 151 struct posInfoType { 152 uint8 *bytePtr; 153 uint8 bitPos; 154 }; 155 156 posInfoType m_posInfo; 157 byte *m_dataBeginPtr; 158 unsigned int vop_time_resolution; 159 bool vop_time_found; 160 uint16 m_SrcWidth, m_SrcHeight; // Dimensions of the source clip 161 public: 162 MP4_Utils(); 163 ~MP4_Utils(); 164 int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits); 165 bool parseHeader(mp4StreamType * psBits); 166 static uint32 read_bit_field(posInfoType * posPtr, uint32 size); 167 bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len); 168 }; 169 #endif 170