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>
39 #include <vlc_codec.h>
40 #include <vlc_dialog.h>
41 #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 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
146 int i_aac_profile; /* AAC profile to use.*/
148 /* Used to work around stupid timestamping behaviour in libavcodec */
150 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
153 static const char *const ppsz_enc_options[] = {
154 "keyint", "bframes", "vt", "qmin", "qmax", "hq",
155 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
156 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
157 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
158 "p-masking", "border-masking", "luma-elim-threshold",
159 "chroma-elim-threshold",
160 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
166 static const uint16_t mpa_bitrate_tab[2][15] =
168 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
169 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
172 static const uint16_t mpa_freq_tab[6] =
173 { 44100, 48000, 32000, 22050, 24000, 16000 };
175 static const uint16_t mpeg4_default_intra_matrix[64] = {
176 8, 17, 18, 19, 21, 23, 25, 27,
177 17, 18, 19, 21, 23, 25, 27, 28,
178 20, 21, 22, 23, 24, 26, 28, 30,
179 21, 22, 23, 24, 26, 28, 30, 32,
180 22, 23, 24, 26, 28, 30, 32, 35,
181 23, 24, 26, 28, 30, 32, 35, 38,
182 25, 26, 28, 30, 32, 35, 38, 41,
183 27, 28, 30, 32, 35, 38, 41, 45,
186 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
187 16, 17, 18, 19, 20, 21, 22, 23,
188 17, 18, 19, 20, 21, 22, 23, 24,
189 18, 19, 20, 21, 22, 23, 24, 25,
190 19, 20, 21, 22, 23, 24, 26, 27,
191 20, 21, 22, 23, 25, 26, 27, 28,
192 21, 22, 23, 24, 26, 27, 28, 30,
193 22, 23, 24, 26, 27, 28, 30, 31,
194 23, 24, 25, 27, 28, 30, 31, 33,
197 /*****************************************************************************
198 * OpenEncoder: probe the encoder
199 *****************************************************************************/
201 int OpenEncoder( vlc_object_t *p_this )
203 encoder_t *p_enc = (encoder_t *)p_this;
204 encoder_sys_t *p_sys = p_enc->p_sys;
205 AVCodecContext *p_context;
207 int i_codec_id, i_cat;
208 const char *psz_namecodec;
211 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
214 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
216 /* handed chroma output */
220 i_codec_id = CODEC_ID_RAWVIDEO;
221 psz_namecodec = "Raw video";
224 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
226 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
227 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
228 _("\"%s\" is no video encoder."), psz_namecodec );
232 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
234 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
235 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
236 _("\"%s\" is no audio encoder."), psz_namecodec );
240 /* Initialization must be done before avcodec_find_encoder() */
241 InitLibavcodec( p_this );
243 p_codec = avcodec_find_encoder( i_codec_id );
246 msg_Err( p_enc, "cannot find encoder %s\n"
247 "*** Your FFMPEG installation is crippled. ***\n"
248 "*** Please check with your FFMPEG packager. ***\n"
249 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
251 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
252 /* I have had enough of all these MPEG-3 transcoding bug reports.
253 * Downstream packager, you had better not patch this out, or I will be really
254 * annoyed. Think about it - you don't want to fork the VLC translation files,
255 * do you? -- Courmisch, 2008-10-22 */
256 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
258 "If you don't know how to fix this, ask for support from your distribution.\n"
260 "This is not an error inside VLC media player.\n"
261 "Do not contact the VideoLAN project about this issue.\n"),
266 /* Allocate the memory needed to store the encoder's structure */
267 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
269 p_enc->p_sys = p_sys;
270 p_sys->p_codec = p_codec;
272 p_enc->pf_encode_video = EncodeVideo;
273 p_enc->pf_encode_audio = EncodeAudio;
275 p_sys->p_buffer = NULL;
276 p_sys->p_buffer_out = NULL;
277 p_sys->i_buffer_out = 0;
279 p_sys->p_context = p_context = avcodec_alloc_context();
280 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
281 p_context->opaque = (void *)p_this;
283 /* Set CPU capabilities */
284 unsigned i_cpu = vlc_CPU();
285 p_context->dsp_mask = 0;
286 if( !(i_cpu & CPU_CAPABILITY_MMX) )
288 p_context->dsp_mask |= FF_MM_MMX;
290 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
292 p_context->dsp_mask |= FF_MM_MMXEXT;
294 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
296 p_context->dsp_mask |= FF_MM_3DNOW;
298 if( !(i_cpu & CPU_CAPABILITY_SSE) )
300 p_context->dsp_mask |= FF_MM_SSE;
301 p_context->dsp_mask |= FF_MM_SSE2;
304 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
306 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
307 p_sys->i_key_int = val.i_int;
309 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
310 p_sys->i_b_frames = val.i_int;
312 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
313 p_sys->i_vtolerance = val.i_int * 1000;
315 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
316 p_sys->b_interlace = val.b_bool;
318 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
319 p_sys->b_interlace_me = val.b_bool;
321 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
322 p_sys->b_pre_me = val.b_bool;
324 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
325 p_sys->b_hurry_up = val.b_bool;
326 if( p_sys->b_hurry_up )
328 /* hurry up mode needs noise reduction, even small */
329 p_sys->i_noise_reduction = 1;
332 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
333 p_sys->i_rc_buffer_size = val.i_int;
334 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
335 p_sys->f_rc_buffer_aggressivity = val.f_float;
337 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
338 p_sys->f_i_quant_factor = val.f_float;
340 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
341 p_sys->i_noise_reduction = val.i_int;
343 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
344 p_sys->b_mpeg4_matrix = val.b_bool;
346 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
347 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
348 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
350 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
351 p_sys->i_hq = FF_MB_DECISION_RD;
352 if( val.psz_string && *val.psz_string )
354 if( !strcmp( val.psz_string, "rd" ) )
355 p_sys->i_hq = FF_MB_DECISION_RD;
356 else if( !strcmp( val.psz_string, "bits" ) )
357 p_sys->i_hq = FF_MB_DECISION_BITS;
358 else if( !strcmp( val.psz_string, "simple" ) )
359 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
361 p_sys->i_hq = FF_MB_DECISION_RD;
364 p_sys->i_hq = FF_MB_DECISION_RD;
365 free( val.psz_string );
367 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
368 p_sys->i_qmin = val.i_int;
369 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
370 p_sys->i_qmax = val.i_int;
371 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
372 p_sys->b_trellis = val.b_bool;
374 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
375 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
376 p_context->strict_std_compliance = val.i_int;
378 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
379 p_sys->f_lumi_masking = val.f_float;
380 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
381 p_sys->f_dark_masking = val.f_float;
382 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
383 p_sys->f_p_masking = val.f_float;
384 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
385 p_sys->f_border_masking = val.f_float;
386 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
387 p_sys->i_luma_elim = val.i_int;
388 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
389 p_sys->i_chroma_elim = val.i_int;
391 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
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 );
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_FOURCC('m', 'p', '2', 'v') ||
457 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
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_FOURCC('I','4','2','0');
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 < ((52<<16)+(0<<8)+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 = AOUT_FMT_S16_NE;
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_FOURCC('m','p','4','a') )
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 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
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;
603 /* Misc parameters */
604 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
606 if( i_codec_id == CODEC_ID_RAWVIDEO )
608 /* XXX: hack: Force same codec (will be handled by transcode) */
609 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
610 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
613 /* Make sure we get extradata filled by the encoder */
614 p_context->extradata_size = 0;
615 p_context->extradata = NULL;
616 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
620 ret = avcodec_open( p_context, p_codec );
621 vlc_avcodec_unlock();
624 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
625 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
626 || i_codec_id == CODEC_ID_MP3) )
628 if( p_context->channels > 2 )
630 p_context->channels = 2;
631 p_enc->fmt_in.audio.i_channels = 2; // FIXME
632 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
635 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
639 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
641 if ( p_enc->fmt_out.audio.i_rate
642 == mpa_freq_tab[i_frequency] )
645 if ( i_frequency == 6 )
647 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
648 p_enc->fmt_out.audio.i_rate );
653 for ( i = 1; i < 14; i++ )
655 if ( p_enc->fmt_out.i_bitrate / 1000
656 <= mpa_bitrate_tab[i_frequency / 3][i] )
659 if ( p_enc->fmt_out.i_bitrate / 1000
660 != mpa_bitrate_tab[i_frequency / 3][i] )
663 "MPEG audio doesn't support bitrate=%d, using %d",
664 p_enc->fmt_out.i_bitrate,
665 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
666 p_enc->fmt_out.i_bitrate =
667 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
668 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
672 p_context->codec = NULL;
674 ret = avcodec_open( p_context, p_codec );
675 vlc_avcodec_unlock();
678 msg_Err( p_enc, "cannot open encoder" );
680 _("Streaming / Transcoding failed"),
681 _("VLC could not open the encoder.") );
688 msg_Err( p_enc, "cannot open encoder" );
689 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
690 _("VLC could not open the encoder.") );
696 if( i_codec_id == CODEC_ID_FLAC )
698 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
699 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
700 if( p_enc->fmt_out.p_extra )
702 uint8_t *p = p_enc->fmt_out.p_extra;
708 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
709 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
710 p[7] = ( p_context->extradata_size ) & 0xff;
711 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
715 p_enc->fmt_out.i_extra = 0;
720 p_enc->fmt_out.i_extra = p_context->extradata_size;
721 if( p_enc->fmt_out.i_extra )
723 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
724 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
725 p_enc->fmt_out.i_extra );
729 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
731 if( p_enc->fmt_in.i_cat == AUDIO_ES )
733 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
734 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
735 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
736 p_sys->p_buffer = malloc( p_sys->i_frame_size );
737 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
740 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
745 /****************************************************************************
746 * Ffmpeg threading system
747 ****************************************************************************/
748 static void* FfmpegThread( vlc_object_t *p_this )
750 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
751 int canc = vlc_savecancel ();
752 while ( vlc_object_alive (p_context) && !p_context->b_error )
754 vlc_mutex_lock( &p_context->lock );
755 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
757 vlc_cond_wait( &p_context->cond, &p_context->lock );
759 p_context->b_work = 0;
760 vlc_mutex_unlock( &p_context->lock );
761 if ( !vlc_object_alive (p_context) || p_context->b_error )
764 if ( p_context->pf_func )
766 p_context->i_ret = p_context->pf_func( p_context->p_context,
770 vlc_mutex_lock( &p_context->lock );
771 p_context->b_done = 1;
772 vlc_cond_signal( &p_context->cond );
773 vlc_mutex_unlock( &p_context->lock );
776 vlc_restorecancel (canc);
780 static int FfmpegExecute( AVCodecContext *s,
781 int (*pf_func)(AVCodecContext *c2, void *arg2),
782 void *arg, int *ret, int count, int size )
784 struct thread_context_t ** pp_contexts =
785 (struct thread_context_t **)s->thread_opaque;
788 /* Note, we can be certain that this is not called with the same
789 * AVCodecContext by different threads at the same time */
790 for ( int i = 0; i < count; i++ )
792 vlc_mutex_lock( &pp_contexts[i]->lock );
793 pp_contexts[i]->arg = argv[i];
794 pp_contexts[i]->pf_func = pf_func;
795 pp_contexts[i]->i_ret = 12345;
796 pp_contexts[i]->b_work = 1;
797 vlc_cond_signal( &pp_contexts[i]->cond );
798 vlc_mutex_unlock( &pp_contexts[i]->lock );
800 for ( int i = 0; i < count; i++ )
802 vlc_mutex_lock( &pp_contexts[i]->lock );
803 while ( !pp_contexts[i]->b_done )
805 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
807 pp_contexts[i]->b_done = 0;
808 pp_contexts[i]->pf_func = NULL;
809 vlc_mutex_unlock( &pp_contexts[i]->lock );
813 ret[i] = pp_contexts[i]->i_ret;
821 /****************************************************************************
822 * EncodeVideo: the whole thing
823 ****************************************************************************/
824 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
826 encoder_sys_t *p_sys = p_enc->p_sys;
830 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
832 struct thread_context_t ** pp_contexts;
836 pp_contexts = malloc( sizeof(struct thread_context_t *)
837 * p_enc->i_threads );
838 p_sys->p_context->thread_opaque = (void *)pp_contexts;
840 for ( i = 0; i < p_enc->i_threads; i++ )
842 pp_contexts[i] = vlc_object_create( p_enc,
843 sizeof(struct thread_context_t) );
844 pp_contexts[i]->p_context = p_sys->p_context;
845 vlc_mutex_init( &pp_contexts[i]->lock );
846 vlc_cond_init( &pp_contexts[i]->cond );
847 pp_contexts[i]->b_work = 0;
848 pp_contexts[i]->b_done = 0;
849 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
850 VLC_THREAD_PRIORITY_VIDEO ) )
852 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
857 p_sys->p_context->execute = FfmpegExecute;
860 memset( &frame, 0, sizeof( AVFrame ) );
861 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
863 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
864 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
867 /* Let ffmpeg select the frame type */
870 frame.repeat_pict = p_pict->i_nb_fields - 2;
871 frame.interlaced_frame = !p_pict->b_progressive;
872 frame.top_field_first = !!p_pict->b_top_field_first;
874 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
875 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
877 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
879 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
881 mtime_t current_date = mdate();
883 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
885 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
886 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
887 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
889 p_sys->p_context->trellis = 0;
891 msg_Dbg( p_enc, "hurry up mode 3" );
895 p_sys->p_context->mb_decision = p_sys->i_hq;
897 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
899 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
900 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
902 p_sys->p_context->trellis = 0;
904 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
905 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
906 msg_Dbg( p_enc, "hurry up mode 2" );
910 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
911 if ( p_sys->b_trellis )
912 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
914 p_sys->p_context->trellis = p_sys->b_trellis;
917 p_sys->p_context->noise_reduction =
918 p_sys->i_noise_reduction;
922 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
924 frame.pict_type = FF_P_TYPE;
925 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
931 frame.pts = (int64_t)AV_NOPTS_VALUE;
934 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
936 if ( p_sys->i_last_pts == frame.pts )
938 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
939 "same PTS (%"PRId64 ")", frame.pts );
942 else if ( p_sys->i_last_pts > frame.pts )
944 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
945 "past (current: %"PRId64 ", last: %"PRId64")",
946 frame.pts, p_sys->i_last_pts );
951 p_sys->i_last_pts = frame.pts;
955 frame.quality = p_sys->i_quality;
957 /* Ugly work-around for stupid libavcodec behaviour */
959 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
960 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
961 p_enc->fmt_in.video.i_frame_rate_base;
962 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
963 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
964 /* End work-around */
966 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
967 p_sys->i_buffer_out, &frame );
971 block_t *p_block = block_New( p_enc, i_out );
972 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
974 /* FIXME, 3-2 pulldown is not handled correctly */
975 p_block->i_length = INT64_C(1000000) *
976 p_enc->fmt_in.video.i_frame_rate_base /
977 p_enc->fmt_in.video.i_frame_rate;
979 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
981 /* No delay -> output pts == input pts */
982 p_block->i_pts = p_block->i_dts = p_pict->date;
984 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
985 p_sys->p_context->coded_frame->pts != 0 &&
986 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
988 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
989 p_block->i_pts = p_sys->p_context->coded_frame->pts;
991 /* Ugly work-around for stupid libavcodec behaviour */
993 int64_t i_framenum = p_block->i_pts *
994 p_enc->fmt_in.video.i_frame_rate /
995 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
997 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
999 /* End work-around */
1001 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
1002 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
1004 p_block->i_dts = p_block->i_pts;
1008 if( p_sys->i_last_ref_pts )
1010 p_block->i_dts = p_sys->i_last_ref_pts;
1014 /* Let's put something sensible */
1015 p_block->i_dts = p_block->i_pts;
1018 p_sys->i_last_ref_pts = p_block->i_pts;
1023 /* Buggy libavcodec which doesn't update coded_frame->pts
1025 p_block->i_dts = p_block->i_pts = p_pict->date;
1028 switch ( p_sys->p_context->coded_frame->pict_type )
1031 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1034 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1037 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1047 /****************************************************************************
1048 * EncodeAudio: the whole thing
1049 ****************************************************************************/
1050 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1052 encoder_sys_t *p_sys = p_enc->p_sys;
1053 block_t *p_block, *p_chain = NULL;
1055 uint8_t *p_buffer = p_aout_buf->p_buffer;
1056 int i_samples = p_aout_buf->i_nb_samples;
1057 int i_samples_delay = p_sys->i_samples_delay;
1059 p_sys->i_pts = p_aout_buf->start_date -
1060 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1061 (mtime_t)p_enc->fmt_in.audio.i_rate;
1063 p_sys->i_samples_delay += i_samples;
1065 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1070 if( i_samples_delay )
1072 /* Take care of the left-over from last time */
1073 int i_delay_size = i_samples_delay * 2 *
1074 p_sys->p_context->channels;
1075 int i_size = p_sys->i_frame_size - i_delay_size;
1077 p_samples = (int16_t *)p_sys->p_buffer;
1078 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1079 p_buffer -= i_delay_size;
1080 i_samples += i_samples_delay;
1081 i_samples_delay = 0;
1085 p_samples = (int16_t *)p_buffer;
1088 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1089 p_sys->i_buffer_out, p_samples );
1092 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1094 if( i_out < 0 ) break;
1096 p_buffer += p_sys->i_frame_size;
1097 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1098 i_samples -= p_sys->p_context->frame_size;
1100 if( i_out == 0 ) continue;
1102 p_block = block_New( p_enc, i_out );
1103 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1105 p_block->i_length = (mtime_t)1000000 *
1106 (mtime_t)p_sys->p_context->frame_size /
1107 (mtime_t)p_sys->p_context->sample_rate;
1109 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1112 p_sys->i_pts += p_block->i_length;
1113 block_ChainAppend( &p_chain, p_block );
1116 /* Backup the remaining raw samples */
1119 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1120 p_sys->p_context->channels, p_buffer,
1121 i_samples * 2 * p_sys->p_context->channels );
1127 /*****************************************************************************
1128 * CloseEncoder: ffmpeg encoder destruction
1129 *****************************************************************************/
1130 void CloseEncoder( vlc_object_t *p_this )
1132 encoder_t *p_enc = (encoder_t *)p_this;
1133 encoder_sys_t *p_sys = p_enc->p_sys;
1135 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1138 struct thread_context_t ** pp_contexts =
1139 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1140 for ( i = 0; i < p_enc->i_threads; i++ )
1142 vlc_object_kill( pp_contexts[i] );
1143 vlc_cond_signal( &pp_contexts[i]->cond );
1144 vlc_thread_join( pp_contexts[i] );
1145 vlc_mutex_destroy( &pp_contexts[i]->lock );
1146 vlc_cond_destroy( &pp_contexts[i]->cond );
1147 vlc_object_release( pp_contexts[i] );
1150 free( pp_contexts );
1154 avcodec_close( p_sys->p_context );
1155 vlc_avcodec_unlock();
1156 av_free( p_sys->p_context );
1158 free( p_sys->p_buffer );
1159 free( p_sys->p_buffer_out );