Message ID | tencent_A39F33AB904E3170042D7A9AA440109A6D08@qq.com |
---|---|
State | Accepted |
Commit | 8586540ad16816589ace145c6479bff172b83919 |
Headers | show |
Series | [FFmpeg-devel,v2,1/2] avcodec/mediacodec_wrapper: get api level via NDK method | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
tis 2023-01-10 klockan 19:30 +0800 skrev Zhao Zhili: > From: Zhao Zhili <zhilizhao@tencent.com> > > android_get_device_api_level() is a static inline before API level > 29. It was implemented via __system_property_get(). We can do the > same thing, but I don't want to mess up with __system_property_get. > --- > libavcodec/mediacodec_wrapper.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/libavcodec/mediacodec_wrapper.c > b/libavcodec/mediacodec_wrapper.c > index 4d6e9487b8..34ec2134aa 100644 > --- a/libavcodec/mediacodec_wrapper.c > +++ b/libavcodec/mediacodec_wrapper.c > @@ -2513,6 +2513,21 @@ FFAMediaCodec* > ff_AMediaCodec_createEncoderByType(const char *mime_type, int ndk > int ff_Build_SDK_INT(AVCodecContext *avctx) > { > int ret = -1; > + > +#if __ANDROID_API__ >= 24 > + // android_get_device_api_level() is a static inline before API > level 29. > + // dlsym() might doesn't work. > + // > + // We can implement android_get_device_api_level() by > + // __system_property_get(), but __system_property_get() has > created a lot of > + // troubles and is deprecated. So avoid using > __system_property_get() for > + // now. > + // > + // Hopy we can remove the conditional compilation finally by > bumping the > + // required API level. > + // > + ret = android_get_device_api_level(); > +#else > JNIEnv *env = NULL; > jclass versionClass; > jfieldID sdkIntFieldID; > @@ -2522,5 +2537,8 @@ int ff_Build_SDK_INT(AVCodecContext *avctx) > sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass, > "SDK_INT", "I"); > ret = (*env)->GetStaticIntField(env, versionClass, > sdkIntFieldID); > (*env)->DeleteLocalRef(env, versionClass); > +#endif > + av_log(avctx, AV_LOG_DEBUG, "device api level %d\n", ret); > + > return ret; > } Looks OK /Tomas
diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index 4d6e9487b8..34ec2134aa 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -2513,6 +2513,21 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime_type, int ndk int ff_Build_SDK_INT(AVCodecContext *avctx) { int ret = -1; + +#if __ANDROID_API__ >= 24 + // android_get_device_api_level() is a static inline before API level 29. + // dlsym() might doesn't work. + // + // We can implement android_get_device_api_level() by + // __system_property_get(), but __system_property_get() has created a lot of + // troubles and is deprecated. So avoid using __system_property_get() for + // now. + // + // Hopy we can remove the conditional compilation finally by bumping the + // required API level. + // + ret = android_get_device_api_level(); +#else JNIEnv *env = NULL; jclass versionClass; jfieldID sdkIntFieldID; @@ -2522,5 +2537,8 @@ int ff_Build_SDK_INT(AVCodecContext *avctx) sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass, "SDK_INT", "I"); ret = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID); (*env)->DeleteLocalRef(env, versionClass); +#endif + av_log(avctx, AV_LOG_DEBUG, "device api level %d\n", ret); + return ret; }
From: Zhao Zhili <zhilizhao@tencent.com> android_get_device_api_level() is a static inline before API level 29. It was implemented via __system_property_get(). We can do the same thing, but I don't want to mess up with __system_property_get. --- libavcodec/mediacodec_wrapper.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)