1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, Code Aurora Forum. 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.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora 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#include "mp4_utils.h"
29dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "omx_vdec.h"
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev# include <stdio.h>
3140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#ifdef _ANDROID_
3240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    extern "C"{
3340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        #include<utils/Log.h>
3440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
3540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#endif//_ANDROID_
3640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
3740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#undef DEBUG_PRINT_LOW
3840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#undef DEBUG_PRINT_HIGH
3940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#undef DEBUG_PRINT_ERROR
4040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
4140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#define DEBUG_PRINT_LOW ALOGV
4240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#define DEBUG_PRINT_HIGH ALOGV
4340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#define DEBUG_PRINT_ERROR ALOGE
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevMP4_Utils::MP4_Utils()
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_SrcWidth = 0;
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_SrcHeight = 0;
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   vop_time_resolution = 0;
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   vop_time_found = false;
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevMP4_Utils::~MP4_Utils()
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevuint32 MP4_Utils::read_bit_field(posInfoType * posPtr, uint32 size) {
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint8 *bits = &posPtr->bytePtr[0];
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 bitBuf =
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3];
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 value = (bitBuf >> (32 - posPtr->bitPos - size)) & MASK(size);
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* Update the offset in preparation for next field    */
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   posPtr->bitPos += size;
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   while (posPtr->bitPos >= 8) {
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      posPtr->bitPos -= 8;
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      posPtr->bytePtr++;
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return value;
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic uint8 *find_code
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (uint8 * bytePtr, uint32 size, uint32 codeMask, uint32 referenceCode) {
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 code = 0xFFFFFFFF;
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   for (uint32 i = 0; i < size; i++) {
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      code <<= 8;
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      code |= *bytePtr++;
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ((code & codeMask) == referenceCode) {
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return bytePtr;
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_LOW("Unable to find code 0x%x\n", referenceCode);
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return NULL;
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool MP4_Utils::parseHeader(mp4StreamType * psBits) {
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 profile_and_level_indication = 0;
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint8 VerID = 1; /* default value */
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   long hxw = 0;
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bitPos = 0;
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = psBits->data;
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_dataBeginPtr = psBits->data;
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 MASK(32),VOP_START_CODE);
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_posInfo.bytePtr) {
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bitPos = 0;
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = psBits->data;
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_dataBeginPtr = psBits->data;
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 MASK(32),GOV_START_CODE);
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_posInfo.bytePtr) {
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bitPos = 0;
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = psBits->data;
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_dataBeginPtr = psBits->data;
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* parsing Visual Object Seqence(VOS) header */
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 psBits->numBytes,
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 MASK(32),
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 VISUAL_OBJECT_SEQUENCE_START_CODE);
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( m_posInfo.bytePtr == NULL ){
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bitPos  = 0;
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bytePtr = psBits->data;
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else {
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 profile_and_level_indication = read_bit_field (&m_posInfo, 8);
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* parsing Visual Object(VO) header*/
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* note: for now, we skip over the user_data */
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             MASK(32),VISUAL_OBJECT_START_CODE);
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_posInfo.bytePtr == NULL) {
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bitPos = 0;
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bytePtr = psBits->data;
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else {
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 is_visual_object_identifier = read_bit_field (&m_posInfo, 1);
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( is_visual_object_identifier ) {
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* visual_object_verid*/
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         read_bit_field (&m_posInfo, 4);
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* visual_object_priority*/
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         read_bit_field (&m_posInfo, 3);
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* visual_object_type*/
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 visual_object_type = read_bit_field (&m_posInfo, 4);
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( visual_object_type != VISUAL_OBJECT_TYPE_VIDEO_ID ) {
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* skipping video_signal_type params*/
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /*parsing Video Object header*/
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    VIDEO_OBJECT_START_CODE_MASK,VIDEO_OBJECT_START_CODE);
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( m_posInfo.bytePtr == NULL ) {
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* parsing Video Object Layer(VOL) header */
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bitPos = 0;
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            psBits->numBytes,
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            VIDEO_OBJECT_LAYER_START_CODE_MASK,
163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            VIDEO_OBJECT_LAYER_START_CODE);
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( m_posInfo.bytePtr == NULL ) {
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bitPos = 0;
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_posInfo.bytePtr = psBits->data;
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // 1 -> random accessible VOL
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   read_bit_field(&m_posInfo, 1);
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 video_object_type_indication = read_bit_field (&m_posInfo, 8);
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( (video_object_type_indication != SIMPLE_OBJECT_TYPE) &&
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (video_object_type_indication != SIMPLE_SCALABLE_OBJECT_TYPE) &&
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (video_object_type_indication != CORE_OBJECT_TYPE) &&
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (video_object_type_indication != ADVANCED_SIMPLE) &&
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (video_object_type_indication != RESERVED_OBJECT_TYPE) &&
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (video_object_type_indication != MAIN_OBJECT_TYPE)) {
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* is_object_layer_identifier*/
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 is_object_layer_identifier = read_bit_field (&m_posInfo, 1);
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (is_object_layer_identifier) {
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 video_object_layer_verid = read_bit_field (&m_posInfo, 4);
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 video_object_layer_priority = read_bit_field (&m_posInfo, 3);
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      VerID = (unsigned char)video_object_layer_verid;
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* aspect_ratio_info*/
190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  uint32 aspect_ratio_info = read_bit_field (&m_posInfo, 4);
191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( aspect_ratio_info == EXTENDED_PAR ) {
192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* par_width*/
193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    read_bit_field (&m_posInfo, 8);
194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* par_height*/
195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    read_bit_field (&m_posInfo, 8);
196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* vol_control_parameters */
198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 vol_control_parameters = read_bit_field (&m_posInfo, 1);
199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( vol_control_parameters ) {
200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* chroma_format*/
201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 chroma_format = read_bit_field (&m_posInfo, 2);
202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( chroma_format != 1 ) {
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return false;
204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* low_delay*/
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 low_delay = read_bit_field (&m_posInfo, 1);
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* vbv_parameters (annex D)*/
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      uint32 vbv_parameters = read_bit_field (&m_posInfo, 1);
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( vbv_parameters ) {
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* first_half_bitrate*/
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 first_half_bitrate = read_bit_field (&m_posInfo, 15);
212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 marker_bit = read_bit_field (&m_posInfo, 1);
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if ( marker_bit != 1) {
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* latter_half_bitrate*/
217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 latter_half_bitrate = read_bit_field (&m_posInfo, 15);
218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         marker_bit = read_bit_field (&m_posInfo, 1);
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if ( marker_bit != 1) {
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 VBVPeakBitRate = (first_half_bitrate << 15) + latter_half_bitrate;
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* first_half_vbv_buffer_size*/
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 first_half_vbv_buffer_size = read_bit_field (&m_posInfo, 15);
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         marker_bit = read_bit_field (&m_posInfo, 1);
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if ( marker_bit != 1) {
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* latter_half_vbv_buffer_size*/
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 latter_half_vbv_buffer_size = read_bit_field (&m_posInfo, 3);
231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 VBVBufferSize = (first_half_vbv_buffer_size << 3) + latter_half_vbv_buffer_size;
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* first_half_vbv_occupancy*/
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 first_half_vbv_occupancy = read_bit_field (&m_posInfo, 11);
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         marker_bit = read_bit_field (&m_posInfo, 1);
235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if ( marker_bit != 1) {
236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* latter_half_vbv_occupancy*/
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         uint32 latter_half_vbv_occupancy = read_bit_field (&m_posInfo, 15);
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         marker_bit = read_bit_field (&m_posInfo, 1);
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if ( marker_bit != 1) {
242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }/* vbv_parameters*/
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }/*vol_control_parameters*/
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* video_object_layer_shape*/
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 video_object_layer_shape = read_bit_field (&m_posInfo, 2);
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint8 VOLShape = (unsigned char)video_object_layer_shape;
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( VOLShape != MPEG4_SHAPE_RECTANGULAR ) {
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return false;
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* marker_bit*/
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 marker_bit = read_bit_field (&m_posInfo, 1);
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ( marker_bit != 1 ) {
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* vop_time_increment_resolution*/
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   uint32 vop_time_increment_resolution = read_bit_field (&m_posInfo, 16);
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   vop_time_resolution = vop_time_increment_resolution;
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   vop_time_found = true;
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return true;
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool MP4_Utils::is_notcodec_vop(unsigned char *pbuffer, unsigned int len)
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   unsigned int index = 4,vop_bits=0;
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   unsigned int temp = vop_time_resolution - 1;
269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   unsigned char vop_type=0,modulo_bit=0,not_coded=0;
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!vop_time_found || !pbuffer || len < 5) {
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if((pbuffer[0] == 0) && (pbuffer[1] == 0) && (pbuffer[2] == 1) && (pbuffer[3] == 0xB6)){
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      while(temp) {
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         vop_bits++;
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         temp >>= 1;
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      vop_type = (pbuffer[index] & 0xc0) >> 6;
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      unsigned bits_parsed = 2;
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      do {
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            modulo_bit = pbuffer[index]  & (1 << (7-bits_parsed));
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bits_parsed++;
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            index += bits_parsed/8;
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bits_parsed = bits_parsed %8;
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(index >= len) {
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               return false;
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }while(modulo_bit);
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bits_parsed++; //skip marker bit
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bits_parsed += vop_bits + 1;//Vop bit & Marker bits
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index += bits_parsed/8;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(index >= len) {
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return false;
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bits_parsed = bits_parsed % 8;
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      not_coded = pbuffer[index] & (1 << (7 - bits_parsed));
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!not_coded){
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return true;
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return false;
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
303dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid mp4_fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
305dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                           OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
306dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   switch(aspect_ratio_info->aspect_ratio) {
308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 1 :
309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioX  = 1;
310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioY  = 1;
311dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             break;
312dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 2 :
314dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioX  = 12;
315dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioY  = 11;
316dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             break;
317dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
318dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 3 :
319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioX  = 10;
320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioY  = 11;
321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             break;
322dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 4 :
324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioX  = 16;
325dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             frame_info->aspectRatio.aspectRatioY  = 11;
326dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             break;
327dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 5 :
329dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            frame_info->aspectRatio.aspectRatioX  = 40;
330dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            frame_info->aspectRatio.aspectRatioY  = 33;
331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            break;
332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case 15:
334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           frame_info->aspectRatio.aspectRatioX =
335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              aspect_ratio_info->par_width;
336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           frame_info->aspectRatio.aspectRatioY =
337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              aspect_ratio_info->par_height;
338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           break;
339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        default:
341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           ALOGE(" Incorrect aspect_ratio = %d",
342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                aspect_ratio_info->aspect_ratio);
343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
345