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 MEDIA_RESOURCE_ARBITRATOR_H_ 19 #define MEDIA_RESOURCE_ARBITRATOR_H_ 20 21 #include <unistd.h> 22 #include <string.h> 23 #include <utils/KeyedVector.h> 24 #include <utils/Vector.h> 25 26 #define MAX_BUFFER_SIZE (20 * 1024) 27 28 using namespace android; 29 30 // This error type keeps align with the OMX error type 31 typedef enum _ArbitratorErrorType { 32 ArbitratorErrorNone = 0, 33 34 /** There were insufficient resources to perform the requested operation */ 35 ArbitratorErrorInsufficientResources = 0x80001000, 36 37 /** There was an error, but the cause of the error could not be determined */ 38 ArbitratorErrorUndefined = 0x80001001 39 } ArbitratorErrorType; 40 41 42 typedef enum _ResolutionType { 43 Resolution_CIF = 0, 44 Resolution_480, 45 Resolution_720, 46 Resolution_1080, 47 Resolution_2K, 48 Resolution_4K, 49 Resolution_MAX 50 } ResolutionType; 51 52 53 typedef enum _CodecType { 54 CODEC_TYPE_AVC = 0, 55 CODEC_TYPE_HEVC, 56 CODEC_TYPE_VP8, 57 CODEC_TYPE_VP9, 58 CODEC_TYPE_MPEG4, 59 CODEC_TYPE_MPEG2, 60 CODEC_TYPE_H263, 61 CODEC_TYPE_VC1, 62 CODEC_TYPE_WMV, 63 CODEC_TYPE_MAX 64 } CodecType; 65 66 67 typedef struct _CodecInfo { 68 CodecType codecType; 69 bool isEncoder; 70 bool isSecured; 71 ResolutionType resolution; 72 uint frameRate; 73 } CodecInfo; 74 75 76 typedef struct _CodecLimitInfo { 77 CodecInfo codecInfo; 78 int instanceLimit; 79 } CodecLimitInfo; 80 81 82 typedef struct _LivingDecodersTable { 83 Vector<CodecInfo> livingDecoders; 84 uint maxResolution; 85 uint maxFrameRate; 86 } LivingDecodersTable; 87 88 89 typedef struct _LivingEncodersTable { 90 Vector<CodecInfo> livingEncoders; 91 uint maxResolution; 92 uint maxFrameRate; 93 } LivingEncodersTable; 94 95 96 class MediaResourceArbitrator { 97 public: 98 MediaResourceArbitrator (); 99 ~MediaResourceArbitrator (); 100 101 /* Initialize the arbitrator. 102 Parse the config XML file if given. */ 103 ArbitratorErrorType Config(const char* configFilePath); 104 105 /* Check if the resource limitation is hit and 106 it is under full load status. In such status, there 107 is no room to instantiate codec anymore. */ 108 bool CheckIfFullLoad(bool isEncoder); 109 110 /* Add codec in the pool. 111 Resolution and frame rate must be provided. 112 This is not necessarily be called when codec instance 113 is constructed when the resolution and frame rate are 114 not known yet. 115 This may be called when codec is configured, 116 for example in OMX set parameter, etc. 117 Return value is expected to be as one of: 118 ArbitratorErrorNone, 119 ArbitratorErrorInsufficientResources 120 */ 121 ArbitratorErrorType AddResource(/* in */ CodecType codecType, 122 /* in */ bool isEncoder, 123 /* in */ bool isSecured, 124 /* in */ ResolutionType resolution, 125 /* in */ uint frameRate); 126 127 /* Remove codec in the pool.*/ 128 ArbitratorErrorType RemoveResource(CodecType codecType, 129 bool isEncoder, 130 bool isSecured, 131 ResolutionType resolution, 132 uint frameRate); 133 134 uint GetLivingCodecsNum(void); 135 136 // XML function 137 void ParseXMLFile(FILE* fp); 138 static void startElement(void *userData, const char *name, const char **atts); 139 static void endElement(void *userData, const char *name); 140 void getConfigData(const char *name, const char **atts); 141 142 private: 143 // a global table stores all codec limit info 144 Vector<CodecLimitInfo> mDecoderLimitInfos; 145 Vector<CodecLimitInfo> mEncoderLimitInfos; 146 147 // a global talbe stores all living codec info 148 LivingDecodersTable mLivingDecodersTable; 149 LivingEncodersTable mLivingEncodersTable; 150 151 // arbitrator lock 152 pthread_mutex_t mArbitratorLock; 153 154 // indicate whether it is under full load status 155 bool mIsEncoderUnderFullLoad; 156 bool mIsDecoderUnderFullLoad; 157 158 KeyedVector <const char*, CodecType> mCodecNameTypeMap; 159 KeyedVector <const char*, ResolutionType> mResolutionNameTypeMap; 160 161 static const int mBufSize = MAX_BUFFER_SIZE; 162 // indicate XML parser is parsing a codec tag 163 bool mIfParsingCodec; 164 CodecLimitInfo mParsingCodecLimitInfo; 165 166 ArbitratorErrorType ArbitrateFullLoad(CodecInfo& codec); 167 168 bool CheckCodecMatched(const CodecInfo& sourceCodec, 169 const CodecInfo& targetCodec); 170 171 void SetupDefaultCodecLimitation(void); 172 void InitializeCodecNameTypeMap(); 173 void InitializeResolutionNameTypeMap(); 174 void DumpCodecTypeFromVector(void); 175 CodecType MapCodecTypeFromName(const char* name); 176 ResolutionType MapResolutionTypeFromName(const char* name); 177 }; 178 179 #endif /* MEDIA_RESOURCE_ARBITRATOR_H_ */ 180