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 *****************************************************************************/
39 #include <vlc_codec.h>
40 #include <vlc_interface.h>
44 #ifdef HAVE_FFMPEG_AVCODEC_H
45 # include <ffmpeg/avcodec.h>
52 #define HURRY_UP_GUARD1 (450000)
53 #define HURRY_UP_GUARD2 (300000)
54 #define HURRY_UP_GUARD3 (100000)
56 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
58 /*****************************************************************************
60 *****************************************************************************/
61 int E_(OpenEncoder) ( vlc_object_t * );
62 void E_(CloseEncoder)( vlc_object_t * );
64 static block_t *EncodeVideo( encoder_t *, picture_t * );
65 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
67 struct thread_context_t;
68 static int FfmpegThread( struct thread_context_t *p_context );
69 static int FfmpegExecute( AVCodecContext *s,
70 int (*pf_func)(AVCodecContext *c2, void *arg2),
71 void **arg, int *ret, int count );
73 /*****************************************************************************
74 * thread_context_t : for multithreaded encoding
75 *****************************************************************************/
76 struct thread_context_t
80 AVCodecContext *p_context;
81 int (* pf_func)(AVCodecContext *c, void *arg);
87 vlc_bool_t b_work, b_done;
90 /*****************************************************************************
91 * encoder_sys_t : ffmpeg encoder descriptor
92 *****************************************************************************/
99 AVCodecContext *p_context;
110 mtime_t i_last_ref_pts;
111 mtime_t i_buggy_pts_detect;
122 /* Encoding settings */
129 vlc_bool_t b_strict_rc;
130 int i_rc_buffer_size;
131 float f_rc_buffer_aggressivity;
133 vlc_bool_t b_hurry_up;
134 vlc_bool_t b_interlace, b_interlace_me;
135 float f_i_quant_factor;
136 int i_noise_reduction;
137 vlc_bool_t b_mpeg4_matrix;
138 vlc_bool_t b_trellis;
139 int i_quality; /* for VBR */
140 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
141 int i_luma_elim, i_chroma_elim;
143 /* Used to work around stupid timestamping behaviour in libavcodec */
145 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
148 static const char *ppsz_enc_options[] = {
149 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
150 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
151 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
152 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
153 "p-masking", "border-masking", "luma-elim-threshold",
154 "chroma-elim-threshold", NULL
157 static const uint16_t mpa_bitrate_tab[2][15] =
159 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
160 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
163 static const uint16_t mpa_freq_tab[6] =
164 { 44100, 48000, 32000, 22050, 24000, 16000 };
166 static const int16_t mpeg4_default_intra_matrix[64] = {
167 8, 17, 18, 19, 21, 23, 25, 27,
168 17, 18, 19, 21, 23, 25, 27, 28,
169 20, 21, 22, 23, 24, 26, 28, 30,
170 21, 22, 23, 24, 26, 28, 30, 32,
171 22, 23, 24, 26, 28, 30, 32, 35,
172 23, 24, 26, 28, 30, 32, 35, 38,
173 25, 26, 28, 30, 32, 35, 38, 41,
174 27, 28, 30, 32, 35, 38, 41, 45,
177 static const int16_t mpeg4_default_non_intra_matrix[64] = {
178 16, 17, 18, 19, 20, 21, 22, 23,
179 17, 18, 19, 20, 21, 22, 23, 24,
180 18, 19, 20, 21, 22, 23, 24, 25,
181 19, 20, 21, 22, 23, 24, 26, 27,
182 20, 21, 22, 23, 25, 26, 27, 28,
183 21, 22, 23, 24, 26, 27, 28, 30,
184 22, 23, 24, 26, 27, 28, 30, 31,
185 23, 24, 25, 27, 28, 30, 31, 33,
189 /*****************************************************************************
190 * OpenEncoder: probe the encoder
191 *****************************************************************************/
193 int E_(OpenEncoder)( vlc_object_t *p_this )
195 encoder_t *p_enc = (encoder_t *)p_this;
196 encoder_sys_t *p_sys = p_enc->p_sys;
197 AVCodecContext *p_context;
199 int i_codec_id, i_cat;
200 const char *psz_namecodec;
203 if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
206 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
208 /* handed chroma output */
212 i_codec_id = CODEC_ID_RAWVIDEO;
213 psz_namecodec = "Raw video";
216 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
218 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
219 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
220 _("\"%s\" is no video encoder."), psz_namecodec );
224 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
226 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
227 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
228 _("\"%s\" is no audio encoder."), psz_namecodec );
232 /* Initialization must be done before avcodec_find_encoder() */
233 E_(InitLibavcodec)(p_this);
235 p_codec = avcodec_find_encoder( i_codec_id );
238 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
239 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
240 _("VLC could not find encoder \"%s\"."), psz_namecodec );
244 /* Allocate the memory needed to store the encoder's structure */
245 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
247 msg_Err( p_enc, "out of memory" );
250 memset( p_sys, 0, sizeof(encoder_sys_t) );
251 p_enc->p_sys = p_sys;
252 p_sys->p_codec = p_codec;
254 p_enc->pf_encode_video = EncodeVideo;
255 p_enc->pf_encode_audio = EncodeAudio;
257 p_sys->p_buffer_out = NULL;
258 p_sys->p_buffer = NULL;
260 p_sys->p_context = p_context = avcodec_alloc_context();
261 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
262 p_context->opaque = (void *)p_this;
264 /* Set CPU capabilities */
265 unsigned i_cpu = vlc_CPU();
266 p_context->dsp_mask = 0;
267 if( !(i_cpu & CPU_CAPABILITY_MMX) )
269 p_context->dsp_mask |= FF_MM_MMX;
271 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
273 p_context->dsp_mask |= FF_MM_MMXEXT;
275 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
277 p_context->dsp_mask |= FF_MM_3DNOW;
279 if( !(i_cpu & CPU_CAPABILITY_SSE) )
281 p_context->dsp_mask |= FF_MM_SSE;
282 p_context->dsp_mask |= FF_MM_SSE2;
285 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
287 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
288 p_sys->i_key_int = val.i_int;
290 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
291 p_sys->i_b_frames = val.i_int;
293 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
294 p_sys->i_vtolerance = val.i_int;
296 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
297 p_sys->b_interlace = val.b_bool;
299 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
300 p_sys->b_interlace_me = val.b_bool;
302 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
303 p_sys->b_pre_me = val.b_bool;
305 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
306 p_sys->b_hurry_up = val.b_bool;
307 if( p_sys->b_hurry_up )
309 /* hurry up mode needs noise reduction, even small */
310 p_sys->i_noise_reduction = 1;
313 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
314 p_sys->b_strict_rc = val.b_bool;
315 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
316 p_sys->i_rc_buffer_size = val.i_int;
317 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
318 p_sys->f_rc_buffer_aggressivity = val.f_float;
320 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
321 p_sys->f_i_quant_factor = val.f_float;
323 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
324 p_sys->i_noise_reduction = val.i_int;
326 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
327 p_sys->b_mpeg4_matrix = val.b_bool;
329 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
330 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
331 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
333 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
334 if( val.psz_string && *val.psz_string )
336 if( !strcmp( val.psz_string, "rd" ) )
337 p_sys->i_hq = FF_MB_DECISION_RD;
338 else if( !strcmp( val.psz_string, "bits" ) )
339 p_sys->i_hq = FF_MB_DECISION_BITS;
340 else if( !strcmp( val.psz_string, "simple" ) )
341 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
343 p_sys->i_hq = FF_MB_DECISION_RD;
346 p_sys->i_hq = FF_MB_DECISION_RD;
347 if( val.psz_string ) free( val.psz_string );
349 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
350 p_sys->i_qmin = val.i_int;
351 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
352 p_sys->i_qmax = val.i_int;
353 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
354 p_sys->b_trellis = val.b_bool;
356 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
357 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
358 p_context->strict_std_compliance = val.i_int;
360 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
361 p_sys->f_lumi_masking = val.f_float;
362 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
363 p_sys->f_dark_masking = val.f_float;
364 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
365 p_sys->f_p_masking = val.f_float;
366 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
367 p_sys->f_border_masking = val.f_float;
368 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
369 p_sys->i_luma_elim = val.i_int;
370 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
371 p_sys->i_chroma_elim = val.i_int;
373 if( p_enc->fmt_in.i_cat == VIDEO_ES )
375 int i_aspect_num, i_aspect_den;
377 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
379 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
380 p_enc->fmt_in.video.i_height );
385 p_context->width = p_enc->fmt_in.video.i_width;
386 p_context->height = p_enc->fmt_in.video.i_height;
387 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
388 && (p_context->width > 720 || p_context->height > 576) )
389 p_context->level = 4; /* High level */
391 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
392 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
394 /* Defaults from ffmpeg.c */
395 p_context->qblur = 0.5;
396 p_context->qcompress = 0.5;
397 p_context->b_quant_offset = 1.25;
398 p_context->b_quant_factor = 1.25;
399 p_context->i_quant_offset = 0.0;
400 p_context->i_quant_factor = -0.8;
402 p_context->lumi_masking = p_sys->f_lumi_masking;
403 p_context->dark_masking = p_sys->f_dark_masking;
404 p_context->p_masking = p_sys->f_p_masking;
405 p_context->border_masking = p_sys->f_border_masking;
406 p_context->luma_elim_threshold = p_sys->i_luma_elim;
407 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
409 if( p_sys->i_key_int > 0 )
410 p_context->gop_size = p_sys->i_key_int;
411 p_context->max_b_frames =
412 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
413 p_context->b_frame_strategy = 0;
414 if( !p_context->max_b_frames &&
415 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
416 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
417 p_context->flags |= CODEC_FLAG_LOW_DELAY;
419 av_reduce( &i_aspect_num, &i_aspect_den,
420 p_enc->fmt_in.video.i_aspect,
421 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
422 av_reduce( &p_context->sample_aspect_ratio.num,
423 &p_context->sample_aspect_ratio.den,
424 i_aspect_num * (int64_t)p_context->height,
425 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
427 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
429 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
430 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
431 if( p_codec->pix_fmts )
433 const enum PixelFormat *p = p_codec->pix_fmts;
434 for( ; *p != -1; p++ )
436 if( *p == p_context->pix_fmt ) break;
438 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
439 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
442 if ( p_sys->b_strict_rc )
444 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
445 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
446 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
447 /* This is from ffmpeg's ffmpeg.c : */
448 p_context->rc_initial_buffer_occupancy
449 = p_sys->i_rc_buffer_size * 3/4;
450 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
453 if ( p_sys->f_i_quant_factor != 0.0 )
454 p_context->i_quant_factor = p_sys->f_i_quant_factor;
456 p_context->noise_reduction = p_sys->i_noise_reduction;
458 if ( p_sys->b_mpeg4_matrix )
460 p_context->intra_matrix = mpeg4_default_intra_matrix;
461 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
464 if ( p_sys->b_pre_me )
466 p_context->pre_me = 1;
467 p_context->me_pre_cmp = FF_CMP_CHROMA;
470 if ( p_sys->b_interlace )
472 if ( p_context->height <= 280 )
474 if ( p_context->height != 16 || p_context->width != 16 )
476 "disabling interlaced video because height=%d <= 280",
481 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
482 if ( p_sys->b_interlace_me )
483 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
487 if ( p_sys->b_trellis )
488 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
490 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
491 p_context->flags |= CODEC_FLAG_QSCALE;
493 if ( p_enc->i_threads >= 1 )
494 p_context->thread_count = p_enc->i_threads;
496 if( p_sys->i_vtolerance > 0 )
497 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
499 if( p_sys->i_qmin > 0 )
500 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
501 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
502 if( p_sys->i_qmax > 0 )
503 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
504 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
505 p_context->max_qdiff = 3;
507 p_context->mb_decision = p_sys->i_hq;
509 if( p_sys->i_quality )
511 p_context->flags |= CODEC_FLAG_QSCALE;
512 p_context->global_quality = p_sys->i_quality;
515 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
517 /* work around bug in libmp3lame encoding */
518 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
519 p_enc->fmt_in.audio.i_channels = 2;
521 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
522 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
523 p_context->channels = p_enc->fmt_in.audio.i_channels;
526 /* Misc parameters */
527 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
529 if( i_codec_id == CODEC_ID_RAWVIDEO )
531 /* XXX: hack: Force same codec (will be handled by transcode) */
532 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
533 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
536 /* Make sure we get extradata filled by the encoder */
537 p_context->extradata_size = 0;
538 p_context->extradata = NULL;
539 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
541 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
543 if( avcodec_open( p_context, p_codec ) )
545 vlc_mutex_unlock( lock );
546 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
547 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
548 || i_codec_id == CODEC_ID_MP3) )
550 if( p_context->channels > 2 )
552 p_context->channels = 2;
553 p_enc->fmt_in.audio.i_channels = 2; // FIXME
554 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
557 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
561 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
563 if ( p_enc->fmt_out.audio.i_rate
564 == mpa_freq_tab[i_frequency] )
567 if ( i_frequency == 6 )
569 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
570 p_enc->fmt_out.audio.i_rate );
575 for ( i = 1; i < 14; i++ )
577 if ( p_enc->fmt_out.i_bitrate / 1000
578 <= mpa_bitrate_tab[i_frequency / 3][i] )
581 if ( p_enc->fmt_out.i_bitrate / 1000
582 != mpa_bitrate_tab[i_frequency / 3][i] )
585 "MPEG audio doesn't support bitrate=%d, using %d",
586 p_enc->fmt_out.i_bitrate,
587 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
588 p_enc->fmt_out.i_bitrate =
589 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
590 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
594 p_context->codec = NULL;
595 vlc_mutex_lock( lock );
596 if( avcodec_open( p_context, p_codec ) )
598 vlc_mutex_unlock( lock );
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.") );
608 msg_Err( p_enc, "cannot open encoder" );
609 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
610 _("VLC could not open the encoder.") );
615 vlc_mutex_unlock( lock);
617 p_enc->fmt_out.i_extra = p_context->extradata_size;
618 if( p_enc->fmt_out.i_extra )
620 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
621 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
622 p_enc->fmt_out.i_extra );
624 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
626 if( p_enc->fmt_in.i_cat == AUDIO_ES )
628 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
629 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
630 p_sys->p_buffer = malloc( p_sys->i_frame_size );
631 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
634 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
639 /****************************************************************************
640 * Ffmpeg threading system
641 ****************************************************************************/
642 static int FfmpegThread( struct thread_context_t *p_context )
644 while ( !p_context->b_die && !p_context->b_error )
646 vlc_mutex_lock( &p_context->lock );
647 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
649 vlc_cond_wait( &p_context->cond, &p_context->lock );
651 p_context->b_work = 0;
652 vlc_mutex_unlock( &p_context->lock );
653 if ( p_context->b_die || p_context->b_error )
656 if ( p_context->pf_func )
658 p_context->i_ret = p_context->pf_func( p_context->p_context,
662 vlc_mutex_lock( &p_context->lock );
663 p_context->b_done = 1;
664 vlc_cond_signal( &p_context->cond );
665 vlc_mutex_unlock( &p_context->lock );
671 static int FfmpegExecute( AVCodecContext *s,
672 int (*pf_func)(AVCodecContext *c2, void *arg2),
673 void **arg, int *ret, int count )
675 struct thread_context_t ** pp_contexts =
676 (struct thread_context_t **)s->thread_opaque;
679 /* Note, we can be certain that this is not called with the same
680 * AVCodecContext by different threads at the same time */
681 for ( i = 0; i < count; i++ )
683 vlc_mutex_lock( &pp_contexts[i]->lock );
684 pp_contexts[i]->arg = arg[i];
685 pp_contexts[i]->pf_func = pf_func;
686 pp_contexts[i]->i_ret = 12345;
687 pp_contexts[i]->b_work = 1;
688 vlc_cond_signal( &pp_contexts[i]->cond );
689 vlc_mutex_unlock( &pp_contexts[i]->lock );
691 for ( i = 0; i < count; i++ )
693 vlc_mutex_lock( &pp_contexts[i]->lock );
694 while ( !pp_contexts[i]->b_done )
696 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
698 pp_contexts[i]->b_done = 0;
699 pp_contexts[i]->pf_func = NULL;
700 vlc_mutex_unlock( &pp_contexts[i]->lock );
704 ret[i] = pp_contexts[i]->i_ret;
711 /****************************************************************************
712 * EncodeVideo: the whole thing
713 ****************************************************************************/
714 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
716 encoder_sys_t *p_sys = p_enc->p_sys;
720 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
722 struct thread_context_t ** pp_contexts;
726 pp_contexts = malloc( sizeof(struct thread_context_t *)
727 * p_enc->i_threads );
728 p_sys->p_context->thread_opaque = (void *)pp_contexts;
730 for ( i = 0; i < p_enc->i_threads; i++ )
732 pp_contexts[i] = vlc_object_create( p_enc,
733 sizeof(struct thread_context_t) );
734 pp_contexts[i]->p_context = p_sys->p_context;
735 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
736 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
737 pp_contexts[i]->b_work = 0;
738 pp_contexts[i]->b_done = 0;
739 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
740 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
742 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
747 p_sys->p_context->execute = FfmpegExecute;
750 memset( &frame, 0, sizeof( AVFrame ) );
751 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
753 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
754 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
757 /* Let ffmpeg select the frame type */
760 frame.repeat_pict = p_pict->i_nb_fields - 2;
761 frame.interlaced_frame = !p_pict->b_progressive;
762 frame.top_field_first = !!p_pict->b_top_field_first;
764 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
765 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
767 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
769 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
771 mtime_t current_date = mdate();
773 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
775 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
776 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
777 msg_Dbg( p_enc, "hurry up mode 3" );
781 p_sys->p_context->mb_decision = p_sys->i_hq;
783 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
785 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
786 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
787 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
788 msg_Dbg( p_enc, "hurry up mode 2" );
792 if ( p_sys->b_trellis )
793 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
795 p_sys->p_context->noise_reduction =
796 p_sys->i_noise_reduction;
800 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
802 frame.pict_type = FF_P_TYPE;
803 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
809 frame.pts = (int64_t)AV_NOPTS_VALUE;
812 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
814 if ( p_sys->i_last_pts == frame.pts )
816 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
817 "same PTS (" I64Fd ")", frame.pts );
820 else if ( p_sys->i_last_pts > frame.pts )
822 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
823 "past (current: " I64Fd ", last: "I64Fd")",
824 frame.pts, p_sys->i_last_pts );
829 p_sys->i_last_pts = frame.pts;
833 frame.quality = p_sys->i_quality;
835 /* Ugly work-around for stupid libavcodec behaviour */
837 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
838 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
839 p_enc->fmt_in.video.i_frame_rate_base;
840 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
841 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
842 /* End work-around */
844 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
845 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
849 block_t *p_block = block_New( p_enc, i_out );
850 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
852 /* FIXME, 3-2 pulldown is not handled correctly */
853 p_block->i_length = I64C(1000000) *
854 p_enc->fmt_in.video.i_frame_rate_base /
855 p_enc->fmt_in.video.i_frame_rate;
857 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
859 /* No delay -> output pts == input pts */
860 p_block->i_pts = p_block->i_dts = p_pict->date;
862 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
863 p_sys->p_context->coded_frame->pts != 0 &&
864 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
866 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
867 p_block->i_pts = p_sys->p_context->coded_frame->pts;
869 /* Ugly work-around for stupid libavcodec behaviour */
871 int64_t i_framenum = p_block->i_pts *
872 p_enc->fmt_in.video.i_frame_rate /
873 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
875 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
877 /* End work-around */
879 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
880 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
882 p_block->i_dts = p_block->i_pts;
886 if( p_sys->i_last_ref_pts )
888 p_block->i_dts = p_sys->i_last_ref_pts;
892 /* Let's put something sensible */
893 p_block->i_dts = p_block->i_pts;
896 p_sys->i_last_ref_pts = p_block->i_pts;
901 /* Buggy libavcodec which doesn't update coded_frame->pts
903 p_block->i_dts = p_block->i_pts = p_pict->date;
906 switch ( p_sys->p_context->coded_frame->pict_type )
909 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
912 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
915 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
925 /****************************************************************************
926 * EncodeAudio: the whole thing
927 ****************************************************************************/
928 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
930 encoder_sys_t *p_sys = p_enc->p_sys;
931 block_t *p_block, *p_chain = NULL;
933 uint8_t *p_buffer = p_aout_buf->p_buffer;
934 int i_samples = p_aout_buf->i_nb_samples;
935 int i_samples_delay = p_sys->i_samples_delay;
937 p_sys->i_pts = p_aout_buf->start_date -
938 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
939 (mtime_t)p_enc->fmt_in.audio.i_rate;
941 p_sys->i_samples_delay += i_samples;
943 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
948 if( i_samples_delay )
950 /* Take care of the left-over from last time */
951 int i_delay_size = i_samples_delay * 2 *
952 p_sys->p_context->channels;
953 int i_size = p_sys->i_frame_size - i_delay_size;
955 p_samples = (int16_t *)p_sys->p_buffer;
956 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
957 p_buffer -= i_delay_size;
958 i_samples += i_samples_delay;
963 p_samples = (int16_t *)p_buffer;
966 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
967 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
971 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
973 if( i_out < 0 ) break;
975 p_buffer += p_sys->i_frame_size;
976 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
977 i_samples -= p_sys->p_context->frame_size;
979 if( i_out == 0 ) continue;
981 p_block = block_New( p_enc, i_out );
982 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
984 p_block->i_length = (mtime_t)1000000 *
985 (mtime_t)p_sys->p_context->frame_size /
986 (mtime_t)p_sys->p_context->sample_rate;
988 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
991 p_sys->i_pts += p_block->i_length;
992 block_ChainAppend( &p_chain, p_block );
995 /* Backup the remaining raw samples */
998 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
999 p_sys->p_context->channels, p_buffer,
1000 i_samples * 2 * p_sys->p_context->channels );
1006 /*****************************************************************************
1007 * CloseEncoder: ffmpeg encoder destruction
1008 *****************************************************************************/
1009 void E_(CloseEncoder)( vlc_object_t *p_this )
1011 encoder_t *p_enc = (encoder_t *)p_this;
1012 encoder_sys_t *p_sys = p_enc->p_sys;
1014 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1017 struct thread_context_t ** pp_contexts =
1018 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1019 for ( i = 0; i < p_enc->i_threads; i++ )
1021 vlc_object_kill( pp_contexts[i] );
1022 vlc_cond_signal( &pp_contexts[i]->cond );
1023 vlc_thread_join( pp_contexts[i] );
1024 vlc_mutex_destroy( &pp_contexts[i]->lock );
1025 vlc_cond_destroy( &pp_contexts[i]->cond );
1026 vlc_object_destroy( pp_contexts[i] );
1029 free( pp_contexts );
1032 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1033 avcodec_close( p_sys->p_context );
1034 vlc_mutex_unlock( lock );
1035 av_free( p_sys->p_context );
1037 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1038 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );