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#include "mp4_utils.h" 296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal//#include "omx_vdec.h" 308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include "vidc_debug.h" 31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev# include <stdio.h> 3240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#ifdef _ANDROID_ 3361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" { 3461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h> 3561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 3640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#endif//_ANDROID_ 3740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevMP4_Utils::MP4_Utils() 39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_SrcWidth = 0; 4161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_SrcHeight = 0; 4261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_time_resolution = 0; 4361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_time_found = false; 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevMP4_Utils::~MP4_Utils() 47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanuint32 MP4_Utils::read_bit_field(posInfoType * posPtr, uint32 size) 5161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 5261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *bits = &posPtr->bytePtr[0]; 5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 bitBuf = 5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; 5561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 value = (bitBuf >> (32 - posPtr->bitPos - size)) & MASK(size); 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Update the offset in preparation for next field */ 5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan posPtr->bitPos += size; 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (posPtr->bitPos >= 8) { 6261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan posPtr->bitPos -= 8; 6361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan posPtr->bytePtr++; 6461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return value; 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan static uint8 *find_code 6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(uint8 * bytePtr, uint32 size, uint32 codeMask, uint32 referenceCode) 7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 code = 0xFFFFFFFF; 7261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (uint32 i = 0; i < size; i++) { 7461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan code <<= 8; 7561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan code |= *bytePtr++; 7661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((code & codeMask) == referenceCode) { 7861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bytePtr; 7961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Unable to find code 0x%x", referenceCode); 8361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool MP4_Utils::parseHeader(mp4StreamType * psBits) 8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 8761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 profile_and_level_indication = 0; 8861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 VerID = 1; /* default value */ 8961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan long hxw = 0; 9061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 9261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 9361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_dataBeginPtr = psBits->data; 9461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4, 9661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MASK(32),VOP_START_CODE); 9761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_posInfo.bytePtr) { 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 10061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 10361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 10461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_dataBeginPtr = psBits->data; 10561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4, 10661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MASK(32),GOV_START_CODE); 10761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_posInfo.bytePtr) { 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 11061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 11261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 11361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_dataBeginPtr = psBits->data; 11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* parsing Visual Object Seqence(VOS) header */ 11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr, 11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits->numBytes, 11861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MASK(32), 11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VISUAL_OBJECT_SEQUENCE_START_CODE); 12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( m_posInfo.bytePtr == NULL ) { 12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 12461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 profile_and_level_indication = read_bit_field (&m_posInfo, 8); 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 12861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* parsing Visual Object(VO) header*/ 12961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* note: for now, we skip over the user_data */ 13061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes, 13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MASK(32),VISUAL_OBJECT_START_CODE); 13261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_posInfo.bytePtr == NULL) { 13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 is_visual_object_identifier = read_bit_field (&m_posInfo, 1); 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( is_visual_object_identifier ) { 14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* visual_object_verid*/ 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan read_bit_field (&m_posInfo, 4); 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* visual_object_priority*/ 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan read_bit_field (&m_posInfo, 3); 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* visual_object_type*/ 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 visual_object_type = read_bit_field (&m_posInfo, 4); 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( visual_object_type != VISUAL_OBJECT_TYPE_VIDEO_ID ) { 150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* skipping video_signal_type params*/ 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*parsing Video Object header*/ 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes, 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VIDEO_OBJECT_START_CODE_MASK,VIDEO_OBJECT_START_CODE); 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( m_posInfo.bytePtr == NULL ) { 159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* parsing Video Object Layer(VOL) header */ 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = find_code(m_posInfo.bytePtr, 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits->numBytes, 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VIDEO_OBJECT_LAYER_START_CODE_MASK, 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VIDEO_OBJECT_LAYER_START_CODE); 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( m_posInfo.bytePtr == NULL ) { 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bitPos = 0; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_posInfo.bytePtr = psBits->data; 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // 1 -> random accessible VOL 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan read_bit_field(&m_posInfo, 1); 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 video_object_type_indication = read_bit_field (&m_posInfo, 8); 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (video_object_type_indication != SIMPLE_OBJECT_TYPE) && 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (video_object_type_indication != SIMPLE_SCALABLE_OBJECT_TYPE) && 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (video_object_type_indication != CORE_OBJECT_TYPE) && 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (video_object_type_indication != ADVANCED_SIMPLE) && 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (video_object_type_indication != RESERVED_OBJECT_TYPE) && 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (video_object_type_indication != MAIN_OBJECT_TYPE)) { 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* is_object_layer_identifier*/ 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 is_object_layer_identifier = read_bit_field (&m_posInfo, 1); 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (is_object_layer_identifier) { 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 video_object_layer_verid = read_bit_field (&m_posInfo, 4); 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 video_object_layer_priority = read_bit_field (&m_posInfo, 3); 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VerID = (unsigned char)video_object_layer_verid; 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* aspect_ratio_info*/ 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 aspect_ratio_info = read_bit_field (&m_posInfo, 4); 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( aspect_ratio_info == EXTENDED_PAR ) { 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* par_width*/ 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan read_bit_field (&m_posInfo, 8); 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* par_height*/ 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan read_bit_field (&m_posInfo, 8); 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* vol_control_parameters */ 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 vol_control_parameters = read_bit_field (&m_posInfo, 1); 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vol_control_parameters ) { 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* chroma_format*/ 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 chroma_format = read_bit_field (&m_posInfo, 2); 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( chroma_format != 1 ) { 216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* low_delay*/ 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 low_delay = read_bit_field (&m_posInfo, 1); 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* vbv_parameters (annex D)*/ 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 vbv_parameters = read_bit_field (&m_posInfo, 1); 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vbv_parameters ) { 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* first_half_bitrate*/ 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 first_half_bitrate = read_bit_field (&m_posInfo, 15); 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 marker_bit = read_bit_field (&m_posInfo, 1); 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1) { 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* latter_half_bitrate*/ 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 latter_half_bitrate = read_bit_field (&m_posInfo, 15); 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan marker_bit = read_bit_field (&m_posInfo, 1); 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1) { 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 VBVPeakBitRate = (first_half_bitrate << 15) + latter_half_bitrate; 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* first_half_vbv_buffer_size*/ 24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 first_half_vbv_buffer_size = read_bit_field (&m_posInfo, 15); 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan marker_bit = read_bit_field (&m_posInfo, 1); 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1) { 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* latter_half_vbv_buffer_size*/ 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 latter_half_vbv_buffer_size = read_bit_field (&m_posInfo, 3); 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 VBVBufferSize = (first_half_vbv_buffer_size << 3) + latter_half_vbv_buffer_size; 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* first_half_vbv_occupancy*/ 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 first_half_vbv_occupancy = read_bit_field (&m_posInfo, 11); 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan marker_bit = read_bit_field (&m_posInfo, 1); 25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1) { 25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* latter_half_vbv_occupancy*/ 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 latter_half_vbv_occupancy = read_bit_field (&m_posInfo, 15); 26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan marker_bit = read_bit_field (&m_posInfo, 1); 26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1) { 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan }/* vbv_parameters*/ 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan }/*vol_control_parameters*/ 27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* video_object_layer_shape*/ 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 video_object_layer_shape = read_bit_field (&m_posInfo, 2); 27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 VOLShape = (unsigned char)video_object_layer_shape; 27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( VOLShape != MPEG4_SHAPE_RECTANGULAR ) { 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* marker_bit*/ 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 marker_bit = read_bit_field (&m_posInfo, 1); 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( marker_bit != 1 ) { 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* vop_time_increment_resolution*/ 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint32 vop_time_increment_resolution = read_bit_field (&m_posInfo, 16); 28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_time_resolution = vop_time_increment_resolution; 28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_time_found = true; 29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool MP4_Utils::is_notcodec_vop(unsigned char *pbuffer, unsigned int len) 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 4,vop_bits=0; 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int temp = vop_time_resolution - 1; 29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char vop_type=0,modulo_bit=0,not_coded=0; 29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!vop_time_found || !pbuffer || len < 5) { 30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pbuffer[0] == 0) && (pbuffer[1] == 0) && (pbuffer[2] == 1) && (pbuffer[3] == 0xB6)) { 30461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (temp) { 30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_bits++; 30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp >>= 1; 30761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 30861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vop_type = (pbuffer[index] & 0xc0) >> 6; 31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned bits_parsed = 2; 31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev modulo_bit = pbuffer[index] & (1 << (7-bits_parsed)); 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bits_parsed++; 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index += bits_parsed/8; 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bits_parsed = bits_parsed %8; 31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= len) { 31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (modulo_bit); 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bits_parsed++; //skip marker bit 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bits_parsed += vop_bits + 1;//Vop bit & Marker bits 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += bits_parsed/8; 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= len) { 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bits_parsed = bits_parsed % 8; 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded = pbuffer[index] & (1 << (7 - bits_parsed)); 33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!not_coded) { 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 341