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, 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 #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. ***", 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;
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_FOURCC('m', 'p', '2', 'v') ||
456 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
457 p_context->flags |= CODEC_FLAG_LOW_DELAY;
459 av_reduce( &i_aspect_num, &i_aspect_den,
460 p_enc->fmt_in.video.i_aspect,
461 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
462 av_reduce( &p_context->sample_aspect_ratio.num,
463 &p_context->sample_aspect_ratio.den,
464 i_aspect_num * (int64_t)p_context->height,
465 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
467 p_sys->i_buffer_out = p_context->height * p_context->width * 3;
468 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
469 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
470 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
472 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
473 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
474 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
476 if( p_codec->pix_fmts )
478 const enum PixelFormat *p = p_codec->pix_fmts;
479 for( ; *p != -1; p++ )
481 if( *p == p_context->pix_fmt ) break;
483 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
484 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
485 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
489 if ( p_sys->f_i_quant_factor != 0.0 )
490 p_context->i_quant_factor = p_sys->f_i_quant_factor;
492 p_context->noise_reduction = p_sys->i_noise_reduction;
494 if ( p_sys->b_mpeg4_matrix )
496 p_context->intra_matrix = mpeg4_default_intra_matrix;
497 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
500 if ( p_sys->b_pre_me )
502 p_context->pre_me = 1;
503 p_context->me_pre_cmp = FF_CMP_CHROMA;
506 if ( p_sys->b_interlace )
508 if ( p_context->height <= 280 )
510 if ( p_context->height != 16 || p_context->width != 16 )
512 "disabling interlaced video because height=%d <= 280",
517 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
518 if ( p_sys->b_interlace_me )
519 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
523 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
524 if ( p_sys->b_trellis )
525 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
527 p_context->trellis = p_sys->b_trellis;
530 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
531 p_context->flags |= CODEC_FLAG_QSCALE;
533 if ( p_enc->i_threads >= 1 )
534 p_context->thread_count = p_enc->i_threads;
536 if( p_sys->i_vtolerance > 0 )
537 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
539 /* usually if someone sets bitrate, he likes more to get that bitrate
540 * over quality should help 'normal' user to get asked bitrate
542 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
548 if( p_sys->i_qmin > 0 )
550 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
551 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
553 if( p_sys->i_qmax > 0 )
555 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
556 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
558 p_context->max_qdiff = 3;
560 p_context->mb_decision = p_sys->i_hq;
562 if( p_sys->i_quality )
564 p_context->flags |= CODEC_FLAG_QSCALE;
565 p_context->global_quality = p_sys->i_quality;
569 p_context->rc_qsquish = 1.0;
570 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
571 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
572 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
573 /* This is from ffmpeg's ffmpeg.c : */
574 p_context->rc_initial_buffer_occupancy
575 = p_sys->i_rc_buffer_size * 3/4;
576 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
579 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
581 /* work around bug in libmp3lame encoding */
582 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
583 p_enc->fmt_in.audio.i_channels = 2;
585 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
586 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
587 p_context->channels = p_enc->fmt_out.audio.i_channels;
589 if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
591 /* XXX: FAAC does resample only when setting the INPUT samplerate
592 * to the desired value (-R option of the faac frontend)
593 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
594 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
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;
602 /* Misc parameters */
603 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
605 if( i_codec_id == CODEC_ID_RAWVIDEO )
607 /* XXX: hack: Force same codec (will be handled by transcode) */
608 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
609 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
612 /* Make sure we get extradata filled by the encoder */
613 p_context->extradata_size = 0;
614 p_context->extradata = NULL;
615 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
617 vlc_mutex_lock( &avcodec_lock );
619 if( avcodec_open( p_context, p_codec ) )
621 vlc_mutex_unlock( &avcodec_lock );
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;
671 vlc_mutex_lock( &avcodec_lock );
672 if( avcodec_open( p_context, p_codec ) )
674 vlc_mutex_unlock( &avcodec_lock );
675 msg_Err( p_enc, "cannot open encoder" );
676 intf_UserFatal( p_enc, false,
677 _("Streaming / Transcoding failed"),
678 _("VLC could not open the encoder.") );
685 msg_Err( p_enc, "cannot open encoder" );
686 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
687 _("VLC could not open the encoder.") );
692 vlc_mutex_unlock( &avcodec_lock );
694 p_enc->fmt_out.i_extra = p_context->extradata_size;
695 if( p_enc->fmt_out.i_extra )
697 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
698 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
699 p_enc->fmt_out.i_extra );
701 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
703 if( p_enc->fmt_in.i_cat == AUDIO_ES )
705 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
706 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
707 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
708 p_sys->p_buffer = malloc( p_sys->i_frame_size );
709 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
712 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
717 /****************************************************************************
718 * Ffmpeg threading system
719 ****************************************************************************/
720 static void* FfmpegThread( vlc_object_t *p_this )
722 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
723 int canc = vlc_savecancel ();
724 while ( vlc_object_alive (p_context) && !p_context->b_error )
726 vlc_mutex_lock( &p_context->lock );
727 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
729 vlc_cond_wait( &p_context->cond, &p_context->lock );
731 p_context->b_work = 0;
732 vlc_mutex_unlock( &p_context->lock );
733 if ( !vlc_object_alive (p_context) || p_context->b_error )
736 if ( p_context->pf_func )
738 p_context->i_ret = p_context->pf_func( p_context->p_context,
742 vlc_mutex_lock( &p_context->lock );
743 p_context->b_done = 1;
744 vlc_cond_signal( &p_context->cond );
745 vlc_mutex_unlock( &p_context->lock );
748 vlc_restorecancel (canc);
752 static int FfmpegExecute( AVCodecContext *s,
753 int (*pf_func)(AVCodecContext *c2, void *arg2),
754 void *arg, int *ret, int count, int size )
756 struct thread_context_t ** pp_contexts =
757 (struct thread_context_t **)s->thread_opaque;
760 /* Note, we can be certain that this is not called with the same
761 * AVCodecContext by different threads at the same time */
762 for ( int i = 0; i < count; i++ )
764 vlc_mutex_lock( &pp_contexts[i]->lock );
765 pp_contexts[i]->arg = argv[i];
766 pp_contexts[i]->pf_func = pf_func;
767 pp_contexts[i]->i_ret = 12345;
768 pp_contexts[i]->b_work = 1;
769 vlc_cond_signal( &pp_contexts[i]->cond );
770 vlc_mutex_unlock( &pp_contexts[i]->lock );
772 for ( int i = 0; i < count; i++ )
774 vlc_mutex_lock( &pp_contexts[i]->lock );
775 while ( !pp_contexts[i]->b_done )
777 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
779 pp_contexts[i]->b_done = 0;
780 pp_contexts[i]->pf_func = NULL;
781 vlc_mutex_unlock( &pp_contexts[i]->lock );
785 ret[i] = pp_contexts[i]->i_ret;
793 /****************************************************************************
794 * EncodeVideo: the whole thing
795 ****************************************************************************/
796 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
798 encoder_sys_t *p_sys = p_enc->p_sys;
802 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
804 struct thread_context_t ** pp_contexts;
808 pp_contexts = malloc( sizeof(struct thread_context_t *)
809 * p_enc->i_threads );
810 p_sys->p_context->thread_opaque = (void *)pp_contexts;
812 for ( i = 0; i < p_enc->i_threads; i++ )
814 pp_contexts[i] = vlc_object_create( p_enc,
815 sizeof(struct thread_context_t) );
816 pp_contexts[i]->p_context = p_sys->p_context;
817 vlc_mutex_init( &pp_contexts[i]->lock );
818 vlc_cond_init( &pp_contexts[i]->cond );
819 pp_contexts[i]->b_work = 0;
820 pp_contexts[i]->b_done = 0;
821 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
822 VLC_THREAD_PRIORITY_VIDEO ) )
824 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
829 p_sys->p_context->execute = FfmpegExecute;
832 memset( &frame, 0, sizeof( AVFrame ) );
833 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
835 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
836 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
839 /* Let ffmpeg select the frame type */
842 frame.repeat_pict = p_pict->i_nb_fields - 2;
843 frame.interlaced_frame = !p_pict->b_progressive;
844 frame.top_field_first = !!p_pict->b_top_field_first;
846 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
847 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
849 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
851 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
853 mtime_t current_date = mdate();
855 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
857 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
858 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
859 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
861 p_sys->p_context->trellis = 0;
863 msg_Dbg( p_enc, "hurry up mode 3" );
867 p_sys->p_context->mb_decision = p_sys->i_hq;
869 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
871 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
872 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
874 p_sys->p_context->trellis = 0;
876 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
877 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
878 msg_Dbg( p_enc, "hurry up mode 2" );
882 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
883 if ( p_sys->b_trellis )
884 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
886 p_sys->p_context->trellis = p_sys->b_trellis;
889 p_sys->p_context->noise_reduction =
890 p_sys->i_noise_reduction;
894 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
896 frame.pict_type = FF_P_TYPE;
897 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
903 frame.pts = (int64_t)AV_NOPTS_VALUE;
906 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
908 if ( p_sys->i_last_pts == frame.pts )
910 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
911 "same PTS (%"PRId64 ")", frame.pts );
914 else if ( p_sys->i_last_pts > frame.pts )
916 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
917 "past (current: %"PRId64 ", last: %"PRId64")",
918 frame.pts, p_sys->i_last_pts );
923 p_sys->i_last_pts = frame.pts;
927 frame.quality = p_sys->i_quality;
929 /* Ugly work-around for stupid libavcodec behaviour */
931 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
932 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
933 p_enc->fmt_in.video.i_frame_rate_base;
934 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
935 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
936 /* End work-around */
938 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
939 p_sys->i_buffer_out, &frame );
943 block_t *p_block = block_New( p_enc, i_out );
944 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
946 /* FIXME, 3-2 pulldown is not handled correctly */
947 p_block->i_length = INT64_C(1000000) *
948 p_enc->fmt_in.video.i_frame_rate_base /
949 p_enc->fmt_in.video.i_frame_rate;
951 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
953 /* No delay -> output pts == input pts */
954 p_block->i_pts = p_block->i_dts = p_pict->date;
956 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
957 p_sys->p_context->coded_frame->pts != 0 &&
958 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
960 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
961 p_block->i_pts = p_sys->p_context->coded_frame->pts;
963 /* Ugly work-around for stupid libavcodec behaviour */
965 int64_t i_framenum = p_block->i_pts *
966 p_enc->fmt_in.video.i_frame_rate /
967 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
969 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
971 /* End work-around */
973 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
974 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
976 p_block->i_dts = p_block->i_pts;
980 if( p_sys->i_last_ref_pts )
982 p_block->i_dts = p_sys->i_last_ref_pts;
986 /* Let's put something sensible */
987 p_block->i_dts = p_block->i_pts;
990 p_sys->i_last_ref_pts = p_block->i_pts;
995 /* Buggy libavcodec which doesn't update coded_frame->pts
997 p_block->i_dts = p_block->i_pts = p_pict->date;
1000 switch ( p_sys->p_context->coded_frame->pict_type )
1003 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1006 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1009 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1019 /****************************************************************************
1020 * EncodeAudio: the whole thing
1021 ****************************************************************************/
1022 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1024 encoder_sys_t *p_sys = p_enc->p_sys;
1025 block_t *p_block, *p_chain = NULL;
1027 uint8_t *p_buffer = p_aout_buf->p_buffer;
1028 int i_samples = p_aout_buf->i_nb_samples;
1029 int i_samples_delay = p_sys->i_samples_delay;
1031 p_sys->i_pts = p_aout_buf->start_date -
1032 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1033 (mtime_t)p_enc->fmt_in.audio.i_rate;
1035 p_sys->i_samples_delay += i_samples;
1037 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1042 if( i_samples_delay )
1044 /* Take care of the left-over from last time */
1045 int i_delay_size = i_samples_delay * 2 *
1046 p_sys->p_context->channels;
1047 int i_size = p_sys->i_frame_size - i_delay_size;
1049 p_samples = (int16_t *)p_sys->p_buffer;
1050 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1051 p_buffer -= i_delay_size;
1052 i_samples += i_samples_delay;
1053 i_samples_delay = 0;
1057 p_samples = (int16_t *)p_buffer;
1060 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1061 p_sys->i_buffer_out, p_samples );
1064 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1066 if( i_out < 0 ) break;
1068 p_buffer += p_sys->i_frame_size;
1069 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1070 i_samples -= p_sys->p_context->frame_size;
1072 if( i_out == 0 ) continue;
1074 p_block = block_New( p_enc, i_out );
1075 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1077 p_block->i_length = (mtime_t)1000000 *
1078 (mtime_t)p_sys->p_context->frame_size /
1079 (mtime_t)p_sys->p_context->sample_rate;
1081 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1084 p_sys->i_pts += p_block->i_length;
1085 block_ChainAppend( &p_chain, p_block );
1088 /* Backup the remaining raw samples */
1091 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1092 p_sys->p_context->channels, p_buffer,
1093 i_samples * 2 * p_sys->p_context->channels );
1099 /*****************************************************************************
1100 * CloseEncoder: ffmpeg encoder destruction
1101 *****************************************************************************/
1102 void CloseEncoder( vlc_object_t *p_this )
1104 encoder_t *p_enc = (encoder_t *)p_this;
1105 encoder_sys_t *p_sys = p_enc->p_sys;
1107 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1110 struct thread_context_t ** pp_contexts =
1111 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1112 for ( i = 0; i < p_enc->i_threads; i++ )
1114 vlc_object_kill( pp_contexts[i] );
1115 vlc_cond_signal( &pp_contexts[i]->cond );
1116 vlc_thread_join( pp_contexts[i] );
1117 vlc_mutex_destroy( &pp_contexts[i]->lock );
1118 vlc_cond_destroy( &pp_contexts[i]->cond );
1119 vlc_object_release( pp_contexts[i] );
1122 free( pp_contexts );
1125 vlc_mutex_lock( &avcodec_lock );
1126 avcodec_close( p_sys->p_context );
1127 vlc_mutex_unlock( &avcodec_lock );
1128 av_free( p_sys->p_context );
1130 free( p_sys->p_buffer );
1131 free( p_sys->p_buffer_out );