blob: 463955011e96b8b5170884ba24fbbb5b1dd19fad [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 __SDP_INFO_H__
#define __SDP_INFO_H__
#include "oscl_mem.h"
#include "session_info.h"
#include "media_info.h"
#include "aac_media_info.h"
#include "amr_media_info.h"
#include "evrc_media_info.h"
#include "m4v_media_info.h"
#include "rfc3640_media_info.h"
#include "h263_media_info.h"
#include "still_image_media_info.h"
#include "bool_array.h"
#include "pcmu_media_info.h"
#include "pcma_media_info.h"
#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif
//----------------------------------------------------------------------
// Global Constant Declarations
//----------------------------------------------------------------------
#define MAX_MEDIA_OBJECTS 50
#define MAX_SEGMENTS 10
struct segmentSpecific
{
bool segmentActive;
bool segmentPayloadOrderPref;
};
typedef BoolArray<MAX_MEDIA_OBJECTS> SDPSelectionType;
//----------------------------------------------------------------------
// Global Type Declarations
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// Global Data Declarations
//----------------------------------------------------------------------
//======================================================================
// CLASS DEFINITIONS and FUNCTION DECLARATIONS
//======================================================================
#include "mime_registry.h"
class SDPInfo
{
public:
SDPInfo()
{
registrar_locally_allocated = false;
reg = NULL;
numMediaObjects = 0;
iMediaObjectIndex = 0;
segmentCount = 0;
for (int ii = 0; ii < MAX_SEGMENTS; ii++)
{
segmentInfo[ii].segmentActive = true;
segmentInfo[ii].segmentPayloadOrderPref = false;
}
}
SDPInfo(const SDPInfo &sourceSdpInfo)
{
registrar_locally_allocated = false;
reg = NULL;
numMediaObjects = 0;
iMediaObjectIndex = 0;
segmentCount = sourceSdpInfo.segmentCount;
for (int jj = 0; jj < MAX_SEGMENTS; jj++)
{
segmentInfo[jj] = sourceSdpInfo.segmentInfo[jj];
}
session_info = sourceSdpInfo.session_info;
bool alternateMedia;
for (int ii = 0; ii < sourceSdpInfo.numMediaObjects; ii++)
{
for (int ss = 0; ss < (int)pMediaInfo[ii].size(); ss++)
{
const char *MIMEType = (sourceSdpInfo.pMediaInfo[ii][ss])->getMIMEType();
if (!oscl_strncmp(MIMEType, "AAC", oscl_strlen("AAC")) || !oscl_strncmp(MIMEType, "MP4A-LATM", oscl_strlen("MP4A-LATM")))
{
aac_mediaInfo *pSourceAAC = (aac_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
//void *memory = alloc(sizeof(aac_mediaInfo) + pSourceAAC->getDecoderSpecificInfoSize());
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(aac_mediaInfo), alternateMedia);
aac_mediaInfo *pAAC = OSCL_PLACEMENT_NEW(memory, aac_mediaInfo());
// unsigned char *decSpecificInfo = (unsigned char *)(memory) + sizeof(aac_mediaInfo);
// pAAC->setDecoderSpecificInfo(decSpecificInfo, pSourceAAC->getDecoderSpecificInfoSize());
*pAAC = *pSourceAAC;
}
else if (!oscl_strncmp(MIMEType, "AMR", oscl_strlen("AMR")))
{
amr_mediaInfo *pSourceAMR = (amr_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(amr_mediaInfo), alternateMedia);
amr_mediaInfo *pAMR = OSCL_PLACEMENT_NEW(memory, amr_mediaInfo());
*pAMR = *pSourceAMR;
}
else if (!oscl_strncmp(MIMEType, "EVRC", oscl_strlen("EVRC")))
{
evrc_mediaInfo *pSourceEVRC = (evrc_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(evrc_mediaInfo), alternateMedia);
evrc_mediaInfo *pEVRC = OSCL_PLACEMENT_NEW(memory, evrc_mediaInfo());
*pEVRC = *pSourceEVRC;
}
else if (!oscl_strncmp(MIMEType, "MP4V-ES", oscl_strlen("MP4V-ES")))
{
m4v_mediaInfo *pSourceM4V = (m4v_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(m4v_mediaInfo), alternateMedia);
m4v_mediaInfo *pM4V = OSCL_PLACEMENT_NEW(memory, m4v_mediaInfo());
*pM4V = *pSourceM4V;
}
else if (!oscl_strncmp(MIMEType, "H263-1998", oscl_strlen("H263-1998")))
{
h263_mediaInfo *pSourceH263 = (h263_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(h263_mediaInfo), alternateMedia);
h263_mediaInfo *pH263 = OSCL_PLACEMENT_NEW(memory, h263_mediaInfo());
*pH263 = *pSourceH263;
}
else if (!oscl_strncmp(MIMEType, "H263-2000", oscl_strlen("H263-2000")))
{
h263_mediaInfo *pSourceH263 = (h263_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(h263_mediaInfo), alternateMedia);
h263_mediaInfo *pH263 = OSCL_PLACEMENT_NEW(memory, h263_mediaInfo());
*pH263 = *pSourceH263;
}
else if (!oscl_strncmp(MIMEType, "PVMP4V-ES", oscl_strlen("PVMP4V-ES")))
{
m4v_mediaInfo *pSourceM4V = (m4v_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(m4v_mediaInfo), alternateMedia);
m4v_mediaInfo *pM4V = OSCL_PLACEMENT_NEW(memory, m4v_mediaInfo());
(mediaInfo)*pM4V = (mediaInfo) * pSourceM4V;
*pM4V = *pSourceM4V;
}
else if (!oscl_strncmp(MIMEType, "mpeg4-generic", oscl_strlen("mpeg4-generic")))
{
rfc3640_mediaInfo *pSourceRFC3640 = (rfc3640_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(rfc3640_mediaInfo), alternateMedia);
rfc3640_mediaInfo *pRFC3640 = OSCL_PLACEMENT_NEW(memory, rfc3640_mediaInfo());
(mediaInfo)*pRFC3640 = (mediaInfo) * pSourceRFC3640;
*pRFC3640 = *pSourceRFC3640;
}
else if (!oscl_strncmp(MIMEType, "X-MP4V-IMAGE", oscl_strlen("X-MP4V-IMAGE")))
{
still_image_mediaInfo *pSourceImage = (still_image_mediaInfo*)sourceSdpInfo.pMediaInfo[ii][ss];
if (ss == 0)
alternateMedia = false;
else
alternateMedia = true;
void *memory = alloc(sizeof(still_image_mediaInfo), alternateMedia);
still_image_mediaInfo *pImage = OSCL_PLACEMENT_NEW(memory, still_image_mediaInfo());
*pImage = *pSourceImage;
}
}
}
}
~SDPInfo()
{
int ii = 0;
int ss = 0;
for (ii = 0; ii < numMediaObjects; ii++)
{
for (ss = 0; ss < (int)pMediaInfo[ii].size();ss++)
{
pMediaInfo[ii][ss]->~mediaInfo();
dealloc(pMediaInfo[ii][ss]);
}
}
numMediaObjects = 0;
}
sessionDescription *getSessionInfo()
{
return &session_info;
};
Oscl_Vector<mediaInfo *, SDPParserAlloc> getMediaInfo(int Object)
{
if ((Object >= 0) && (Object < MAX_MEDIA_OBJECTS))
{
return pMediaInfo[Object];
}
else
{
return 0;
}
};
Oscl_Vector<mediaInfo *, SDPParserAlloc> *getMediaArray()
{
return pMediaInfo;
};
int getNumMediaObjects()
{
return numMediaObjects;
};
inline void dealloc(void *ptr)
{
oscl_free(ptr);
};
mediaInfo* getMediaInfoBasedOnID(uint32 trackID)
{
int numObjects = getNumMediaObjects();
for (int i = 0; i < numObjects; i++)
{
Oscl_Vector<mediaInfo*, SDPParserAlloc> mediaInfoVec;
mediaInfoVec = getMediaInfo(i);
for (uint32 j = 0; j < mediaInfoVec.size(); j++)
{
mediaInfo* minfo = mediaInfoVec[j];
if (minfo != NULL)
{
if (minfo->getMediaInfoID() == trackID)
{
return minfo;
}
}
}
}
return NULL;
}
mediaInfo* getMediaInfoBasedOnDependsOnID(uint32 trackID)
{
if (trackID == 0)
{
return NULL;
}
int numObjects = getNumMediaObjects();
for (int i = 0; i < numObjects; i++)
{
Oscl_Vector<mediaInfo*, SDPParserAlloc> mediaInfoVec;
mediaInfoVec = getMediaInfo(i);
for (uint32 j = 0; j < mediaInfoVec.size(); j++)
{
mediaInfo* minfo = mediaInfoVec[j];
if (minfo != NULL)
{
if ((uint32)(minfo->getControlTrackID()) == trackID)
{
return minfo;
}
}
}
}
return NULL;
}
void *alloc(const int size, bool alternateMedia)
{
OSCL_UNUSED_ARG(alternateMedia);
if (numMediaObjects < MAX_MEDIA_OBJECTS)
{
void *mem = oscl_malloc(size * sizeof(char));
if (mem != NULL)
{
iMediaObjectIndex++;
pMediaInfo[numMediaObjects].push_back((mediaInfo *)mem);
}
return mem;
}
else
{
return NULL;
}
}
void IncrementAlternateMediaInfoVectorIndex()
{
pMediaInfo[numMediaObjects][0]->setSegmentNumber(segmentCount);
numMediaObjects++;
}
void copyFmDefMedia(mediaInfo *media)
{
*media = *pMediaInfo[numMediaObjects][0];
}
inline void reset()
{
session_info.resetSessionDescription();
int ii = 0;
int ss = 0;
for (ii = 0; ii < numMediaObjects; ii++)
{
for (ss = 0; ss < (int)pMediaInfo[ii].size(); ss++)
{
pMediaInfo[ii][ss]->~mediaInfo();
dealloc(pMediaInfo[ii][ss]);
}
}
numMediaObjects = 0;
}
inline uint32 getMediaObjectIndex()
{
return iMediaObjectIndex;
}
bool getMediaInfoInSegment(int segment, Oscl_Vector< mediaInfo *, SDPParserAlloc>& segmentMediaInfo)
{
if (segmentCount == 0)
return false;
for (int ii = 0; ii < numMediaObjects; ii++)
{
if (pMediaInfo[ii][0]->getSegmentNumber() == (uint)segment)
{
segmentMediaInfo.push_back(pMediaInfo[ii][0]);
}
}
return true;
}
void setSegmentCount(int count)
{
segmentCount = count;
}
int getSegmentCount()
{
return segmentCount;
}
bool setSegmentActive(int segment, bool status)
{
if (segment <= segmentCount)
{
segmentInfo[segment].segmentActive = status;
return true;
}
else
return false;
}
bool isSegmentActive(int segment)
{
if (segment <= segmentCount)
return segmentInfo[segment].segmentActive;
else
return false;
}
bool setSegmentPayloadOrderPref(int segment, int* payloadArray, int len)
{
segmentInfo[segment].segmentPayloadOrderPref = false;
if (segment <= segmentCount)
{
Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
{
for (int ii = 0; ii < len; ii++)
{
for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
{
if (segmentMediaInfo[jj]->getPayloadSpecificInfoVector()[0]->getPayloadNumber() == (uint32)payloadArray[ii])
{
segmentMediaInfo[jj]->setPayloadPreference(ii);
break;
}
}
}
}
}
else
return false;
segmentInfo[segment].segmentPayloadOrderPref = true;
return true;
}
bool isPayloadOrderPreferenceSet(int segment)
{
if (segment <= segmentCount)
return segmentInfo[segment].segmentPayloadOrderPref;
else
return false;
}
mediaInfo* getPreferedMediaInfo(int segment)
{
mediaInfo* media = NULL;
Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
{
for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
{
if (segmentMediaInfo[jj]->isMatched() == true)
{
media = segmentMediaInfo[jj];
break;
}
}
}
return media;
}
int getPreferedPayloadNumber(int segment)
{
int payload = -1;
Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
{
for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
{
if (segmentMediaInfo[jj]->isMatched() == true)
{
payload = segmentMediaInfo[jj]->getPayloadSpecificInfoVector()[0]->getPayloadNumber();
break;
}
}
}
return payload;
}
const oscl_wchar *getSdpFilename(uint32 &retsize)
{
retsize = SdpFilename.get_size();
return SdpFilename.get_cstr();
}
void setSDPFilename(OSCL_wString& aURL)
{
SdpFilename = aURL;
}
private:
sessionDescription session_info;
Oscl_Vector< mediaInfo *, SDPParserAlloc> pMediaInfo[MAX_MEDIA_OBJECTS];
int numMediaObjects;
registrar *reg;
bool registrar_locally_allocated;
uint32 iMediaObjectIndex;
int segmentCount;
segmentSpecific segmentInfo[MAX_SEGMENTS];
OSCL_wHeapString<SDPParserAlloc> SdpFilename;
};
#endif // __SDP_INFO_H__