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_codec.h>
36 #include <vlc_interface.h>
40 #ifdef HAVE_FFMPEG_AVCODEC_H
41 # include <ffmpeg/avcodec.h>
48 #define HURRY_UP_GUARD1 (450000)
49 #define HURRY_UP_GUARD2 (300000)
50 #define HURRY_UP_GUARD3 (100000)
52 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
54 /*****************************************************************************
56 *****************************************************************************/
57 int E_(OpenEncoder) ( vlc_object_t * );
58 void E_(CloseEncoder)( vlc_object_t * );
60 static block_t *EncodeVideo( encoder_t *, picture_t * );
61 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
63 struct thread_context_t;
64 static int FfmpegThread( struct thread_context_t *p_context );
65 static int FfmpegExecute( AVCodecContext *s,
66 int (*pf_func)(AVCodecContext *c2, void *arg2),
67 void **arg, int *ret, int count );
69 /*****************************************************************************
70 * thread_context_t : for multithreaded encoding
71 *****************************************************************************/
72 struct thread_context_t
76 AVCodecContext *p_context;
77 int (* pf_func)(AVCodecContext *c, void *arg);
83 vlc_bool_t b_work, b_done;
86 /*****************************************************************************
87 * encoder_sys_t : ffmpeg encoder descriptor
88 *****************************************************************************/
95 AVCodecContext *p_context;
106 mtime_t i_last_ref_pts;
107 mtime_t i_buggy_pts_detect;
118 /* Encoding settings */
125 vlc_bool_t b_strict_rc;
126 int i_rc_buffer_size;
127 float f_rc_buffer_aggressivity;
129 vlc_bool_t b_hurry_up;
130 vlc_bool_t b_interlace, b_interlace_me;
131 float f_i_quant_factor;
132 int i_noise_reduction;
133 vlc_bool_t b_mpeg4_matrix;
134 vlc_bool_t b_trellis;
135 int i_quality; /* for VBR */
136 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
137 int i_luma_elim, i_chroma_elim;
139 /* Used to work around stupid timestamping behaviour in libavcodec */
141 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
144 static const char *ppsz_enc_options[] = {
145 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
146 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
147 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
148 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
149 "p-masking", "border-masking", "luma-elim-threshold",
150 "chroma-elim-threshold", NULL
153 static const uint16_t mpa_bitrate_tab[2][15] =
155 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
156 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
159 static const uint16_t mpa_freq_tab[6] =
160 { 44100, 48000, 32000, 22050, 24000, 16000 };
162 static const int16_t mpeg4_default_intra_matrix[64] = {
163 8, 17, 18, 19, 21, 23, 25, 27,
164 17, 18, 19, 21, 23, 25, 27, 28,
165 20, 21, 22, 23, 24, 26, 28, 30,
166 21, 22, 23, 24, 26, 28, 30, 32,
167 22, 23, 24, 26, 28, 30, 32, 35,
168 23, 24, 26, 28, 30, 32, 35, 38,
169 25, 26, 28, 30, 32, 35, 38, 41,
170 27, 28, 30, 32, 35, 38, 41, 45,
173 static const int16_t mpeg4_default_non_intra_matrix[64] = {
174 16, 17, 18, 19, 20, 21, 22, 23,
175 17, 18, 19, 20, 21, 22, 23, 24,
176 18, 19, 20, 21, 22, 23, 24, 25,
177 19, 20, 21, 22, 23, 24, 26, 27,
178 20, 21, 22, 23, 25, 26, 27, 28,
179 21, 22, 23, 24, 26, 27, 28, 30,
180 22, 23, 24, 26, 27, 28, 30, 31,
181 23, 24, 25, 27, 28, 30, 31, 33,
185 /*****************************************************************************
186 * OpenEncoder: probe the encoder
187 *****************************************************************************/
189 int E_(OpenEncoder)( vlc_object_t *p_this )
191 encoder_t *p_enc = (encoder_t *)p_this;
192 encoder_sys_t *p_sys = p_enc->p_sys;
193 AVCodecContext *p_context;
195 int i_codec_id, i_cat;
196 const char *psz_namecodec;
199 if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
202 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
204 /* handed chroma output */
208 i_codec_id = CODEC_ID_RAWVIDEO;
209 psz_namecodec = "Raw video";
212 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
214 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
215 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
216 _("\"%s\" is no video encoder."), psz_namecodec );
220 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
222 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
223 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
224 _("\"%s\" is no audio encoder."), psz_namecodec );
228 /* Initialization must be done before avcodec_find_encoder() */
229 E_(InitLibavcodec)(p_this);
231 p_codec = avcodec_find_encoder( i_codec_id );
234 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
235 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
236 _("VLC could not find encoder \"%s\"."), psz_namecodec );
240 /* Allocate the memory needed to store the encoder's structure */
241 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
243 msg_Err( p_enc, "out of memory" );
246 memset( p_sys, 0, sizeof(encoder_sys_t) );
247 p_enc->p_sys = p_sys;
248 p_sys->p_codec = p_codec;
250 p_enc->pf_encode_video = EncodeVideo;
251 p_enc->pf_encode_audio = EncodeAudio;
253 p_sys->p_buffer_out = NULL;
254 p_sys->p_buffer = NULL;
256 p_sys->p_context = p_context = avcodec_alloc_context();
257 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
258 p_context->opaque = (void *)p_this;
260 /* Set CPU capabilities */
261 unsigned i_cpu = vlc_CPU();
262 p_context->dsp_mask = 0;
263 if( !(i_cpu & CPU_CAPABILITY_MMX) )
265 p_context->dsp_mask |= FF_MM_MMX;
267 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
269 p_context->dsp_mask |= FF_MM_MMXEXT;
271 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
273 p_context->dsp_mask |= FF_MM_3DNOW;
275 if( !(i_cpu & CPU_CAPABILITY_SSE) )
277 p_context->dsp_mask |= FF_MM_SSE;
278 p_context->dsp_mask |= FF_MM_SSE2;
281 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
283 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
284 p_sys->i_key_int = val.i_int;
286 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
287 p_sys->i_b_frames = val.i_int;
289 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
290 p_sys->i_vtolerance = val.i_int;
292 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
293 p_sys->b_interlace = val.b_bool;
295 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
296 p_sys->b_interlace_me = val.b_bool;
298 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
299 p_sys->b_pre_me = val.b_bool;
301 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
302 p_sys->b_hurry_up = val.b_bool;
303 if( p_sys->b_hurry_up )
305 /* hurry up mode needs noise reduction, even small */
306 p_sys->i_noise_reduction = 1;
309 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
310 p_sys->b_strict_rc = val.b_bool;
311 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
312 p_sys->i_rc_buffer_size = val.i_int;
313 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
314 p_sys->f_rc_buffer_aggressivity = val.f_float;
316 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
317 p_sys->f_i_quant_factor = val.f_float;
319 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
320 p_sys->i_noise_reduction = val.i_int;
322 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
323 p_sys->b_mpeg4_matrix = val.b_bool;
325 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
326 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
327 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
329 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
330 if( val.psz_string && *val.psz_string )
332 if( !strcmp( val.psz_string, "rd" ) )
333 p_sys->i_hq = FF_MB_DECISION_RD;
334 else if( !strcmp( val.psz_string, "bits" ) )
335 p_sys->i_hq = FF_MB_DECISION_BITS;
336 else if( !strcmp( val.psz_string, "simple" ) )
337 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
339 p_sys->i_hq = FF_MB_DECISION_RD;
341 if( val.psz_string ) free( val.psz_string );
343 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
344 p_sys->i_qmin = val.i_int;
345 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
346 p_sys->i_qmax = val.i_int;
347 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
348 p_sys->b_trellis = val.b_bool;
350 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
351 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
352 p_context->strict_std_compliance = val.i_int;
354 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
355 p_sys->f_lumi_masking = val.f_float;
356 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
357 p_sys->f_dark_masking = val.f_float;
358 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
359 p_sys->f_p_masking = val.f_float;
360 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
361 p_sys->f_border_masking = val.f_float;
362 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
363 p_sys->i_luma_elim = val.i_int;
364 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
365 p_sys->i_chroma_elim = val.i_int;
367 if( p_enc->fmt_in.i_cat == VIDEO_ES )
369 int i_aspect_num, i_aspect_den;
371 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
373 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
374 p_enc->fmt_in.video.i_height );
379 p_context->width = p_enc->fmt_in.video.i_width;
380 p_context->height = p_enc->fmt_in.video.i_height;
381 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
382 && (p_context->width > 720 || p_context->height > 576) )
383 p_context->level = 4; /* High level */
385 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
386 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
388 /* Defaults from ffmpeg.c */
389 p_context->qblur = 0.5;
390 p_context->qcompress = 0.5;
391 p_context->b_quant_offset = 1.25;
392 p_context->b_quant_factor = 1.25;
393 p_context->i_quant_offset = 0.0;
394 p_context->i_quant_factor = -0.8;
396 p_context->lumi_masking = p_sys->f_lumi_masking;
397 p_context->dark_masking = p_sys->f_dark_masking;
398 p_context->p_masking = p_sys->f_p_masking;
399 p_context->border_masking = p_sys->f_border_masking;
400 p_context->luma_elim_threshold = p_sys->i_luma_elim;
401 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
403 if( p_sys->i_key_int > 0 )
404 p_context->gop_size = p_sys->i_key_int;
405 p_context->max_b_frames =
406 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
407 p_context->b_frame_strategy = 0;
408 if( !p_context->max_b_frames &&
409 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
410 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
411 p_context->flags |= CODEC_FLAG_LOW_DELAY;
413 av_reduce( &i_aspect_num, &i_aspect_den,
414 p_enc->fmt_in.video.i_aspect,
415 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
416 av_reduce( &p_context->sample_aspect_ratio.num,
417 &p_context->sample_aspect_ratio.den,
418 i_aspect_num * (int64_t)p_context->height,
419 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
421 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
423 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
424 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
425 if( p_codec->pix_fmts )
427 const enum PixelFormat *p = p_codec->pix_fmts;
428 for( ; *p != -1; p++ )
430 if( *p == p_context->pix_fmt ) break;
432 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
433 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
436 if ( p_sys->b_strict_rc )
438 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
439 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
440 /* This is from ffmpeg's ffmpeg.c : */
441 p_context->rc_initial_buffer_occupancy
442 = p_sys->i_rc_buffer_size * 3/4;
443 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
446 if ( p_sys->f_i_quant_factor != 0.0 )
447 p_context->i_quant_factor = p_sys->f_i_quant_factor;
449 p_context->noise_reduction = p_sys->i_noise_reduction;
451 if ( p_sys->b_mpeg4_matrix )
453 p_context->intra_matrix = mpeg4_default_intra_matrix;
454 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
457 if ( p_sys->b_pre_me )
459 p_context->pre_me = 1;
460 p_context->me_pre_cmp = FF_CMP_CHROMA;
463 if ( p_sys->b_interlace )
465 if ( p_context->height <= 280 )
467 if ( p_context->height != 16 || p_context->width != 16 )
469 "disabling interlaced video because height=%d <= 280",
474 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
475 if ( p_sys->b_interlace_me )
476 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
480 if ( p_sys->b_trellis )
481 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
483 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
484 p_context->flags |= CODEC_FLAG_QSCALE;
486 if ( p_enc->i_threads >= 1 )
487 p_context->thread_count = p_enc->i_threads;
489 if( p_sys->i_vtolerance > 0 )
490 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
492 if( p_sys->i_qmin > 0 )
493 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
494 if( p_sys->i_qmax > 0 )
495 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
496 p_context->max_qdiff = 3;
498 p_context->mb_decision = p_sys->i_hq;
500 if( p_sys->i_quality )
502 p_context->flags |= CODEC_FLAG_QSCALE;
503 p_context->global_quality = p_sys->i_quality;
506 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
508 /* work around bug in libmp3lame encoding */
509 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
510 p_enc->fmt_in.audio.i_channels = 2;
512 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
513 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
514 p_context->channels = p_enc->fmt_in.audio.i_channels;
517 /* Misc parameters */
518 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
520 if( i_codec_id == CODEC_ID_RAWVIDEO )
522 /* XXX: hack: Force same codec (will be handled by transcode) */
523 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
524 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
527 /* Make sure we get extradata filled by the encoder */
528 p_context->extradata_size = 0;
529 p_context->extradata = NULL;
530 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
532 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
534 if( avcodec_open( p_context, p_codec ) )
536 vlc_mutex_unlock( lock );
537 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
538 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
539 || i_codec_id == CODEC_ID_MP3) )
541 if( p_context->channels > 2 )
543 p_context->channels = 2;
544 p_enc->fmt_in.audio.i_channels = 2; // FIXME
545 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
548 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
552 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
554 if ( p_enc->fmt_out.audio.i_rate
555 == mpa_freq_tab[i_frequency] )
558 if ( i_frequency == 6 )
560 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
561 p_enc->fmt_out.audio.i_rate );
566 for ( i = 1; i < 14; i++ )
568 if ( p_enc->fmt_out.i_bitrate / 1000
569 <= mpa_bitrate_tab[i_frequency / 3][i] )
572 if ( p_enc->fmt_out.i_bitrate / 1000
573 != mpa_bitrate_tab[i_frequency / 3][i] )
576 "MPEG audio doesn't support bitrate=%d, using %d",
577 p_enc->fmt_out.i_bitrate,
578 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
579 p_enc->fmt_out.i_bitrate =
580 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
581 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
585 p_context->codec = NULL;
586 vlc_mutex_lock( lock );
587 if( avcodec_open( p_context, p_codec ) )
589 vlc_mutex_unlock( lock );
590 msg_Err( p_enc, "cannot open encoder" );
591 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
592 _("VLC could not open the encoder.") );
599 msg_Err( p_enc, "cannot open encoder" );
600 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
601 _("VLC could not open the encoder.") );
606 vlc_mutex_unlock( lock);
608 p_enc->fmt_out.i_extra = p_context->extradata_size;
609 if( p_enc->fmt_out.i_extra )
611 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
612 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
613 p_enc->fmt_out.i_extra );
615 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
617 if( p_enc->fmt_in.i_cat == AUDIO_ES )
619 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
620 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
621 p_sys->p_buffer = malloc( p_sys->i_frame_size );
622 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
625 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
630 /****************************************************************************
631 * Ffmpeg threading system
632 ****************************************************************************/
633 static int FfmpegThread( struct thread_context_t *p_context )
635 while ( !p_context->b_die && !p_context->b_error )
637 vlc_mutex_lock( &p_context->lock );
638 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
640 vlc_cond_wait( &p_context->cond, &p_context->lock );
642 p_context->b_work = 0;
643 vlc_mutex_unlock( &p_context->lock );
644 if ( p_context->b_die || p_context->b_error )
647 if ( p_context->pf_func )
649 p_context->i_ret = p_context->pf_func( p_context->p_context,
653 vlc_mutex_lock( &p_context->lock );
654 p_context->b_done = 1;
655 vlc_cond_signal( &p_context->cond );
656 vlc_mutex_unlock( &p_context->lock );
662 static int FfmpegExecute( AVCodecContext *s,
663 int (*pf_func)(AVCodecContext *c2, void *arg2),
664 void **arg, int *ret, int count )
666 struct thread_context_t ** pp_contexts =
667 (struct thread_context_t **)s->thread_opaque;
670 /* Note, we can be certain that this is not called with the same
671 * AVCodecContext by different threads at the same time */
672 for ( i = 0; i < count; i++ )
674 vlc_mutex_lock( &pp_contexts[i]->lock );
675 pp_contexts[i]->arg = arg[i];
676 pp_contexts[i]->pf_func = pf_func;
677 pp_contexts[i]->i_ret = 12345;
678 pp_contexts[i]->b_work = 1;
679 vlc_cond_signal( &pp_contexts[i]->cond );
680 vlc_mutex_unlock( &pp_contexts[i]->lock );
682 for ( i = 0; i < count; i++ )
684 vlc_mutex_lock( &pp_contexts[i]->lock );
685 while ( !pp_contexts[i]->b_done )
687 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
689 pp_contexts[i]->b_done = 0;
690 pp_contexts[i]->pf_func = NULL;
691 vlc_mutex_unlock( &pp_contexts[i]->lock );
695 ret[i] = pp_contexts[i]->i_ret;
702 /****************************************************************************
703 * EncodeVideo: the whole thing
704 ****************************************************************************/
705 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
707 encoder_sys_t *p_sys = p_enc->p_sys;
711 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
713 struct thread_context_t ** pp_contexts;
717 pp_contexts = malloc( sizeof(struct thread_context_t *)
718 * p_enc->i_threads );
719 p_sys->p_context->thread_opaque = (void *)pp_contexts;
721 for ( i = 0; i < p_enc->i_threads; i++ )
723 pp_contexts[i] = vlc_object_create( p_enc,
724 sizeof(struct thread_context_t) );
725 pp_contexts[i]->p_context = p_sys->p_context;
726 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
727 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
728 pp_contexts[i]->b_work = 0;
729 pp_contexts[i]->b_done = 0;
730 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
731 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
733 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
738 p_sys->p_context->execute = FfmpegExecute;
741 memset( &frame, 0, sizeof( AVFrame ) );
742 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
744 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
745 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
748 /* Let ffmpeg select the frame type */
751 frame.repeat_pict = p_pict->i_nb_fields - 2;
752 frame.interlaced_frame = !p_pict->b_progressive;
753 frame.top_field_first = !!p_pict->b_top_field_first;
755 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
756 if( p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', 'g', 'v' ) ||
757 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '1', 'v' ) ||
758 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '2', 'v' ) )
760 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
762 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
764 mtime_t current_date = mdate();
766 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
768 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
769 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
770 msg_Dbg( p_enc, "hurry up mode 3" );
774 p_sys->p_context->mb_decision = p_sys->i_hq;
776 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
778 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
779 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
780 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
781 msg_Dbg( p_enc, "hurry up mode 2" );
785 if ( p_sys->b_trellis )
786 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
788 p_sys->p_context->noise_reduction =
789 p_sys->i_noise_reduction;
793 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
795 frame.pict_type = FF_P_TYPE;
796 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
802 frame.pts = (int64_t)AV_NOPTS_VALUE;
805 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
807 if ( p_sys->i_last_pts == frame.pts )
809 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
810 "same PTS (" I64Fd ")", frame.pts );
813 else if ( p_sys->i_last_pts > frame.pts )
815 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
816 "past (current: " I64Fd ", last: "I64Fd")",
817 frame.pts, p_sys->i_last_pts );
822 p_sys->i_last_pts = frame.pts;
826 frame.quality = p_sys->i_quality;
828 /* Ugly work-around for stupid libavcodec behaviour */
830 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
831 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
832 p_enc->fmt_in.video.i_frame_rate_base;
833 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
834 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
835 /* End work-around */
837 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
838 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
842 block_t *p_block = block_New( p_enc, i_out );
843 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
845 /* FIXME, 3-2 pulldown is not handled correctly */
846 p_block->i_length = I64C(1000000) *
847 p_enc->fmt_in.video.i_frame_rate_base /
848 p_enc->fmt_in.video.i_frame_rate;
850 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
852 /* No delay -> output pts == input pts */
853 p_block->i_pts = p_block->i_dts = p_pict->date;
855 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
856 p_sys->p_context->coded_frame->pts != 0 &&
857 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
859 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
860 p_block->i_pts = p_sys->p_context->coded_frame->pts;
862 /* Ugly work-around for stupid libavcodec behaviour */
864 int64_t i_framenum = p_block->i_pts *
865 p_enc->fmt_in.video.i_frame_rate /
866 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
868 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
870 /* End work-around */
872 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
873 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
875 p_block->i_dts = p_block->i_pts;
879 if( p_sys->i_last_ref_pts )
881 p_block->i_dts = p_sys->i_last_ref_pts;
885 /* Let's put something sensible */
886 p_block->i_dts = p_block->i_pts;
889 p_sys->i_last_ref_pts = p_block->i_pts;
894 /* Buggy libavcodec which doesn't update coded_frame->pts
896 p_block->i_dts = p_block->i_pts = p_pict->date;
899 switch ( p_sys->p_context->coded_frame->pict_type )
902 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
905 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
908 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
918 /****************************************************************************
919 * EncodeAudio: the whole thing
920 ****************************************************************************/
921 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
923 encoder_sys_t *p_sys = p_enc->p_sys;
924 block_t *p_block, *p_chain = NULL;
926 uint8_t *p_buffer = p_aout_buf->p_buffer;
927 int i_samples = p_aout_buf->i_nb_samples;
928 int i_samples_delay = p_sys->i_samples_delay;
930 p_sys->i_pts = p_aout_buf->start_date -
931 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
932 (mtime_t)p_enc->fmt_in.audio.i_rate;
934 p_sys->i_samples_delay += i_samples;
936 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
941 if( i_samples_delay )
943 /* Take care of the left-over from last time */
944 int i_delay_size = i_samples_delay * 2 *
945 p_sys->p_context->channels;
946 int i_size = p_sys->i_frame_size - i_delay_size;
948 p_samples = (int16_t *)p_sys->p_buffer;
949 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
950 p_buffer -= i_delay_size;
951 i_samples += i_samples_delay;
956 p_samples = (int16_t *)p_buffer;
959 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
960 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
964 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
966 if( i_out < 0 ) break;
968 p_buffer += p_sys->i_frame_size;
969 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
970 i_samples -= p_sys->p_context->frame_size;
972 if( i_out == 0 ) continue;
974 p_block = block_New( p_enc, i_out );
975 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
977 p_block->i_length = (mtime_t)1000000 *
978 (mtime_t)p_sys->p_context->frame_size /
979 (mtime_t)p_sys->p_context->sample_rate;
981 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
984 p_sys->i_pts += p_block->i_length;
985 block_ChainAppend( &p_chain, p_block );
988 /* Backup the remaining raw samples */
991 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
992 p_sys->p_context->channels, p_buffer,
993 i_samples * 2 * p_sys->p_context->channels );
999 /*****************************************************************************
1000 * CloseEncoder: ffmpeg encoder destruction
1001 *****************************************************************************/
1002 void E_(CloseEncoder)( vlc_object_t *p_this )
1004 encoder_t *p_enc = (encoder_t *)p_this;
1005 encoder_sys_t *p_sys = p_enc->p_sys;
1007 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1010 struct thread_context_t ** pp_contexts =
1011 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1012 for ( i = 0; i < p_enc->i_threads; i++ )
1014 vlc_object_kill( pp_contexts[i] );
1015 vlc_cond_signal( &pp_contexts[i]->cond );
1016 vlc_thread_join( pp_contexts[i] );
1017 vlc_mutex_destroy( &pp_contexts[i]->lock );
1018 vlc_cond_destroy( &pp_contexts[i]->cond );
1019 vlc_object_destroy( pp_contexts[i] );
1022 free( pp_contexts );
1025 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1026 avcodec_close( p_sys->p_context );
1027 vlc_mutex_unlock( lock );
1028 av_free( p_sys->p_context );
1030 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1031 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );