1 /* 2 * Copyright (c) 2015 Intel Corporation. All rights reserved. 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 express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 #ifndef OMX_WRAPPER_H_ 19 #define OMX_WRAPPER_H_ 20 21 #include <unistd.h> 22 #include <OMX_Core.h> 23 #include <OMX_Component.h> 24 #include <utils/threads.h> 25 #include <utils/KeyedVector.h> 26 #include <utils/String8.h> 27 #include "MediaResourceArbitrator.h" 28 29 using namespace android; 30 31 typedef KeyedVector <OMX_HANDLETYPE, String8> ComponentNameMap; 32 typedef KeyedVector <OMX_HANDLETYPE, uint> ComponentFramerateMap; 33 34 typedef struct _AdaptorCodecInfo { 35 CodecType codecType; 36 bool isEncoder; 37 bool isSecured; 38 ResolutionType resolution; 39 uint frameRate; 40 } AdaptorCodecInfo; 41 42 typedef KeyedVector <OMX_HANDLETYPE, AdaptorCodecInfo> ComponentInfoMap; 43 44 class MRM_OMX_Adaptor { 45 public: 46 // Returns the singleton instance 47 static MRM_OMX_Adaptor* getInstance(); 48 ~MRM_OMX_Adaptor()49 ~MRM_OMX_Adaptor() { 50 if (sInstance) { 51 delete sInstance; 52 sInstance = NULL; 53 } 54 }; 55 56 // create and configure the MRM arbitrator 57 OMX_ERRORTYPE MRM_OMX_Init(void); 58 59 60 // check with MRM arbitrator if codec resource 61 // is under full load status. 62 // this should be called before OMX_GetHandle 63 // return OMX_ErrorInsufficientResources if true. 64 OMX_ERRORTYPE MRM_OMX_CheckIfFullLoad(OMX_STRING cComponentName); 65 66 67 // Set component name and component handle 68 // keeps this mapping but not adds resource yet. 69 // this intends to be called after OMX_GetHandle 70 void MRM_OMX_SetComponent( 71 OMX_HANDLETYPE pComponentHandle, 72 OMX_STRING cComponentName); 73 74 75 // handle the index 'OMX_IndexParamPortDefinition' 76 // when codec is configured, with resolution and 77 // frame rate. this actually adds resource 78 // to the MRM arbitrator. 79 // return OMX_ErrorInsufficientResources if failed. 80 OMX_ERRORTYPE MRM_OMX_SetParameter( 81 OMX_HANDLETYPE hComponent, 82 OMX_INDEXTYPE nIndex, 83 OMX_PTR pComponentParameterStructure); 84 85 86 // check grahpic buffer resource 87 // return OMX_ErrorInsufficientResources if under full load status. 88 OMX_ERRORTYPE MRM_OMX_UseBuffer( 89 OMX_HANDLETYPE hComponent, 90 OMX_BUFFERHEADERTYPE **ppBufferHdr, 91 OMX_U32 nPortIndex, 92 OMX_PTR pAppPrivate, 93 OMX_U32 nSizeBytes, 94 OMX_U8 *pBuffer); 95 96 97 // Remove the component 98 OMX_ERRORTYPE MRM_OMX_RemoveComponent(OMX_HANDLETYPE pComponentHandle); 99 100 private: MRM_OMX_Adaptor()101 MRM_OMX_Adaptor() { mArbitrator = new MediaResourceArbitrator(); } 102 MRM_OMX_Adaptor& operator=(const MRM_OMX_Adaptor&); // Don't call me 103 MRM_OMX_Adaptor(const MRM_OMX_Adaptor&); // Don't call me 104 105 106 void ParseCodecInfoFromComponentName(const char* componentName, 107 AdaptorCodecInfo* codecInfo); 108 109 MediaResourceArbitrator* mArbitrator; 110 static Mutex sLock; 111 static MRM_OMX_Adaptor* sInstance; 112 113 ComponentNameMap mComponentNameMap; 114 ComponentFramerateMap mComponentFramerateMap; 115 ComponentInfoMap mComponentInfoMap; 116 }; 117 #endif /* OMX_WRAPPER_H_ */ 118