On Thu, 14 Dec 2017 11:09:13 +0100
Matthieu Bouron <matthieu.bou...@gmail.com> wrote:

> ---
>  libavcodec/mediacodec_wrapper.c | 262 
> +++++++++++-----------------------------
>  1 file changed, 70 insertions(+), 192 deletions(-)
> 
> diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c
> index f34450a6d8..4660e895ca 100644
> --- a/libavcodec/mediacodec_wrapper.c
> +++ b/libavcodec/mediacodec_wrapper.c
> @@ -1132,200 +1132,78 @@ fail:


> +#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(func, jfunc)                      
>                \
> +FFAMediaCodec* ff_AMediaCodec_##func(const char *arg)                        
>                \
> +{                                                                            
>                \
> +    int ret = -1;                                                            
>                \
> +    JNIEnv *env = NULL;                                                      
>                \
> +    FFAMediaCodec *codec = NULL;                                             
>                \
> +    jstring jarg = NULL;                                                     
>                \
> +    jobject object = NULL;                                                   
>                \
> +                                                                             
>                \
> +    codec = av_mallocz(sizeof(FFAMediaCodec));                               
>                \
> +    if (!codec) {                                                            
>                \
> +        return NULL;                                                         
>                \
> +    }                                                                        
>                \
> +    codec->class = &amediacodec_class;                                       
>                \
> +                                                                             
>                \
> +    env = ff_jni_get_env(codec);                                             
>                \
> +    if (!env) {                                                              
>                \
> +        av_freep(&codec);                                                    
>                \
> +        return NULL;                                                         
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 
> 1, codec) < 0) { \
> +        goto fail;                                                           
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    jarg = ff_jni_utf_chars_to_jstring(env, arg, codec);                     
>                \
> +    if (!jarg) {                                                             
>                \
> +        goto fail;                                                           
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    object = (*env)->CallStaticObjectMethod(env,                             
>                \
> +                                            codec->jfields.mediacodec_class, 
>                \
> +                                            codec->jfields.jfunc,            
>                \
> +                                            jarg);                           
>                \
> +    if (ff_jni_exception_check(env, 1, codec) < 0) {                         
>                \
> +        goto fail;                                                           
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    codec->object = (*env)->NewGlobalRef(env, object);                       
>                \
> +    if (!codec->object) {                                                    
>                \
> +        goto fail;                                                           
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    if (codec_init_static_fields(codec) < 0) {                               
>                \
> +        goto fail;                                                           
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    if (codec->jfields.get_input_buffer_id && 
> codec->jfields.get_output_buffer_id) {        \
> +        codec->has_get_i_o_buffer = 1;                                       
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    ret = 0;                                                                 
>                \
> +fail:                                                                        
>                \
> +    if (jarg) {                                                              
>                \
> +        (*env)->DeleteLocalRef(env, jarg);                                   
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    if (object) {                                                            
>                \
> +        (*env)->DeleteLocalRef(env, object);                                 
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    if (ret < 0) {                                                           
>                \
> +        ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 
> 1, codec);      \
> +        av_freep(&codec);                                                    
>                \
> +    }                                                                        
>                \
> +                                                                             
>                \
> +    return codec;                                                            
>                \
>  }
>  

Such long macros are very ugly. And the only macro argument that is
used in the body is jfunc. Would it be possible to move most of the
macro into a proper function, with jfunc as pointer argument or so?
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to