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