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_interface.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 );
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 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
145 int i_aac_profile; /* AAC profile to use.*/
147 /* Used to work around stupid timestamping behaviour in libavcodec */
149 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
152 static const char *const ppsz_enc_options[] = {
153 "keyint", "bframes", "vt", "qmin", "qmax", "hq",
154 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
155 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
156 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
157 "p-masking", "border-masking", "luma-elim-threshold",
158 "chroma-elim-threshold",
159 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
165 static const uint16_t mpa_bitrate_tab[2][15] =
167 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
168 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
171 static const uint16_t mpa_freq_tab[6] =
172 { 44100, 48000, 32000, 22050, 24000, 16000 };
174 static const uint16_t mpeg4_default_intra_matrix[64] = {
175 8, 17, 18, 19, 21, 23, 25, 27,
176 17, 18, 19, 21, 23, 25, 27, 28,
177 20, 21, 22, 23, 24, 26, 28, 30,
178 21, 22, 23, 24, 26, 28, 30, 32,
179 22, 23, 24, 26, 28, 30, 32, 35,
180 23, 24, 26, 28, 30, 32, 35, 38,
181 25, 26, 28, 30, 32, 35, 38, 41,
182 27, 28, 30, 32, 35, 38, 41, 45,
185 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
186 16, 17, 18, 19, 20, 21, 22, 23,
187 17, 18, 19, 20, 21, 22, 23, 24,
188 18, 19, 20, 21, 22, 23, 24, 25,
189 19, 20, 21, 22, 23, 24, 26, 27,
190 20, 21, 22, 23, 25, 26, 27, 28,
191 21, 22, 23, 24, 26, 27, 28, 30,
192 22, 23, 24, 26, 27, 28, 30, 31,
193 23, 24, 25, 27, 28, 30, 31, 33,
196 /*****************************************************************************
197 * OpenEncoder: probe the encoder
198 *****************************************************************************/
200 int OpenEncoder( vlc_object_t *p_this )
202 encoder_t *p_enc = (encoder_t *)p_this;
203 encoder_sys_t *p_sys = p_enc->p_sys;
204 AVCodecContext *p_context;
206 int i_codec_id, i_cat;
207 const char *psz_namecodec;
210 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
213 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
215 /* handed chroma output */
219 i_codec_id = CODEC_ID_RAWVIDEO;
220 psz_namecodec = "Raw video";
223 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
225 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
226 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
227 _("\"%s\" is no video encoder."), psz_namecodec );
231 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
233 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
234 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
235 _("\"%s\" is no audio encoder."), psz_namecodec );
239 /* Initialization must be done before avcodec_find_encoder() */
240 InitLibavcodec( p_this );
242 p_codec = avcodec_find_encoder( i_codec_id );
245 msg_Err( p_enc, "cannot find encoder %s\n"
246 "*** Your FFMPEG installation is crippled. ***\n"
247 "*** Please check with your FFMPEG packager. ***\n"
248 "*** This is NOT a VLC media player issue. ***\n", psz_namecodec );
250 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"), _(
251 /* I have had enough of all these MPEG-3 transcoding bug reports.
252 * Downstream packager, you had better not patch this out, or I will be really
253 * annoyed. Think about it - you don't want to fork the VLC translation files,
254 * do you? -- Courmisch, 2008-10-22 */
255 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
257 "If you don't know how to fix this, ask for support from your distribution.\n"
259 "This is not an error inside VLC media player.\n"
260 "Do not contact the VideoLAN project about this issue.\n"),
265 /* Allocate the memory needed to store the encoder's structure */
266 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
268 p_enc->p_sys = p_sys;
269 p_sys->p_codec = p_codec;
271 p_enc->pf_encode_video = EncodeVideo;
272 p_enc->pf_encode_audio = EncodeAudio;
274 p_sys->p_buffer = NULL;
275 p_sys->p_buffer_out = NULL;
276 p_sys->i_buffer_out = 0;
278 p_sys->p_context = p_context = avcodec_alloc_context();
279 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
280 p_context->opaque = (void *)p_this;
282 /* Set CPU capabilities */
283 unsigned i_cpu = vlc_CPU();
284 p_context->dsp_mask = 0;
285 if( !(i_cpu & CPU_CAPABILITY_MMX) )
287 p_context->dsp_mask |= FF_MM_MMX;
289 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
291 p_context->dsp_mask |= FF_MM_MMXEXT;
293 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
295 p_context->dsp_mask |= FF_MM_3DNOW;
297 if( !(i_cpu & CPU_CAPABILITY_SSE) )
299 p_context->dsp_mask |= FF_MM_SSE;
300 p_context->dsp_mask |= FF_MM_SSE2;
303 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
305 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
306 p_sys->i_key_int = val.i_int;
308 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
309 p_sys->i_b_frames = val.i_int;
311 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
312 p_sys->i_vtolerance = val.i_int * 1000;
314 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
315 p_sys->b_interlace = val.b_bool;
317 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
318 p_sys->b_interlace_me = val.b_bool;
320 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
321 p_sys->b_pre_me = val.b_bool;
323 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
324 p_sys->b_hurry_up = val.b_bool;
325 if( p_sys->b_hurry_up )
327 /* hurry up mode needs noise reduction, even small */
328 p_sys->i_noise_reduction = 1;
331 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
332 p_sys->i_rc_buffer_size = val.i_int;
333 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
334 p_sys->f_rc_buffer_aggressivity = val.f_float;
336 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
337 p_sys->f_i_quant_factor = val.f_float;
339 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
340 p_sys->i_noise_reduction = val.i_int;
342 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
343 p_sys->b_mpeg4_matrix = val.b_bool;
345 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
346 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
347 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
349 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
350 p_sys->i_hq = FF_MB_DECISION_RD;
351 if( val.psz_string && *val.psz_string )
353 if( !strcmp( val.psz_string, "rd" ) )
354 p_sys->i_hq = FF_MB_DECISION_RD;
355 else if( !strcmp( val.psz_string, "bits" ) )
356 p_sys->i_hq = FF_MB_DECISION_BITS;
357 else if( !strcmp( val.psz_string, "simple" ) )
358 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
360 p_sys->i_hq = FF_MB_DECISION_RD;
363 p_sys->i_hq = FF_MB_DECISION_RD;
364 free( val.psz_string );
366 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
367 p_sys->i_qmin = val.i_int;
368 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
369 p_sys->i_qmax = val.i_int;
370 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
371 p_sys->b_trellis = val.b_bool;
373 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
374 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
375 p_context->strict_std_compliance = val.i_int;
377 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
378 p_sys->f_lumi_masking = val.f_float;
379 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
380 p_sys->f_dark_masking = val.f_float;
381 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
382 p_sys->f_p_masking = val.f_float;
383 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
384 p_sys->f_border_masking = val.f_float;
385 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
386 p_sys->i_luma_elim = val.i_int;
387 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
388 p_sys->i_chroma_elim = val.i_int;
390 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
391 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
392 /* ffmpeg uses faac encoder atm, and it has issues with
393 * other than low-complexity profile, so default to that */
394 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
395 if( val.psz_string && *val.psz_string )
397 if( !strncmp( val.psz_string, "main", 4 ) )
398 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
399 else if( !strncmp( val.psz_string, "low", 3 ) )
400 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
401 #if 0 /* Not supported by FAAC encoder */
402 else if( !strncmp( val.psz_string, "ssr", 3 ) )
403 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
405 else if( !strncmp( val.psz_string, "ltp", 3 ) )
406 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
409 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
410 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
413 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;
430 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
431 && (p_context->width > 720 || p_context->height > 576) )
432 p_context->level = 4; /* High level */
434 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
435 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
437 /* Defaults from ffmpeg.c */
438 p_context->qblur = 0.5;
439 p_context->qcompress = 0.5;
440 p_context->b_quant_offset = 1.25;
441 p_context->b_quant_factor = 1.25;
442 p_context->i_quant_offset = 0.0;
443 p_context->i_quant_factor = -0.8;
445 p_context->lumi_masking = p_sys->f_lumi_masking;
446 p_context->dark_masking = p_sys->f_dark_masking;
447 p_context->p_masking = p_sys->f_p_masking;
448 p_context->border_masking = p_sys->f_border_masking;
449 p_context->luma_elim_threshold = p_sys->i_luma_elim;
450 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
452 if( p_sys->i_key_int > 0 )
453 p_context->gop_size = p_sys->i_key_int;
454 p_context->max_b_frames =
455 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
456 p_context->b_frame_strategy = 0;
457 if( !p_context->max_b_frames &&
458 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
459 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
460 p_context->flags |= CODEC_FLAG_LOW_DELAY;
462 av_reduce( &i_aspect_num, &i_aspect_den,
463 p_enc->fmt_in.video.i_aspect,
464 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
465 av_reduce( &p_context->sample_aspect_ratio.num,
466 &p_context->sample_aspect_ratio.den,
467 i_aspect_num * (int64_t)p_context->height,
468 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
470 p_sys->i_buffer_out = p_context->height * p_context->width * 3;
471 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
472 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
473 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
475 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
476 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
477 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
479 if( p_codec->pix_fmts )
481 const enum PixelFormat *p = p_codec->pix_fmts;
482 for( ; *p != -1; p++ )
484 if( *p == p_context->pix_fmt ) break;
486 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
487 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
488 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
492 if ( p_sys->f_i_quant_factor != 0.0 )
493 p_context->i_quant_factor = p_sys->f_i_quant_factor;
495 p_context->noise_reduction = p_sys->i_noise_reduction;
497 if ( p_sys->b_mpeg4_matrix )
499 p_context->intra_matrix = mpeg4_default_intra_matrix;
500 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
503 if ( p_sys->b_pre_me )
505 p_context->pre_me = 1;
506 p_context->me_pre_cmp = FF_CMP_CHROMA;
509 if ( p_sys->b_interlace )
511 if ( p_context->height <= 280 )
513 if ( p_context->height != 16 || p_context->width != 16 )
515 "disabling interlaced video because height=%d <= 280",
520 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
521 if ( p_sys->b_interlace_me )
522 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
526 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
527 if ( p_sys->b_trellis )
528 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
530 p_context->trellis = p_sys->b_trellis;
533 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
534 p_context->flags |= CODEC_FLAG_QSCALE;
536 if ( p_enc->i_threads >= 1 )
537 p_context->thread_count = p_enc->i_threads;
539 if( p_sys->i_vtolerance > 0 )
540 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
542 /* usually if someone sets bitrate, he likes more to get that bitrate
543 * over quality should help 'normal' user to get asked bitrate
545 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
551 if( p_sys->i_qmin > 0 )
553 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
554 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
556 if( p_sys->i_qmax > 0 )
558 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
559 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
561 p_context->max_qdiff = 3;
563 p_context->mb_decision = p_sys->i_hq;
565 if( p_sys->i_quality )
567 p_context->flags |= CODEC_FLAG_QSCALE;
568 p_context->global_quality = p_sys->i_quality;
572 p_context->rc_qsquish = 1.0;
573 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
574 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
575 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
576 /* This is from ffmpeg's ffmpeg.c : */
577 p_context->rc_initial_buffer_occupancy
578 = p_sys->i_rc_buffer_size * 3/4;
579 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
582 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
584 /* work around bug in libmp3lame encoding */
585 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
586 p_enc->fmt_in.audio.i_channels = 2;
588 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
589 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
590 p_context->channels = p_enc->fmt_out.audio.i_channels;
592 if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
594 /* XXX: FAAC does resample only when setting the INPUT samplerate
595 * to the desired value (-R option of the faac frontend)
596 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
597 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
598 /* vlc should default to low-complexity profile, faac encoder
599 * has bug and aac audio has issues otherwise atm */
600 p_context->profile = p_sys->i_aac_profile;
605 /* Misc parameters */
606 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
608 if( i_codec_id == CODEC_ID_RAWVIDEO )
610 /* XXX: hack: Force same codec (will be handled by transcode) */
611 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
612 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
615 /* Make sure we get extradata filled by the encoder */
616 p_context->extradata_size = 0;
617 p_context->extradata = NULL;
618 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
620 vlc_mutex_lock( &avcodec_lock );
622 if( avcodec_open( p_context, p_codec ) )
624 vlc_mutex_unlock( &avcodec_lock );
625 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
626 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
627 || i_codec_id == CODEC_ID_MP3) )
629 if( p_context->channels > 2 )
631 p_context->channels = 2;
632 p_enc->fmt_in.audio.i_channels = 2; // FIXME
633 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
636 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
640 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
642 if ( p_enc->fmt_out.audio.i_rate
643 == mpa_freq_tab[i_frequency] )
646 if ( i_frequency == 6 )
648 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
649 p_enc->fmt_out.audio.i_rate );
654 for ( i = 1; i < 14; i++ )
656 if ( p_enc->fmt_out.i_bitrate / 1000
657 <= mpa_bitrate_tab[i_frequency / 3][i] )
660 if ( p_enc->fmt_out.i_bitrate / 1000
661 != mpa_bitrate_tab[i_frequency / 3][i] )
664 "MPEG audio doesn't support bitrate=%d, using %d",
665 p_enc->fmt_out.i_bitrate,
666 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
667 p_enc->fmt_out.i_bitrate =
668 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
669 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
673 p_context->codec = NULL;
674 vlc_mutex_lock( &avcodec_lock );
675 if( avcodec_open( p_context, p_codec ) )
677 vlc_mutex_unlock( &avcodec_lock );
678 msg_Err( p_enc, "cannot open encoder" );
679 intf_UserFatal( p_enc, false,
680 _("Streaming / Transcoding failed"),
681 _("VLC could not open the encoder.") );
688 msg_Err( p_enc, "cannot open encoder" );
689 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
690 _("VLC could not open the encoder.") );
695 vlc_mutex_unlock( &avcodec_lock );
697 p_enc->fmt_out.i_extra = p_context->extradata_size;
698 if( p_enc->fmt_out.i_extra )
700 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
701 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
702 p_enc->fmt_out.i_extra );
704 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
706 if( p_enc->fmt_in.i_cat == AUDIO_ES )
708 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
709 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
710 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
711 p_sys->p_buffer = malloc( p_sys->i_frame_size );
712 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
715 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
720 /****************************************************************************
721 * Ffmpeg threading system
722 ****************************************************************************/
723 static void* FfmpegThread( vlc_object_t *p_this )
725 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
726 int canc = vlc_savecancel ();
727 while ( vlc_object_alive (p_context) && !p_context->b_error )
729 vlc_mutex_lock( &p_context->lock );
730 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
732 vlc_cond_wait( &p_context->cond, &p_context->lock );
734 p_context->b_work = 0;
735 vlc_mutex_unlock( &p_context->lock );
736 if ( !vlc_object_alive (p_context) || p_context->b_error )
739 if ( p_context->pf_func )
741 p_context->i_ret = p_context->pf_func( p_context->p_context,
745 vlc_mutex_lock( &p_context->lock );
746 p_context->b_done = 1;
747 vlc_cond_signal( &p_context->cond );
748 vlc_mutex_unlock( &p_context->lock );
751 vlc_restorecancel (canc);
755 static int FfmpegExecute( AVCodecContext *s,
756 int (*pf_func)(AVCodecContext *c2, void *arg2),
757 void **arg, int *ret, int count )
759 struct thread_context_t ** pp_contexts =
760 (struct thread_context_t **)s->thread_opaque;
763 /* Note, we can be certain that this is not called with the same
764 * AVCodecContext by different threads at the same time */
765 for ( i = 0; i < count; i++ )
767 vlc_mutex_lock( &pp_contexts[i]->lock );
768 pp_contexts[i]->arg = arg[i];
769 pp_contexts[i]->pf_func = pf_func;
770 pp_contexts[i]->i_ret = 12345;
771 pp_contexts[i]->b_work = 1;
772 vlc_cond_signal( &pp_contexts[i]->cond );
773 vlc_mutex_unlock( &pp_contexts[i]->lock );
775 for ( i = 0; i < count; i++ )
777 vlc_mutex_lock( &pp_contexts[i]->lock );
778 while ( !pp_contexts[i]->b_done )
780 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
782 pp_contexts[i]->b_done = 0;
783 pp_contexts[i]->pf_func = NULL;
784 vlc_mutex_unlock( &pp_contexts[i]->lock );
788 ret[i] = pp_contexts[i]->i_ret;
795 /****************************************************************************
796 * EncodeVideo: the whole thing
797 ****************************************************************************/
798 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
800 encoder_sys_t *p_sys = p_enc->p_sys;
804 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
806 struct thread_context_t ** pp_contexts;
810 pp_contexts = malloc( sizeof(struct thread_context_t *)
811 * p_enc->i_threads );
812 p_sys->p_context->thread_opaque = (void *)pp_contexts;
814 for ( i = 0; i < p_enc->i_threads; i++ )
816 pp_contexts[i] = vlc_object_create( p_enc,
817 sizeof(struct thread_context_t) );
818 pp_contexts[i]->p_context = p_sys->p_context;
819 vlc_mutex_init( &pp_contexts[i]->lock );
820 vlc_cond_init( &pp_contexts[i]->cond );
821 pp_contexts[i]->b_work = 0;
822 pp_contexts[i]->b_done = 0;
823 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
824 VLC_THREAD_PRIORITY_VIDEO ) )
826 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
831 p_sys->p_context->execute = FfmpegExecute;
834 memset( &frame, 0, sizeof( AVFrame ) );
835 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
837 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
838 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
841 /* Let ffmpeg select the frame type */
844 frame.repeat_pict = p_pict->i_nb_fields - 2;
845 frame.interlaced_frame = !p_pict->b_progressive;
846 frame.top_field_first = !!p_pict->b_top_field_first;
848 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
849 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
851 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
853 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
855 mtime_t current_date = mdate();
857 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
859 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
860 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
861 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
863 p_sys->p_context->trellis = 0;
865 msg_Dbg( p_enc, "hurry up mode 3" );
869 p_sys->p_context->mb_decision = p_sys->i_hq;
871 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
873 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
874 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
876 p_sys->p_context->trellis = 0;
878 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
879 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
880 msg_Dbg( p_enc, "hurry up mode 2" );
884 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
885 if ( p_sys->b_trellis )
886 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
888 p_sys->p_context->trellis = p_sys->b_trellis;
891 p_sys->p_context->noise_reduction =
892 p_sys->i_noise_reduction;
896 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
898 frame.pict_type = FF_P_TYPE;
899 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
905 frame.pts = (int64_t)AV_NOPTS_VALUE;
908 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
910 if ( p_sys->i_last_pts == frame.pts )
912 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
913 "same PTS (%"PRId64 ")", frame.pts );
916 else if ( p_sys->i_last_pts > frame.pts )
918 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
919 "past (current: %"PRId64 ", last: %"PRId64")",
920 frame.pts, p_sys->i_last_pts );
925 p_sys->i_last_pts = frame.pts;
929 frame.quality = p_sys->i_quality;
931 /* Ugly work-around for stupid libavcodec behaviour */
933 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
934 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
935 p_enc->fmt_in.video.i_frame_rate_base;
936 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
937 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
938 /* End work-around */
940 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
941 p_sys->i_buffer_out, &frame );
945 block_t *p_block = block_New( p_enc, i_out );
946 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
948 /* FIXME, 3-2 pulldown is not handled correctly */
949 p_block->i_length = INT64_C(1000000) *
950 p_enc->fmt_in.video.i_frame_rate_base /
951 p_enc->fmt_in.video.i_frame_rate;
953 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
955 /* No delay -> output pts == input pts */
956 p_block->i_pts = p_block->i_dts = p_pict->date;
958 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
959 p_sys->p_context->coded_frame->pts != 0 &&
960 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
962 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
963 p_block->i_pts = p_sys->p_context->coded_frame->pts;
965 /* Ugly work-around for stupid libavcodec behaviour */
967 int64_t i_framenum = p_block->i_pts *
968 p_enc->fmt_in.video.i_frame_rate /
969 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
971 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
973 /* End work-around */
975 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
976 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
978 p_block->i_dts = p_block->i_pts;
982 if( p_sys->i_last_ref_pts )
984 p_block->i_dts = p_sys->i_last_ref_pts;
988 /* Let's put something sensible */
989 p_block->i_dts = p_block->i_pts;
992 p_sys->i_last_ref_pts = p_block->i_pts;
997 /* Buggy libavcodec which doesn't update coded_frame->pts
999 p_block->i_dts = p_block->i_pts = p_pict->date;
1002 switch ( p_sys->p_context->coded_frame->pict_type )
1005 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1008 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1011 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1021 /****************************************************************************
1022 * EncodeAudio: the whole thing
1023 ****************************************************************************/
1024 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1026 encoder_sys_t *p_sys = p_enc->p_sys;
1027 block_t *p_block, *p_chain = NULL;
1029 uint8_t *p_buffer = p_aout_buf->p_buffer;
1030 int i_samples = p_aout_buf->i_nb_samples;
1031 int i_samples_delay = p_sys->i_samples_delay;
1033 p_sys->i_pts = p_aout_buf->start_date -
1034 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1035 (mtime_t)p_enc->fmt_in.audio.i_rate;
1037 p_sys->i_samples_delay += i_samples;
1039 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1044 if( i_samples_delay )
1046 /* Take care of the left-over from last time */
1047 int i_delay_size = i_samples_delay * 2 *
1048 p_sys->p_context->channels;
1049 int i_size = p_sys->i_frame_size - i_delay_size;
1051 p_samples = (int16_t *)p_sys->p_buffer;
1052 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1053 p_buffer -= i_delay_size;
1054 i_samples += i_samples_delay;
1055 i_samples_delay = 0;
1059 p_samples = (int16_t *)p_buffer;
1062 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1063 p_sys->i_buffer_out, p_samples );
1066 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1068 if( i_out < 0 ) break;
1070 p_buffer += p_sys->i_frame_size;
1071 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1072 i_samples -= p_sys->p_context->frame_size;
1074 if( i_out == 0 ) continue;
1076 p_block = block_New( p_enc, i_out );
1077 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1079 p_block->i_length = (mtime_t)1000000 *
1080 (mtime_t)p_sys->p_context->frame_size /
1081 (mtime_t)p_sys->p_context->sample_rate;
1083 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1086 p_sys->i_pts += p_block->i_length;
1087 block_ChainAppend( &p_chain, p_block );
1090 /* Backup the remaining raw samples */
1093 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1094 p_sys->p_context->channels, p_buffer,
1095 i_samples * 2 * p_sys->p_context->channels );
1101 /*****************************************************************************
1102 * CloseEncoder: ffmpeg encoder destruction
1103 *****************************************************************************/
1104 void CloseEncoder( vlc_object_t *p_this )
1106 encoder_t *p_enc = (encoder_t *)p_this;
1107 encoder_sys_t *p_sys = p_enc->p_sys;
1109 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1112 struct thread_context_t ** pp_contexts =
1113 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1114 for ( i = 0; i < p_enc->i_threads; i++ )
1116 vlc_object_kill( pp_contexts[i] );
1117 vlc_cond_signal( &pp_contexts[i]->cond );
1118 vlc_thread_join( pp_contexts[i] );
1119 vlc_mutex_destroy( &pp_contexts[i]->lock );
1120 vlc_cond_destroy( &pp_contexts[i]->cond );
1121 vlc_object_release( pp_contexts[i] );
1124 free( pp_contexts );
1127 vlc_mutex_lock( &avcodec_lock );
1128 avcodec_close( p_sys->p_context );
1129 vlc_mutex_unlock( &avcodec_lock );
1130 av_free( p_sys->p_context );
1132 free( p_sys->p_buffer );
1133 free( p_sys->p_buffer_out );