/* ------------------------------------------------------------------
 * Copyright (C) 2008 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#include "pv_avifile_indx.h"

PVAviFileIdxChunk::PVAviFileIdxChunk(PVFile* aFp, uint32 aIndxSize, uint32 aNumStreams)
{
    iIndexSize = aIndxSize;
    iNumStreams = aNumStreams;
    uint32 bytesRead = 0;
    int32 strNum = 0;
    uint32 data = 0;
    iError = PV_AVI_FILE_PARSER_SUCCESS;
    iOffsetFrmMoviLst = false;
    bool firstSample = true;

    for (uint32 ii = 0; ii < iNumStreams; ii++)
    {
        IndxTblVector  xtbl;
        iIndexTable.push_back(xtbl);
    }

    while (bytesRead < iIndexSize)
    {
        if (PV_AVI_FILE_PARSER_SUCCESS != PVAviFileParserUtils::read32(aFp, data))
        {
            iError = PV_AVI_FILE_PARSER_READ_ERROR;
            break;
        }
        bytesRead += CHUNK_SIZE;
        if (bytesRead > iIndexSize)
        {
            iError = PV_AVI_FILE_PARSER_BYTE_COUNT_ERROR;
            break;
        }

        strNum = PVAviFileParserUtils::GetStreamNumber(data);

        if ((strNum < 0) || (strNum >= (int32)iNumStreams))
        {
            //bogus entry skip it.
            aFp->Seek((CHUNK_SIZE + CHUNK_SIZE + CHUNK_SIZE), Oscl_File::SEEKCUR);

            bytesRead += CHUNK_SIZE + CHUNK_SIZE + CHUNK_SIZE ; //flags+offset+size
            continue;
        }

        IdxTblType tbl;
        tbl.chunkId = data;

        if (PV_AVI_FILE_PARSER_SUCCESS != PVAviFileParserUtils::read32(aFp, (tbl.flags)))
        {
            iError = PV_AVI_FILE_PARSER_READ_ERROR;
            break;
        }

        bytesRead += CHUNK_SIZE;
        if (bytesRead > iIndexSize)
        {
            iError = PV_AVI_FILE_PARSER_BYTE_COUNT_ERROR;
            break;
        }

        if (tbl.flags & AVIIF_KEYFRAME)
            tbl.isKeyFrame = true;
        if (tbl.flags & AVIIF_LIST)
            tbl.ifRecList = true;
        if (tbl.flags & AVIIF_NO_TIME)
            tbl.ifNoTime  = true;

        if (PV_AVI_FILE_PARSER_SUCCESS != PVAviFileParserUtils::read32(aFp, tbl.offset, true))
        {
            iError = PV_AVI_FILE_PARSER_READ_ERROR;
            break;
        }

        bytesRead += CHUNK_SIZE;
        if (bytesRead > iIndexSize)
        {
            iError = PV_AVI_FILE_PARSER_BYTE_COUNT_ERROR;
            break;
        }

        if (firstSample)
        {
            firstSample = false;
            if (OFFSET_FROM_MOVI_LST == tbl.offset)
            {
                iOffsetFrmMoviLst = true;
            }
        }

        if (PV_AVI_FILE_PARSER_SUCCESS != PVAviFileParserUtils::read32(aFp, tbl.size, true))
        {
            iError = PV_AVI_FILE_PARSER_READ_ERROR;
            break;
        }

        bytesRead += CHUNK_SIZE;
        if (bytesRead > iIndexSize)
        {
            iError = PV_AVI_FILE_PARSER_BYTE_COUNT_ERROR;
            break;
        }

        (iIndexTable[strNum]).push_back(tbl);

    }
}

