diff options
author | Matthieu Bouron <matthieu.bouron@gmail.com> | 2017-05-10 15:59:41 +0200 |
---|---|---|
committer | Matthieu Bouron <matthieu.bouron@gmail.com> | 2017-05-11 16:29:03 +0200 |
commit | 1795dccde0ad22fc8201142f92fb8d58c234f3e4 (patch) | |
tree | e7d17bb55a2c1b519976832f6df99e4cdeb7c368 | |
parent | 2f43897f657974d8f94d0d075eb67dac1147ddde (diff) | |
download | ffmpeg-1795dccde0ad22fc8201142f92fb8d58c234f3e4.tar.gz |
lavc/mediacodec_wrapper: fix local reference leaks
Reviewed-by: Clément Bœsch <u@pkh.me>
-rw-r--r-- | libavcodec/mediacodec_wrapper.c | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index c2af950f39..43fbb511fd 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -1129,9 +1129,11 @@ fail: FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) { + int ret = -1; JNIEnv *env = NULL; FFAMediaCodec *codec = NULL; jstring codec_name = NULL; + jobject object = NULL; codec = av_mallocz(sizeof(FFAMediaCodec)); if (!codec) { @@ -1154,12 +1156,12 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) goto fail; } - codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name); + object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->object = (*env)->NewGlobalRef(env, codec->object); + codec->object = (*env)->NewGlobalRef(env, object); if (!codec->object) { goto fail; } @@ -1172,24 +1174,31 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) codec->has_get_i_o_buffer = 1; } - return codec; + ret = 0; fail: - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - if (codec_name) { (*env)->DeleteLocalRef(env, codec_name); } - av_freep(&codec); + if (object) { + (*env)->DeleteLocalRef(env, object); + } - return NULL; + if (ret < 0) { + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); + av_freep(&codec); + } + + return codec; } FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) { + int ret = -1; JNIEnv *env = NULL; FFAMediaCodec *codec = NULL; jstring mime_type = NULL; + jobject object = NULL; codec = av_mallocz(sizeof(FFAMediaCodec)); if (!codec) { @@ -1212,12 +1221,12 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) goto fail; } - codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_decoder_by_type_id, mime_type); + object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_decoder_by_type_id, mime_type); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->object = (*env)->NewGlobalRef(env, codec->object); + codec->object = (*env)->NewGlobalRef(env, object); if (!codec->object) { goto fail; } @@ -1230,24 +1239,31 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) codec->has_get_i_o_buffer = 1; } - return codec; + ret = 0; fail: - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - if (mime_type) { (*env)->DeleteLocalRef(env, mime_type); } - av_freep(&codec); + if (object) { + (*env)->DeleteLocalRef(env, object); + } - return NULL; + if (ret < 0) { + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); + av_freep(&codec); + } + + return codec; } FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) { + int ret = -1; JNIEnv *env = NULL; FFAMediaCodec *codec = NULL; jstring mime_type = NULL; + jobject object = NULL; codec = av_mallocz(sizeof(FFAMediaCodec)); if (!codec) { @@ -1270,12 +1286,12 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) goto fail; } - codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_encoder_by_type_id, mime_type); + object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_encoder_by_type_id, mime_type); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->object = (*env)->NewGlobalRef(env, codec->object); + codec->object = (*env)->NewGlobalRef(env, object); if (!codec->object) { goto fail; } @@ -1288,17 +1304,22 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) codec->has_get_i_o_buffer = 1; } - return codec; + ret = 0; fail: - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - if (mime_type) { (*env)->DeleteLocalRef(env, mime_type); } - av_freep(&codec); + if (object) { + (*env)->DeleteLocalRef(env, object); + } - return NULL; + if (ret < 0) { + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); + av_freep(&codec); + } + + return codec; } int ff_AMediaCodec_delete(FFAMediaCodec* codec) |