1 /*****************************************************************************
2 * encoder.c: video and audio encoder using the ffmpeg library
3 *****************************************************************************
4 * Copyright (C) 1999-2004 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@videolan.org>
9 * Christophe Massiot <massiot@via.ecp.fr>
10 * Part of the file Copyright (C) FFMPEG Project Developers
11 * (mpeg4_default matrixes)
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
26 *****************************************************************************/
28 /*****************************************************************************
30 *****************************************************************************/
35 #include <vlc/decoder.h>
36 #include <vlc_interaction.h>
40 #ifdef HAVE_FFMPEG_AVCODEC_H
41 # include <ffmpeg/avcodec.h>
46 #if LIBAVCODEC_BUILD < 4704
47 # define AV_NOPTS_VALUE 0
49 #if LIBAVCODEC_BUILD < 4684
50 # define FF_QP2LAMBDA 118
55 #define AVCODEC_MAX_VIDEO_FRAME_SIZE (3*1024*1024)
56 #define HURRY_UP_GUARD1 (450000)
57 #define HURRY_UP_GUARD2 (300000)
58 #define HURRY_UP_GUARD3 (100000)
60 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
62 /*****************************************************************************
64 *****************************************************************************/
65 int E_(OpenEncoder) ( vlc_object_t * );
66 void E_(CloseEncoder)( vlc_object_t * );
68 static block_t *EncodeVideo( encoder_t *, picture_t * );
69 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
71 struct thread_context_t;
72 static int FfmpegThread( struct thread_context_t *p_context );
73 static int FfmpegExecute( AVCodecContext *s,
74 int (*pf_func)(AVCodecContext *c2, void *arg2),
75 void **arg, int *ret, int count );
77 /*****************************************************************************
78 * thread_context_t : for multithreaded encoding
79 *****************************************************************************/
80 #if LIBAVCODEC_BUILD >= 4702
81 struct thread_context_t
85 AVCodecContext *p_context;
86 int (* pf_func)(AVCodecContext *c, void *arg);
92 vlc_bool_t b_work, b_done;
96 /*****************************************************************************
97 * encoder_sys_t : ffmpeg encoder descriptor
98 *****************************************************************************/
105 AVCodecContext *p_context;
116 mtime_t i_last_ref_pts;
117 mtime_t i_buggy_pts_detect;
128 /* Encoding settings */
135 vlc_bool_t b_strict_rc;
136 int i_rc_buffer_size;
137 float f_rc_buffer_aggressivity;
139 vlc_bool_t b_hurry_up;
140 vlc_bool_t b_interlace, b_interlace_me;
141 float f_i_quant_factor;
142 int i_noise_reduction;
143 vlc_bool_t b_mpeg4_matrix;
144 vlc_bool_t b_trellis;
145 int i_quality; /* for VBR */
146 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
147 int i_luma_elim, i_chroma_elim;
149 /* Used to work around stupid timestamping behaviour in libavcodec */
151 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
154 static const char *ppsz_enc_options[] = {
155 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
156 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
157 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
158 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
159 "p-masking", "border-masking", "luma-elim-threshold",
160 "chroma-elim-threshold", NULL
163 static const uint16_t mpa_bitrate_tab[2][15] =
165 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
166 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
169 static const uint16_t mpa_freq_tab[6] =
170 { 44100, 48000, 32000, 22050, 24000, 16000 };
172 static const int16_t mpeg4_default_intra_matrix[64] = {
173 8, 17, 18, 19, 21, 23, 25, 27,
174 17, 18, 19, 21, 23, 25, 27, 28,
175 20, 21, 22, 23, 24, 26, 28, 30,
176 21, 22, 23, 24, 26, 28, 30, 32,
177 22, 23, 24, 26, 28, 30, 32, 35,
178 23, 24, 26, 28, 30, 32, 35, 38,
179 25, 26, 28, 30, 32, 35, 38, 41,
180 27, 28, 30, 32, 35, 38, 41, 45,
183 static const int16_t mpeg4_default_non_intra_matrix[64] = {
184 16, 17, 18, 19, 20, 21, 22, 23,
185 17, 18, 19, 20, 21, 22, 23, 24,
186 18, 19, 20, 21, 22, 23, 24, 25,
187 19, 20, 21, 22, 23, 24, 26, 27,
188 20, 21, 22, 23, 25, 26, 27, 28,
189 21, 22, 23, 24, 26, 27, 28, 30,
190 22, 23, 24, 26, 27, 28, 30, 31,
191 23, 24, 25, 27, 28, 30, 31, 33,
195 /*****************************************************************************
196 * OpenEncoder: probe the encoder
197 *****************************************************************************/
199 int E_(OpenEncoder)( vlc_object_t *p_this )
201 encoder_t *p_enc = (encoder_t *)p_this;
202 encoder_sys_t *p_sys = p_enc->p_sys;
203 AVCodecContext *p_context;
205 int i_codec_id, i_cat;
210 var_Get( p_enc->p_libvlc, "avcodec", &lockval );
212 if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
215 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
217 /* handed chroma output */
221 i_codec_id = CODEC_ID_RAWVIDEO;
222 psz_namecodec = "Raw video";
225 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
227 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
228 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
229 _("\"%s\" is no video encoder."), psz_namecodec );
233 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
235 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
236 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
237 _("\"%s\" is no audio encoder."), psz_namecodec );
241 /* Initialization must be done before avcodec_find_encoder() */
242 E_(InitLibavcodec)(p_this);
244 p_codec = avcodec_find_encoder( i_codec_id );
247 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
248 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
249 _("VLC could not find encoder \"%s\"."), psz_namecodec );
253 /* Allocate the memory needed to store the encoder's structure */
254 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
256 msg_Err( p_enc, "out of memory" );
259 memset( p_sys, 0, sizeof(encoder_sys_t) );
260 p_enc->p_sys = p_sys;
261 p_sys->p_codec = p_codec;
263 p_enc->pf_encode_video = EncodeVideo;
264 p_enc->pf_encode_audio = EncodeAudio;
266 p_sys->p_buffer_out = NULL;
267 p_sys->p_buffer = NULL;
269 p_sys->p_context = p_context = avcodec_alloc_context();
270 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
271 p_context->opaque = (void *)p_this;
273 /* Set CPU capabilities */
274 p_context->dsp_mask = 0;
275 if( !(p_enc->p_libvlc->i_cpu & CPU_CAPABILITY_MMX) )
277 p_context->dsp_mask |= FF_MM_MMX;
279 if( !(p_enc->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT) )
281 p_context->dsp_mask |= FF_MM_MMXEXT;
283 if( !(p_enc->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW) )
285 p_context->dsp_mask |= FF_MM_3DNOW;
287 if( !(p_enc->p_libvlc->i_cpu & CPU_CAPABILITY_SSE) )
289 p_context->dsp_mask |= FF_MM_SSE;
290 p_context->dsp_mask |= FF_MM_SSE2;
293 sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
295 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
296 p_sys->i_key_int = val.i_int;
298 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
299 p_sys->i_b_frames = val.i_int;
301 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
302 p_sys->i_vtolerance = val.i_int;
304 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
305 p_sys->b_interlace = val.b_bool;
307 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
308 p_sys->b_interlace_me = val.b_bool;
310 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
311 p_sys->b_pre_me = val.b_bool;
313 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
314 p_sys->b_hurry_up = val.b_bool;
315 if( p_sys->b_hurry_up )
317 /* hurry up mode needs noise reduction, even small */
318 p_sys->i_noise_reduction = 1;
321 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
322 p_sys->b_strict_rc = val.b_bool;
323 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
324 p_sys->i_rc_buffer_size = val.i_int;
325 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
326 p_sys->f_rc_buffer_aggressivity = val.f_float;
328 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
329 p_sys->f_i_quant_factor = val.f_float;
331 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
332 p_sys->i_noise_reduction = val.i_int;
334 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
335 p_sys->b_mpeg4_matrix = val.b_bool;
337 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
338 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
339 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
341 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
342 if( val.psz_string && *val.psz_string )
344 if( !strcmp( val.psz_string, "rd" ) )
345 p_sys->i_hq = FF_MB_DECISION_RD;
346 else if( !strcmp( val.psz_string, "bits" ) )
347 p_sys->i_hq = FF_MB_DECISION_BITS;
348 else if( !strcmp( val.psz_string, "simple" ) )
349 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
351 p_sys->i_hq = FF_MB_DECISION_RD;
353 if( val.psz_string ) free( val.psz_string );
355 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
356 p_sys->i_qmin = val.i_int;
357 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
358 p_sys->i_qmax = val.i_int;
359 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
360 p_sys->b_trellis = val.b_bool;
362 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
363 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
364 p_context->strict_std_compliance = val.i_int;
366 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
367 p_sys->f_lumi_masking = val.f_float;
368 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
369 p_sys->f_dark_masking = val.f_float;
370 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
371 p_sys->f_p_masking = val.f_float;
372 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
373 p_sys->f_border_masking = val.f_float;
374 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
375 p_sys->i_luma_elim = val.i_int;
376 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
377 p_sys->i_chroma_elim = val.i_int;
379 if( p_enc->fmt_in.i_cat == VIDEO_ES )
381 int i_aspect_num, i_aspect_den;
383 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
385 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
386 p_enc->fmt_in.video.i_height );
391 p_context->width = p_enc->fmt_in.video.i_width;
392 p_context->height = p_enc->fmt_in.video.i_height;
394 #if LIBAVCODEC_BUILD >= 4754
395 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
396 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
398 p_context->frame_rate = p_enc->fmt_in.video.i_frame_rate;
399 p_context->frame_rate_base= p_enc->fmt_in.video.i_frame_rate_base;
402 /* Defaults from ffmpeg.c */
403 p_context->qblur = 0.5;
404 p_context->qcompress = 0.5;
405 p_context->b_quant_offset = 1.25;
406 p_context->b_quant_factor = 1.25;
407 p_context->i_quant_offset = 0.0;
408 p_context->i_quant_factor = -0.8;
410 p_context->lumi_masking = p_sys->f_lumi_masking;
411 p_context->dark_masking = p_sys->f_dark_masking;
412 p_context->p_masking = p_sys->f_p_masking;
413 #if LIBAVCODEC_BUILD >= 4741
414 p_context->border_masking = p_sys->f_border_masking;
416 p_context->luma_elim_threshold = p_sys->i_luma_elim;
417 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
419 if( p_sys->i_key_int > 0 )
420 p_context->gop_size = p_sys->i_key_int;
421 p_context->max_b_frames =
422 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
423 p_context->b_frame_strategy = 0;
425 #if LIBAVCODEC_BUILD >= 4687
426 av_reduce( &i_aspect_num, &i_aspect_den,
427 p_enc->fmt_in.video.i_aspect,
428 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
429 av_reduce( &p_context->sample_aspect_ratio.num,
430 &p_context->sample_aspect_ratio.den,
431 i_aspect_num * (int64_t)p_context->height,
432 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
434 p_context->aspect_ratio = ((float)p_enc->fmt_in.video.i_aspect) /
438 p_sys->p_buffer_out = malloc( AVCODEC_MAX_VIDEO_FRAME_SIZE );
440 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
441 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
442 #if LIBAVCODEC_BUILD >= 4714
443 if( p_codec->pix_fmts )
445 const enum PixelFormat *p = p_codec->pix_fmts;
446 for( ; *p != -1; p++ )
448 if( *p == p_context->pix_fmt ) break;
450 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
451 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
454 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
457 if ( p_sys->b_strict_rc )
459 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
460 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
461 /* This is from ffmpeg's ffmpeg.c : */
462 p_context->rc_initial_buffer_occupancy
463 = p_sys->i_rc_buffer_size * 3/4;
464 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
467 if ( p_sys->f_i_quant_factor != 0.0 )
468 p_context->i_quant_factor = p_sys->f_i_quant_factor;
470 #if LIBAVCODEC_BUILD >= 4690
471 p_context->noise_reduction = p_sys->i_noise_reduction;
474 if ( p_sys->b_mpeg4_matrix )
476 p_context->intra_matrix = mpeg4_default_intra_matrix;
477 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
480 if ( p_sys->b_pre_me )
482 p_context->pre_me = 1;
483 p_context->me_pre_cmp = FF_CMP_CHROMA;
486 if ( p_sys->b_interlace )
488 if ( p_context->height <= 280 )
490 if ( p_context->height != 16 || p_context->width != 16 )
492 "disabling interlaced video because height=%d <= 280",
497 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
498 #if LIBAVCODEC_BUILD >= 4698
499 if ( p_sys->b_interlace_me )
500 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
505 if ( p_sys->b_trellis )
506 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
508 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
509 p_context->flags |= CODEC_FLAG_QSCALE;
511 #if LIBAVCODEC_BUILD >= 4702
512 if ( p_enc->i_threads >= 1 )
513 p_context->thread_count = p_enc->i_threads;
516 if( p_sys->i_vtolerance > 0 )
517 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
519 if( p_sys->i_qmin > 0 )
520 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
521 if( p_sys->i_qmax > 0 )
522 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
523 p_context->max_qdiff = 3;
525 p_context->mb_decision = p_sys->i_hq;
527 if( p_sys->i_quality )
529 p_context->flags |= CODEC_FLAG_QSCALE;
530 #if LIBAVCODEC_BUILD >= 4668
531 p_context->global_quality = p_sys->i_quality;
535 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
537 /* work around bug in libmp3lame encoding */
538 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
539 p_enc->fmt_in.audio.i_channels = 2;
541 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
542 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
543 p_context->channels = p_enc->fmt_in.audio.i_channels;
546 /* Misc parameters */
547 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
549 if( i_codec_id == CODEC_ID_RAWVIDEO )
551 /* XXX: hack: Force same codec (will be handled by transcode) */
552 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
553 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
556 /* Make sure we get extradata filled by the encoder */
557 p_context->extradata_size = 0;
558 p_context->extradata = NULL;
559 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
561 vlc_mutex_lock( lockval.p_address );
562 if( avcodec_open( p_context, p_codec ) )
564 vlc_mutex_unlock( lockval.p_address );
565 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
566 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
567 || i_codec_id == CODEC_ID_MP3) )
569 if( p_context->channels > 2 )
571 p_context->channels = 2;
572 p_enc->fmt_in.audio.i_channels = 2; // FIXME
573 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
576 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
580 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
582 if ( p_enc->fmt_out.audio.i_rate
583 == mpa_freq_tab[i_frequency] )
586 if ( i_frequency == 6 )
588 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
589 p_enc->fmt_out.audio.i_rate );
594 for ( i = 1; i < 14; i++ )
596 if ( p_enc->fmt_out.i_bitrate / 1000
597 <= mpa_bitrate_tab[i_frequency / 3][i] )
600 if ( p_enc->fmt_out.i_bitrate / 1000
601 != mpa_bitrate_tab[i_frequency / 3][i] )
604 "MPEG audio doesn't support bitrate=%d, using %d",
605 p_enc->fmt_out.i_bitrate,
606 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
607 p_enc->fmt_out.i_bitrate =
608 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
609 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
613 p_context->codec = NULL;
614 vlc_mutex_lock( lockval.p_address );
615 if( avcodec_open( p_context, p_codec ) )
617 vlc_mutex_unlock( lockval.p_address );
618 msg_Err( p_enc, "cannot open encoder" );
619 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
620 _("VLC could not open the encoder.") );
627 msg_Err( p_enc, "cannot open encoder" );
628 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
629 _("VLC could not open the encoder.") );
634 vlc_mutex_unlock( lockval.p_address );
636 p_enc->fmt_out.i_extra = p_context->extradata_size;
637 if( p_enc->fmt_out.i_extra )
639 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
640 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
641 p_enc->fmt_out.i_extra );
643 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
645 if( p_enc->fmt_in.i_cat == AUDIO_ES )
647 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
648 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
649 p_sys->p_buffer = malloc( p_sys->i_frame_size );
652 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
657 /****************************************************************************
658 * Ffmpeg threading system
659 ****************************************************************************/
660 #if LIBAVCODEC_BUILD >= 4702
661 static int FfmpegThread( struct thread_context_t *p_context )
663 while ( !p_context->b_die && !p_context->b_error )
665 vlc_mutex_lock( &p_context->lock );
666 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
668 vlc_cond_wait( &p_context->cond, &p_context->lock );
670 p_context->b_work = 0;
671 vlc_mutex_unlock( &p_context->lock );
672 if ( p_context->b_die || p_context->b_error )
675 if ( p_context->pf_func )
677 p_context->i_ret = p_context->pf_func( p_context->p_context,
681 vlc_mutex_lock( &p_context->lock );
682 p_context->b_done = 1;
683 vlc_cond_signal( &p_context->cond );
684 vlc_mutex_unlock( &p_context->lock );
690 static int FfmpegExecute( AVCodecContext *s,
691 int (*pf_func)(AVCodecContext *c2, void *arg2),
692 void **arg, int *ret, int count )
694 struct thread_context_t ** pp_contexts =
695 (struct thread_context_t **)s->thread_opaque;
698 /* Note, we can be certain that this is not called with the same
699 * AVCodecContext by different threads at the same time */
700 for ( i = 0; i < count; i++ )
702 vlc_mutex_lock( &pp_contexts[i]->lock );
703 pp_contexts[i]->arg = arg[i];
704 pp_contexts[i]->pf_func = pf_func;
705 pp_contexts[i]->i_ret = 12345;
706 pp_contexts[i]->b_work = 1;
707 vlc_cond_signal( &pp_contexts[i]->cond );
708 vlc_mutex_unlock( &pp_contexts[i]->lock );
710 for ( i = 0; i < count; i++ )
712 vlc_mutex_lock( &pp_contexts[i]->lock );
713 while ( !pp_contexts[i]->b_done )
715 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
717 pp_contexts[i]->b_done = 0;
718 pp_contexts[i]->pf_func = NULL;
719 vlc_mutex_unlock( &pp_contexts[i]->lock );
723 ret[i] = pp_contexts[i]->i_ret;
731 /****************************************************************************
732 * EncodeVideo: the whole thing
733 ****************************************************************************/
734 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
736 encoder_sys_t *p_sys = p_enc->p_sys;
740 #if LIBAVCODEC_BUILD >= 4702
741 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
743 struct thread_context_t ** pp_contexts;
747 pp_contexts = malloc( sizeof(struct thread_context_t *)
748 * p_enc->i_threads );
749 p_sys->p_context->thread_opaque = (void *)pp_contexts;
751 for ( i = 0; i < p_enc->i_threads; i++ )
753 pp_contexts[i] = vlc_object_create( p_enc,
754 sizeof(struct thread_context_t) );
755 pp_contexts[i]->p_context = p_sys->p_context;
756 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
757 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
758 pp_contexts[i]->b_work = 0;
759 pp_contexts[i]->b_done = 0;
760 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
761 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
763 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
768 p_sys->p_context->execute = FfmpegExecute;
772 memset( &frame, 0, sizeof( AVFrame ) );
773 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
775 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
776 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
779 /* Let ffmpeg select the frame type */
782 frame.repeat_pict = p_pict->i_nb_fields - 2;
784 #if LIBAVCODEC_BUILD >= 4685
785 frame.interlaced_frame = !p_pict->b_progressive;
786 frame.top_field_first = !!p_pict->b_top_field_first;
789 #if LIBAVCODEC_BUILD < 4702
790 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
791 if( p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', 'g', 'v' ) ||
792 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '1', 'v' ) ||
793 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '2', 'v' ) )
798 frame.pts = p_pict->date ? p_pict->date : (signed int) AV_NOPTS_VALUE;
800 if ( p_sys->b_hurry_up && frame.pts != (signed int) AV_NOPTS_VALUE )
802 mtime_t current_date = mdate();
804 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
806 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
807 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
808 msg_Dbg( p_enc, "hurry up mode 3" );
812 p_sys->p_context->mb_decision = p_sys->i_hq;
814 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
816 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
817 #if LIBAVCODEC_BUILD >= 4690
818 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
819 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
821 msg_Dbg( p_enc, "hurry up mode 2" );
825 if ( p_sys->b_trellis )
826 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
827 #if LIBAVCODEC_BUILD >= 4690
828 p_sys->p_context->noise_reduction =
829 p_sys->i_noise_reduction;
834 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
836 frame.pict_type = FF_P_TYPE;
837 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
843 frame.pts = AV_NOPTS_VALUE;
846 if ( frame.pts != (signed int) AV_NOPTS_VALUE && frame.pts != 0 )
848 if ( p_sys->i_last_pts == frame.pts )
850 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
851 "same PTS (" I64Fd ")", frame.pts );
854 else if ( p_sys->i_last_pts > frame.pts )
856 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
857 "past (current: " I64Fd ", last: "I64Fd")",
858 frame.pts, p_sys->i_last_pts );
863 p_sys->i_last_pts = frame.pts;
867 frame.quality = p_sys->i_quality;
869 /* Ugly work-around for stupid libavcodec behaviour */
870 #if LIBAVCODEC_BUILD >= 4722
872 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
873 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
874 p_enc->fmt_in.video.i_frame_rate_base;
875 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
876 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
878 /* End work-around */
880 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
881 AVCODEC_MAX_VIDEO_FRAME_SIZE, &frame );
885 block_t *p_block = block_New( p_enc, i_out );
886 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
888 /* FIXME, 3-2 pulldown is not handled correctly */
889 p_block->i_length = I64C(1000000) *
890 p_enc->fmt_in.video.i_frame_rate_base /
891 p_enc->fmt_in.video.i_frame_rate;
893 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
895 /* No delay -> output pts == input pts */
896 p_block->i_pts = p_block->i_dts = p_pict->date;
898 else if( p_sys->p_context->coded_frame->pts != (signed int) AV_NOPTS_VALUE &&
899 p_sys->p_context->coded_frame->pts != 0 &&
900 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
902 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
903 p_block->i_pts = p_sys->p_context->coded_frame->pts;
905 /* Ugly work-around for stupid libavcodec behaviour */
906 #if LIBAVCODEC_BUILD >= 4722
908 int64_t i_framenum = p_block->i_pts *
909 p_enc->fmt_in.video.i_frame_rate /
910 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
912 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
915 /* End work-around */
917 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
918 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
920 p_block->i_dts = p_block->i_pts;
924 if( p_sys->i_last_ref_pts )
926 p_block->i_dts = p_sys->i_last_ref_pts;
930 /* Let's put something sensible */
931 p_block->i_dts = p_block->i_pts;
934 p_sys->i_last_ref_pts = p_block->i_pts;
939 /* Buggy libavcodec which doesn't update coded_frame->pts
941 p_block->i_dts = p_block->i_pts = p_pict->date;
944 switch ( p_sys->p_context->coded_frame->pict_type )
947 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
950 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
953 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
963 /****************************************************************************
964 * EncodeAudio: the whole thing
965 ****************************************************************************/
966 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
968 encoder_sys_t *p_sys = p_enc->p_sys;
969 block_t *p_block, *p_chain = NULL;
971 char *p_buffer = p_aout_buf->p_buffer;
972 int i_samples = p_aout_buf->i_nb_samples;
973 int i_samples_delay = p_sys->i_samples_delay;
975 p_sys->i_pts = p_aout_buf->start_date -
976 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
977 (mtime_t)p_enc->fmt_in.audio.i_rate;
979 p_sys->i_samples_delay += i_samples;
981 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
986 if( i_samples_delay )
988 /* Take care of the left-over from last time */
989 int i_delay_size = i_samples_delay * 2 *
990 p_sys->p_context->channels;
991 int i_size = p_sys->i_frame_size - i_delay_size;
993 p_samples = (int16_t *)p_sys->p_buffer;
994 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
995 p_buffer -= i_delay_size;
996 i_samples += i_samples_delay;
1001 p_samples = (int16_t *)p_buffer;
1004 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1005 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
1009 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1011 if( i_out < 0 ) break;
1013 p_buffer += p_sys->i_frame_size;
1014 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1015 i_samples -= p_sys->p_context->frame_size;
1017 if( i_out == 0 ) continue;
1019 p_block = block_New( p_enc, i_out );
1020 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1022 p_block->i_length = (mtime_t)1000000 *
1023 (mtime_t)p_sys->p_context->frame_size /
1024 (mtime_t)p_sys->p_context->sample_rate;
1026 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1029 p_sys->i_pts += p_block->i_length;
1030 block_ChainAppend( &p_chain, p_block );
1033 /* Backup the remaining raw samples */
1036 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1037 p_sys->p_context->channels, p_buffer,
1038 i_samples * 2 * p_sys->p_context->channels );
1044 /*****************************************************************************
1045 * CloseEncoder: ffmpeg encoder destruction
1046 *****************************************************************************/
1047 void E_(CloseEncoder)( vlc_object_t *p_this )
1049 encoder_t *p_enc = (encoder_t *)p_this;
1050 encoder_sys_t *p_sys = p_enc->p_sys;
1051 vlc_value_t lockval;
1053 var_Get( p_enc->p_libvlc, "avcodec", &lockval );
1055 #if LIBAVCODEC_BUILD >= 4702
1056 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1059 struct thread_context_t ** pp_contexts =
1060 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1061 for ( i = 0; i < p_enc->i_threads; i++ )
1063 pp_contexts[i]->b_die = 1;
1064 vlc_cond_signal( &pp_contexts[i]->cond );
1065 vlc_thread_join( pp_contexts[i] );
1066 vlc_mutex_destroy( &pp_contexts[i]->lock );
1067 vlc_cond_destroy( &pp_contexts[i]->cond );
1068 vlc_object_destroy( pp_contexts[i] );
1071 free( pp_contexts );
1075 vlc_mutex_lock( lockval.p_address );
1076 avcodec_close( p_sys->p_context );
1077 vlc_mutex_unlock( lockval.p_address );
1078 av_free( p_sys->p_context );
1080 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1081 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );