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_common.h>
38 #include <vlc_codec.h>
39 #include <vlc_dialog.h>
40 #include <vlc_avcodec.h>
44 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
45 # include <libavcodec/avcodec.h>
46 #elif defined(HAVE_FFMPEG_AVCODEC_H)
47 # include <ffmpeg/avcodec.h>
54 #define HURRY_UP_GUARD1 (450000)
55 #define HURRY_UP_GUARD2 (300000)
56 #define HURRY_UP_GUARD3 (100000)
58 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
60 /*****************************************************************************
62 *****************************************************************************/
63 int OpenEncoder ( vlc_object_t * );
64 void CloseEncoder( vlc_object_t * );
66 static block_t *EncodeVideo( encoder_t *, picture_t * );
67 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
69 struct thread_context_t;
70 static void* FfmpegThread( vlc_object_t *p_this );
71 static int FfmpegExecute( AVCodecContext *s,
72 int (*pf_func)(AVCodecContext *c2, void *arg2),
73 void *arg, int *ret, int count, int );
75 /*****************************************************************************
76 * thread_context_t : for multithreaded encoding
77 *****************************************************************************/
78 struct thread_context_t
82 AVCodecContext *p_context;
83 int (* pf_func)(AVCodecContext *c, void *arg);
92 /*****************************************************************************
93 * encoder_sys_t : ffmpeg encoder descriptor
94 *****************************************************************************/
101 AVCodecContext *p_context;
107 uint8_t *p_buffer_out;
113 mtime_t i_last_ref_pts;
114 mtime_t i_buggy_pts_detect;
125 /* Encoding settings */
132 int i_rc_buffer_size;
133 float f_rc_buffer_aggressivity;
136 bool b_interlace, b_interlace_me;
137 float f_i_quant_factor;
138 int i_noise_reduction;
141 int i_quality; /* for VBR */
142 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
143 int i_luma_elim, i_chroma_elim;
144 int i_aac_profile; /* AAC profile to use.*/
145 /* Used to work around stupid timestamping behaviour in libavcodec */
147 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
150 static const char *const ppsz_enc_options[] = {
151 "keyint", "bframes", "vt", "qmin", "qmax", "hq",
152 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
153 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
154 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
155 "p-masking", "border-masking", "luma-elim-threshold",
156 "chroma-elim-threshold",
161 static const uint16_t mpa_bitrate_tab[2][15] =
163 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
164 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
167 static const uint16_t mpa_freq_tab[6] =
168 { 44100, 48000, 32000, 22050, 24000, 16000 };
170 static const uint16_t mpeg4_default_intra_matrix[64] = {
171 8, 17, 18, 19, 21, 23, 25, 27,
172 17, 18, 19, 21, 23, 25, 27, 28,
173 20, 21, 22, 23, 24, 26, 28, 30,
174 21, 22, 23, 24, 26, 28, 30, 32,
175 22, 23, 24, 26, 28, 30, 32, 35,
176 23, 24, 26, 28, 30, 32, 35, 38,
177 25, 26, 28, 30, 32, 35, 38, 41,
178 27, 28, 30, 32, 35, 38, 41, 45,
181 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
182 16, 17, 18, 19, 20, 21, 22, 23,
183 17, 18, 19, 20, 21, 22, 23, 24,
184 18, 19, 20, 21, 22, 23, 24, 25,
185 19, 20, 21, 22, 23, 24, 26, 27,
186 20, 21, 22, 23, 25, 26, 27, 28,
187 21, 22, 23, 24, 26, 27, 28, 30,
188 22, 23, 24, 26, 27, 28, 30, 31,
189 23, 24, 25, 27, 28, 30, 31, 33,
192 /*****************************************************************************
193 * OpenEncoder: probe the encoder
194 *****************************************************************************/
196 int OpenEncoder( vlc_object_t *p_this )
198 encoder_t *p_enc = (encoder_t *)p_this;
199 encoder_sys_t *p_sys;
200 AVCodecContext *p_context;
202 int i_codec_id, i_cat;
203 const char *psz_namecodec;
206 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
209 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
211 /* handed chroma output */
215 i_codec_id = CODEC_ID_RAWVIDEO;
216 psz_namecodec = "Raw video";
219 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
221 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
222 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
223 _("\"%s\" is no video encoder."), psz_namecodec );
227 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
229 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
230 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
231 _("\"%s\" is no audio encoder."), psz_namecodec );
235 /* Initialization must be done before avcodec_find_encoder() */
236 InitLibavcodec( p_this );
238 p_codec = avcodec_find_encoder( i_codec_id );
241 msg_Err( p_enc, "cannot find encoder %s\n"
242 "*** Your FFMPEG installation is crippled. ***\n"
243 "*** Please check with your FFMPEG packager. ***\n"
244 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
246 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
247 /* I have had enough of all these MPEG-3 transcoding bug reports.
248 * Downstream packager, you had better not patch this out, or I will be really
249 * annoyed. Think about it - you don't want to fork the VLC translation files,
250 * do you? -- Courmisch, 2008-10-22 */
251 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
253 "If you don't know how to fix this, ask for support from your distribution.\n"
255 "This is not an error inside VLC media player.\n"
256 "Do not contact the VideoLAN project about this issue.\n"),
261 /* Allocate the memory needed to store the encoder's structure */
262 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
264 p_enc->p_sys = p_sys;
265 p_sys->p_codec = p_codec;
267 p_enc->pf_encode_video = EncodeVideo;
268 p_enc->pf_encode_audio = EncodeAudio;
270 p_sys->p_buffer = NULL;
271 p_sys->p_buffer_out = NULL;
272 p_sys->i_buffer_out = 0;
274 p_sys->p_context = p_context = avcodec_alloc_context();
275 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
276 p_context->opaque = (void *)p_this;
278 /* Set CPU capabilities */
279 unsigned i_cpu = vlc_CPU();
280 p_context->dsp_mask = 0;
281 if( !(i_cpu & CPU_CAPABILITY_MMX) )
283 p_context->dsp_mask |= FF_MM_MMX;
285 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
287 p_context->dsp_mask |= FF_MM_MMXEXT;
289 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
291 p_context->dsp_mask |= FF_MM_3DNOW;
293 if( !(i_cpu & CPU_CAPABILITY_SSE) )
295 p_context->dsp_mask |= FF_MM_SSE;
296 p_context->dsp_mask |= FF_MM_SSE2;
299 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
301 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
302 p_sys->i_key_int = val.i_int;
304 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
305 p_sys->i_b_frames = val.i_int;
307 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
308 p_sys->i_vtolerance = val.i_int * 1000;
310 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
311 p_sys->b_interlace = val.b_bool;
313 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
314 p_sys->b_interlace_me = val.b_bool;
316 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
317 p_sys->b_pre_me = val.b_bool;
319 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
320 p_sys->b_hurry_up = val.b_bool;
321 if( p_sys->b_hurry_up )
323 /* hurry up mode needs noise reduction, even small */
324 p_sys->i_noise_reduction = 1;
327 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
328 p_sys->i_rc_buffer_size = val.i_int;
329 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
330 p_sys->f_rc_buffer_aggressivity = val.f_float;
332 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
333 p_sys->f_i_quant_factor = val.f_float;
335 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
336 p_sys->i_noise_reduction = val.i_int;
338 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
339 p_sys->b_mpeg4_matrix = val.b_bool;
341 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
342 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
343 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
345 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
346 p_sys->i_hq = FF_MB_DECISION_RD;
347 if( val.psz_string && *val.psz_string )
349 if( !strcmp( val.psz_string, "rd" ) )
350 p_sys->i_hq = FF_MB_DECISION_RD;
351 else if( !strcmp( val.psz_string, "bits" ) )
352 p_sys->i_hq = FF_MB_DECISION_BITS;
353 else if( !strcmp( val.psz_string, "simple" ) )
354 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
356 p_sys->i_hq = FF_MB_DECISION_RD;
359 p_sys->i_hq = FF_MB_DECISION_RD;
360 free( val.psz_string );
362 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
363 p_sys->i_qmin = val.i_int;
364 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
365 p_sys->i_qmax = val.i_int;
366 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
367 p_sys->b_trellis = val.b_bool;
369 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
370 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
371 p_context->strict_std_compliance = val.i_int;
373 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
374 p_sys->f_lumi_masking = val.f_float;
375 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
376 p_sys->f_dark_masking = val.f_float;
377 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
378 p_sys->f_p_masking = val.f_float;
379 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
380 p_sys->f_border_masking = val.f_float;
381 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
382 p_sys->i_luma_elim = val.i_int;
383 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
384 p_sys->i_chroma_elim = val.i_int;
386 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
387 /* ffmpeg uses faac encoder atm, and it has issues with
388 * other than low-complexity profile, so default to that */
389 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
390 if( val.psz_string && *val.psz_string )
392 if( !strncmp( val.psz_string, "main", 4 ) )
393 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
394 else if( !strncmp( val.psz_string, "low", 3 ) )
395 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
396 #if 0 /* Not supported by FAAC encoder */
397 else if( !strncmp( val.psz_string, "ssr", 3 ) )
398 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
400 else if( !strncmp( val.psz_string, "ltp", 3 ) )
401 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
404 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
405 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
408 free( val.psz_string );
410 if( p_enc->fmt_in.i_cat == VIDEO_ES )
412 int i_aspect_num, i_aspect_den;
414 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
416 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
417 p_enc->fmt_in.video.i_height );
422 p_context->width = p_enc->fmt_in.video.i_width;
423 p_context->height = p_enc->fmt_in.video.i_height;
425 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
426 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
428 /* Defaults from ffmpeg.c */
429 p_context->qblur = 0.5;
430 p_context->qcompress = 0.5;
431 p_context->b_quant_offset = 1.25;
432 p_context->b_quant_factor = 1.25;
433 p_context->i_quant_offset = 0.0;
434 p_context->i_quant_factor = -0.8;
436 p_context->lumi_masking = p_sys->f_lumi_masking;
437 p_context->dark_masking = p_sys->f_dark_masking;
438 p_context->p_masking = p_sys->f_p_masking;
439 p_context->border_masking = p_sys->f_border_masking;
440 p_context->luma_elim_threshold = p_sys->i_luma_elim;
441 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
443 if( p_sys->i_key_int > 0 )
444 p_context->gop_size = p_sys->i_key_int;
445 p_context->max_b_frames =
446 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
447 p_context->b_frame_strategy = 0;
448 if( !p_context->max_b_frames &&
449 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
450 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ||
451 p_enc->fmt_out.i_codec == VLC_CODEC_MP1V ) )
452 p_context->flags |= CODEC_FLAG_LOW_DELAY;
454 av_reduce( &i_aspect_num, &i_aspect_den,
455 p_enc->fmt_in.video.i_aspect,
456 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
457 av_reduce( &p_context->sample_aspect_ratio.num,
458 &p_context->sample_aspect_ratio.den,
459 i_aspect_num * (int64_t)p_context->height,
460 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
462 p_sys->i_buffer_out = p_context->height * p_context->width * 3;
463 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
464 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
465 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
467 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
468 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
469 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
471 if( p_codec->pix_fmts )
473 const enum PixelFormat *p = p_codec->pix_fmts;
474 for( ; *p != -1; p++ )
476 if( *p == p_context->pix_fmt ) break;
478 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
479 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
480 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
484 if ( p_sys->f_i_quant_factor != 0.0 )
485 p_context->i_quant_factor = p_sys->f_i_quant_factor;
487 p_context->noise_reduction = p_sys->i_noise_reduction;
489 if ( p_sys->b_mpeg4_matrix )
491 p_context->intra_matrix = mpeg4_default_intra_matrix;
492 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
495 if ( p_sys->b_pre_me )
497 p_context->pre_me = 1;
498 p_context->me_pre_cmp = FF_CMP_CHROMA;
501 if ( p_sys->b_interlace )
503 if ( p_context->height <= 280 )
505 if ( p_context->height != 16 || p_context->width != 16 )
507 "disabling interlaced video because height=%d <= 280",
512 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
513 if ( p_sys->b_interlace_me )
514 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
518 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
519 if ( p_sys->b_trellis )
520 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
522 p_context->trellis = p_sys->b_trellis;
525 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
526 p_context->flags |= CODEC_FLAG_QSCALE;
528 if ( p_enc->i_threads >= 1 )
529 p_context->thread_count = p_enc->i_threads;
531 if( p_sys->i_vtolerance > 0 )
532 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
534 /* usually if someone sets bitrate, he likes more to get that bitrate
535 * over quality should help 'normal' user to get asked bitrate
537 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
543 if( p_sys->i_qmin > 0 )
545 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
546 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
548 if( p_sys->i_qmax > 0 )
550 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
551 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
553 p_context->max_qdiff = 3;
555 p_context->mb_decision = p_sys->i_hq;
557 if( p_sys->i_quality )
559 p_context->flags |= CODEC_FLAG_QSCALE;
560 p_context->global_quality = p_sys->i_quality;
564 p_context->rc_qsquish = 1.0;
565 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
566 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
567 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
568 /* This is from ffmpeg's ffmpeg.c : */
569 p_context->rc_initial_buffer_occupancy
570 = p_sys->i_rc_buffer_size * 3/4;
571 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
574 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
576 /* work around bug in libmp3lame encoding */
577 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
578 p_enc->fmt_in.audio.i_channels = 2;
580 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
581 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
582 p_context->channels = p_enc->fmt_out.audio.i_channels;
584 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
586 /* XXX: FAAC does resample only when setting the INPUT samplerate
587 * to the desired value (-R option of the faac frontend)
588 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
589 /* vlc should default to low-complexity profile, faac encoder
590 * has bug and aac audio has issues otherwise atm */
591 p_context->profile = p_sys->i_aac_profile;
595 /* Misc parameters */
596 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
598 if( i_codec_id == CODEC_ID_RAWVIDEO )
600 /* XXX: hack: Force same codec (will be handled by transcode) */
601 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
602 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
605 /* Make sure we get extradata filled by the encoder */
606 p_context->extradata_size = 0;
607 p_context->extradata = NULL;
608 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
612 ret = avcodec_open( p_context, p_codec );
613 vlc_avcodec_unlock();
616 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
617 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
618 || i_codec_id == CODEC_ID_MP3) )
620 if( p_context->channels > 2 )
622 p_context->channels = 2;
623 p_enc->fmt_in.audio.i_channels = 2; // FIXME
624 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
627 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
631 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
633 if ( p_enc->fmt_out.audio.i_rate
634 == mpa_freq_tab[i_frequency] )
637 if ( i_frequency == 6 )
639 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
640 p_enc->fmt_out.audio.i_rate );
645 for ( i = 1; i < 14; i++ )
647 if ( p_enc->fmt_out.i_bitrate / 1000
648 <= mpa_bitrate_tab[i_frequency / 3][i] )
651 if ( p_enc->fmt_out.i_bitrate / 1000
652 != mpa_bitrate_tab[i_frequency / 3][i] )
655 "MPEG audio doesn't support bitrate=%d, using %d",
656 p_enc->fmt_out.i_bitrate,
657 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
658 p_enc->fmt_out.i_bitrate =
659 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
660 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
664 p_context->codec = NULL;
666 ret = avcodec_open( p_context, p_codec );
667 vlc_avcodec_unlock();
670 msg_Err( p_enc, "cannot open encoder" );
672 _("Streaming / Transcoding failed"),
673 "%s", _("VLC could not open the encoder.") );
680 msg_Err( p_enc, "cannot open encoder" );
681 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
682 "%s", _("VLC could not open the encoder.") );
688 if( i_codec_id == CODEC_ID_FLAC )
690 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
691 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
692 if( p_enc->fmt_out.p_extra )
694 uint8_t *p = p_enc->fmt_out.p_extra;
700 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
701 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
702 p[7] = ( p_context->extradata_size ) & 0xff;
703 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
707 p_enc->fmt_out.i_extra = 0;
712 p_enc->fmt_out.i_extra = p_context->extradata_size;
713 if( p_enc->fmt_out.i_extra )
715 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
716 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
717 p_enc->fmt_out.i_extra );
721 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
723 if( p_enc->fmt_in.i_cat == AUDIO_ES )
725 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
726 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
727 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
728 p_sys->p_buffer = malloc( p_sys->i_frame_size );
729 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
732 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
737 /****************************************************************************
738 * Ffmpeg threading system
739 ****************************************************************************/
740 static void* FfmpegThread( vlc_object_t *p_this )
742 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
743 int canc = vlc_savecancel ();
744 while ( vlc_object_alive (p_context) && !p_context->b_error )
746 vlc_mutex_lock( &p_context->lock );
747 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
749 vlc_cond_wait( &p_context->cond, &p_context->lock );
751 p_context->b_work = 0;
752 vlc_mutex_unlock( &p_context->lock );
753 if ( !vlc_object_alive (p_context) || p_context->b_error )
756 if ( p_context->pf_func )
758 p_context->i_ret = p_context->pf_func( p_context->p_context,
762 vlc_mutex_lock( &p_context->lock );
763 p_context->b_done = 1;
764 vlc_cond_signal( &p_context->cond );
765 vlc_mutex_unlock( &p_context->lock );
768 vlc_restorecancel (canc);
772 static int FfmpegExecute( AVCodecContext *s,
773 int (*pf_func)(AVCodecContext *c2, void *arg2),
774 void *arg, int *ret, int count, int size )
776 struct thread_context_t ** pp_contexts =
777 (struct thread_context_t **)s->thread_opaque;
780 /* Note, we can be certain that this is not called with the same
781 * AVCodecContext by different threads at the same time */
782 for ( int i = 0; i < count; i++ )
784 vlc_mutex_lock( &pp_contexts[i]->lock );
785 pp_contexts[i]->arg = argv[i];
786 pp_contexts[i]->pf_func = pf_func;
787 pp_contexts[i]->i_ret = 12345;
788 pp_contexts[i]->b_work = 1;
789 vlc_cond_signal( &pp_contexts[i]->cond );
790 vlc_mutex_unlock( &pp_contexts[i]->lock );
792 for ( int i = 0; i < count; i++ )
794 vlc_mutex_lock( &pp_contexts[i]->lock );
795 while ( !pp_contexts[i]->b_done )
797 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
799 pp_contexts[i]->b_done = 0;
800 pp_contexts[i]->pf_func = NULL;
801 vlc_mutex_unlock( &pp_contexts[i]->lock );
805 ret[i] = pp_contexts[i]->i_ret;
813 /****************************************************************************
814 * EncodeVideo: the whole thing
815 ****************************************************************************/
816 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
818 encoder_sys_t *p_sys = p_enc->p_sys;
822 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
824 struct thread_context_t ** pp_contexts;
828 pp_contexts = malloc( sizeof(struct thread_context_t *)
829 * p_enc->i_threads );
830 p_sys->p_context->thread_opaque = (void *)pp_contexts;
832 for ( i = 0; i < p_enc->i_threads; i++ )
834 pp_contexts[i] = vlc_object_create( p_enc,
835 sizeof(struct thread_context_t) );
836 pp_contexts[i]->p_context = p_sys->p_context;
837 vlc_mutex_init( &pp_contexts[i]->lock );
838 vlc_cond_init( &pp_contexts[i]->cond );
839 pp_contexts[i]->b_work = 0;
840 pp_contexts[i]->b_done = 0;
841 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
842 VLC_THREAD_PRIORITY_VIDEO ) )
844 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
849 p_sys->p_context->execute = FfmpegExecute;
852 memset( &frame, 0, sizeof( AVFrame ) );
853 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
855 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
856 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
859 /* Let ffmpeg select the frame type */
862 frame.repeat_pict = p_pict->i_nb_fields - 2;
863 frame.interlaced_frame = !p_pict->b_progressive;
864 frame.top_field_first = !!p_pict->b_top_field_first;
866 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
867 if( p_enc->fmt_out.i_codec != VLC_CODEC_MP4V )
869 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
871 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
873 mtime_t current_date = mdate();
875 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
877 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
878 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
879 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
881 p_sys->p_context->trellis = 0;
883 msg_Dbg( p_enc, "hurry up mode 3" );
887 p_sys->p_context->mb_decision = p_sys->i_hq;
889 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
891 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
892 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
894 p_sys->p_context->trellis = 0;
896 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
897 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
898 msg_Dbg( p_enc, "hurry up mode 2" );
902 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
903 if ( p_sys->b_trellis )
904 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
906 p_sys->p_context->trellis = p_sys->b_trellis;
909 p_sys->p_context->noise_reduction =
910 p_sys->i_noise_reduction;
914 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
916 frame.pict_type = FF_P_TYPE;
917 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
923 frame.pts = (int64_t)AV_NOPTS_VALUE;
926 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
928 if ( p_sys->i_last_pts == frame.pts )
930 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
931 "same PTS (%"PRId64 ")", frame.pts );
934 else if ( p_sys->i_last_pts > frame.pts )
936 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
937 "past (current: %"PRId64 ", last: %"PRId64")",
938 frame.pts, p_sys->i_last_pts );
943 p_sys->i_last_pts = frame.pts;
947 frame.quality = p_sys->i_quality;
949 /* Ugly work-around for stupid libavcodec behaviour */
951 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
952 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
953 p_enc->fmt_in.video.i_frame_rate_base;
954 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
955 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
956 /* End work-around */
958 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
959 p_sys->i_buffer_out, &frame );
963 block_t *p_block = block_New( p_enc, i_out );
964 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
966 /* FIXME, 3-2 pulldown is not handled correctly */
967 p_block->i_length = INT64_C(1000000) *
968 p_enc->fmt_in.video.i_frame_rate_base /
969 p_enc->fmt_in.video.i_frame_rate;
971 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
973 /* No delay -> output pts == input pts */
974 p_block->i_pts = p_block->i_dts = p_pict->date;
976 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
977 p_sys->p_context->coded_frame->pts != 0 &&
978 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
980 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
981 p_block->i_pts = p_sys->p_context->coded_frame->pts;
983 /* Ugly work-around for stupid libavcodec behaviour */
985 int64_t i_framenum = p_block->i_pts *
986 p_enc->fmt_in.video.i_frame_rate /
987 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
989 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
991 /* End work-around */
993 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
994 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
996 p_block->i_dts = p_block->i_pts;
1000 if( p_sys->i_last_ref_pts )
1002 p_block->i_dts = p_sys->i_last_ref_pts;
1006 /* Let's put something sensible */
1007 p_block->i_dts = p_block->i_pts;
1010 p_sys->i_last_ref_pts = p_block->i_pts;
1015 /* Buggy libavcodec which doesn't update coded_frame->pts
1017 p_block->i_dts = p_block->i_pts = p_pict->date;
1020 switch ( p_sys->p_context->coded_frame->pict_type )
1023 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1026 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1029 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1039 /****************************************************************************
1040 * EncodeAudio: the whole thing
1041 ****************************************************************************/
1042 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1044 encoder_sys_t *p_sys = p_enc->p_sys;
1045 block_t *p_block, *p_chain = NULL;
1047 uint8_t *p_buffer = p_aout_buf->p_buffer;
1048 int i_samples = p_aout_buf->i_nb_samples;
1049 int i_samples_delay = p_sys->i_samples_delay;
1051 p_sys->i_pts = p_aout_buf->start_date -
1052 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1053 (mtime_t)p_enc->fmt_in.audio.i_rate;
1055 p_sys->i_samples_delay += i_samples;
1057 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1062 if( i_samples_delay )
1064 /* Take care of the left-over from last time */
1065 int i_delay_size = i_samples_delay * 2 *
1066 p_sys->p_context->channels;
1067 int i_size = p_sys->i_frame_size - i_delay_size;
1069 p_samples = (int16_t *)p_sys->p_buffer;
1070 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1071 p_buffer -= i_delay_size;
1072 i_samples += i_samples_delay;
1073 i_samples_delay = 0;
1077 p_samples = (int16_t *)p_buffer;
1080 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1081 p_sys->i_buffer_out, p_samples );
1084 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1086 if( i_out < 0 ) break;
1088 p_buffer += p_sys->i_frame_size;
1089 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1090 i_samples -= p_sys->p_context->frame_size;
1092 if( i_out == 0 ) continue;
1094 p_block = block_New( p_enc, i_out );
1095 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1097 p_block->i_length = (mtime_t)1000000 *
1098 (mtime_t)p_sys->p_context->frame_size /
1099 (mtime_t)p_sys->p_context->sample_rate;
1101 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1104 p_sys->i_pts += p_block->i_length;
1105 block_ChainAppend( &p_chain, p_block );
1108 /* Backup the remaining raw samples */
1111 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1112 p_sys->p_context->channels, p_buffer,
1113 i_samples * 2 * p_sys->p_context->channels );
1119 /*****************************************************************************
1120 * CloseEncoder: ffmpeg encoder destruction
1121 *****************************************************************************/
1122 void CloseEncoder( vlc_object_t *p_this )
1124 encoder_t *p_enc = (encoder_t *)p_this;
1125 encoder_sys_t *p_sys = p_enc->p_sys;
1127 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1130 struct thread_context_t ** pp_contexts =
1131 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1132 for ( i = 0; i < p_enc->i_threads; i++ )
1134 vlc_object_kill( pp_contexts[i] );
1135 vlc_cond_signal( &pp_contexts[i]->cond );
1136 vlc_thread_join( pp_contexts[i] );
1137 vlc_mutex_destroy( &pp_contexts[i]->lock );
1138 vlc_cond_destroy( &pp_contexts[i]->cond );
1139 vlc_object_release( pp_contexts[i] );
1142 free( pp_contexts );
1146 avcodec_close( p_sys->p_context );
1147 vlc_avcodec_unlock();
1148 av_free( p_sys->p_context );
1150 free( p_sys->p_buffer );
1151 free( p_sys->p_buffer_out );