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 // -*- c++ -*- 19 #ifndef PVMF_RETURN_CODES_H_INCLUDED 20 #include "pvmf_return_codes.h" 21 #endif 22 23 #include "media_packet.h" 24 25 OSCL_EXPORT_REF MediaFragment* MediaPacket::GetMediaFragment(int32 idx, MediaFragment& fragment) 26 { 27 BufferState * state = GetBufferState(idx); 28 /*if(!state) 29 return NULL;*/ 30 fragment.Set(*GetFragment(idx), state); 31 return &fragment; 32 } 33 34 35 OSCL_EXPORT_REF BufFragStatusClass::status_t MediaPacket::AddMediaFragment(MediaFragment* fragment, int32 location_offset) 36 { 37 return AddFragment(*fragment->GetFragment(), fragment->GetState(), location_offset); 38 } 39 40 OSCL_EXPORT_REF void MediaPacket::Reset() 41 { 42 cur_frag_num = 0; 43 cur_pos = NULL; 44 end_pos = NULL; 45 AppendNext(NULL); 46 } 47 48 49 /* This should change to allocate memory from a memory pool */ 50 OSCL_EXPORT_REF MediaPacket* MediaPacketAllocator::allocate_packet(EPacketType type) 51 { 52 OSCL_UNUSED_ARG(type); 53 return OSCL_NEW(MediaPacket, ()); 54 } 55 56 /* Change to return to pool */ 57 OSCL_EXPORT_REF void MediaPacketAllocator::deallocate_packet(MediaPacket* pack) 58 { 59 OSCL_DELETE(pack); 60 } 61 62 OSCL_EXPORT_REF MediaPacketPoolAllocator::MediaPacketPoolAllocator(int packets) 63 { 64 num_packets = packets; 65 66 entire_list = OSCL_ARRAY_NEW(MediaPacket, num_packets); 67 free_list = entire_list; 68 69 int i; 70 for (i = 0; i < num_packets; i++) 71 { 72 if (i > 0) 73 { 74 entire_list[i-1].AppendNext(&entire_list[i]); 75 } 76 } 77 entire_list[i-1].AppendNext(NULL); 78 79 } 80 81 MediaPacketPoolAllocator::~MediaPacketPoolAllocator() 82 { 83 if (entire_list) delete[] entire_list; 84 } 85 86 OSCL_EXPORT_REF MediaPacket *MediaPacketPoolAllocator::allocate_packet(EPacketType type) 87 { 88 OSCL_UNUSED_ARG(type); 89 90 MediaPacket *pkt; 91 92 if (free_list) 93 { 94 pkt = free_list; 95 free_list = (MediaPacket *)free_list->GetNext(); 96 97 pkt->AppendNext(NULL); 98 99 return pkt; 100 } 101 else 102 { 103 return NULL; 104 } 105 } 106 107 OSCL_EXPORT_REF void MediaPacketPoolAllocator::deallocate_packet(MediaPacket* pack) 108 { 109 pack->Clear(); 110 pack->Reset(); 111 112 pack->AppendNext(free_list); 113 free_list = pack; 114 115 } 116 117 OSCL_EXPORT_REF PVMFSharedMediaMsgPtr MediaPacketToPVMFMediaMsg(MediaPacket* packet, PVMFSimpleMediaBufferCombinedAlloc& alloc) 118 { 119 if (packet == NULL || packet->GetMediaSize() == 0) 120 { 121 OSCL_LEAVE(PVMFErrArgument); 122 } 123 uint16 packet_size = (uint16)packet->GetMediaSize(); 124 125 // Create new media data buffer 126 OsclSharedPtr<PVMFMediaDataImpl> mediaDataImpl = alloc.allocate(packet_size); 127 PVMFSharedMediaDataPtr mediaData = PVMFMediaData::createMediaData(mediaDataImpl); 128 129 // Retrieve memory fragment to write to 130 OsclRefCounterMemFrag refCtrMemFrag; 131 mediaData->getMediaFragment(0, refCtrMemFrag); 132 uint8* copy_pos = (uint8*)refCtrMemFrag.getMemFragPtr(); 133 MediaFragment frag; 134 for (int frag_num = 0; frag_num < packet->GetNumFrags(); frag_num++) 135 { 136 packet->GetMediaFragment(frag_num, frag); 137 oscl_memcpy(copy_pos, frag.GetPtr(), frag.GetLen()); 138 copy_pos += frag.GetLen(); 139 } 140 141 // update the filled length of the fragment 142 mediaData->setMediaFragFilledLen(0, packet_size); 143 144 // Send packet to downstream node 145 PVMFSharedMediaMsgPtr mediaMsg; 146 convertToPVMFMediaMsg(mediaMsg, mediaData); 147 return mediaMsg; 148 } 149 150 /* Callers responsibility to delete the packet */ 151 OSCL_EXPORT_REF MediaPacket* PVMFMediaMsgToMediaPacket(PVMFSharedMediaMsgPtr aMsg, 152 MediaPacketAllocator& aMediaPacketAlloc, FragmentAllocator& aFragmentAlloc) 153 { 154 155 PVMFSharedMediaDataPtr mediaData; 156 convertToPVMFMediaData(mediaData, aMsg); 157 if (mediaData->getFilledSize() == 0) 158 { 159 return NULL; 160 } 161 162 MediaPacket* packet = aMediaPacketAlloc.allocate_packet(); 163 OSCL_ASSERT(packet->GetNumFrags() == 0); 164 165 MediaFragment *frag = aFragmentAlloc.allocate_fragment(mediaData->getFilledSize()); 166 167 OsclRefCounterMemFrag rcmfrag; 168 169 uint8* write_pos = frag->GetPtr(); 170 for (uint16 frag_num = 0; frag_num < mediaData->getNumFragments(); frag_num++) 171 { 172 mediaData->getMediaFragment(frag_num, rcmfrag); 173 oscl_memcpy(write_pos, rcmfrag.getMemFragPtr(), rcmfrag.getMemFragSize()); 174 write_pos += rcmfrag.getMemFragSize(); 175 } 176 177 // add fragment to packet and send 178 packet->AddMediaFragment(frag); 179 aFragmentAlloc.deallocate_fragment(frag); 180 181 return packet; 182 } 183