aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthieu Bouron <matthieu.bouron@gmail.com>2017-05-10 15:59:41 +0200
committerMatthieu Bouron <matthieu.bouron@gmail.com>2017-05-11 16:29:03 +0200
commit1795dccde0ad22fc8201142f92fb8d58c234f3e4 (patch)
treee7d17bb55a2c1b519976832f6df99e4cdeb7c368
parent2f43897f657974d8f94d0d075eb67dac1147ddde (diff)
downloadffmpeg-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.c63
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)