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 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 20 21 // A U D I O M P 3 G E T I D 3 I N F O 22 23 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 24 25 26 /** 27 * @file pvfile.h 28 * @brief This include file contains the definitions and classes needed 29 * to access a file either through Oscl File I/O or CPM. 30 */ 31 32 33 #ifndef PVFILE_H_INCLUDED 34 #define PVFILE_H_INCLUDED 35 36 #ifndef OSCL_TYPES_H_INCLUDED 37 #include "oscl_types.h" 38 #endif 39 #ifndef OSCL_FILE_IO_H_INCLUDED 40 #include "oscl_file_io.h" 41 #endif 42 43 /** 44 * PVFile is a class with an API similar to Oscl File I/O. 45 * It allows the parser libraries to access a local file 46 * source either through CPM or through Oscl File I/O, depending 47 * on the parameters provided in the local source data. 48 */ 49 50 class PVMFCPMPluginAccessInterfaceFactory; 51 class PVMIDataStreamSyncInterface; 52 class PvmiDataStreamObserver; 53 54 #define PVFILE_DEFAULT_CACHE_SIZE 4*1024 55 #define PVFILE_DEFAULT_ASYNC_READ_BUFFER_SIZE 0 56 #define PVFILE_DEFAULT_NATIVE_ACCESS_MODE 0 57 58 class PVFileCacheParams 59 { 60 public: PVFileCacheParams()61 PVFileCacheParams() 62 { 63 iCacheSize = PVFILE_DEFAULT_CACHE_SIZE; 64 iAsyncReadBuffSize = PVFILE_DEFAULT_ASYNC_READ_BUFFER_SIZE; 65 iNativeAccessMode = PVFILE_DEFAULT_NATIVE_ACCESS_MODE; 66 iPVLoggerEnableFlag = false; 67 iPVLoggerStateEnableFlag = false; 68 } 69 PVFileCacheParams(const PVFileCacheParams & a)70 PVFileCacheParams(const PVFileCacheParams& a) 71 { 72 MyCopy(a); 73 } 74 75 /** 76 * The assignment operator 77 */ 78 PVFileCacheParams& operator=(const PVFileCacheParams& a) 79 { 80 if (&a != this) 81 { 82 MyCopy(a); 83 } 84 return *this; 85 } 86 87 uint32 iCacheSize; 88 uint32 iAsyncReadBuffSize; 89 bool iPVLoggerEnableFlag; 90 bool iPVLoggerStateEnableFlag; 91 uint32 iNativeAccessMode; 92 93 private: MyCopy(const PVFileCacheParams & a)94 void MyCopy(const PVFileCacheParams& a) 95 { 96 iCacheSize = a.iCacheSize; 97 iAsyncReadBuffSize = a.iAsyncReadBuffSize; 98 iPVLoggerEnableFlag = a.iPVLoggerEnableFlag; 99 iPVLoggerStateEnableFlag = a.iPVLoggerStateEnableFlag; 100 iNativeAccessMode = a.iNativeAccessMode; 101 } 102 }; 103 104 class PVFile 105 { 106 public: 107 //default constructor. PVFile()108 PVFile() 109 { 110 Reset(); 111 } 112 113 //API to copy all fields from another object. Copy(const PVFile & a)114 void Copy(const PVFile&a) 115 { 116 iFile = a.iFile; 117 iFilePtr = a.iFilePtr; 118 iFileHandle = a.iFileHandle; 119 iCPMAccessFactory = a.iCPMAccessFactory; 120 iDataStreamAccess = a.iDataStreamAccess; 121 iFileSize = a.iFileSize; 122 iFileSizeAvailable = a.iFileSizeAvailable; 123 iDataStreamSession = a.iDataStreamSession; 124 iRequestReadCapacityNotificationID = a.iRequestReadCapacityNotificationID; 125 iOsclFileCacheParams = a.iOsclFileCacheParams; 126 } 127 128 //copy constructor. PVFile(const PVFile & a)129 PVFile(const PVFile&a) 130 { 131 Copy(a); 132 } 133 ~PVFile()134 ~PVFile() 135 { 136 } 137 Reset()138 void Reset() 139 { 140 iFile = NULL; 141 iFileHandle = NULL; 142 iCPMAccessFactory = NULL; 143 iFilePtr = NULL; 144 iDataStreamAccess = NULL; 145 iFileSize = 0; 146 iFileSizeAvailable = false; 147 iRequestReadCapacityNotificationID = 0; 148 } 149 150 //API to set the CPM access interface. 151 //The CPM access interface is provided in the 152 //local file source data. SetCPM(PVMFCPMPluginAccessInterfaceFactory * a)153 void SetCPM(PVMFCPMPluginAccessInterfaceFactory*a) 154 { 155 iCPMAccessFactory = a; 156 } 157 158 //API to get the CPM access interface factory GetCPM()159 PVMFCPMPluginAccessInterfaceFactory* GetCPM() 160 { 161 return iCPMAccessFactory; 162 } 163 164 //API to set the internal file handle. 165 //The file handle is provided in the local file source data. SetFileHandle(OsclFileHandle * a)166 void SetFileHandle(OsclFileHandle*a) 167 { 168 iFileHandle = a; 169 } 170 171 //To support access through an existing, open Oscl_File object. 172 //This was an add-on for some MP4 file parser libraries-- not 173 //used with the normal local file source access. 174 //With this access mode, Open/Close should not be called. SetFilePtr(Oscl_File * a)175 void SetFilePtr(Oscl_File*a) 176 { 177 iFilePtr = a; 178 } 179 180 //API to copy the access parameters from another object SetAccess(const PVFile & a)181 void SetAccess(const PVFile& a) 182 { 183 iCPMAccessFactory = a.iCPMAccessFactory; 184 iFileHandle = a.iFileHandle; 185 iFilePtr = a.iFilePtr; 186 iFile = a.iFile; 187 } 188 189 //API to tell whether file is open. IsOpen()190 bool IsOpen() 191 { 192 if ((iFilePtr != NULL) || 193 (iFile != NULL) || 194 (iDataStreamAccess != NULL)) 195 { 196 return true; 197 } 198 return false; 199 } 200 201 //Only valid in case Oscl_File class is being used 202 //internally for file access. In case of datastream 203 //access or in case of Oscl_File ptr provided for outside 204 //via SetFilePtr API, it is assumed that implementor of datastream 205 //has picked appropriate caching mechanism. SetFileCacheParams(PVFileCacheParams aParams)206 void SetFileCacheParams(PVFileCacheParams aParams) 207 { 208 iOsclFileCacheParams = aParams; 209 } 210 211 //Access APIs, same functionality as Oscl File I/O. 212 OSCL_IMPORT_REF int32 Seek(int32 offset, Oscl_File::seek_type origin); 213 OSCL_IMPORT_REF int32 Tell(); 214 OSCL_IMPORT_REF uint32 Read(OsclAny *buffer, uint32 size, uint32 numelements) ; 215 OSCL_IMPORT_REF int32 Close(); 216 OSCL_IMPORT_REF int32 Flush(); 217 OSCL_IMPORT_REF int32 Open(const oscl_wchar *filename, 218 uint32 mode, 219 Oscl_FileServer& fileserv); 220 OSCL_IMPORT_REF bool GetRemainingBytes(uint32& aNumBytes); 221 222 OSCL_IMPORT_REF bool RequestReadCapacityNotification(PvmiDataStreamObserver& aObserver, 223 uint32 aCapacity, 224 OsclAny* aContextData = NULL); 225 226 OSCL_IMPORT_REF bool CancelNotificationSync(); 227 228 // For memory buffer data stream 229 // file size is content length from HTTP HEAD response 230 OSCL_IMPORT_REF uint32 GetContentLength(); 231 232 // memory cache size, is 0 if not MBDS 233 OSCL_IMPORT_REF uint32 GetFileBufferingCapacity(); 234 235 // For memory buffer data stream 236 // portion of the data can be copied to persistent storage for the duration of playback 237 OSCL_IMPORT_REF bool MakePersistent(int32 offset, uint32 size); 238 239 // For memory buffer data stream 240 // to trigger a http GET request 241 // like a seek but read pointer doesn't change 242 OSCL_IMPORT_REF int32 Skip(int32 offset, Oscl_File::seek_type origin); 243 244 // For memory buffer data stream 245 // returns the byte range availabe in the stream cache 246 OSCL_IMPORT_REF void GetCurrentByteRange(uint32& aCurrentFirstByteOffset, uint32& aCurrentLastByteOffset); 247 248 private: 249 //Access parameters from local source data 250 PVMFCPMPluginAccessInterfaceFactory* iCPMAccessFactory; 251 OsclFileHandle* iFileHandle; 252 253 //Internal implementation. 254 Oscl_File* iFile; 255 PVMIDataStreamSyncInterface* iDataStreamAccess; 256 int32 iDataStreamSession; 257 258 //For the alternate access method-- through an existing file object. 259 Oscl_File* iFilePtr; 260 uint32 iFileSize; 261 bool iFileSizeAvailable; 262 uint32 iRequestReadCapacityNotificationID; 263 PVFileCacheParams iOsclFileCacheParams; 264 }; 265 266 267 268 #endif // PVFILE_H_INCLUDED 269 270