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 
     19 #include "pvmf_media_data.h"
     20 #include "pvmf_media_msg_header.h"
     21 #include "pvmf_media_data_impl.h"
     22 #include "oscl_mem.h"
     23 
     24 
     25 OSCL_EXPORT_REF PVMFTimestamp PVMFMediaData::getTimestamp()
     26 {
     27     return hdr_ptr->timestamp;
     28 }
     29 
     30 OSCL_EXPORT_REF uint32 PVMFMediaData::getDuration()
     31 {
     32     return hdr_ptr->duration;
     33 }
     34 
     35 OSCL_EXPORT_REF uint32 PVMFMediaData::getStreamID()
     36 {
     37     return hdr_ptr->stream_id;
     38 }
     39 
     40 OSCL_EXPORT_REF uint32 PVMFMediaData::getSeqNum()
     41 {
     42     return hdr_ptr->seqnum;
     43 }
     44 
     45 OSCL_EXPORT_REF PVUid32 PVMFMediaData::getFormatID()
     46 {
     47     return hdr_ptr->format_id;
     48 }
     49 
     50 OSCL_EXPORT_REF bool PVMFMediaData::queryInterface(const PVUuid& uuid, PVInterface*& iface)
     51 {
     52     OSCL_UNUSED_ARG(uuid);
     53     iface = NULL;
     54     return false;
     55 }
     56 
     57 OSCL_EXPORT_REF bool PVMFMediaData::getFormatSpecificInfo(OsclRefCounterMemFrag& memfrag)
     58 {
     59     memfrag = hdr_ptr->format_spec_info;
     60     return true;
     61 }
     62 
     63 OSCL_EXPORT_REF void PVMFMediaData::setFormatSpecificInfo(OsclRefCounterMemFrag& memfrag)
     64 {
     65     hdr_ptr->format_spec_info = memfrag;
     66 }
     67 
     68 OSCL_EXPORT_REF bool PVMFMediaData::setMediaFragFilledLen(uint32 index, uint32 len)
     69 {
     70     return impl_ptr->setMediaFragFilledLen(index, len);
     71 }
     72 
     73 OSCL_EXPORT_REF void PVMFMediaData::setTimestamp(const PVMFTimestamp& ts)
     74 {
     75     hdr_ptr->timestamp = ts;
     76 }
     77 
     78 OSCL_EXPORT_REF void PVMFMediaData::setDuration(const uint32& duration)
     79 {
     80     hdr_ptr->duration = duration;
     81 }
     82 
     83 OSCL_EXPORT_REF void PVMFMediaData::setSeqNum(uint32 seq)
     84 {
     85     hdr_ptr->seqnum = seq;
     86 }
     87 
     88 OSCL_EXPORT_REF void PVMFMediaData::setStreamID(uint32 id)
     89 {
     90     hdr_ptr->stream_id = id;
     91 }
     92 
     93 OSCL_EXPORT_REF uint32 PVMFMediaData::getMarkerInfo()
     94 {
     95     return impl_ptr->getMarkerInfo();
     96 }
     97 
     98 OSCL_EXPORT_REF bool PVMFMediaData::setMarkerInfo(uint32 aMarker)
     99 {
    100     return impl_ptr->setMarkerInfo(aMarker);
    101 }
    102 
    103 OSCL_EXPORT_REF uint32  PVMFMediaData::getErrorsFlag()
    104 {
    105     return impl_ptr->getErrorsFlag();
    106 }
    107 
    108 OSCL_EXPORT_REF uint32 PVMFMediaData::getNumFragments()
    109 {
    110     return impl_ptr->getNumFragments();
    111 }
    112 
    113 OSCL_EXPORT_REF bool PVMFMediaData::getMediaFragment(uint32 index, OsclRefCounterMemFrag& memfrag)
    114 {
    115     return impl_ptr->getMediaFragment(index, memfrag);
    116 }
    117 
    118 OSCL_EXPORT_REF bool PVMFMediaData::getMediaDataImpl(OsclSharedPtr<PVMFMediaDataImpl>&
    119         media_data_impl)
    120 {
    121     media_data_impl = impl_ptr;
    122     return true;
    123 }
    124 
    125 
    126 OSCL_EXPORT_REF uint32 PVMFMediaData::getFilledSize()
    127 {
    128     return impl_ptr->getFilledSize();
    129 }
    130 
    131 OSCL_EXPORT_REF uint32 PVMFMediaData::getCapacity()
    132 {
    133     return impl_ptr->getCapacity();
    134 }
    135 
    136 OSCL_EXPORT_REF const PVMFMediaMsgHeader* PVMFMediaData::getMessageHeader()
    137 {
    138     return hdr_ptr;
    139 }
    140 
    141 
    142 
    143 
    144 class MediaDataCleanupSA : public OsclDestructDealloc
    145 {
    146     public:
    147         virtual ~MediaDataCleanupSA() {};
    148         virtual void destruct_and_dealloc(OsclAny* ptr)
    149         {
    150             uint8* tmp_ptr = (uint8*) ptr;
    151             uint aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterSA<MediaDataCleanupSA>));
    152             tmp_ptr += aligned_refcnt_size;
    153             PVMFMediaData* mdata_ptr = reinterpret_cast<PVMFMediaData*>(tmp_ptr);
    154             mdata_ptr->~PVMFMediaData();
    155             OsclMemAllocator alloc;
    156             alloc.deallocate(ptr);
    157         }
    158 };
    159 
    160 class MediaDataCleanupDA : public OsclDestructDealloc
    161 {
    162     public:
    163         MediaDataCleanupDA(Oscl_DefAlloc* in_gen_alloc) : gen_alloc(in_gen_alloc) {};
    164         virtual ~MediaDataCleanupDA() {};
    165 
    166         virtual void destruct_and_dealloc(OsclAny* ptr)
    167         {
    168             uint8* tmp_ptr = (uint8*) ptr;
    169             uint aligned_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
    170             // skip the refcounter
    171             tmp_ptr += aligned_size;
    172             // skip the MediaData Cleanup
    173             aligned_size = oscl_mem_aligned_size(sizeof(MediaDataCleanupDA));
    174             tmp_ptr += aligned_size;
    175 
    176             PVMFMediaData* mdata_ptr = reinterpret_cast<PVMFMediaData*>(tmp_ptr);
    177             mdata_ptr->~PVMFMediaData();
    178             gen_alloc->deallocate(ptr);
    179         }
    180 
    181     private:
    182         Oscl_DefAlloc* gen_alloc;
    183 };
    184 
    185 
    186 OSCL_EXPORT_REF OsclSharedPtr<PVMFMediaData>
    187 PVMFMediaData::createMediaData(OsclSharedPtr<PVMFMediaDataImpl>& in_impl_ptr,
    188                                Oscl_DefAlloc* gen_alloc)
    189 {
    190     OsclSharedPtr<PVMFMediaData> shared_media_data;
    191 
    192     // allocate enough room
    193     uint8* my_ptr;
    194     OsclRefCounter* my_refcnt;
    195 
    196     uint aligned_media_data_size = oscl_mem_aligned_size(sizeof(PVMFMediaData));
    197 
    198     // must compute the aligned size for PVMFMediaData.
    199     if (gen_alloc)
    200     {
    201         uint aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
    202         uint aligned_cleanup_size = oscl_mem_aligned_size(sizeof(MediaDataCleanupDA));
    203         my_ptr = (uint8*) gen_alloc->ALLOCATE(aligned_refcnt_size +
    204                                               aligned_cleanup_size +
    205                                               aligned_media_data_size +
    206                                               sizeof(PVMFMediaMsgHeader));
    207 
    208         //not allocators leave, so check for NULL ptr
    209         if (my_ptr == NULL) return shared_media_data;
    210 
    211         MediaDataCleanupDA *my_cleanup = OSCL_PLACEMENT_NEW(my_ptr + aligned_refcnt_size, MediaDataCleanupDA(gen_alloc));
    212         my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterDA(my_ptr, my_cleanup));
    213         my_ptr += aligned_refcnt_size + aligned_cleanup_size;
    214 
    215     }
    216     else
    217     {
    218         OsclMemAllocator my_alloc;
    219         uint aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterSA<MediaDataCleanupSA>));
    220         my_ptr = (uint8*) my_alloc.ALLOCATE(aligned_refcnt_size +
    221                                             aligned_media_data_size + sizeof(PVMFMediaMsgHeader));
    222         my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterSA<MediaDataCleanupSA>(my_ptr));
    223         my_ptr += aligned_refcnt_size;
    224     }
    225 
    226     PVMFMediaData *media_data_ptr = OSCL_PLACEMENT_NEW(my_ptr, PVMFMediaData());
    227 
    228     media_data_ptr->hdr_ptr = OSCL_PLACEMENT_NEW(my_ptr + aligned_media_data_size, PVMFMediaMsgHeader());
    229 
    230     media_data_ptr->impl_ptr = in_impl_ptr;
    231 
    232     shared_media_data.Bind(media_data_ptr, my_refcnt);
    233 
    234     return shared_media_data;
    235 }
    236 
    237 OSCL_EXPORT_REF OsclSharedPtr<PVMFMediaData>
    238 PVMFMediaData::createMediaData(OsclSharedPtr<PVMFMediaDataImpl>& in_impl_ptr,
    239                                const PVMFMediaMsgHeader* msgHeader,
    240                                Oscl_DefAlloc* gen_alloc)
    241 {
    242     OsclSharedPtr<PVMFMediaData> shared_media_data;
    243 
    244     // allocate enough room
    245     uint8* my_ptr;
    246     OsclRefCounter* my_refcnt;
    247 
    248     uint aligned_media_data_size = oscl_mem_aligned_size(sizeof(PVMFMediaData));
    249 
    250     // must compute the aligned size for PVMFMediaData.
    251     if (gen_alloc)
    252     {
    253         uint aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
    254         uint aligned_cleanup_size = oscl_mem_aligned_size(sizeof(MediaDataCleanupDA));
    255         my_ptr = (uint8*) gen_alloc->ALLOCATE(aligned_refcnt_size +
    256                                               aligned_cleanup_size +
    257                                               aligned_media_data_size +
    258                                               sizeof(PVMFMediaMsgHeader));
    259 
    260         //not allocators leave, so check for NULL ptr
    261         if (my_ptr == NULL) return shared_media_data;
    262 
    263         MediaDataCleanupDA *my_cleanup = OSCL_PLACEMENT_NEW(my_ptr + aligned_refcnt_size, MediaDataCleanupDA(gen_alloc));
    264         my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterDA(my_ptr, my_cleanup));
    265         my_ptr += aligned_refcnt_size + aligned_cleanup_size;
    266 
    267     }
    268     else
    269     {
    270         OsclMemAllocator my_alloc;
    271         uint aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterSA<MediaDataCleanupSA>));
    272         my_ptr = (uint8*) my_alloc.ALLOCATE(aligned_refcnt_size +
    273                                             aligned_media_data_size + sizeof(PVMFMediaMsgHeader));
    274         my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterSA<MediaDataCleanupSA>(my_ptr));
    275         my_ptr += aligned_refcnt_size;
    276     }
    277 
    278     PVMFMediaData *media_data_ptr = OSCL_PLACEMENT_NEW(my_ptr, PVMFMediaData());
    279 
    280     media_data_ptr->hdr_ptr = OSCL_PLACEMENT_NEW(my_ptr + aligned_media_data_size, PVMFMediaMsgHeader());
    281 
    282     media_data_ptr->hdr_ptr->timestamp = msgHeader->timestamp;
    283     media_data_ptr->hdr_ptr->duration = msgHeader->duration;
    284     media_data_ptr->hdr_ptr->stream_id = msgHeader->stream_id;
    285     media_data_ptr->hdr_ptr->seqnum = msgHeader->seqnum;
    286     media_data_ptr->hdr_ptr->format_id = msgHeader->format_id;
    287     media_data_ptr->hdr_ptr->format_spec_info = msgHeader->format_spec_info;
    288 
    289     media_data_ptr->impl_ptr = in_impl_ptr;
    290 
    291     shared_media_data.Bind(media_data_ptr, my_refcnt);
    292 
    293     return shared_media_data;
    294 }
    295 
    296 
    297 OSCL_EXPORT_REF PVMFMediaData::~PVMFMediaData()
    298 {
    299 
    300     // call the destructors
    301     hdr_ptr->~PVMFMediaMsgHeader();
    302 
    303     // the destructor of the impl_ptr will be called by default.
    304 
    305 }
    306 
    307 OSCL_EXPORT_REF void convertToPVMFMediaMsg(PVMFSharedMediaMsgPtr& dest, PVMFSharedMediaDataPtr& source)
    308 {
    309     OsclRefCounter* refcnt = source.GetRefCounter();
    310     /* explicitly increment refcnt since Bind doesn't do it when refcnt and pointer are
    311      * added separately
    312      */
    313     refcnt->addRef();
    314     dest.Bind(source.GetRep(), refcnt);
    315 }
    316 
    317 OSCL_EXPORT_REF void convertToPVMFMediaData(PVMFSharedMediaDataPtr& dest, PVMFSharedMediaMsgPtr& source)
    318 {
    319     OsclRefCounter* refcnt = source.GetRefCounter();
    320     /* explicitly increment refcnt since Bind doesn't do it when refcnt and pointer are
    321      * added separately
    322      */
    323     refcnt->addRef();
    324     dest.Bind(reinterpret_cast<PVMFMediaData*>(source.GetRep()), refcnt);
    325 }
    326 
    327 
    328