blob: 8c7b663868d6f552d835f007d5d6a040380e0b77 [file] [log] [blame]
/* ------------------------------------------------------------------
* 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.
* -------------------------------------------------------------------
*/
#ifndef PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED
#define PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_TYPES_H_INCLUDED
#include "oscl_types.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#ifndef OSCL_SHARED_PTR_H_INCLUDED
#include "oscl_shared_ptr.h"
#endif
#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif
#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
#ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
#include "oscl_refcounter_memfrag.h"
#endif
enum PVMF_TRACK_INFO_TRACK_ALTERNATE_TYPE
{
PVMF_TRACK_ALTERNATE_TYPE_UNDEFINED,
PVMF_TRACK_ALTERNATE_TYPE_LANGUAGE,
PVMF_TRACK_ALTERNATE_TYPE_BANDWIDTH,
PVMF_TRACK_ALTERNATE_TYPE_BANDWIDTH_AND_CODEC_PARAMS,
};
class PVMFTrackInfo : public HeapBase
{
public:
PVMFTrackInfo()
{
iTrackID = -1;
iPortTag = -1;
iDurationValue = 0;
iDurationTimeScale = 0;
iDependsOn = false;
iHasAlternates = false;
iTrackAlternateType = PVMF_TRACK_ALTERNATE_TYPE_UNDEFINED;
oDurationAvailable = true;
iTrackFrameRate = 0;
}
PVMFTrackInfo(const PVMFTrackInfo& aSourceTrackInfo) : HeapBase(aSourceTrackInfo)
{
iTrackMimeType = aSourceTrackInfo.iTrackMimeType;
iTrackID = aSourceTrackInfo.iTrackID;
iPortTag = aSourceTrackInfo.iPortTag;
iDurationValue = aSourceTrackInfo.iDurationValue;
iDurationTimeScale = aSourceTrackInfo.iDurationTimeScale;
iTrackBitRate = aSourceTrackInfo.iTrackBitRate;
iTrackFrameRate = aSourceTrackInfo.iTrackFrameRate;
iTrackConfigInfo = aSourceTrackInfo.iTrackConfigInfo;
iDependsOn = aSourceTrackInfo.iDependsOn;
iHasAlternates = aSourceTrackInfo.iHasAlternates;
iTrackAlternateType = aSourceTrackInfo.iTrackAlternateType;
iDependsOnTrackIDVec = aSourceTrackInfo.iDependsOnTrackIDVec;
iAlternateTrackIDVec = aSourceTrackInfo.iAlternateTrackIDVec;
oDurationAvailable = aSourceTrackInfo.oDurationAvailable;
iLanguage = aSourceTrackInfo.iLanguage;
}
PVMFTrackInfo& operator=(const PVMFTrackInfo& aSourceTrackInfo)
{
if (&aSourceTrackInfo != this)
{
iTrackMimeType = aSourceTrackInfo.iTrackMimeType;
iTrackID = aSourceTrackInfo.iTrackID;
iPortTag = aSourceTrackInfo.iPortTag;
iDurationValue = aSourceTrackInfo.iDurationValue;
iDurationTimeScale = aSourceTrackInfo.iDurationTimeScale;
iTrackBitRate = aSourceTrackInfo.iTrackBitRate;
iTrackFrameRate = aSourceTrackInfo.iTrackFrameRate;
iTrackConfigInfo = aSourceTrackInfo.iTrackConfigInfo;
iDependsOn = aSourceTrackInfo.iDependsOn;
iHasAlternates = aSourceTrackInfo.iHasAlternates;
iTrackAlternateType = aSourceTrackInfo.iTrackAlternateType;
iDependsOnTrackIDVec = aSourceTrackInfo.iDependsOnTrackIDVec;
iAlternateTrackIDVec = aSourceTrackInfo.iAlternateTrackIDVec;
oDurationAvailable = aSourceTrackInfo.oDurationAvailable;
iLanguage = aSourceTrackInfo.iLanguage;
}
return *this;
}
~PVMFTrackInfo()
{
}
/*
* Track mimetype is a mimestring that uniquely identifies
* a media track and its format to some extent, within a
* presentation.
*/
OSCL_String& getTrackMimeType()
{
return iTrackMimeType;
}
void setTrackMimeType(OSCL_String& aMimeType)
{
iTrackMimeType = aMimeType;
}
uint32 getTrackID()
{
return iTrackID;
}
void setTrackID(uint32 aId)
{
iTrackID = aId;
}
uint32 getPortTag()
{
return iPortTag;
}
void setPortTag(uint32 aTag)
{
iPortTag = aTag;
}
bool IsDurationAvailable()
{
return oDurationAvailable;
}
void SetDurationAvailable(bool aDurationAvailable)
{
oDurationAvailable = aDurationAvailable;
}
uint64 getTrackDurationValue()
{
return iDurationValue;
}
void setTrackDurationValue(uint64 aDuration)
{
iDurationValue = aDuration;
}
uint64 getTrackDurationTimeScale()
{
return iDurationTimeScale;
}
void setTrackDurationTimeScale(uint64 aTimeScale)
{
iDurationTimeScale = aTimeScale;
}
uint32 getTrackBitRate()
{
return iTrackBitRate;
}
void setTrackBitRate(uint32 aBitRate)
{
iTrackBitRate = aBitRate;
}
uint32 getTrackFrameRate()
{
return iTrackFrameRate;
}
void setTrackFrameRate(uint32 aFrameRate)
{
iTrackFrameRate = aFrameRate;
}
/*
* TrackConfig info typically holds info that gets passed to
* decoders to initialize, aka, mpeg4 vol header, mpeg4 audio
* config etc. For tracks that expose a fixed set of parameters
* as part of config as opposed to some opaque data, the void
* pointer in the memory fragement is actually a pointer to a
* strcuture that the user of this field would know how to
* interpret. For example in case of H263, we could have a structure
* that could be defined as:
* struct H263ConfigInfo
* {
* uint32 maxWidth;
* uint32 maxHeight;
* uint32 codecProfile;
* uint32 codecLevel;
* };
* Memory fragment holds a pointer to this strcuture.
*
*/
OsclRefCounterMemFrag& getTrackConfigInfo()
{
return iTrackConfigInfo;
}
void setTrackConfigInfo(OsclRefCounterMemFrag& aConfig)
{
iTrackConfigInfo = aConfig;
}
void setDependsOn()
{
iDependsOn = true;
}
bool DoesTrackHaveDependency()
{
return (iDependsOn);
}
void addDependsOnTrackID(int32 aTrackID)
{
iDependsOnTrackIDVec.push_back(aTrackID);
}
Oscl_Vector<int32, OsclMemAllocator> getDependsOnTrackIDVec()
{
return (iDependsOnTrackIDVec);
}
void setTrackAlternates(PVMF_TRACK_INFO_TRACK_ALTERNATE_TYPE aAlternateType)
{
if (aAlternateType != PVMF_TRACK_ALTERNATE_TYPE_UNDEFINED)
{
iHasAlternates = true;
iTrackAlternateType = aAlternateType;
}
}
bool DoesTrackHaveAlternates()
{
return (iHasAlternates);
}
PVMF_TRACK_INFO_TRACK_ALTERNATE_TYPE getTrackAlternateType()
{
return iTrackAlternateType;
}
void addAlternateTrackID(int32 aTrackID)
{
iAlternateTrackIDVec.push_back(aTrackID);
}
Oscl_Vector<int32, OsclMemAllocator> getAlternateTrackIDVec()
{
return (iAlternateTrackIDVec);
}
OSCL_String& getTrackLanguage()
{
return iLanguage;
}
private:
OSCL_HeapString<OsclMemAllocator> iTrackMimeType;
int32 iTrackID;
int32 iPortTag;
uint64 iDurationValue;
uint64 iDurationTimeScale;
uint32 iTrackBitRate;
uint32 iTrackFrameRate;
OsclRefCounterMemFrag iTrackConfigInfo;
bool iDependsOn;
Oscl_Vector<int32, OsclMemAllocator> iDependsOnTrackIDVec;
bool iHasAlternates;
PVMF_TRACK_INFO_TRACK_ALTERNATE_TYPE iTrackAlternateType;
Oscl_Vector<int32, OsclMemAllocator> iAlternateTrackIDVec;
bool oDurationAvailable;
/*
* ISO-639-2/T language codes, which are basically 3 character codes
* assigned to each language. Typically applicable to audio tracks.
* If the language code exists it will be returned in the iLanguage parameter.
* If iLanguage is empty English should be assumed.
*/
OSCL_HeapString<OsclMemAllocator> iLanguage;
};
/**
* Primary goals of this class are to provide:
* - a common interface for the track selection modules, across
* local playback, streaming and download
* - provide enough information to perform track selection
*/
class PVMFMediaPresentationInfo
{
public:
PVMFMediaPresentationInfo()
{
oIsSeekable = false;
oDurationAvailable = true;
}
PVMFMediaPresentationInfo(const PVMFMediaPresentationInfo& aInfo)
{
iPresentationType = aInfo.iPresentationType;
iDurationValue = aInfo.iDurationValue;
iDurationTimeScale = aInfo.iDurationTimeScale;
oIsSeekable = aInfo.oIsSeekable;
iTrackInfoVec = aInfo.iTrackInfoVec;
oDurationAvailable = aInfo.oDurationAvailable;
}
~PVMFMediaPresentationInfo()
{
iTrackInfoVec.clear();
}
PVMFMediaPresentationInfo& operator=(const PVMFMediaPresentationInfo& aInfo)
{
if (&aInfo != this)
{
iPresentationType = aInfo.iPresentationType;
iDurationValue = aInfo.iDurationValue;
iDurationTimeScale = aInfo.iDurationTimeScale;
oIsSeekable = aInfo.oIsSeekable;
iTrackInfoVec = aInfo.iTrackInfoVec;
oDurationAvailable = aInfo.oDurationAvailable;
}
return *this;
}
/*
* Presentation type is a mime string that identifies the
* media presentation, viz, mp4, asf, mp3 etc
*/
OSCL_String& getPresentationType()
{
return iPresentationType;
}
void setPresentationType(OSCL_String& aPresentationType)
{
iPresentationType = aPresentationType;
}
bool IsSeekable()
{
return oIsSeekable;
}
void setSeekableFlag(bool aFlag)
{
oIsSeekable = aFlag;
}
void addTrackInfo(PVMFTrackInfo& aTrackInfo)
{
iTrackInfoVec.push_back(aTrackInfo);
}
uint32 getNumTracks() const
{
return (iTrackInfoVec.size());
}
PVMFTrackInfo* getTrackInfo(uint32 aIndex) const
{
if (aIndex >= iTrackInfoVec.size())
{
return NULL;
}
return (OSCL_CONST_CAST(PVMFTrackInfo*, &(iTrackInfoVec[aIndex])));
}
PVMFTrackInfo* getTrackInfoBasedOnTrackID(uint32 aTrackID)
{
Oscl_Vector<PVMFTrackInfo, OsclMemAllocator>::iterator it;
for (it = iTrackInfoVec.begin(); it != iTrackInfoVec.end(); it++)
{
if (it->getTrackID() == aTrackID)
{
return (it);
}
}
return NULL;
}
bool IsDurationAvailable()
{
return oDurationAvailable;
}
void SetDurationAvailable(bool aDurationAvailable)
{
oDurationAvailable = aDurationAvailable;
}
uint64 getDurationValue()
{
return iDurationValue;
}
void setDurationValue(uint64 aDuration)
{
iDurationValue = aDuration;
}
uint64 getDurationTimeScale()
{
return iDurationTimeScale;
}
void setDurationTimeScale(uint64 aTimeScale)
{
iDurationTimeScale = aTimeScale;
}
void Reset()
{
iTrackInfoVec.clear();
iDurationValue = 0;
iDurationTimeScale = 0;
oIsSeekable = false;
iPresentationType = _STRLIT_CHAR("");
oDurationAvailable = true;
}
private:
OSCL_HeapString<OsclMemAllocator> iPresentationType;
uint64 iDurationValue;
uint64 iDurationTimeScale;
bool oIsSeekable;
Oscl_Vector<PVMFTrackInfo, OsclMemAllocator> iTrackInfoVec;
bool oDurationAvailable;
};
#endif //PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED