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 #ifndef PV_OMX_PROXIED_INTERFACE_H_INCLUDED 20 #define PV_OMX_PROXIED_INTERFACE_H_INCLUDED 21 22 23 #ifndef OSCL_BASE_H_INCLUDED 24 #include "oscl_base.h" 25 #endif 26 #ifndef PV_UUID_H_INCLUDED 27 #include "pv_uuid.h" 28 #endif 29 #ifndef PV_INTERFACE_H_INCLUDED 30 #include "pv_interface.h" 31 #endif 32 #ifndef PV_OMXDEFS_H_INCLUDED 33 #include "pv_omxdefs.h" 34 #endif 35 36 #define PVUidOMXProxiedInterface PVUuid(0xf7076653,0x6088,0x47c6,0x88,0xc1,0xb7,0xed,0x28,0xe7,0x2b,0xeb) 37 #if PROXY_INTERFACE 38 39 class PVProxiedInterface_OMX; 40 class PVProxiedInterfaceClient_OMX; 41 class PVProxiedInterfaceServer_OMX; 42 class PVProxiedEngine_OMX; 43 44 typedef int32 TPVProxyId; 45 typedef int32 TPVProxyMsgId; 46 typedef PVUuid TPVProxyUUID; 47 48 //Added command id to identify the openmax commands 49 typedef int32 TPVCommandId; 50 51 /** 52 ** Main proxy class. This class defines the public interface 53 ** to the PV proxy. 54 */ 55 class PVMainProxy_OMX 56 { 57 public: ~PVMainProxy_OMX()58 virtual ~PVMainProxy_OMX() {} 59 60 /** 61 ** This call registers a proxied interface with the main 62 ** proxy and assigns a unique interface ID. 63 ** Interfaces may be registered at any time during 64 ** the life of the main proxy. 65 ** 66 ** @return aProxyId: the ID of this interface pair. 67 ** @param aServer: server side (PV Thread) implementation. 68 ** @param aClient: client side (app thread) implementation. 69 ** This function will leave if memory allocation fails. 70 */ 71 virtual TPVProxyId RegisterProxiedInterface( 72 PVProxiedInterfaceServer_OMX& aServer, 73 PVProxiedInterfaceClient_OMX& aClient) = 0; 74 75 /** 76 ** This call un-registers a proxied interface with the main 77 ** proxy. During this call, the main proxy will de-queue all 78 ** undelivered messages belonging to this interface and will 79 ** call their memory cleanup routine. 80 ** If the interface is not currently registered, this call 81 ** will have no effect. 82 ** Interfaces may be un-registered at any time during the 83 ** life of the main proxy. 84 ** 85 ** @param aProxyId: the ID of this interface pair. 86 ** @return : result code 87 **/ 88 virtual void UnregisterProxiedInterface(TPVProxyId aProxyId) = 0; 89 90 /** 91 ** This API adds message to the command queue. This would 92 ** typically be called from a PVProxiedInterfaceClient 93 ** module. The message will be delivered asynchronously under 94 ** the PV thread. 95 ** 96 ** @param aProxyId: the ID of this interface pair. 97 ** @param aCmd: the command. 98 ** @return: a unique message ID, assigned by the proxy. 99 ** This function will leave if memory allocation fails. 100 **/ 101 virtual TPVProxyMsgId SendCommand(TPVProxyId aProxyId, TPVCommandId cmdid, OsclAny* aCmd) = 0; 102 103 /** 104 ** This API will cancel a command that was previously sent 105 ** and may still be queued. This is a synchronous operation. 106 ** The proxy will de-queue the message and call its memory cleanup 107 ** routine. If the message is no longer queued, this call will 108 ** have no effect. 109 ** 110 ** @param aProxyId: the ID of this interface pair. 111 ** @param aMsgId: the command's ID, previously returned by SendCommand. 112 ** @return : result code 113 */ 114 virtual void CancelCommand(TPVProxyId aProxyId, TPVProxyMsgId aMsgId) = 0; 115 116 /** 117 ** This API will de-queue and cleanup all commands that were 118 ** previously sent for an interface and may still be queued. 119 ** The cancel operation is synchronous. 120 ** If no commands are queued for the interface, this call has 121 ** no effect. 122 ** 123 ** @param aProxyId: the ID of this interface pair. 124 ** @return : result code 125 */ 126 virtual void CancelAllCommands(TPVProxyId aProxyId) = 0; 127 128 /** 129 ** This API adds a message to the notification queue. 130 ** This would typically be called by a PVProxiedInterfaceServer 131 ** module. The message will be delivered asynchronously under 132 ** the app thread. 133 ** 134 ** @param aProxyId: the ID of this interface pair. 135 ** @param aResp: the notification. 136 ** @return: a unique message ID, assigned by the proxy. 137 ** This function will leave if memory allocation fails. 138 **/ 139 virtual TPVProxyMsgId SendNotification(TPVProxyId aProxyId, OsclAny* aResp) = 0; 140 141 /** 142 ** This API will cancel a notification that was previously sent 143 ** and may still be queued. This is a synchronous operation. 144 ** The proxy will de-queue the message and call its memory cleanup 145 ** routine. If the message is no longer queued, this call will 146 ** have no effect. 147 ** 148 ** @param aProxyId: the ID of this interface pair. 149 ** @param aMsgId: the message ID, previously returned by SendNotification. 150 ** @return : result code 151 */ 152 virtual void CancelNotification(TPVProxyId aProxyId, TPVProxyMsgId aMsgId) = 0; 153 154 /** 155 ** This API will de-queue and cleanup all notifications that were 156 ** previously sent for an interface and may still be queued. 157 ** The cancel operation is synchronous. 158 ** If no notifications are queued for the interface, this call has 159 ** no effect. 160 ** 161 ** @param aProxyId: the ID of this interface pair. 162 ** @return : result code 163 */ 164 virtual void CancelAllNotifications(TPVProxyId aProxyId) = 0; 165 166 /** 167 ** This API will start the PV thread. The call will block 168 ** until the thread starts up and the engine thread logon 169 ** completes. 170 ** 171 ** @returns: true if thread creation succeeded-- false otherwise. 172 */ 173 virtual bool StartPVThread() = 0; 174 175 /** 176 ** This API will stop the PV thread's scheduler and block 177 ** until the thread cleanup is complete. During the thread 178 ** cleanup, the scheduler is stopped, all un-sent messages 179 ** are automatically cleaned up, and the engine Thread Logoff 180 ** routine is called. 181 ** 182 ** Calling this API under the PV thread context is an error 183 ** and will leave. 184 */ 185 virtual void StopPVThread() = 0; 186 187 /** 188 ** This API may be used to run the client-side of the proxy 189 ** in a non-blocking mode, for cases where there is no Oscl 190 ** scheduler or native scheduler running in the application 191 ** thread. 192 ** The proxy client will run until all pending notifications 193 ** have been sent, or else the max count of notifications has 194 ** been reached. This API also returns the count of notifications 195 ** still pending after the processing is complete. 196 ** Any call to this API from within the PV thread context is 197 ** an error and will leave. 198 ** 199 ** @param aMaxCount: (input param) the maximum of pending 200 ** notifications to process during the call. 201 ** @param aPendingCount: (output param) number of pending 202 ** notifications still remaining on the queue. 203 */ 204 virtual void DeliverNotifications(int32 aMaxCount, int32& aPendingCount) = 0; 205 }; 206 207 /** 208 ** A proxied engine must implement this class 209 */ 210 class PVProxiedEngine_OMX 211 { 212 public: ~PVProxiedEngine_OMX()213 virtual ~PVProxiedEngine_OMX() {} 214 215 /** 216 ** Create PV logger appenders for the PV thread. 217 ** Creating appenders in this call is optional and 218 ** allows logging by the PV thread related to thread 219 ** and scheduler initialization that occurs before 220 ** the thread logon. 221 **/ 222 virtual void CreateLoggerAppenders() = 0; 223 224 /** 225 ** Perform all thread-specific engine creation and 226 ** initialization. 227 ** This call is made by the main proxy from the PV 228 ** Thread after Oscl has been initialized 229 ** in the thread, but before starting the scheduler. 230 ** 231 ** @param proxy: reference to the caller. The app 232 ** may save this pointer and use it to make calls 233 ** to the main proxy. 234 */ 235 virtual void PVThreadLogon(PVMainProxy_OMX &proxy) = 0; 236 237 /** 238 ** Perform all thread-specific engine cleanup. 239 ** This call is made by the main proxy from the PV thread 240 ** after the scheduler has exited, but before Oscl has been 241 ** cleaned up. 242 ** 243 ** @param proxy: reference to the caller. The app 244 ** may save this pointer and use it to make calls 245 ** to the main proxy. 246 */ 247 virtual void PVThreadLogoff(PVMainProxy_OMX &proxy) = 0; 248 }; 249 250 /** 251 ** Proxied interface modules may implement this class 252 ** in order to provide a common interface query mechanism. 253 */ 254 class PVProxiedInterface_OMX : public PVInterface 255 { 256 public: 257 /** 258 ** To query for supported (proxied) interfaces. 259 ** 260 ** @param aUuid (input): the requested UUID 261 ** @param aInterfacePtr (output): a pointer to 262 ** the interface implementation, or NULL if not available. 263 ** 264 ** The holder of the interface pointer must call 265 ** "removeRef" when it is done with the pointer. 266 */ 267 virtual void QueryProxiedInterface(const TPVProxyUUID& aUuid, PVInterface*& aInterfacePtr) = 0; 268 /** 269 ** May be used to pass the main proxy pointer to 270 ** the implementation. 271 */ 272 virtual void SetMainProxy(PVMainProxy_OMX*) = 0; 273 }; 274 275 276 /** 277 ** Proxied interface modules must implement this class on the 278 ** PV thread side. 279 */ 280 class PVProxiedInterfaceServer_OMX 281 { 282 public: ~PVProxiedInterfaceServer_OMX()283 virtual ~PVProxiedInterfaceServer_OMX() {} 284 285 /** 286 ** PVMainProxy calls this under the PV thread to process a 287 ** command off the queue. 288 ** 289 ** @param aId: the message ID assigned by the SendCommand call. 290 ** @param aMsg: the command data. 291 */ 292 //Added one more argument to identify the openmax command 293 virtual void HandleCommand(TPVProxyMsgId aMsgId, TPVCommandId, OsclAny* aMsg) = 0; 294 295 /** 296 ** PVMainProxy calls this to cleanup an un-sent or canceled 297 ** notification. The server module should clean up any 298 ** allocated memory. The cleanup operation must be synchronous 299 ** and thread-safe. 300 ** 301 ** @param aId: the message ID assigned by the SendNotification call. 302 ** @param aMsg: the notification data. 303 */ 304 virtual void CleanupNotification(TPVProxyMsgId aId, OsclAny* aMsg) = 0; 305 }; 306 307 /** 308 ** Proxied interface pairs must implement this class on the 309 ** app thread side. 310 */ 311 class PVProxiedInterfaceClient_OMX 312 { 313 public: ~PVProxiedInterfaceClient_OMX()314 virtual ~PVProxiedInterfaceClient_OMX() {} 315 316 /** 317 ** PVMainProxy calls this to process a notification off the 318 ** queue. 319 ** @param aId: the message ID assigned by the SendNotification call. 320 ** @param aMsg: the notification data. 321 */ 322 virtual void HandleNotification(TPVProxyMsgId aId, OsclAny* aMsg) = 0; 323 324 /** 325 ** PVMainProxy calls this to cleanup an un-sent or canceled 326 ** command. The client module should clean up any allocated 327 ** memory. The cleanup operation must be synchronous 328 ** and thread-safe. 329 ** 330 ** @param aId: the message ID assigned by the SendCommand call. 331 ** @param aMsg: the command data. 332 */ 333 virtual void CleanupCommand(TPVProxyMsgId aId, OsclAny* aMsg) = 0; 334 }; 335 336 /** 337 //A basic implemention of PVProxiedInterface. 338 //Interface implementations 339 //can derive from this. 340 */ 341 template<class Alloc> 342 class PVProxiedInterfaceImpl_OMX : public PVProxiedInterface_OMX 343 { 344 public: PVProxiedInterfaceImpl_OMX(const PVUuid & uuid)345 PVProxiedInterfaceImpl_OMX(const PVUuid& uuid) 346 : iRefCounter(1) 347 , iUuid(uuid) 348 , iMainProxy(NULL) 349 {} SetUuid(const PVUuid & uuid)350 void SetUuid(const PVUuid& uuid) 351 { 352 iUuid = uuid; 353 } TestUuid(const PVUuid & uuid)354 bool TestUuid(const PVUuid& uuid) 355 { 356 return iUuid == uuid; 357 } ~PVProxiedInterfaceImpl_OMX()358 virtual ~PVProxiedInterfaceImpl_OMX() 359 {} removeRef()360 void removeRef() 361 { 362 --iRefCounter; 363 if (iRefCounter <= 0) 364 { 365 this->~PVProxiedInterfaceImpl_OMX(); 366 Alloc alloc; 367 alloc.deallocate(this); 368 } 369 } addRef()370 void addRef() 371 { 372 iRefCounter++; 373 } queryInterface(const PVUuid &,PVInterface * &)374 bool queryInterface(const PVUuid&, PVInterface*&) 375 { 376 return false; 377 } 378 SetMainProxy(PVMainProxy_OMX * p)379 void SetMainProxy(PVMainProxy_OMX *p) 380 { 381 iMainProxy = p; 382 } QueryProxiedInterface(const TPVProxyUUID & aUuid,PVInterface * & aInterfacePtr)383 void QueryProxiedInterface(const TPVProxyUUID& aUuid, PVInterface*& aInterfacePtr) 384 { 385 if (aUuid == iUuid) 386 aInterfacePtr = (PVInterface*)this; 387 else 388 aInterfacePtr = NULL; 389 } 390 protected: 391 int32 iRefCounter; 392 PVUuid iUuid; 393 PVMainProxy_OMX *iMainProxy; 394 }; 395 396 #endif // PROXY_INTERFACE 397 #endif 398 399 400