Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 #ifndef __SDP_INFO_H__
     19 #include "sdp_info.h"
     20 #endif
     21 
     22 #ifndef SDPPARSER_CONFIG_H_INCLUDED
     23 #include "sdpparser_config.h"
     24 #endif
     25 
     26 #ifndef SDPPARSER_HAS_REAL_MEDIA_SUPPORT
     27 #error "sdp config file missing"
     28 #endif
     29 
     30 #if SDPPARSER_HAS_REAL_MEDIA_SUPPORT
     31 #ifndef RM_MEDIAINFO_H
     32 #include "rm_media_info.h"
     33 #endif
     34 #endif
     35 
     36 
     37 OSCL_EXPORT_REF
     38 SDPInfo::SDPInfo()
     39 {
     40     numMediaObjects = 0;
     41     iMediaObjectIndex = 0;
     42     segmentCount = 0;
     43     for (int ii = 0; ii < MAX_SEGMENTS; ii++)
     44     {
     45         segmentInfo[ii].segmentActive = true;
     46         segmentInfo[ii].segmentPayloadOrderPref = false;
     47     }
     48 }
     49 
     50 OSCL_EXPORT_REF
     51 SDPInfo::SDPInfo(const SDPInfo &sourceSdpInfo)
     52 {
     53     //expecting the = oper of sessionDescription to be overloaded
     54     session_info = sourceSdpInfo.session_info;
     55     SdpFilename = sourceSdpInfo.SdpFilename;
     56     segmentCount = sourceSdpInfo.segmentCount;
     57     iMediaObjectIndex = sourceSdpInfo.iMediaObjectIndex;
     58     numMediaObjects = sourceSdpInfo.numMediaObjects;
     59 
     60     for (int jj = 0; jj < MAX_SEGMENTS; jj++)
     61     {
     62         segmentInfo[jj] = sourceSdpInfo.segmentInfo[jj];
     63     }
     64 
     65     for (int ii = 0; ii < MAX_MEDIA_OBJECTS; ii++)
     66     {
     67         Oscl_Vector< mediaInfo *, SDPParserAlloc>& destMediaInfoVect = pMediaInfo[ii];
     68         const Oscl_Vector< mediaInfo *, SDPParserAlloc>& srcMediaInfoVect = sourceSdpInfo.pMediaInfo[ii];
     69         const int32 srcMediaInfoVectSz = srcMediaInfoVect.size();
     70         for (int ss = 0; ss < srcMediaInfoVectSz; ss++)
     71         {
     72             mediaInfo* destMediaInfo = NULL;
     73             const char *mimeType = srcMediaInfoVect[ss]->getMIMEType();
     74             bool alternateMedia = (0 == ss) ? false : true;
     75 
     76             if (!oscl_strncmp(mimeType, "AAC", oscl_strlen("AAC")) || !oscl_strncmp(mimeType, "MP4A-LATM", oscl_strlen("MP4A-LATM")))
     77             {
     78                 aac_mediaInfo *pSourceAAC = OSCL_REINTERPRET_CAST(aac_mediaInfo*, srcMediaInfoVect[ss]);
     79                 void *memory = alloc(sizeof(aac_mediaInfo), alternateMedia);
     80                 aac_mediaInfo *pAAC = OSCL_PLACEMENT_NEW(memory, aac_mediaInfo());
     81                 *pAAC = *pSourceAAC;
     82                 destMediaInfo = pAAC;
     83             }
     84             else if (!oscl_strncmp(mimeType, "AMR", oscl_strlen("AMR")))
     85             {
     86                 amr_mediaInfo *pSourceAMR = OSCL_REINTERPRET_CAST(amr_mediaInfo*, srcMediaInfoVect[ss]);
     87                 void *memory = alloc(sizeof(amr_mediaInfo), alternateMedia);
     88                 amr_mediaInfo *pAMR = OSCL_PLACEMENT_NEW(memory, amr_mediaInfo());
     89                 *pAMR = *pSourceAMR;
     90                 destMediaInfo = pAMR;
     91             }
     92             else if (!oscl_strncmp(mimeType, "MP4V-ES", oscl_strlen("MP4V-ES")))
     93             {
     94                 m4v_mediaInfo *pSourceM4V = OSCL_REINTERPRET_CAST(m4v_mediaInfo*, srcMediaInfoVect[ss]);
     95                 void *memory = alloc(sizeof(m4v_mediaInfo), alternateMedia);
     96                 m4v_mediaInfo *pM4V = OSCL_PLACEMENT_NEW(memory, m4v_mediaInfo());
     97                 *pM4V = *pSourceM4V;
     98                 destMediaInfo = pM4V;
     99             }
    100             else if (!oscl_strncmp(mimeType, "H263-1998", oscl_strlen("H263-1998")) || !oscl_strncmp(mimeType, "H263-2000", oscl_strlen("H263-2000")))
    101             {
    102                 h263_mediaInfo *pSourceH263 = OSCL_REINTERPRET_CAST(h263_mediaInfo*, srcMediaInfoVect[ss]);
    103                 void *memory = alloc(sizeof(h263_mediaInfo), alternateMedia);
    104                 h263_mediaInfo *pH263 = OSCL_PLACEMENT_NEW(memory, h263_mediaInfo());
    105                 *pH263 = *pSourceH263;
    106                 destMediaInfo = pH263;
    107             }
    108             else if (!oscl_strncmp(mimeType, "PVMP4V-ES", oscl_strlen("PVMP4V-ES")))
    109             {
    110                 m4v_mediaInfo *pSourceM4V = OSCL_REINTERPRET_CAST(m4v_mediaInfo*, srcMediaInfoVect[ss]);
    111                 void *memory = alloc(sizeof(m4v_mediaInfo), alternateMedia);
    112                 m4v_mediaInfo *pM4V = OSCL_PLACEMENT_NEW(memory, m4v_mediaInfo());
    113                 *pM4V = *pSourceM4V;
    114                 destMediaInfo = pM4V;
    115             }
    116             else if (!oscl_strncmp(mimeType, "mpeg4-generic", oscl_strlen("mpeg4-generic")))
    117             {
    118                 rfc3640_mediaInfo *pSourceRFC3640 = OSCL_REINTERPRET_CAST(rfc3640_mediaInfo*, srcMediaInfoVect[ss]);
    119                 void *memory = alloc(sizeof(rfc3640_mediaInfo), alternateMedia);
    120                 rfc3640_mediaInfo *pRFC3640 = OSCL_PLACEMENT_NEW(memory, rfc3640_mediaInfo());
    121                 *pRFC3640 = *pSourceRFC3640;
    122                 destMediaInfo = pRFC3640;
    123             }
    124             else if (!oscl_strncmp(mimeType, "X-MP4V-IMAGE", oscl_strlen("X-MP4V-IMAGE")))
    125             {
    126                 still_image_mediaInfo *pSourceImage = OSCL_REINTERPRET_CAST(still_image_mediaInfo*, srcMediaInfoVect[ss]);
    127                 void *memory = alloc(sizeof(still_image_mediaInfo), alternateMedia);
    128                 still_image_mediaInfo *pImage = OSCL_PLACEMENT_NEW(memory, still_image_mediaInfo());
    129                 *pImage = *pSourceImage;
    130                 destMediaInfo = pImage;
    131             }
    132 #if SDPPARSER_HAS_REAL_MEDIA_SUPPORT
    133             else if (!oscl_strncmp(mimeType, "x-pn-realaudio", oscl_strlen("x-pn-realaudio")) || !oscl_strncmp(mimeType, "x-pn-realvideo", oscl_strlen("x-pn-realvideo")))
    134             {
    135                 rm_mediaInfo *rmSource = OSCL_REINTERPRET_CAST(rm_mediaInfo*, srcMediaInfoVect[ss]);
    136                 void *memory = alloc(sizeof(rm_mediaInfo), alternateMedia);
    137                 rm_mediaInfo *prm = OSCL_PLACEMENT_NEW(memory, rm_mediaInfo());
    138                 *prm = *rmSource;
    139                 destMediaInfo = prm;
    140             }
    141 #endif
    142             if (destMediaInfo)
    143                 destMediaInfoVect.push_back(destMediaInfo);
    144         }
    145     }
    146 }
    147 
    148 
    149 OSCL_EXPORT_REF
    150 SDPInfo::~SDPInfo()
    151 {
    152     int ii = 0;
    153     int ss = 0;
    154     for (ii = 0; ii < numMediaObjects; ii++)
    155     {
    156         for (ss = 0; ss < (int)pMediaInfo[ii].size(); ss++)
    157         {
    158             pMediaInfo[ii][ss]->~mediaInfo();
    159             dealloc(pMediaInfo[ii][ss]);
    160         }
    161     }
    162     numMediaObjects = 0;
    163 
    164 }
    165 
    166 OSCL_EXPORT_REF
    167 void SDPInfo::freeLastMediaInfoObject(void)
    168 {
    169     if (numMediaObjects < 0)
    170     {
    171         return;
    172     }
    173 
    174     for (int ss = 0; ss < (int)pMediaInfo[numMediaObjects].size(); ss++)
    175     {
    176         pMediaInfo[numMediaObjects][ss]->~mediaInfo();
    177         dealloc(pMediaInfo[numMediaObjects][ss]);
    178     }
    179 }
    180 
    181 OSCL_EXPORT_REF
    182 sessionDescription* SDPInfo::getSessionInfo()
    183 {
    184     return &session_info;
    185 }
    186 
    187 OSCL_EXPORT_REF
    188 Oscl_Vector<mediaInfo *, SDPParserAlloc> SDPInfo::getMediaInfo(int Object)
    189 {
    190     if ((Object >= 0) && (Object < MAX_MEDIA_OBJECTS))
    191     {
    192         return pMediaInfo[Object];
    193     }
    194     else
    195     {
    196         return 0;
    197     }
    198 }
    199 
    200 OSCL_EXPORT_REF
    201 Oscl_Vector<mediaInfo *, SDPParserAlloc> * SDPInfo::getMediaArray()
    202 {
    203     return pMediaInfo;
    204 }
    205 
    206 OSCL_EXPORT_REF
    207 int SDPInfo::getNumMediaObjects()
    208 {
    209     return numMediaObjects;
    210 }
    211 
    212 OSCL_EXPORT_REF
    213 void SDPInfo::dealloc(void *ptr)
    214 {
    215     oscl_free(ptr);
    216 }
    217 
    218 OSCL_EXPORT_REF
    219 mediaInfo* SDPInfo::getMediaInfoBasedOnID(uint32 trackID)
    220 {
    221     int numObjects = getNumMediaObjects();
    222 
    223     for (int i = 0; i < numObjects; i++)
    224     {
    225         Oscl_Vector<mediaInfo*, SDPParserAlloc> mediaInfoVec;
    226         mediaInfoVec = getMediaInfo(i);
    227 
    228         for (uint32 j = 0; j < mediaInfoVec.size(); j++)
    229         {
    230             mediaInfo* minfo = mediaInfoVec[j];
    231 
    232             if (minfo != NULL)
    233             {
    234                 if (minfo->getMediaInfoID() == trackID)
    235                 {
    236                     return minfo;
    237                 }
    238             }
    239         }
    240     }
    241     return NULL;
    242 }
    243 
    244 OSCL_EXPORT_REF
    245 mediaInfo* SDPInfo::getMediaInfoBasedOnDependsOnID(uint32 trackID)
    246 {
    247     if (trackID == 0)
    248     {
    249         return NULL;
    250     }
    251 
    252     int numObjects = getNumMediaObjects();
    253 
    254     for (int i = 0; i < numObjects; i++)
    255     {
    256         Oscl_Vector<mediaInfo*, SDPParserAlloc> mediaInfoVec;
    257         mediaInfoVec = getMediaInfo(i);
    258 
    259         for (uint32 j = 0; j < mediaInfoVec.size(); j++)
    260         {
    261             mediaInfo* minfo = mediaInfoVec[j];
    262 
    263             if (minfo != NULL)
    264             {
    265                 if ((uint32)(minfo->getControlTrackID()) == trackID)
    266                 {
    267                     return minfo;
    268                 }
    269             }
    270         }
    271     }
    272     return NULL;
    273 }
    274 
    275 OSCL_EXPORT_REF
    276 void * SDPInfo::alloc(const int size, bool alternateMedia)
    277 {
    278     OSCL_UNUSED_ARG(alternateMedia);
    279 
    280     if (numMediaObjects < MAX_MEDIA_OBJECTS)
    281     {
    282         void *mem = oscl_malloc(size * sizeof(char));
    283         if (mem != NULL)
    284         {
    285             iMediaObjectIndex++;
    286             pMediaInfo[numMediaObjects].push_back((mediaInfo *)mem);
    287         }
    288         return mem;
    289     }
    290     else
    291     {
    292         return NULL;
    293     }
    294 }
    295 
    296 OSCL_EXPORT_REF
    297 void SDPInfo::IncrementAlternateMediaInfoVectorIndex()
    298 {
    299     pMediaInfo[numMediaObjects][0]->setSegmentNumber(segmentCount);
    300     numMediaObjects++;
    301 }
    302 
    303 OSCL_EXPORT_REF
    304 void SDPInfo::copyFmDefMedia(mediaInfo *media)
    305 {
    306     *media = *pMediaInfo[numMediaObjects][0];
    307 }
    308 
    309 OSCL_EXPORT_REF
    310 void SDPInfo::reset()
    311 {
    312     session_info.resetSessionDescription();
    313     int ii = 0;
    314     int ss = 0;
    315     for (ii = 0; ii < numMediaObjects; ii++)
    316     {
    317         for (ss = 0; ss < (int)pMediaInfo[ii].size(); ss++)
    318         {
    319             pMediaInfo[ii][ss]->~mediaInfo();
    320             dealloc(pMediaInfo[ii][ss]);
    321         }
    322     }
    323     numMediaObjects = 0;
    324 }
    325 
    326 OSCL_EXPORT_REF
    327 uint32 SDPInfo::getMediaObjectIndex()
    328 {
    329     return iMediaObjectIndex;
    330 }
    331 
    332 OSCL_EXPORT_REF
    333 bool SDPInfo::getMediaInfoInSegment(int segment, Oscl_Vector< mediaInfo *, SDPParserAlloc>& segmentMediaInfo)
    334 {
    335     if (segmentCount == 0)
    336         return false;
    337     for (int ii = 0; ii < numMediaObjects; ii++)
    338     {
    339         if (pMediaInfo[ii][0]->getSegmentNumber() == (uint)segment)
    340         {
    341             segmentMediaInfo.push_back(pMediaInfo[ii][0]);
    342         }
    343     }
    344     return true;
    345 }
    346 
    347 OSCL_EXPORT_REF
    348 void SDPInfo::setSegmentCount(int count)
    349 {
    350     segmentCount = count;
    351 }
    352 
    353 OSCL_EXPORT_REF
    354 int SDPInfo::getSegmentCount()
    355 {
    356     return segmentCount;
    357 }
    358 
    359 OSCL_EXPORT_REF
    360 bool SDPInfo::setSegmentActive(int segment, bool status)
    361 {
    362     if (segment <= segmentCount)
    363     {
    364         segmentInfo[segment].segmentActive = status;
    365         return true;
    366     }
    367     else
    368         return false;
    369 }
    370 
    371 OSCL_EXPORT_REF
    372 bool SDPInfo::isSegmentActive(int segment)
    373 {
    374     if (segment <= segmentCount)
    375         return segmentInfo[segment].segmentActive;
    376     else
    377         return false;
    378 }
    379 
    380 OSCL_EXPORT_REF
    381 bool SDPInfo::setSegmentPayloadOrderPref(int segment, int* payloadArray, int len)
    382 {
    383     segmentInfo[segment].segmentPayloadOrderPref = false;
    384     if (segment <= segmentCount)
    385     {
    386         Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
    387         if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
    388         {
    389             for (int ii = 0; ii < len; ii++)
    390             {
    391                 for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
    392                 {
    393                     if (segmentMediaInfo[jj]->getPayloadSpecificInfoVector()[0]->getPayloadNumber() == (uint32)payloadArray[ii])
    394                     {
    395                         segmentMediaInfo[jj]->setPayloadPreference(ii);
    396                         break;
    397                     }
    398                 }
    399             }
    400         }
    401     }
    402     else
    403         return false;
    404     segmentInfo[segment].segmentPayloadOrderPref = true;
    405     return true;
    406 }
    407 
    408 OSCL_EXPORT_REF
    409 bool SDPInfo::isPayloadOrderPreferenceSet(int segment)
    410 {
    411     if (segment <= segmentCount)
    412         return segmentInfo[segment].segmentPayloadOrderPref;
    413     else
    414         return false;
    415 }
    416 
    417 OSCL_EXPORT_REF
    418 mediaInfo* SDPInfo::getPreferedMediaInfo(int segment)
    419 {
    420     mediaInfo* media = NULL;
    421     Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
    422     if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
    423     {
    424         for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
    425         {
    426             if (segmentMediaInfo[jj]->isMatched() == true)
    427             {
    428                 media = segmentMediaInfo[jj];
    429                 break;
    430             }
    431         }
    432     }
    433     return media;
    434 }
    435 
    436 OSCL_EXPORT_REF
    437 int SDPInfo::getPreferedPayloadNumber(int segment)
    438 {
    439     int payload = -1;
    440     Oscl_Vector< mediaInfo *, SDPParserAlloc> segmentMediaInfo;
    441     if (getMediaInfoInSegment(segment, segmentMediaInfo) == true)
    442     {
    443         for (uint32 jj = 0; jj < segmentMediaInfo.size(); jj++)
    444         {
    445             if (segmentMediaInfo[jj]->isMatched() == true)
    446             {
    447                 payload = segmentMediaInfo[jj]->getPayloadSpecificInfoVector()[0]->getPayloadNumber();
    448                 break;
    449             }
    450         }
    451     }
    452     return payload;
    453 }
    454 
    455 OSCL_EXPORT_REF
    456 const oscl_wchar * SDPInfo::getSdpFilename(uint32 &retsize)
    457 {
    458     retsize = SdpFilename.get_size();
    459     return SdpFilename.get_cstr();
    460 }
    461 
    462 OSCL_EXPORT_REF
    463 void SDPInfo::setSDPFilename(OSCL_wString& aURL)
    464 {
    465     SdpFilename = aURL;
    466 }
    467