/*****************************************************************************
* Preamble
*****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <vlc/vlc.h>
#include <vlc_vout.h>
#include <vlc_aout.h>
int i_codec_id, i_cat;
const char *psz_namecodec;
vlc_value_t val;
- vlc_mutex_t *lock = var_GetGlobalMutex( "avcodec" );
if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
&psz_namecodec ) )
else
p_sys->i_hq = FF_MB_DECISION_RD;
}
+ else
+ p_sys->i_hq = FF_MB_DECISION_RD;
if( val.psz_string ) free( val.psz_string );
var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
if ( p_sys->b_strict_rc )
{
p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
+ p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
/* This is from ffmpeg's ffmpeg.c : */
p_context->rc_initial_buffer_occupancy
if( p_sys->i_vtolerance > 0 )
p_context->bit_rate_tolerance = p_sys->i_vtolerance;
+ /* usually if someone sets bitrate, he likes more to get that bitrate over quality
+ * should help 'normal' user to get asked bitrate
+ */
+ if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
+ {
+ p_sys->i_qmax = 51;
+ p_sys->i_qmin = 10;
+ }
+
if( p_sys->i_qmin > 0 )
+ {
p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
+ p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
+ }
if( p_sys->i_qmax > 0 )
+ {
p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
+ p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
+ }
p_context->max_qdiff = 3;
p_context->mb_decision = p_sys->i_hq;
p_context->extradata = NULL;
p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
- vlc_mutex_lock( lock );
+ vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
+
if( avcodec_open( p_context, p_codec ) )
{
vlc_mutex_unlock( lock );
frame.top_field_first = !!p_pict->b_top_field_first;
/* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
- if( p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', 'g', 'v' ) ||
- p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '1', 'v' ) ||
- p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '2', 'v' ) )
+ if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
{
frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
{
encoder_t *p_enc = (encoder_t *)p_this;
encoder_sys_t *p_sys = p_enc->p_sys;
- vlc_mutex_t *lock = var_GetGlobalMutex( "avcodec" );
if ( p_sys->b_inited && p_enc->i_threads >= 1 )
{
free( pp_contexts );
}
- vlc_mutex_lock( lock );
+ vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
avcodec_close( p_sys->p_context );
vlc_mutex_unlock( lock );
av_free( p_sys->p_context );