001package net.facelib.mtfsdk;
002
003import static net.facelib.mtfsdk.V2AndroidBridge.V2_PRODUCT_ID;
004import static net.facelib.mtfsdk.V2AndroidBridge.V2_LICENSE_MANAGER;
005
006import java.util.Collections;
007import java.util.HashMap;
008import java.util.Map;
009import java.util.concurrent.atomic.AtomicLong;
010
011import org.apache.commons.pool2.impl.GenericObjectPool;
012import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
013
014import net.facelib.akcore.LicenseManager;
015import net.facelib.akcore.ProductInitStatus;
016import net.facelib.jni.BaseJniBridge;
017import net.facelib.jni.BridgePool;
018import net.facelib.jni.FacelibRuntimeParam;
019import net.gdface.image.MatType;
020import net.gdface.sdk.CodeInfo;
021import net.gdface.sdk.ContextLoader.ContextField;
022
023/**
024 * MTFSDK V2 android/arm平台 {@link net.gdface.sdk.FaceApi}接口实现抽象类(线程安全)<br>
025 * @author guyadong
026 *
027 */
028public class FaceApiMtfV2Android extends BaseFaceApiMtfAndroid{
029        /**
030         * 资源池参数配置
031         */
032        private static GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
033        public static final FaceApiMtfV2Android INSTANCE = new FaceApiMtfV2Android();
034        static final Map<ContextField, Object> CONTEXT;
035        /**
036         * 特征提取算法实例资源 
037         */
038        private final BridgePool<V2AndroidBridge> poolWrap = new BridgePool<>(V2AndroidBridge.class,poolConfig);
039        protected FaceApiMtfV2Android() {
040                super();
041                capacity.put(C_SDK_VERSION, V2AndroidBridge.SDK_VERSION);
042        }
043        
044        public static FaceApiMtfV2Android getInstance(){
045                return INSTANCE;
046        }
047
048        /**
049         * 获取授权管理对象
050         * @return 授权管理对象
051         */
052        public LicenseManager getLicenseManager(){
053                return BaseJniBridge.getLicenseManager(V2_PRODUCT_ID, V2_LICENSE_MANAGER);
054        }
055        static {
056                try {
057                        // MTFSDK JNI接口静态区初始化
058                        Class.forName(net.facelib.mtfsdk.V2AndroidBridge.class.getName());
059                } catch (ClassNotFoundException e) {
060                        throw new ExceptionInInitializerError(e);
061                }
062                HashMap<ContextField, Object> m = new HashMap<>();
063                m.put(ContextField.INSTANCE, getInstance());
064                m.put(ContextField.LICENCE_MANAGER, BaseJniBridge.getLicenseManager(V2_PRODUCT_ID, V2_LICENSE_MANAGER));
065                CONTEXT = Collections.unmodifiableMap(m);
066        }
067
068        @Override
069        protected double nativeCompareCode(byte[] code1, byte[] code2) {
070                return V2AndroidBridge.FFSimilarityByteV2(code1,code2);
071        }
072
073
074        @Override
075        protected byte[] nativeGetFaceFeature(MatType matType,byte[] imgMatrix, int width, int height, CodeInfo faceInfo) {
076                NativeFaceInfo nativeFaceInfo = NativeFaceInfo.toNative(faceInfo);
077                V2AndroidBridge instance = poolWrap.applyInstance();
078                try{
079                        sdkRuntime.setInstanceParam(instance,FacelibRuntimeParam.featureThreadNumber.name());
080                         return instance.feaExtractByte(matType, imgMatrix, width, height, nativeFaceInfo.nativeData);
081                }finally{
082                        poolWrap.returnInstance(instance);
083                }
084        }
085        
086        @Override
087        public void bindNativeFeatureInstanceForCurentThread() {
088                poolWrap.bindInstanceForCurentThread();
089        }
090
091        @Override
092        public void unbindNativeFeatureInstanceForCurentThread() {
093                poolWrap.unbindInstanceForCurentThread();
094        }
095
096        /**
097         * 测试是否可以正常初始化特征提取算法实例
098         * @param initMills [out]如果不为{@code null}返回返回初始化耗时(毫秒)
099         * @return 产品初始化状态
100         */
101        public ProductInitStatus testV2Init(AtomicLong initMills) {
102                return BaseJniBridge.testInit(initMills, V2AndroidBridge.class);
103        }
104        /**
105         * @return 返回V2特征提取算法实例资源池对象
106         */
107        public GenericObjectPool<V2AndroidBridge> getFeaturePool() {
108                return poolWrap.getPool();
109        }
110        /**
111         * 返回V2特征提取算法资源池对象参数配置
112         * @return poolConfig
113         */
114        public static GenericObjectPoolConfig getPoolConfig() {
115                return poolConfig;
116        }
117        /**
118         * 设置V2特征提取算法资源池对象参数配置
119         * @param poolConfig 要设置的 poolConfig
120         */
121        public static void setPoolConfig(GenericObjectPoolConfig poolConfig) {
122                if(null != poolConfig){
123                        FaceApiMtfV2Android.poolConfig = poolConfig;
124                }
125        }
126}