X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fffmpeg%2Fencoder.c;h=b74de24cf229e3822b49d17bf56736d7803479f6;hb=0274be8790164dccf71b9f4574b57a47e4a88c70;hp=c0ec8c827f75d81366b832876c2847c6960bdb91;hpb=a78e273ec53ff8a6c3993f3deda0b893f8dd709a;p=vlc diff --git a/modules/codec/ffmpeg/encoder.c b/modules/codec/ffmpeg/encoder.c index c0ec8c827f..b74de24cf2 100644 --- a/modules/codec/ffmpeg/encoder.c +++ b/modules/codec/ffmpeg/encoder.c @@ -41,7 +41,9 @@ /* ffmpeg header */ #define HAVE_MMX 1 -#ifdef HAVE_FFMPEG_AVCODEC_H +#ifdef HAVE_LIBAVCODEC_AVCODEC_H +# include +#elif defined(HAVE_FFMPEG_AVCODEC_H) # include #else # include @@ -139,7 +141,9 @@ struct encoder_sys_t int i_quality; /* for VBR */ float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking; int i_luma_elim, i_chroma_elim; - +#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4) + int i_aac_profile; /* AAC profile to use.*/ +#endif /* Used to work around stupid timestamping behaviour in libavcodec */ uint64_t i_framenum; mtime_t pi_delay_pts[MAX_FRAME_DELAY]; @@ -151,7 +155,11 @@ static const char *ppsz_enc_options[] = { "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix", "trellis", "qscale", "strict", "lumi-masking", "dark-masking", "p-masking", "border-masking", "luma-elim-threshold", - "chroma-elim-threshold", NULL + "chroma-elim-threshold", +#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4) + "aac-profile", +#endif + NULL }; static const uint16_t mpa_bitrate_tab[2][15] = @@ -185,7 +193,6 @@ static const uint16_t mpeg4_default_non_intra_matrix[64] = { 23, 24, 25, 27, 28, 30, 31, 33, }; - /***************************************************************************** * OpenEncoder: probe the encoder *****************************************************************************/ @@ -331,6 +338,7 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5); var_Get( p_enc, ENC_CFG_PREFIX "hq", &val ); + p_sys->i_hq = FF_MB_DECISION_RD; if( val.psz_string && *val.psz_string ) { if( !strcmp( val.psz_string, "rd" ) ) @@ -344,7 +352,7 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) } else p_sys->i_hq = FF_MB_DECISION_RD; - if( val.psz_string ) free( val.psz_string ); + free( val.psz_string ); var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val ); p_sys->i_qmin = val.i_int; @@ -370,6 +378,30 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val ); p_sys->i_chroma_elim = val.i_int; +#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4) + var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val ); + p_sys->i_aac_profile = FF_PROFILE_UNKNOWN; + if( val.psz_string && *val.psz_string ) + { + if( !strncmp( val.psz_string, "main", 4 ) ) + p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN; + else if( !strncmp( val.psz_string, "low", 3 ) ) + p_sys->i_aac_profile = FF_PROFILE_AAC_LOW; +#if 0 /* Not supported by FAAC encoder */ + else if( !strncmp( val.psz_string, "ssr", 3 ) ) + p_sys->i_aac_profile = FF_PROFILE_AAC_SSR; +#endif + else if( !strncmp( val.psz_string, "ltp", 3 ) ) + p_sys->i_aac_profile = FF_PROFILE_AAC_LTP; + else + { + msg_Warn( p_enc, "unknown AAC profile requested" ); + p_sys->i_aac_profile = FF_PROFILE_UNKNOWN; + } + } + free( val.psz_string ); +#endif + if( p_enc->fmt_in.i_cat == VIDEO_ES ) { int i_aspect_num, i_aspect_den; @@ -534,6 +566,13 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE; p_context->sample_rate = p_enc->fmt_in.audio.i_rate; p_context->channels = p_enc->fmt_in.audio.i_channels; + +#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4) + /* Ignore FF_PROFILE_UNKNOWN */ + if( ( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN ) && + ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') ) ) + p_context->profile = p_sys->i_aac_profile; +#endif } /* Misc parameters */ @@ -1047,8 +1086,8 @@ void E_(CloseEncoder)( vlc_object_t *p_this ) vlc_mutex_unlock( lock ); av_free( p_sys->p_context ); - if( p_sys->p_buffer ) free( p_sys->p_buffer ); - if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out ); + free( p_sys->p_buffer ); + free( p_sys->p_buffer_out ); free( p_sys ); }