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>
45 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
46 # include <libavcodec/avcodec.h>
47 #elif defined(HAVE_FFMPEG_AVCODEC_H)
48 # include <ffmpeg/avcodec.h>
55 #define HURRY_UP_GUARD1 (450000)
56 #define HURRY_UP_GUARD2 (300000)
57 #define HURRY_UP_GUARD3 (100000)
59 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
61 /*****************************************************************************
63 *****************************************************************************/
64 int OpenEncoder ( vlc_object_t * );
65 void CloseEncoder( vlc_object_t * );
67 static block_t *EncodeVideo( encoder_t *, picture_t * );
68 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
70 struct thread_context_t;
71 static void* FfmpegThread( vlc_object_t *p_this );
72 static int FfmpegExecute( AVCodecContext *s,
73 int (*pf_func)(AVCodecContext *c2, void *arg2),
74 void *arg, int *ret, int count, int );
76 /*****************************************************************************
77 * thread_context_t : for multithreaded encoding
78 *****************************************************************************/
79 struct thread_context_t
83 AVCodecContext *p_context;
84 int (* pf_func)(AVCodecContext *c, void *arg);
93 /*****************************************************************************
94 * encoder_sys_t : ffmpeg encoder descriptor
95 *****************************************************************************/
102 AVCodecContext *p_context;
108 uint8_t *p_buffer_out;
114 mtime_t i_last_ref_pts;
115 mtime_t i_buggy_pts_detect;
126 /* Encoding settings */
133 int i_rc_buffer_size;
134 float f_rc_buffer_aggressivity;
137 bool b_interlace, b_interlace_me;
138 float f_i_quant_factor;
139 int i_noise_reduction;
142 int i_quality; /* for VBR */
143 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
144 int i_luma_elim, i_chroma_elim;
145 int i_aac_profile; /* AAC profile to use.*/
146 /* Used to work around stupid timestamping behaviour in libavcodec */
148 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
151 static const char *const ppsz_enc_options[] = {
152 "keyint", "bframes", "vt", "qmin", "qmax", "hq",
153 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
154 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
155 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
156 "p-masking", "border-masking", "luma-elim-threshold",
157 "chroma-elim-threshold",
162 static const uint16_t mpa_bitrate_tab[2][15] =
164 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
165 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
168 static const uint16_t mpa_freq_tab[6] =
169 { 44100, 48000, 32000, 22050, 24000, 16000 };
171 static const uint16_t mpeg4_default_intra_matrix[64] = {
172 8, 17, 18, 19, 21, 23, 25, 27,
173 17, 18, 19, 21, 23, 25, 27, 28,
174 20, 21, 22, 23, 24, 26, 28, 30,
175 21, 22, 23, 24, 26, 28, 30, 32,
176 22, 23, 24, 26, 28, 30, 32, 35,
177 23, 24, 26, 28, 30, 32, 35, 38,
178 25, 26, 28, 30, 32, 35, 38, 41,
179 27, 28, 30, 32, 35, 38, 41, 45,
182 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
183 16, 17, 18, 19, 20, 21, 22, 23,
184 17, 18, 19, 20, 21, 22, 23, 24,
185 18, 19, 20, 21, 22, 23, 24, 25,
186 19, 20, 21, 22, 23, 24, 26, 27,
187 20, 21, 22, 23, 25, 26, 27, 28,
188 21, 22, 23, 24, 26, 27, 28, 30,
189 22, 23, 24, 26, 27, 28, 30, 31,
190 23, 24, 25, 27, 28, 30, 31, 33,
193 /*****************************************************************************
194 * OpenEncoder: probe the encoder
195 *****************************************************************************/
197 int OpenEncoder( vlc_object_t *p_this )
199 encoder_t *p_enc = (encoder_t *)p_this;
200 encoder_sys_t *p_sys;
201 AVCodecContext *p_context;
203 int i_codec_id, i_cat;
204 const char *psz_namecodec;
207 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
210 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
212 /* handed chroma output */
216 i_codec_id = CODEC_ID_RAWVIDEO;
217 psz_namecodec = "Raw video";
220 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
222 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
223 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
224 _("\"%s\" is no video encoder."), psz_namecodec );
228 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
230 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
231 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
232 _("\"%s\" is no audio encoder."), psz_namecodec );
236 if( p_enc->fmt_out.i_cat == SPU_ES )
238 /* We don't support subtitle encoding */
242 /* Initialization must be done before avcodec_find_encoder() */
243 InitLibavcodec( p_this );
245 p_codec = avcodec_find_encoder( i_codec_id );
248 msg_Err( p_enc, "cannot find encoder %s\n"
249 "*** Your FFMPEG installation is crippled. ***\n"
250 "*** Please check with your FFMPEG packager. ***\n"
251 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
253 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
254 /* I have had enough of all these MPEG-3 transcoding bug reports.
255 * Downstream packager, you had better not patch this out, or I will be really
256 * annoyed. Think about it - you don't want to fork the VLC translation files,
257 * do you? -- Courmisch, 2008-10-22 */
258 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
260 "If you don't know how to fix this, ask for support from your distribution.\n"
262 "This is not an error inside VLC media player.\n"
263 "Do not contact the VideoLAN project about this issue.\n"),
268 /* Allocate the memory needed to store the encoder's structure */
269 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
271 p_enc->p_sys = p_sys;
272 p_sys->p_codec = p_codec;
274 p_enc->pf_encode_video = EncodeVideo;
275 p_enc->pf_encode_audio = EncodeAudio;
277 p_sys->p_buffer = NULL;
278 p_sys->p_buffer_out = NULL;
279 p_sys->i_buffer_out = 0;
281 p_sys->p_context = p_context = avcodec_alloc_context();
282 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
283 p_context->opaque = (void *)p_this;
285 /* Set CPU capabilities */
286 unsigned i_cpu = vlc_CPU();
287 p_context->dsp_mask = 0;
288 if( !(i_cpu & CPU_CAPABILITY_MMX) )
290 p_context->dsp_mask |= FF_MM_MMX;
292 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
294 p_context->dsp_mask |= FF_MM_MMXEXT;
296 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
298 p_context->dsp_mask |= FF_MM_3DNOW;
300 if( !(i_cpu & CPU_CAPABILITY_SSE) )
302 p_context->dsp_mask |= FF_MM_SSE;
303 p_context->dsp_mask |= FF_MM_SSE2;
306 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
308 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
309 p_sys->i_key_int = val.i_int;
311 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
312 p_sys->i_b_frames = val.i_int;
314 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
315 p_sys->i_vtolerance = val.i_int * 1000;
317 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
318 p_sys->b_interlace = val.b_bool;
320 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
321 p_sys->b_interlace_me = val.b_bool;
323 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
324 p_sys->b_pre_me = val.b_bool;
326 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
327 p_sys->b_hurry_up = val.b_bool;
328 if( p_sys->b_hurry_up )
330 /* hurry up mode needs noise reduction, even small */
331 p_sys->i_noise_reduction = 1;
334 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
335 p_sys->i_rc_buffer_size = val.i_int;
336 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
337 p_sys->f_rc_buffer_aggressivity = val.f_float;
339 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
340 p_sys->f_i_quant_factor = val.f_float;
342 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
343 p_sys->i_noise_reduction = val.i_int;
345 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
346 p_sys->b_mpeg4_matrix = val.b_bool;
348 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
349 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
350 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
352 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
353 p_sys->i_hq = FF_MB_DECISION_RD;
354 if( val.psz_string && *val.psz_string )
356 if( !strcmp( val.psz_string, "rd" ) )
357 p_sys->i_hq = FF_MB_DECISION_RD;
358 else if( !strcmp( val.psz_string, "bits" ) )
359 p_sys->i_hq = FF_MB_DECISION_BITS;
360 else if( !strcmp( val.psz_string, "simple" ) )
361 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
363 p_sys->i_hq = FF_MB_DECISION_RD;
366 p_sys->i_hq = FF_MB_DECISION_RD;
367 free( val.psz_string );
369 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
370 p_sys->i_qmin = val.i_int;
371 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
372 p_sys->i_qmax = val.i_int;
373 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
374 p_sys->b_trellis = val.b_bool;
376 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
377 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
378 p_context->strict_std_compliance = val.i_int;
380 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
381 p_sys->f_lumi_masking = val.f_float;
382 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
383 p_sys->f_dark_masking = val.f_float;
384 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
385 p_sys->f_p_masking = val.f_float;
386 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
387 p_sys->f_border_masking = val.f_float;
388 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
389 p_sys->i_luma_elim = val.i_int;
390 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
391 p_sys->i_chroma_elim = val.i_int;
393 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
394 /* ffmpeg uses faac encoder atm, and it has issues with
395 * other than low-complexity profile, so default to that */
396 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
397 if( val.psz_string && *val.psz_string )
399 if( !strncmp( val.psz_string, "main", 4 ) )
400 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
401 else if( !strncmp( val.psz_string, "low", 3 ) )
402 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
403 #if 0 /* Not supported by FAAC encoder */
404 else if( !strncmp( val.psz_string, "ssr", 3 ) )
405 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
407 else if( !strncmp( val.psz_string, "ltp", 3 ) )
408 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
411 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
412 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
415 free( val.psz_string );
417 if( p_enc->fmt_in.i_cat == VIDEO_ES )
419 int i_aspect_num, i_aspect_den;
421 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
423 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
424 p_enc->fmt_in.video.i_height );
429 p_context->width = p_enc->fmt_in.video.i_width;
430 p_context->height = p_enc->fmt_in.video.i_height;
432 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
433 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
435 /* Defaults from ffmpeg.c */
436 p_context->qblur = 0.5;
437 p_context->qcompress = 0.5;
438 p_context->b_quant_offset = 1.25;
439 p_context->b_quant_factor = 1.25;
440 p_context->i_quant_offset = 0.0;
441 p_context->i_quant_factor = -0.8;
443 p_context->lumi_masking = p_sys->f_lumi_masking;
444 p_context->dark_masking = p_sys->f_dark_masking;
445 p_context->p_masking = p_sys->f_p_masking;
446 p_context->border_masking = p_sys->f_border_masking;
447 p_context->luma_elim_threshold = p_sys->i_luma_elim;
448 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
450 if( p_sys->i_key_int > 0 )
451 p_context->gop_size = p_sys->i_key_int;
452 p_context->max_b_frames =
453 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
454 p_context->b_frame_strategy = 0;
455 if( !p_context->max_b_frames &&
456 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
457 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ||
458 p_enc->fmt_out.i_codec == VLC_CODEC_MP1V ) )
459 p_context->flags |= CODEC_FLAG_LOW_DELAY;
461 av_reduce( &i_aspect_num, &i_aspect_den,
462 p_enc->fmt_in.video.i_aspect,
463 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
464 av_reduce( &p_context->sample_aspect_ratio.num,
465 &p_context->sample_aspect_ratio.den,
466 i_aspect_num * (int64_t)p_context->height,
467 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
469 p_sys->i_buffer_out = p_context->height * p_context->width * 3;
470 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
471 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
472 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
474 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
475 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
476 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
478 if( p_codec->pix_fmts )
480 const enum PixelFormat *p = p_codec->pix_fmts;
481 for( ; *p != -1; p++ )
483 if( *p == p_context->pix_fmt ) break;
485 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
486 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
487 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
491 if ( p_sys->f_i_quant_factor != 0.0 )
492 p_context->i_quant_factor = p_sys->f_i_quant_factor;
494 p_context->noise_reduction = p_sys->i_noise_reduction;
496 if ( p_sys->b_mpeg4_matrix )
498 p_context->intra_matrix = mpeg4_default_intra_matrix;
499 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
502 if ( p_sys->b_pre_me )
504 p_context->pre_me = 1;
505 p_context->me_pre_cmp = FF_CMP_CHROMA;
508 if ( p_sys->b_interlace )
510 if ( p_context->height <= 280 )
512 if ( p_context->height != 16 || p_context->width != 16 )
514 "disabling interlaced video because height=%d <= 280",
519 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
520 if ( p_sys->b_interlace_me )
521 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
525 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
526 if ( p_sys->b_trellis )
527 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
529 p_context->trellis = p_sys->b_trellis;
532 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
533 p_context->flags |= CODEC_FLAG_QSCALE;
535 if ( p_enc->i_threads >= 1 )
536 p_context->thread_count = p_enc->i_threads;
538 if( p_sys->i_vtolerance > 0 )
539 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
541 /* usually if someone sets bitrate, he likes more to get that bitrate
542 * over quality should help 'normal' user to get asked bitrate
544 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
550 if( p_sys->i_qmin > 0 )
552 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
553 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
555 if( p_sys->i_qmax > 0 )
557 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
558 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
560 p_context->max_qdiff = 3;
562 p_context->mb_decision = p_sys->i_hq;
564 if( p_sys->i_quality )
566 p_context->flags |= CODEC_FLAG_QSCALE;
567 p_context->global_quality = p_sys->i_quality;
571 p_context->rc_qsquish = 1.0;
572 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
573 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
574 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
575 /* This is from ffmpeg's ffmpeg.c : */
576 p_context->rc_initial_buffer_occupancy
577 = p_sys->i_rc_buffer_size * 3/4;
578 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
581 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
583 /* work around bug in libmp3lame encoding */
584 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
585 p_enc->fmt_in.audio.i_channels = 2;
587 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
588 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
589 p_context->channels = p_enc->fmt_out.audio.i_channels;
591 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
593 /* XXX: FAAC does resample only when setting the INPUT samplerate
594 * to the desired value (-R option of the faac frontend)
595 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
596 /* vlc should default to low-complexity profile, faac encoder
597 * has bug and aac audio has issues otherwise atm */
598 p_context->profile = p_sys->i_aac_profile;
602 /* Misc parameters */
603 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
605 if( i_codec_id == CODEC_ID_RAWVIDEO )
607 /* XXX: hack: Force same codec (will be handled by transcode) */
608 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
609 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
612 /* Make sure we get extradata filled by the encoder */
613 p_context->extradata_size = 0;
614 p_context->extradata = NULL;
615 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
619 ret = avcodec_open( p_context, p_codec );
620 vlc_avcodec_unlock();
623 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
624 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
625 || i_codec_id == CODEC_ID_MP3) )
627 if( p_context->channels > 2 )
629 p_context->channels = 2;
630 p_enc->fmt_in.audio.i_channels = 2; // FIXME
631 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
634 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
638 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
640 if ( p_enc->fmt_out.audio.i_rate
641 == mpa_freq_tab[i_frequency] )
644 if ( i_frequency == 6 )
646 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
647 p_enc->fmt_out.audio.i_rate );
652 for ( i = 1; i < 14; i++ )
654 if ( p_enc->fmt_out.i_bitrate / 1000
655 <= mpa_bitrate_tab[i_frequency / 3][i] )
658 if ( p_enc->fmt_out.i_bitrate / 1000
659 != mpa_bitrate_tab[i_frequency / 3][i] )
662 "MPEG audio doesn't support bitrate=%d, using %d",
663 p_enc->fmt_out.i_bitrate,
664 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
665 p_enc->fmt_out.i_bitrate =
666 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
667 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
671 p_context->codec = NULL;
673 ret = avcodec_open( p_context, p_codec );
674 vlc_avcodec_unlock();
677 msg_Err( p_enc, "cannot open encoder" );
679 _("Streaming / Transcoding failed"),
680 "%s", _("VLC could not open the encoder.") );
687 msg_Err( p_enc, "cannot open encoder" );
688 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
689 "%s", _("VLC could not open the encoder.") );
695 if( i_codec_id == CODEC_ID_FLAC )
697 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
698 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
699 if( p_enc->fmt_out.p_extra )
701 uint8_t *p = p_enc->fmt_out.p_extra;
707 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
708 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
709 p[7] = ( p_context->extradata_size ) & 0xff;
710 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
714 p_enc->fmt_out.i_extra = 0;
719 p_enc->fmt_out.i_extra = p_context->extradata_size;
720 if( p_enc->fmt_out.i_extra )
722 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
723 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
724 p_enc->fmt_out.i_extra );
728 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
730 if( p_enc->fmt_in.i_cat == AUDIO_ES )
732 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
733 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
734 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
735 p_sys->p_buffer = malloc( p_sys->i_frame_size );
736 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
739 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
744 /****************************************************************************
745 * Ffmpeg threading system
746 ****************************************************************************/
747 static void* FfmpegThread( vlc_object_t *p_this )
749 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
750 int canc = vlc_savecancel ();
751 while ( vlc_object_alive (p_context) && !p_context->b_error )
753 vlc_mutex_lock( &p_context->lock );
754 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
756 vlc_cond_wait( &p_context->cond, &p_context->lock );
758 p_context->b_work = 0;
759 vlc_mutex_unlock( &p_context->lock );
760 if ( !vlc_object_alive (p_context) || p_context->b_error )
763 if ( p_context->pf_func )
765 p_context->i_ret = p_context->pf_func( p_context->p_context,
769 vlc_mutex_lock( &p_context->lock );
770 p_context->b_done = 1;
771 vlc_cond_signal( &p_context->cond );
772 vlc_mutex_unlock( &p_context->lock );
775 vlc_restorecancel (canc);
779 static int FfmpegExecute( AVCodecContext *s,
780 int (*pf_func)(AVCodecContext *c2, void *arg2),
781 void *arg, int *ret, int count, int size )
783 struct thread_context_t ** pp_contexts =
784 (struct thread_context_t **)s->thread_opaque;
787 /* Note, we can be certain that this is not called with the same
788 * AVCodecContext by different threads at the same time */
789 for ( int i = 0; i < count; i++ )
791 vlc_mutex_lock( &pp_contexts[i]->lock );
792 pp_contexts[i]->arg = argv[i];
793 pp_contexts[i]->pf_func = pf_func;
794 pp_contexts[i]->i_ret = 12345;
795 pp_contexts[i]->b_work = 1;
796 vlc_cond_signal( &pp_contexts[i]->cond );
797 vlc_mutex_unlock( &pp_contexts[i]->lock );
799 for ( int i = 0; i < count; i++ )
801 vlc_mutex_lock( &pp_contexts[i]->lock );
802 while ( !pp_contexts[i]->b_done )
804 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
806 pp_contexts[i]->b_done = 0;
807 pp_contexts[i]->pf_func = NULL;
808 vlc_mutex_unlock( &pp_contexts[i]->lock );
812 ret[i] = pp_contexts[i]->i_ret;
820 /****************************************************************************
821 * EncodeVideo: the whole thing
822 ****************************************************************************/
823 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
825 encoder_sys_t *p_sys = p_enc->p_sys;
829 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
831 struct thread_context_t ** pp_contexts;
835 pp_contexts = malloc( sizeof(struct thread_context_t *)
836 * p_enc->i_threads );
837 p_sys->p_context->thread_opaque = (void *)pp_contexts;
839 for ( i = 0; i < p_enc->i_threads; i++ )
841 pp_contexts[i] = vlc_object_create( p_enc,
842 sizeof(struct thread_context_t) );
843 pp_contexts[i]->p_context = p_sys->p_context;
844 vlc_mutex_init( &pp_contexts[i]->lock );
845 vlc_cond_init( &pp_contexts[i]->cond );
846 pp_contexts[i]->b_work = 0;
847 pp_contexts[i]->b_done = 0;
848 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
849 VLC_THREAD_PRIORITY_VIDEO ) )
851 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
856 p_sys->p_context->execute = FfmpegExecute;
859 memset( &frame, 0, sizeof( AVFrame ) );
860 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
862 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
863 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
866 /* Let ffmpeg select the frame type */
869 frame.repeat_pict = p_pict->i_nb_fields - 2;
870 frame.interlaced_frame = !p_pict->b_progressive;
871 frame.top_field_first = !!p_pict->b_top_field_first;
873 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
874 if( p_enc->fmt_out.i_codec != VLC_CODEC_MP4V )
876 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
878 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
880 mtime_t current_date = mdate();
882 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
884 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
885 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
886 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
888 p_sys->p_context->trellis = 0;
890 msg_Dbg( p_enc, "hurry up mode 3" );
894 p_sys->p_context->mb_decision = p_sys->i_hq;
896 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
898 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
899 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
901 p_sys->p_context->trellis = 0;
903 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
904 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
905 msg_Dbg( p_enc, "hurry up mode 2" );
909 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
910 if ( p_sys->b_trellis )
911 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
913 p_sys->p_context->trellis = p_sys->b_trellis;
916 p_sys->p_context->noise_reduction =
917 p_sys->i_noise_reduction;
921 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
923 frame.pict_type = FF_P_TYPE;
924 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
930 frame.pts = (int64_t)AV_NOPTS_VALUE;
933 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
935 if ( p_sys->i_last_pts == frame.pts )
937 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
938 "same PTS (%"PRId64 ")", frame.pts );
941 else if ( p_sys->i_last_pts > frame.pts )
943 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
944 "past (current: %"PRId64 ", last: %"PRId64")",
945 frame.pts, p_sys->i_last_pts );
950 p_sys->i_last_pts = frame.pts;
954 frame.quality = p_sys->i_quality;
956 /* Ugly work-around for stupid libavcodec behaviour */
958 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
959 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
960 p_enc->fmt_in.video.i_frame_rate_base;
961 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
962 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
963 /* End work-around */
965 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
966 p_sys->i_buffer_out, &frame );
970 block_t *p_block = block_New( p_enc, i_out );
971 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
973 /* FIXME, 3-2 pulldown is not handled correctly */
974 p_block->i_length = INT64_C(1000000) *
975 p_enc->fmt_in.video.i_frame_rate_base /
976 p_enc->fmt_in.video.i_frame_rate;
978 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
980 /* No delay -> output pts == input pts */
981 p_block->i_pts = p_block->i_dts = p_pict->date;
983 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
984 p_sys->p_context->coded_frame->pts != 0 &&
985 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
987 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
988 p_block->i_pts = p_sys->p_context->coded_frame->pts;
990 /* Ugly work-around for stupid libavcodec behaviour */
992 int64_t i_framenum = p_block->i_pts *
993 p_enc->fmt_in.video.i_frame_rate /
994 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
996 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
998 /* End work-around */
1000 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
1001 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
1003 p_block->i_dts = p_block->i_pts;
1007 if( p_sys->i_last_ref_pts )
1009 p_block->i_dts = p_sys->i_last_ref_pts;
1013 /* Let's put something sensible */
1014 p_block->i_dts = p_block->i_pts;
1017 p_sys->i_last_ref_pts = p_block->i_pts;
1022 /* Buggy libavcodec which doesn't update coded_frame->pts
1024 p_block->i_dts = p_block->i_pts = p_pict->date;
1027 switch ( p_sys->p_context->coded_frame->pict_type )
1030 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1033 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1036 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1046 /****************************************************************************
1047 * EncodeAudio: the whole thing
1048 ****************************************************************************/
1049 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1051 encoder_sys_t *p_sys = p_enc->p_sys;
1052 block_t *p_block, *p_chain = NULL;
1054 uint8_t *p_buffer = p_aout_buf->p_buffer;
1055 int i_samples = p_aout_buf->i_nb_samples;
1056 int i_samples_delay = p_sys->i_samples_delay;
1058 p_sys->i_pts = p_aout_buf->i_pts -
1059 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1060 (mtime_t)p_enc->fmt_in.audio.i_rate;
1062 p_sys->i_samples_delay += i_samples;
1064 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1069 if( i_samples_delay )
1071 /* Take care of the left-over from last time */
1072 int i_delay_size = i_samples_delay * 2 *
1073 p_sys->p_context->channels;
1074 int i_size = p_sys->i_frame_size - i_delay_size;
1076 p_samples = (int16_t *)p_sys->p_buffer;
1077 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1078 p_buffer -= i_delay_size;
1079 i_samples += i_samples_delay;
1080 i_samples_delay = 0;
1084 p_samples = (int16_t *)p_buffer;
1087 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1088 p_sys->i_buffer_out, p_samples );
1091 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1093 if( i_out < 0 ) break;
1095 p_buffer += p_sys->i_frame_size;
1096 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1097 i_samples -= p_sys->p_context->frame_size;
1099 if( i_out == 0 ) continue;
1101 p_block = block_New( p_enc, i_out );
1102 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1104 p_block->i_length = (mtime_t)1000000 *
1105 (mtime_t)p_sys->p_context->frame_size /
1106 (mtime_t)p_sys->p_context->sample_rate;
1108 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1111 p_sys->i_pts += p_block->i_length;
1112 block_ChainAppend( &p_chain, p_block );
1115 /* Backup the remaining raw samples */
1118 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1119 p_sys->p_context->channels, p_buffer,
1120 i_samples * 2 * p_sys->p_context->channels );
1126 /*****************************************************************************
1127 * CloseEncoder: ffmpeg encoder destruction
1128 *****************************************************************************/
1129 void CloseEncoder( vlc_object_t *p_this )
1131 encoder_t *p_enc = (encoder_t *)p_this;
1132 encoder_sys_t *p_sys = p_enc->p_sys;
1134 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1137 struct thread_context_t ** pp_contexts =
1138 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1139 for ( i = 0; i < p_enc->i_threads; i++ )
1141 vlc_object_kill( pp_contexts[i] );
1142 vlc_cond_signal( &pp_contexts[i]->cond );
1143 vlc_thread_join( pp_contexts[i] );
1144 vlc_mutex_destroy( &pp_contexts[i]->lock );
1145 vlc_cond_destroy( &pp_contexts[i]->cond );
1146 vlc_object_release( pp_contexts[i] );
1149 free( pp_contexts );
1153 avcodec_close( p_sys->p_context );
1154 vlc_avcodec_unlock();
1155 av_free( p_sys->p_context );
1157 free( p_sys->p_buffer );
1158 free( p_sys->p_buffer_out );