blob: 26b5cdfabcd9cb3044d4c3e51482c047ee570f7c [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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.
* -------------------------------------------------------------------
*/
#ifndef PV_AVIFILE_PARSER_H_INCLUDED
#define PV_AVIFILE_PARSER_H_INCLUDED
#ifndef PV_AVIFILE_TYPEDEFS_H_INCLUDED
#include "pv_avifile_typedefs.h"
#endif
#ifndef PV_AVIFILE_PARSER_UTILS_H_INCLUDED
#include "pv_avifile_parser_utils.h"
#endif
#ifndef PV_AVIFILE_HEADER_H_INCLUDED
#include "pv_avifile_header.h"
#endif
#ifndef PV_AVIFILE_INDX_H_INCLUDED
#include "pv_avifile_indx.h"
#endif
#ifndef PV_AVIFILE_H_INCLUDED
#include "pv_avifile.h"
#endif
//class to parse avi file
class PVAviFileParser: public PVAviFile
{
public:
//constructor
PVAviFileParser(OSCL_wHeapString<OsclMemAllocator> aFileName, int32& aError, Oscl_FileServer* aFileServer,
PVMFCPMPluginAccessInterfaceFactory* aCPM, OsclFileHandle* aFileHandle);
//destructor
~PVAviFileParser();
PV_AVI_FILE_PARSER_ERROR_TYPE ParseFile();
//Read Media Sample form the file in order they exist in 'movi' chunk
PV_AVI_FILE_PARSER_ERROR_TYPE
GetNextMediaSample(uint32& arStreamNo, uint8* aBuffer, uint32& arSize,
uint32& arTimeStamp);
//read next media samples for a stream with stream number = aStreamNo.
PV_AVI_FILE_PARSER_ERROR_TYPE
GetNextStreamMediaSample(uint32 aStreamNo, uint8* aBuffer, uint32& arSize,
uint32& arTimeStamp);
PV_AVI_FILE_PARSER_ERROR_TYPE
GetNextStreamSampleInfo(uint32 aStreamNo, uint32& arSize, uint32& arOffset);
//methods to retrieve file properties
PVAviFileMainHeaderStruct GetMainHeaderStruct()
{
return (ipFileHeader->GetMainHeaderStruct());
}
OSCL_IMPORT_REF uint32 GetFileDuration();
OSCL_IMPORT_REF void Reset();
OSCL_IMPORT_REF void Reset(uint32 aStreamNo);
OSCL_IMPORT_REF uint32 GetFrameDuration();
OSCL_IMPORT_REF uint32 GetNumStreams();
uint32 GetFileSuggestedBufferSize();
uint32 GetFileDataRate()
{
return (ipFileHeader->GetFileDataRate());
}
bool IsCopyrighted()
{
return (ipFileHeader->IsCopyrighted());
}
bool HasIndexTable()
{
return (ipFileHeader->HasIndexTable());
}
bool IsInterleaved()
{
return (ipFileHeader->IsInterleaved());
}
bool MustUseIndex()
{
return (ipFileHeader->MustUseIndex());
}
bool IsCaptureFile()
{
return (ipFileHeader->IsCaptureFile());
}
uint32 GetTotalFrames()
{
return (ipFileHeader->GetTotalFrames());
}
uint32 GetInitialFrames()
{
return (ipFileHeader->GetInitialFrames());
}
OSCL_IMPORT_REF uint32 GetWidth(int32 aStreamNo);
OSCL_IMPORT_REF uint32 GetHeight(bool& rBottomUp, int32 aStreamNo);
//methods to retrieve stream properties
OSCL_IMPORT_REF PVAviFileStreamHeaderStruct GetStreamHeaderStruct(uint32 aStreamNum);
OSCL_IMPORT_REF OSCL_HeapString<OsclMemAllocator> GetStreamMimeType(uint32 aStreamNum);
OSCL_IMPORT_REF uint32 GetStreamDuration(uint32 aStreamNum);
bool PalletChangeAvailable(uint32 aStreamNum)
{
return (ipFileHeader->PalletChangeAvailable(aStreamNum));
}
bool ISDisabledByDefault(uint32 aStreamNum)
{
return (ipFileHeader->ISDisabledByDefault(aStreamNum));
}
bool GetVideoFormatType(uint8* aHdlr, uint32& arSize, uint32 aStreamNo);
uint32 GetAudioFormatType(uint32 aStreamNo)
{
return ipFileHeader->GetAudioFormat(aStreamNo);
}
uint32 GetNumAudioChannels(uint32 aStreamNo)
{
return ipFileHeader->GetNumAudioChannels(aStreamNo);
}
uint16 GetPriority(uint32 aStreamNum)
{
return (ipFileHeader->GetPriority(aStreamNum));
}
uint16 GetLanguage(uint32 aStreamNum)
{
return (ipFileHeader->GetLanguage(aStreamNum));
}
uint32 GetInitalFrames(uint32 aStreamNum)
{
return (ipFileHeader->GetInitalFrames(aStreamNum));
}
uint32 GetRate(uint32 aStreamNum)
{
return (ipFileHeader->GetRate(aStreamNum));
}
uint32 GetScale(uint32 aStreamNum)
{
return (ipFileHeader->GetScale(aStreamNum));
}
OSCL_IMPORT_REF OsclFloat GetFrameRate(uint32 aStreamNum);
uint32 GetStartTime(uint32 aStreamNum)
{
return (ipFileHeader->GetStartTime(aStreamNum));
}
uint32 GetStreamSuggestedBufferSize(uint32 aStreamNum)
{
return (ipFileHeader->GetStreamSuggestedBufferSize(aStreamNum));
}
uint32 GetBitsPerSample(uint32 aStreamNum)
{
return (ipFileHeader->GetBitsPerSample(aStreamNum));
}
int32 GetQuality(uint32 aStreamNum)
{
return (ipFileHeader->GetQuality(aStreamNum));
}
uint32 GetSampleSize(uint32 aStreamNum)
{
return (ipFileHeader->GetSampleSize(aStreamNum));
}
rcFrameType GetRCFrame(uint32 aStreamNum)
{
return (ipFileHeader->GetRCFrame(aStreamNum));
}
//method to get codec specific info
OSCL_IMPORT_REF bool GetCodecSpecificData(uint32 aStreamNum, OsclRefCounterMemFrag& arFormatSpecificDataFrag);
//method to retrieve stream format specific info
OSCL_IMPORT_REF bool GetFormatSpecificInfo(uint32 aStreamNum, OsclRefCounterMemFrag& arFormatSpecificDataFrag);
Oscl_Vector<uint32, OsclMemAllocator> GetStreamCountList()
{
return iStreamCount;
}
OSCL_IMPORT_REF Oscl_Vector<uint32, OsclMemAllocator> GetAudioStreamCountList();
OSCL_IMPORT_REF Oscl_Vector<uint32, OsclMemAllocator> GetVideoStreamCountList();
private:
PV_AVI_FILE_PARSER_ERROR_TYPE
GetStreamOffsetFromIndexTable(uint32 aStreamNo, uint32& arSize, uint32& aOffset);
PV_AVI_FILE_PARSER_ERROR_TYPE
GetStreamOffset(uint32 aStreamNo, uint32& aSampleSize, uint32& aOffset);
PVAviFileHeader* ipFileHeader;
PVAviFileIdxChunk* ipIdxChunk;
bool iIdxChunkPresent;
uint32 iFileSize;
uint32 iHeaderChunkSize;
uint32 iMovieChunkSize;
//store the offset of first sample. used if index table is not present.
uint32 iMovieChunkStartOffset;
uint32 iIndxChunkSize;
Oscl_Vector < uint32,
OsclMemAllocator > iStreamCount;
Oscl_Vector < uint32,
OsclMemAllocator > iStreamSampleCount;
//stores current offset if index table is not present
uint32 iSampleOffset;
//store latest sample offset if index table is not present
Oscl_Vector < uint32,
OsclMemAllocator > iStreamSampleOffset;
PVFile* ipFilePtr;
uint32 iTimeStampAudio;
uint32 iTimeStampVideo;
};
#endif //#ifndef PV_AVIFILE_PARSER_H_INCLUDED