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 * This PVA_FF_AtomUtils Class contains sime useful methods for operating on Atoms 20 */ 21 22 23 #define IMPLEMENT_AtomUtils 24 25 #include "atomutils.h" 26 #include "a_atomdefs.h" 27 #include <time.h> 28 29 // **** FILE STREAM RENDERING METHODS **** 30 31 // Render the 64 bits byte by byte and take most significant byte first 32 bool 33 PVA_FF_AtomUtils::render64(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint64 data) 34 { 35 if (fp != NULL) 36 { 37 for (int32 i = 0; i < 64; i += 8) 38 { 39 40 uint8 byte = (uint8)((data >> (56 - i)) & 0x000000ff); 41 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 42 { 43 return false; 44 } 45 } 46 return true; 47 } 48 return false; 49 } 50 51 // Render the 32 bits byte by byte and take most significant byte first 52 bool 53 PVA_FF_AtomUtils::render32(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 data) 54 { 55 if (fp != NULL) 56 { 57 for (int32 i = 0; i < 32; i += 8) 58 { 59 uint8 byte = (uint8)((data >> (24 - i)) & 0x000000ff); 60 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 61 { 62 return false; 63 } 64 } 65 return true; 66 } 67 return false; 68 } 69 70 // Render the 24 bits byte by byte and take most significant byte first 71 bool 72 PVA_FF_AtomUtils::render24(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 data) 73 { 74 if (fp != NULL) 75 { 76 for (int32 i = 0; i < 24; i += 8) 77 { 78 uint8 byte = (uint8)((data >> (16 - i)) & 0x0000ff); 79 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 80 { 81 return false; 82 } 83 } 84 return true; 85 } 86 return false; 87 } 88 89 // Render the 16 bits byte by byte and take most significant byte first 90 bool 91 PVA_FF_AtomUtils::render16(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint16 data) 92 { 93 if (fp != NULL) 94 { 95 for (int32 i = 0; i < 16; i += 8) 96 { 97 uint8 byte = (uint8)((data >> (8 - i)) & 0x00ff); 98 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 99 { 100 return false; 101 } 102 } 103 return true; 104 } 105 return false; 106 } 107 108 // Render the 8 bits as a single byte 109 bool 110 PVA_FF_AtomUtils::render8(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint8 data) 111 { 112 if (fp != NULL) 113 { 114 if (fp->_filePtr->Write(&data, 1, 1) != 1) 115 { 116 return false; 117 } 118 return true; 119 } 120 return false; 121 } 122 123 // Render the a string byte by byte 124 bool 125 PVA_FF_AtomUtils::renderString(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, PVA_FF_UTF8_STRING_PARAM data) 126 { 127 if (fp != NULL) 128 { 129 uint8 byte = 0; 130 for (uint32 i = 0; i < data.get_size(); i++) 131 { 132 byte = data[i]; 133 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 134 { 135 return false; 136 } 137 } 138 return true; 139 } 140 return false; 141 } 142 143 // Render the a string byte by byte 144 bool 145 PVA_FF_AtomUtils::renderUnicodeString(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, PVA_FF_UNICODE_STRING_PARAM data) 146 { 147 if (fp != NULL) 148 { 149 OSCL_TCHAR *stringptr = (OSCL_TCHAR *)data.get_cstr(); 150 151 uint16 temp = 0; 152 uint8 lower_byte = 0; 153 uint8 upper_byte = 0; 154 for (uint32 i = 0; i < data.get_size(); i++) 155 { 156 // Watch byte ordering in the stored format 157 temp = (uint16)(stringptr[i] & 0xFF00); 158 temp = (uint8)((temp >> 8) & 0xFF); 159 lower_byte = (uint8)(temp); 160 161 if (fp->_filePtr->Write(&lower_byte, 1, 1) != 1) 162 { 163 return false; 164 } 165 166 upper_byte = (uint8)(stringptr[i] & 0x00FF); 167 if (fp->_filePtr->Write(&upper_byte, 1, 1) != 1) 168 { 169 return false; 170 } 171 } 172 return true; 173 } 174 return false; 175 } 176 177 // Render the a string byte by byte PLUS render the trailing \0 178 bool 179 PVA_FF_AtomUtils::renderNullTerminatedString(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, PVA_FF_UTF8_STRING_PARAM data) 180 { 181 if (fp != NULL) 182 { 183 PVA_FF_AtomUtils::renderString(fp, data); 184 // put the trailing 0 185 uint8 byte = 0; 186 if (fp->_filePtr->Write(&byte, 1, 1) != 1) 187 { 188 return false; 189 } 190 return true; 191 } 192 return false; 193 } 194 195 // Render the a string byte by byte PLUS render the trailing \0 196 bool 197 PVA_FF_AtomUtils::renderNullTerminatedUnicodeString(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, PVA_FF_UNICODE_STRING_PARAM data) 198 { 199 if (fp != NULL) 200 { 201 PVA_FF_AtomUtils::renderUnicodeString(fp, data); 202 // Need two bytes of zeros for UNICODE null termination 203 uint16 data = 0; 204 if (fp->_filePtr->Write(&data, 2, 1) != 1) 205 { 206 return false; 207 } 208 return true; 209 } 210 return false; 211 } 212 213 // Render a chunk of uint8 data 214 bool 215 PVA_FF_AtomUtils::renderByteData(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 length, uint8 *data) 216 { 217 bool retVal = true; 218 219 if (fp != NULL) 220 { 221 if (fp->_filePtr->Write(data, 1, length) != length) 222 { 223 retVal = false; 224 } 225 } 226 else 227 { 228 retVal = false; 229 } 230 231 return (retVal); 232 } 233 234 // Setting the current time value - seconds since 1/1/1904 235 void 236 PVA_FF_AtomUtils::setTime(uint32 &ulTime) 237 { 238 // 2082844800 is number of seconds from Jan 1, 1904 to Jan 1, 1970. 239 // time() returns the seconds since Jan 1, 1970. 240 ulTime = uint32(time(NULL) + 2082844800 ); 241 } 242 243 244 uint32 245 PVA_FF_AtomUtils::getNumberOfBytesUsedToStoreContent(uint32 sizeOfClass) 246 { 247 // The content in a descriptor class fp stored immediately after the descriptor tag 248 if (sizeOfClass <= 0x7f) return sizeOfClass - 2; // _sizeOfClass field fp 1 byte (7 LS bits) 249 else if (sizeOfClass <= 0x3fff) return sizeOfClass - 3; // _sizeOfClass fp 2 bytes (7 LS bits each) 250 else if (sizeOfClass <= 0x1fffff) return sizeOfClass - 4; // _sizeOfClass fp 3 bytes (7 LS bits each) 251 else if (sizeOfClass <= 0x0fffffff) return sizeOfClass - 5; // _sizeOfClass fp 4 bytes (7 LS bits each) 252 else return 0; // ERROR condition 253 } 254 255 uint32 256 PVA_FF_AtomUtils::getNumberOfBytesUsedToStoreSizeOfClass(uint32 contentSize) 257 { 258 // The actual _sizeOfClass value includes the size of the class's contents PLUS 259 // the number of bytes needed to store the _sizeOfClass field. The parameter 260 // contentSize represents the number of bytes needed to store ONLY the members 261 // of the class NOT including the _sizeOfClass field. 262 if (contentSize <= 0x7e) return 1; // _sizeOfClass field can be rendered in 1 byte (7 LS bits) 263 else if (contentSize <= 0x3ffd) return 2; // _sizeOfClass field can be rendered in 2 bytes (7 LS bits each) 264 else if (contentSize <= 0x1ffffc) return 3; // _sizeOfClass field can be rendered in 3 bytes (7 LS bits each) 265 else if (contentSize <= 0xfffffffb) return 4; // _sizeOfClass field can be rendered in 4 bytes (7 LS bits each) 266 else return 0; // ERROR condition 267 } 268 269 void PVA_FF_AtomUtils::seekFromCurrPos(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 n) 270 { 271 fp->_filePtr->Seek(n, Oscl_File::SEEKCUR); 272 } 273 274 void PVA_FF_AtomUtils::seekFromStart(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 n) 275 { 276 fp->_filePtr->Seek(n, Oscl_File::SEEKSET); 277 } 278 279 void PVA_FF_AtomUtils::seekToEnd(MP4_AUTHOR_FF_FILE_IO_WRAP *fp) 280 { 281 fp->_filePtr->Seek(0, Oscl_File::SEEKEND); 282 } 283 284 void PVA_FF_AtomUtils::rewindFilePointerByN(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 n) 285 { 286 fp->_filePtr->Seek((-1 *(int32) n), Oscl_File::SEEKCUR); 287 } 288 289 int32 PVA_FF_AtomUtils::getCurrentFilePosition(MP4_AUTHOR_FF_FILE_IO_WRAP *fp) 290 { 291 return (fp->_filePtr->Tell()); 292 } 293 294 bool 295 PVA_FF_AtomUtils::openFile(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, 296 PVA_FF_UNICODE_STRING_PARAM fileName, 297 int32 mode, uint32 aCacheSize) 298 { 299 if (!fp->_filePtr) 300 { 301 // Only need to create new file object if it's not passed in from createMp4File 302 //fp->_filePtr = OSCL_NEW(Oscl_File, ()); 303 PV_MP4_FF_NEW(fp->auditCB, Oscl_File, (), fp->_filePtr); 304 } 305 306 if (fp->_osclFileServerSession->Connect() != 0) 307 return false; 308 309 fp->_filePtr->SetPVCacheSize(aCacheSize); 310 return (fp->_filePtr->Open(fileName.get_cstr(), mode, *(fp->_osclFileServerSession)) == 0); 311 } 312 313 void 314 PVA_FF_AtomUtils::closeFile(MP4_AUTHOR_FF_FILE_IO_WRAP *fp) 315 { 316 fp->_filePtr->Close(); 317 //OSCL_DELETE(fp->_filePtr); 318 PV_MP4_FF_DELETE(NULL, Oscl_File, fp->_filePtr); 319 320 fp->_filePtr = NULL; 321 } 322 323 void PVA_FF_AtomUtils::closeFileSession(Oscl_FileServer* fs) 324 { 325 if (fs) 326 fs->Close(); 327 } 328 329 bool 330 PVA_FF_AtomUtils::readByteData(MP4_AUTHOR_FF_FILE_IO_WRAP *fp, uint32 length, uint8 *data) 331 { 332 uint32 bytesRead; 333 bytesRead = fp->_filePtr->Read(data, 1, length); 334 335 if (bytesRead < (uint32)length) // read byte data failed 336 return false; 337 return true; 338 } 339 340 341