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 if( p_enc->fmt_out.i_cat == SPU_ES )
237 /* We don't support subtitle encoding */
241 /* Initialization must be done before avcodec_find_encoder() */
242 InitLibavcodec( p_this );
244 p_codec = avcodec_find_encoder( i_codec_id );
247 msg_Err( p_enc, "cannot find encoder %s\n"
248 "*** Your FFMPEG installation is crippled. ***\n"
249 "*** Please check with your FFMPEG packager. ***\n"
250 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
252 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
253 /* I have had enough of all these MPEG-3 transcoding bug reports.
254 * Downstream packager, you had better not patch this out, or I will be really
255 * annoyed. Think about it - you don't want to fork the VLC translation files,
256 * do you? -- Courmisch, 2008-10-22 */
257 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
259 "If you don't know how to fix this, ask for support from your distribution.\n"
261 "This is not an error inside VLC media player.\n"
262 "Do not contact the VideoLAN project about this issue.\n"),
267 /* Allocate the memory needed to store the encoder's structure */
268 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
270 p_enc->p_sys = p_sys;
271 p_sys->p_codec = p_codec;
273 p_enc->pf_encode_video = EncodeVideo;
274 p_enc->pf_encode_audio = EncodeAudio;
276 p_sys->p_buffer = NULL;
277 p_sys->p_buffer_out = NULL;
278 p_sys->i_buffer_out = 0;
280 p_sys->p_context = p_context = avcodec_alloc_context();
281 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
282 p_context->opaque = (void *)p_this;
284 /* Set CPU capabilities */
285 unsigned i_cpu = vlc_CPU();
286 p_context->dsp_mask = 0;
287 if( !(i_cpu & CPU_CAPABILITY_MMX) )
289 p_context->dsp_mask |= FF_MM_MMX;
291 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
293 p_context->dsp_mask |= FF_MM_MMXEXT;
295 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
297 p_context->dsp_mask |= FF_MM_3DNOW;
299 if( !(i_cpu & CPU_CAPABILITY_SSE) )
301 p_context->dsp_mask |= FF_MM_SSE;
302 p_context->dsp_mask |= FF_MM_SSE2;
305 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
307 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
308 p_sys->i_key_int = val.i_int;
310 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
311 p_sys->i_b_frames = val.i_int;
313 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
314 p_sys->i_vtolerance = val.i_int * 1000;
316 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
317 p_sys->b_interlace = val.b_bool;
319 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
320 p_sys->b_interlace_me = val.b_bool;
322 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
323 p_sys->b_pre_me = val.b_bool;
325 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
326 p_sys->b_hurry_up = val.b_bool;
327 if( p_sys->b_hurry_up )
329 /* hurry up mode needs noise reduction, even small */
330 p_sys->i_noise_reduction = 1;
333 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
334 p_sys->i_rc_buffer_size = val.i_int;
335 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
336 p_sys->f_rc_buffer_aggressivity = val.f_float;
338 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
339 p_sys->f_i_quant_factor = val.f_float;
341 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
342 p_sys->i_noise_reduction = val.i_int;
344 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
345 p_sys->b_mpeg4_matrix = val.b_bool;
347 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
348 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
349 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
351 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
352 p_sys->i_hq = FF_MB_DECISION_RD;
353 if( val.psz_string && *val.psz_string )
355 if( !strcmp( val.psz_string, "rd" ) )
356 p_sys->i_hq = FF_MB_DECISION_RD;
357 else if( !strcmp( val.psz_string, "bits" ) )
358 p_sys->i_hq = FF_MB_DECISION_BITS;
359 else if( !strcmp( val.psz_string, "simple" ) )
360 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
362 p_sys->i_hq = FF_MB_DECISION_RD;
365 p_sys->i_hq = FF_MB_DECISION_RD;
366 free( val.psz_string );
368 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
369 p_sys->i_qmin = val.i_int;
370 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
371 p_sys->i_qmax = val.i_int;
372 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
373 p_sys->b_trellis = val.b_bool;
375 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
376 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
377 p_context->strict_std_compliance = val.i_int;
379 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
380 p_sys->f_lumi_masking = val.f_float;
381 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
382 p_sys->f_dark_masking = val.f_float;
383 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
384 p_sys->f_p_masking = val.f_float;
385 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
386 p_sys->f_border_masking = val.f_float;
387 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
388 p_sys->i_luma_elim = val.i_int;
389 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
390 p_sys->i_chroma_elim = val.i_int;
392 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
393 /* ffmpeg uses faac encoder atm, and it has issues with
394 * other than low-complexity profile, so default to that */
395 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
396 if( val.psz_string && *val.psz_string )
398 if( !strncmp( val.psz_string, "main", 4 ) )
399 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
400 else if( !strncmp( val.psz_string, "low", 3 ) )
401 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
402 #if 0 /* Not supported by FAAC encoder */
403 else if( !strncmp( val.psz_string, "ssr", 3 ) )
404 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
406 else if( !strncmp( val.psz_string, "ltp", 3 ) )
407 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
410 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
411 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
414 free( val.psz_string );
416 if( p_enc->fmt_in.i_cat == VIDEO_ES )
418 int i_aspect_num, i_aspect_den;
420 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
422 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
423 p_enc->fmt_in.video.i_height );
428 p_context->width = p_enc->fmt_in.video.i_width;
429 p_context->height = p_enc->fmt_in.video.i_height;
431 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
432 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
434 /* Defaults from ffmpeg.c */
435 p_context->qblur = 0.5;
436 p_context->qcompress = 0.5;
437 p_context->b_quant_offset = 1.25;
438 p_context->b_quant_factor = 1.25;
439 p_context->i_quant_offset = 0.0;
440 p_context->i_quant_factor = -0.8;
442 p_context->lumi_masking = p_sys->f_lumi_masking;
443 p_context->dark_masking = p_sys->f_dark_masking;
444 p_context->p_masking = p_sys->f_p_masking;
445 p_context->border_masking = p_sys->f_border_masking;
446 p_context->luma_elim_threshold = p_sys->i_luma_elim;
447 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
449 if( p_sys->i_key_int > 0 )
450 p_context->gop_size = p_sys->i_key_int;
451 p_context->max_b_frames =
452 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
453 p_context->b_frame_strategy = 0;
454 if( !p_context->max_b_frames &&
455 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
456 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ||
457 p_enc->fmt_out.i_codec == VLC_CODEC_MP1V ) )
458 p_context->flags |= CODEC_FLAG_LOW_DELAY;
460 av_reduce( &i_aspect_num, &i_aspect_den,
461 p_enc->fmt_in.video.i_aspect,
462 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
463 av_reduce( &p_context->sample_aspect_ratio.num,
464 &p_context->sample_aspect_ratio.den,
465 i_aspect_num * (int64_t)p_context->height,
466 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
468 p_sys->i_buffer_out = p_context->height * p_context->width * 3;
469 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
470 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
471 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
473 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
474 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
475 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
477 if( p_codec->pix_fmts )
479 const enum PixelFormat *p = p_codec->pix_fmts;
480 for( ; *p != -1; p++ )
482 if( *p == p_context->pix_fmt ) break;
484 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
485 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
486 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
490 if ( p_sys->f_i_quant_factor != 0.0 )
491 p_context->i_quant_factor = p_sys->f_i_quant_factor;
493 p_context->noise_reduction = p_sys->i_noise_reduction;
495 if ( p_sys->b_mpeg4_matrix )
497 p_context->intra_matrix = mpeg4_default_intra_matrix;
498 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
501 if ( p_sys->b_pre_me )
503 p_context->pre_me = 1;
504 p_context->me_pre_cmp = FF_CMP_CHROMA;
507 if ( p_sys->b_interlace )
509 if ( p_context->height <= 280 )
511 if ( p_context->height != 16 || p_context->width != 16 )
513 "disabling interlaced video because height=%d <= 280",
518 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
519 if ( p_sys->b_interlace_me )
520 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
524 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
525 if ( p_sys->b_trellis )
526 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
528 p_context->trellis = p_sys->b_trellis;
531 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
532 p_context->flags |= CODEC_FLAG_QSCALE;
534 if ( p_enc->i_threads >= 1 )
535 p_context->thread_count = p_enc->i_threads;
537 if( p_sys->i_vtolerance > 0 )
538 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
540 /* usually if someone sets bitrate, he likes more to get that bitrate
541 * over quality should help 'normal' user to get asked bitrate
543 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
549 if( p_sys->i_qmin > 0 )
551 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
552 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
554 if( p_sys->i_qmax > 0 )
556 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
557 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
559 p_context->max_qdiff = 3;
561 p_context->mb_decision = p_sys->i_hq;
563 if( p_sys->i_quality )
565 p_context->flags |= CODEC_FLAG_QSCALE;
566 p_context->global_quality = p_sys->i_quality;
570 p_context->rc_qsquish = 1.0;
571 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
572 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
573 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
574 /* This is from ffmpeg's ffmpeg.c : */
575 p_context->rc_initial_buffer_occupancy
576 = p_sys->i_rc_buffer_size * 3/4;
577 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
580 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
582 /* work around bug in libmp3lame encoding */
583 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
584 p_enc->fmt_in.audio.i_channels = 2;
586 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
587 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
588 p_context->channels = p_enc->fmt_out.audio.i_channels;
590 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
592 /* XXX: FAAC does resample only when setting the INPUT samplerate
593 * to the desired value (-R option of the faac frontend)
594 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
595 /* vlc should default to low-complexity profile, faac encoder
596 * has bug and aac audio has issues otherwise atm */
597 p_context->profile = p_sys->i_aac_profile;
601 /* Misc parameters */
602 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
604 if( i_codec_id == CODEC_ID_RAWVIDEO )
606 /* XXX: hack: Force same codec (will be handled by transcode) */
607 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
608 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
611 /* Make sure we get extradata filled by the encoder */
612 p_context->extradata_size = 0;
613 p_context->extradata = NULL;
614 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
618 ret = avcodec_open( p_context, p_codec );
619 vlc_avcodec_unlock();
622 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
623 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
624 || i_codec_id == CODEC_ID_MP3) )
626 if( p_context->channels > 2 )
628 p_context->channels = 2;
629 p_enc->fmt_in.audio.i_channels = 2; // FIXME
630 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
633 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
637 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
639 if ( p_enc->fmt_out.audio.i_rate
640 == mpa_freq_tab[i_frequency] )
643 if ( i_frequency == 6 )
645 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
646 p_enc->fmt_out.audio.i_rate );
651 for ( i = 1; i < 14; i++ )
653 if ( p_enc->fmt_out.i_bitrate / 1000
654 <= mpa_bitrate_tab[i_frequency / 3][i] )
657 if ( p_enc->fmt_out.i_bitrate / 1000
658 != mpa_bitrate_tab[i_frequency / 3][i] )
661 "MPEG audio doesn't support bitrate=%d, using %d",
662 p_enc->fmt_out.i_bitrate,
663 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
664 p_enc->fmt_out.i_bitrate =
665 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
666 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
670 p_context->codec = NULL;
672 ret = avcodec_open( p_context, p_codec );
673 vlc_avcodec_unlock();
676 msg_Err( p_enc, "cannot open encoder" );
678 _("Streaming / Transcoding failed"),
679 "%s", _("VLC could not open the encoder.") );
686 msg_Err( p_enc, "cannot open encoder" );
687 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
688 "%s", _("VLC could not open the encoder.") );
694 if( i_codec_id == CODEC_ID_FLAC )
696 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
697 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
698 if( p_enc->fmt_out.p_extra )
700 uint8_t *p = p_enc->fmt_out.p_extra;
706 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
707 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
708 p[7] = ( p_context->extradata_size ) & 0xff;
709 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
713 p_enc->fmt_out.i_extra = 0;
718 p_enc->fmt_out.i_extra = p_context->extradata_size;
719 if( p_enc->fmt_out.i_extra )
721 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
722 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
723 p_enc->fmt_out.i_extra );
727 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
729 if( p_enc->fmt_in.i_cat == AUDIO_ES )
731 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
732 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
733 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
734 p_sys->p_buffer = malloc( p_sys->i_frame_size );
735 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
738 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
743 /****************************************************************************
744 * Ffmpeg threading system
745 ****************************************************************************/
746 static void* FfmpegThread( vlc_object_t *p_this )
748 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
749 int canc = vlc_savecancel ();
750 while ( vlc_object_alive (p_context) && !p_context->b_error )
752 vlc_mutex_lock( &p_context->lock );
753 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
755 vlc_cond_wait( &p_context->cond, &p_context->lock );
757 p_context->b_work = 0;
758 vlc_mutex_unlock( &p_context->lock );
759 if ( !vlc_object_alive (p_context) || p_context->b_error )
762 if ( p_context->pf_func )
764 p_context->i_ret = p_context->pf_func( p_context->p_context,
768 vlc_mutex_lock( &p_context->lock );
769 p_context->b_done = 1;
770 vlc_cond_signal( &p_context->cond );
771 vlc_mutex_unlock( &p_context->lock );
774 vlc_restorecancel (canc);
778 static int FfmpegExecute( AVCodecContext *s,
779 int (*pf_func)(AVCodecContext *c2, void *arg2),
780 void *arg, int *ret, int count, int size )
782 struct thread_context_t ** pp_contexts =
783 (struct thread_context_t **)s->thread_opaque;
786 /* Note, we can be certain that this is not called with the same
787 * AVCodecContext by different threads at the same time */
788 for ( int i = 0; i < count; i++ )
790 vlc_mutex_lock( &pp_contexts[i]->lock );
791 pp_contexts[i]->arg = argv[i];
792 pp_contexts[i]->pf_func = pf_func;
793 pp_contexts[i]->i_ret = 12345;
794 pp_contexts[i]->b_work = 1;
795 vlc_cond_signal( &pp_contexts[i]->cond );
796 vlc_mutex_unlock( &pp_contexts[i]->lock );
798 for ( int i = 0; i < count; i++ )
800 vlc_mutex_lock( &pp_contexts[i]->lock );
801 while ( !pp_contexts[i]->b_done )
803 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
805 pp_contexts[i]->b_done = 0;
806 pp_contexts[i]->pf_func = NULL;
807 vlc_mutex_unlock( &pp_contexts[i]->lock );
811 ret[i] = pp_contexts[i]->i_ret;
819 /****************************************************************************
820 * EncodeVideo: the whole thing
821 ****************************************************************************/
822 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
824 encoder_sys_t *p_sys = p_enc->p_sys;
828 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
830 struct thread_context_t ** pp_contexts;
834 pp_contexts = malloc( sizeof(struct thread_context_t *)
835 * p_enc->i_threads );
836 p_sys->p_context->thread_opaque = (void *)pp_contexts;
838 for ( i = 0; i < p_enc->i_threads; i++ )
840 pp_contexts[i] = vlc_object_create( p_enc,
841 sizeof(struct thread_context_t) );
842 pp_contexts[i]->p_context = p_sys->p_context;
843 vlc_mutex_init( &pp_contexts[i]->lock );
844 vlc_cond_init( &pp_contexts[i]->cond );
845 pp_contexts[i]->b_work = 0;
846 pp_contexts[i]->b_done = 0;
847 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
848 VLC_THREAD_PRIORITY_VIDEO ) )
850 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
855 p_sys->p_context->execute = FfmpegExecute;
858 memset( &frame, 0, sizeof( AVFrame ) );
859 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
861 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
862 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
865 /* Let ffmpeg select the frame type */
868 frame.repeat_pict = p_pict->i_nb_fields - 2;
869 frame.interlaced_frame = !p_pict->b_progressive;
870 frame.top_field_first = !!p_pict->b_top_field_first;
872 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
873 if( p_enc->fmt_out.i_codec != VLC_CODEC_MP4V )
875 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
877 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
879 mtime_t current_date = mdate();
881 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
883 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
884 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
885 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
887 p_sys->p_context->trellis = 0;
889 msg_Dbg( p_enc, "hurry up mode 3" );
893 p_sys->p_context->mb_decision = p_sys->i_hq;
895 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
897 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
898 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
900 p_sys->p_context->trellis = 0;
902 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
903 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
904 msg_Dbg( p_enc, "hurry up mode 2" );
908 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 0, 0 )
909 if ( p_sys->b_trellis )
910 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
912 p_sys->p_context->trellis = p_sys->b_trellis;
915 p_sys->p_context->noise_reduction =
916 p_sys->i_noise_reduction;
920 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
922 frame.pict_type = FF_P_TYPE;
923 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
929 frame.pts = (int64_t)AV_NOPTS_VALUE;
932 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
934 if ( p_sys->i_last_pts == frame.pts )
936 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
937 "same PTS (%"PRId64 ")", frame.pts );
940 else if ( p_sys->i_last_pts > frame.pts )
942 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
943 "past (current: %"PRId64 ", last: %"PRId64")",
944 frame.pts, p_sys->i_last_pts );
949 p_sys->i_last_pts = frame.pts;
953 frame.quality = p_sys->i_quality;
955 /* Ugly work-around for stupid libavcodec behaviour */
957 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
958 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
959 p_enc->fmt_in.video.i_frame_rate_base;
960 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
961 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
962 /* End work-around */
964 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
965 p_sys->i_buffer_out, &frame );
969 block_t *p_block = block_New( p_enc, i_out );
970 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
972 /* FIXME, 3-2 pulldown is not handled correctly */
973 p_block->i_length = INT64_C(1000000) *
974 p_enc->fmt_in.video.i_frame_rate_base /
975 p_enc->fmt_in.video.i_frame_rate;
977 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
979 /* No delay -> output pts == input pts */
980 p_block->i_pts = p_block->i_dts = p_pict->date;
982 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
983 p_sys->p_context->coded_frame->pts != 0 &&
984 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
986 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
987 p_block->i_pts = p_sys->p_context->coded_frame->pts;
989 /* Ugly work-around for stupid libavcodec behaviour */
991 int64_t i_framenum = p_block->i_pts *
992 p_enc->fmt_in.video.i_frame_rate /
993 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
995 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
997 /* End work-around */
999 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
1000 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
1002 p_block->i_dts = p_block->i_pts;
1006 if( p_sys->i_last_ref_pts )
1008 p_block->i_dts = p_sys->i_last_ref_pts;
1012 /* Let's put something sensible */
1013 p_block->i_dts = p_block->i_pts;
1016 p_sys->i_last_ref_pts = p_block->i_pts;
1021 /* Buggy libavcodec which doesn't update coded_frame->pts
1023 p_block->i_dts = p_block->i_pts = p_pict->date;
1026 switch ( p_sys->p_context->coded_frame->pict_type )
1029 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1032 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1035 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1045 /****************************************************************************
1046 * EncodeAudio: the whole thing
1047 ****************************************************************************/
1048 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1050 encoder_sys_t *p_sys = p_enc->p_sys;
1051 block_t *p_block, *p_chain = NULL;
1053 uint8_t *p_buffer = p_aout_buf->p_buffer;
1054 int i_samples = p_aout_buf->i_nb_samples;
1055 int i_samples_delay = p_sys->i_samples_delay;
1057 p_sys->i_pts = p_aout_buf->start_date -
1058 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1059 (mtime_t)p_enc->fmt_in.audio.i_rate;
1061 p_sys->i_samples_delay += i_samples;
1063 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1068 if( i_samples_delay )
1070 /* Take care of the left-over from last time */
1071 int i_delay_size = i_samples_delay * 2 *
1072 p_sys->p_context->channels;
1073 int i_size = p_sys->i_frame_size - i_delay_size;
1075 p_samples = (int16_t *)p_sys->p_buffer;
1076 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1077 p_buffer -= i_delay_size;
1078 i_samples += i_samples_delay;
1079 i_samples_delay = 0;
1083 p_samples = (int16_t *)p_buffer;
1086 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1087 p_sys->i_buffer_out, p_samples );
1090 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1092 if( i_out < 0 ) break;
1094 p_buffer += p_sys->i_frame_size;
1095 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1096 i_samples -= p_sys->p_context->frame_size;
1098 if( i_out == 0 ) continue;
1100 p_block = block_New( p_enc, i_out );
1101 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1103 p_block->i_length = (mtime_t)1000000 *
1104 (mtime_t)p_sys->p_context->frame_size /
1105 (mtime_t)p_sys->p_context->sample_rate;
1107 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1110 p_sys->i_pts += p_block->i_length;
1111 block_ChainAppend( &p_chain, p_block );
1114 /* Backup the remaining raw samples */
1117 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1118 p_sys->p_context->channels, p_buffer,
1119 i_samples * 2 * p_sys->p_context->channels );
1125 /*****************************************************************************
1126 * CloseEncoder: ffmpeg encoder destruction
1127 *****************************************************************************/
1128 void CloseEncoder( vlc_object_t *p_this )
1130 encoder_t *p_enc = (encoder_t *)p_this;
1131 encoder_sys_t *p_sys = p_enc->p_sys;
1133 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1136 struct thread_context_t ** pp_contexts =
1137 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1138 for ( i = 0; i < p_enc->i_threads; i++ )
1140 vlc_object_kill( pp_contexts[i] );
1141 vlc_cond_signal( &pp_contexts[i]->cond );
1142 vlc_thread_join( pp_contexts[i] );
1143 vlc_mutex_destroy( &pp_contexts[i]->lock );
1144 vlc_cond_destroy( &pp_contexts[i]->cond );
1145 vlc_object_release( pp_contexts[i] );
1148 free( pp_contexts );
1152 avcodec_close( p_sys->p_context );
1153 vlc_avcodec_unlock();
1154 av_free( p_sys->p_context );
1156 free( p_sys->p_buffer );
1157 free( p_sys->p_buffer_out );