| /* ------------------------------------------------------------------ |
| * 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 |
| |