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>
56 #define HURRY_UP_GUARD1 (450000)
57 #define HURRY_UP_GUARD2 (300000)
58 #define HURRY_UP_GUARD3 (100000)
60 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
62 /*****************************************************************************
64 *****************************************************************************/
65 int OpenEncoder ( vlc_object_t * );
66 void CloseEncoder( vlc_object_t * );
68 static block_t *EncodeVideo( encoder_t *, picture_t * );
69 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
71 struct thread_context_t;
72 static int FfmpegThread( struct thread_context_t *p_context );
73 static int FfmpegExecute( AVCodecContext *s,
74 int (*pf_func)(AVCodecContext *c2, void *arg2),
75 void **arg, int *ret, int count );
77 /*****************************************************************************
78 * thread_context_t : for multithreaded encoding
79 *****************************************************************************/
80 struct thread_context_t
84 AVCodecContext *p_context;
85 int (* pf_func)(AVCodecContext *c, void *arg);
94 /*****************************************************************************
95 * encoder_sys_t : ffmpeg encoder descriptor
96 *****************************************************************************/
103 AVCodecContext *p_context;
114 mtime_t i_last_ref_pts;
115 mtime_t i_buggy_pts_detect;
126 /* Encoding settings */
134 int i_rc_buffer_size;
135 float f_rc_buffer_aggressivity;
138 bool b_interlace, b_interlace_me;
139 float f_i_quant_factor;
140 int i_noise_reduction;
143 int i_quality; /* for VBR */
144 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
145 int i_luma_elim, i_chroma_elim;
146 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
147 int i_aac_profile; /* AAC profile to use.*/
149 /* Used to work around stupid timestamping behaviour in libavcodec */
151 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
154 static const char *const ppsz_enc_options[] = {
155 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
156 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
157 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
158 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
159 "p-masking", "border-masking", "luma-elim-threshold",
160 "chroma-elim-threshold",
161 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
167 static const uint16_t mpa_bitrate_tab[2][15] =
169 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
170 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
173 static const uint16_t mpa_freq_tab[6] =
174 { 44100, 48000, 32000, 22050, 24000, 16000 };
176 static const uint16_t mpeg4_default_intra_matrix[64] = {
177 8, 17, 18, 19, 21, 23, 25, 27,
178 17, 18, 19, 21, 23, 25, 27, 28,
179 20, 21, 22, 23, 24, 26, 28, 30,
180 21, 22, 23, 24, 26, 28, 30, 32,
181 22, 23, 24, 26, 28, 30, 32, 35,
182 23, 24, 26, 28, 30, 32, 35, 38,
183 25, 26, 28, 30, 32, 35, 38, 41,
184 27, 28, 30, 32, 35, 38, 41, 45,
187 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
188 16, 17, 18, 19, 20, 21, 22, 23,
189 17, 18, 19, 20, 21, 22, 23, 24,
190 18, 19, 20, 21, 22, 23, 24, 25,
191 19, 20, 21, 22, 23, 24, 26, 27,
192 20, 21, 22, 23, 25, 26, 27, 28,
193 21, 22, 23, 24, 26, 27, 28, 30,
194 22, 23, 24, 26, 27, 28, 30, 31,
195 23, 24, 25, 27, 28, 30, 31, 33,
198 /*****************************************************************************
199 * OpenEncoder: probe the encoder
200 *****************************************************************************/
202 int OpenEncoder( vlc_object_t *p_this )
204 encoder_t *p_enc = (encoder_t *)p_this;
205 encoder_sys_t *p_sys = p_enc->p_sys;
206 AVCodecContext *p_context;
208 int i_codec_id, i_cat;
209 const char *psz_namecodec;
212 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
215 if( GetFfmpegChroma( p_enc->fmt_out.i_codec ) < 0 )
217 /* handed chroma output */
221 i_codec_id = CODEC_ID_RAWVIDEO;
222 psz_namecodec = "Raw video";
225 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
227 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
228 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
229 _("\"%s\" is no video encoder."), psz_namecodec );
233 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
235 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
236 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
237 _("\"%s\" is no audio encoder."), psz_namecodec );
241 /* Initialization must be done before avcodec_find_encoder() */
242 InitLibavcodec( p_this );
244 p_codec = avcodec_find_encoder( i_codec_id );
247 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
248 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
249 _("VLC could not find encoder \"%s\"."), psz_namecodec );
253 /* Allocate the memory needed to store the encoder's structure */
254 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
256 msg_Err( p_enc, "out of memory" );
259 memset( p_sys, 0, sizeof(encoder_sys_t) );
260 p_enc->p_sys = p_sys;
261 p_sys->p_codec = p_codec;
263 p_enc->pf_encode_video = EncodeVideo;
264 p_enc->pf_encode_audio = EncodeAudio;
266 p_sys->p_buffer_out = NULL;
267 p_sys->p_buffer = NULL;
269 p_sys->p_context = p_context = avcodec_alloc_context();
270 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
271 p_context->opaque = (void *)p_this;
273 /* Set CPU capabilities */
274 unsigned i_cpu = vlc_CPU();
275 p_context->dsp_mask = 0;
276 if( !(i_cpu & CPU_CAPABILITY_MMX) )
278 p_context->dsp_mask |= FF_MM_MMX;
280 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
282 p_context->dsp_mask |= FF_MM_MMXEXT;
284 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
286 p_context->dsp_mask |= FF_MM_3DNOW;
288 if( !(i_cpu & CPU_CAPABILITY_SSE) )
290 p_context->dsp_mask |= FF_MM_SSE;
291 p_context->dsp_mask |= FF_MM_SSE2;
294 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
296 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
297 p_sys->i_key_int = val.i_int;
299 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
300 p_sys->i_b_frames = val.i_int;
302 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
303 p_sys->i_vtolerance = val.i_int * 1000;
305 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
306 p_sys->b_interlace = val.b_bool;
308 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
309 p_sys->b_interlace_me = val.b_bool;
311 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
312 p_sys->b_pre_me = val.b_bool;
314 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
315 p_sys->b_hurry_up = val.b_bool;
316 if( p_sys->b_hurry_up )
318 /* hurry up mode needs noise reduction, even small */
319 p_sys->i_noise_reduction = 1;
322 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
323 p_sys->b_strict_rc = val.b_bool;
324 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
325 p_sys->i_rc_buffer_size = val.i_int;
326 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
327 p_sys->f_rc_buffer_aggressivity = val.f_float;
329 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
330 p_sys->f_i_quant_factor = val.f_float;
332 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
333 p_sys->i_noise_reduction = val.i_int;
335 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
336 p_sys->b_mpeg4_matrix = val.b_bool;
338 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
339 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
340 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
342 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
343 p_sys->i_hq = FF_MB_DECISION_RD;
344 if( val.psz_string && *val.psz_string )
346 if( !strcmp( val.psz_string, "rd" ) )
347 p_sys->i_hq = FF_MB_DECISION_RD;
348 else if( !strcmp( val.psz_string, "bits" ) )
349 p_sys->i_hq = FF_MB_DECISION_BITS;
350 else if( !strcmp( val.psz_string, "simple" ) )
351 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
353 p_sys->i_hq = FF_MB_DECISION_RD;
356 p_sys->i_hq = FF_MB_DECISION_RD;
357 free( val.psz_string );
359 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
360 p_sys->i_qmin = val.i_int;
361 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
362 p_sys->i_qmax = val.i_int;
363 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
364 p_sys->b_trellis = val.b_bool;
366 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
367 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
368 p_context->strict_std_compliance = val.i_int;
370 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
371 p_sys->f_lumi_masking = val.f_float;
372 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
373 p_sys->f_dark_masking = val.f_float;
374 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
375 p_sys->f_p_masking = val.f_float;
376 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
377 p_sys->f_border_masking = val.f_float;
378 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
379 p_sys->i_luma_elim = val.i_int;
380 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
381 p_sys->i_chroma_elim = val.i_int;
383 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
384 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
385 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
386 if( val.psz_string && *val.psz_string )
388 if( !strncmp( val.psz_string, "main", 4 ) )
389 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
390 else if( !strncmp( val.psz_string, "low", 3 ) )
391 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
392 #if 0 /* Not supported by FAAC encoder */
393 else if( !strncmp( val.psz_string, "ssr", 3 ) )
394 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
396 else if( !strncmp( val.psz_string, "ltp", 3 ) )
397 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
400 msg_Warn( p_enc, "unknown AAC profile requested" );
401 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
404 free( val.psz_string );
407 if( p_enc->fmt_in.i_cat == VIDEO_ES )
409 int i_aspect_num, i_aspect_den;
411 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
413 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
414 p_enc->fmt_in.video.i_height );
419 p_context->width = p_enc->fmt_in.video.i_width;
420 p_context->height = p_enc->fmt_in.video.i_height;
421 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
422 && (p_context->width > 720 || p_context->height > 576) )
423 p_context->level = 4; /* High level */
425 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
426 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
428 /* Defaults from ffmpeg.c */
429 p_context->qblur = 0.5;
430 p_context->qcompress = 0.5;
431 p_context->b_quant_offset = 1.25;
432 p_context->b_quant_factor = 1.25;
433 p_context->i_quant_offset = 0.0;
434 p_context->i_quant_factor = -0.8;
436 p_context->lumi_masking = p_sys->f_lumi_masking;
437 p_context->dark_masking = p_sys->f_dark_masking;
438 p_context->p_masking = p_sys->f_p_masking;
439 p_context->border_masking = p_sys->f_border_masking;
440 p_context->luma_elim_threshold = p_sys->i_luma_elim;
441 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
443 if( p_sys->i_key_int > 0 )
444 p_context->gop_size = p_sys->i_key_int;
445 p_context->max_b_frames =
446 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
447 p_context->b_frame_strategy = 0;
448 if( !p_context->max_b_frames &&
449 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
450 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
451 p_context->flags |= CODEC_FLAG_LOW_DELAY;
453 av_reduce( &i_aspect_num, &i_aspect_den,
454 p_enc->fmt_in.video.i_aspect,
455 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
456 av_reduce( &p_context->sample_aspect_ratio.num,
457 &p_context->sample_aspect_ratio.den,
458 i_aspect_num * (int64_t)p_context->height,
459 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
461 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
463 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
464 p_context->pix_fmt = GetFfmpegChroma( p_enc->fmt_in.i_codec );
465 if( p_codec->pix_fmts )
467 const enum PixelFormat *p = p_codec->pix_fmts;
468 for( ; *p != -1; p++ )
470 if( *p == p_context->pix_fmt ) break;
472 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
473 p_enc->fmt_in.i_codec = GetVlcChroma( p_context->pix_fmt );
476 if ( p_sys->b_strict_rc )
478 p_context->rc_qsquish = 1.0;
479 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
480 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
481 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
482 /* This is from ffmpeg's ffmpeg.c : */
483 p_context->rc_initial_buffer_occupancy
484 = p_sys->i_rc_buffer_size * 3/4;
485 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
488 if ( p_sys->f_i_quant_factor != 0.0 )
489 p_context->i_quant_factor = p_sys->f_i_quant_factor;
491 p_context->noise_reduction = p_sys->i_noise_reduction;
493 if ( p_sys->b_mpeg4_matrix )
495 p_context->intra_matrix = mpeg4_default_intra_matrix;
496 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
499 if ( p_sys->b_pre_me )
501 p_context->pre_me = 1;
502 p_context->me_pre_cmp = FF_CMP_CHROMA;
505 if ( p_sys->b_interlace )
507 if ( p_context->height <= 280 )
509 if ( p_context->height != 16 || p_context->width != 16 )
511 "disabling interlaced video because height=%d <= 280",
516 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
517 if ( p_sys->b_interlace_me )
518 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
522 if ( p_sys->b_trellis )
523 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
525 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
526 p_context->flags |= CODEC_FLAG_QSCALE;
528 if ( p_enc->i_threads >= 1 )
529 p_context->thread_count = p_enc->i_threads;
531 if( p_sys->i_vtolerance > 0 )
532 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
534 /* usually if someone sets bitrate, he likes more to get that bitrate
535 * over quality should help 'normal' user to get asked bitrate
537 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
543 if( p_sys->i_qmin > 0 )
545 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
546 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
548 if( p_sys->i_qmax > 0 )
550 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
551 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
553 p_context->max_qdiff = 3;
555 p_context->mb_decision = p_sys->i_hq;
557 if( p_sys->i_quality )
559 p_context->flags |= CODEC_FLAG_QSCALE;
560 p_context->global_quality = p_sys->i_quality;
563 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
565 /* work around bug in libmp3lame encoding */
566 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
567 p_enc->fmt_in.audio.i_channels = 2;
569 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
570 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
571 p_context->channels = p_enc->fmt_out.audio.i_channels;
573 if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
575 /* XXX: FAAC does resample only when setting the INPUT samplerate
576 * to the desired value (-R option of the faac frontend) */
577 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;
578 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
579 /* Ignore FF_PROFILE_UNKNOWN */
580 if( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN )
581 p_context->profile = p_sys->i_aac_profile;
586 /* Misc parameters */
587 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
589 if( i_codec_id == CODEC_ID_RAWVIDEO )
591 /* XXX: hack: Force same codec (will be handled by transcode) */
592 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
593 p_context->pix_fmt = GetFfmpegChroma( p_enc->fmt_in.i_codec );
596 /* Make sure we get extradata filled by the encoder */
597 p_context->extradata_size = 0;
598 p_context->extradata = NULL;
599 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
601 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
603 if( avcodec_open( p_context, p_codec ) )
605 vlc_mutex_unlock( lock );
606 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
607 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
608 || i_codec_id == CODEC_ID_MP3) )
610 if( p_context->channels > 2 )
612 p_context->channels = 2;
613 p_enc->fmt_in.audio.i_channels = 2; // FIXME
614 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
617 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
621 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
623 if ( p_enc->fmt_out.audio.i_rate
624 == mpa_freq_tab[i_frequency] )
627 if ( i_frequency == 6 )
629 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
630 p_enc->fmt_out.audio.i_rate );
635 for ( i = 1; i < 14; i++ )
637 if ( p_enc->fmt_out.i_bitrate / 1000
638 <= mpa_bitrate_tab[i_frequency / 3][i] )
641 if ( p_enc->fmt_out.i_bitrate / 1000
642 != mpa_bitrate_tab[i_frequency / 3][i] )
645 "MPEG audio doesn't support bitrate=%d, using %d",
646 p_enc->fmt_out.i_bitrate,
647 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
648 p_enc->fmt_out.i_bitrate =
649 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
650 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
654 p_context->codec = NULL;
655 vlc_mutex_lock( lock );
656 if( avcodec_open( p_context, p_codec ) )
658 vlc_mutex_unlock( lock );
659 msg_Err( p_enc, "cannot open encoder" );
660 intf_UserFatal( p_enc, false,
661 _("Streaming / Transcoding failed"),
662 _("VLC could not open the encoder.") );
669 msg_Err( p_enc, "cannot open encoder" );
670 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
671 _("VLC could not open the encoder.") );
676 vlc_mutex_unlock( lock);
678 p_enc->fmt_out.i_extra = p_context->extradata_size;
679 if( p_enc->fmt_out.i_extra )
681 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
682 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
683 p_enc->fmt_out.i_extra );
685 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
687 if( p_enc->fmt_in.i_cat == AUDIO_ES )
689 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
690 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
691 p_sys->p_buffer = malloc( p_sys->i_frame_size );
692 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
695 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
700 /****************************************************************************
701 * Ffmpeg threading system
702 ****************************************************************************/
703 static int FfmpegThread( struct thread_context_t *p_context )
705 while ( !p_context->b_die && !p_context->b_error )
707 vlc_mutex_lock( &p_context->lock );
708 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
710 vlc_cond_wait( &p_context->cond, &p_context->lock );
712 p_context->b_work = 0;
713 vlc_mutex_unlock( &p_context->lock );
714 if ( p_context->b_die || p_context->b_error )
717 if ( p_context->pf_func )
719 p_context->i_ret = p_context->pf_func( p_context->p_context,
723 vlc_mutex_lock( &p_context->lock );
724 p_context->b_done = 1;
725 vlc_cond_signal( &p_context->cond );
726 vlc_mutex_unlock( &p_context->lock );
732 static int FfmpegExecute( AVCodecContext *s,
733 int (*pf_func)(AVCodecContext *c2, void *arg2),
734 void **arg, int *ret, int count )
736 struct thread_context_t ** pp_contexts =
737 (struct thread_context_t **)s->thread_opaque;
740 /* Note, we can be certain that this is not called with the same
741 * AVCodecContext by different threads at the same time */
742 for ( i = 0; i < count; i++ )
744 vlc_mutex_lock( &pp_contexts[i]->lock );
745 pp_contexts[i]->arg = arg[i];
746 pp_contexts[i]->pf_func = pf_func;
747 pp_contexts[i]->i_ret = 12345;
748 pp_contexts[i]->b_work = 1;
749 vlc_cond_signal( &pp_contexts[i]->cond );
750 vlc_mutex_unlock( &pp_contexts[i]->lock );
752 for ( i = 0; i < count; i++ )
754 vlc_mutex_lock( &pp_contexts[i]->lock );
755 while ( !pp_contexts[i]->b_done )
757 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
759 pp_contexts[i]->b_done = 0;
760 pp_contexts[i]->pf_func = NULL;
761 vlc_mutex_unlock( &pp_contexts[i]->lock );
765 ret[i] = pp_contexts[i]->i_ret;
772 /****************************************************************************
773 * EncodeVideo: the whole thing
774 ****************************************************************************/
775 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
777 encoder_sys_t *p_sys = p_enc->p_sys;
781 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
783 struct thread_context_t ** pp_contexts;
787 pp_contexts = malloc( sizeof(struct thread_context_t *)
788 * p_enc->i_threads );
789 p_sys->p_context->thread_opaque = (void *)pp_contexts;
791 for ( i = 0; i < p_enc->i_threads; i++ )
793 pp_contexts[i] = vlc_object_create( p_enc,
794 sizeof(struct thread_context_t) );
795 pp_contexts[i]->p_context = p_sys->p_context;
796 vlc_mutex_init( &pp_contexts[i]->lock );
797 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
798 pp_contexts[i]->b_work = 0;
799 pp_contexts[i]->b_done = 0;
800 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
801 VLC_THREAD_PRIORITY_VIDEO, false ) )
803 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
808 p_sys->p_context->execute = FfmpegExecute;
811 memset( &frame, 0, sizeof( AVFrame ) );
812 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
814 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
815 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
818 /* Let ffmpeg select the frame type */
821 frame.repeat_pict = p_pict->i_nb_fields - 2;
822 frame.interlaced_frame = !p_pict->b_progressive;
823 frame.top_field_first = !!p_pict->b_top_field_first;
825 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
826 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
828 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
830 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
832 mtime_t current_date = mdate();
834 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
836 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
837 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
838 msg_Dbg( p_enc, "hurry up mode 3" );
842 p_sys->p_context->mb_decision = p_sys->i_hq;
844 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
846 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
847 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
848 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
849 msg_Dbg( p_enc, "hurry up mode 2" );
853 if ( p_sys->b_trellis )
854 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
856 p_sys->p_context->noise_reduction =
857 p_sys->i_noise_reduction;
861 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
863 frame.pict_type = FF_P_TYPE;
864 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
870 frame.pts = (int64_t)AV_NOPTS_VALUE;
873 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
875 if ( p_sys->i_last_pts == frame.pts )
877 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
878 "same PTS (%"PRId64 ")", frame.pts );
881 else if ( p_sys->i_last_pts > frame.pts )
883 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
884 "past (current: %"PRId64 ", last: %"PRId64")",
885 frame.pts, p_sys->i_last_pts );
890 p_sys->i_last_pts = frame.pts;
894 frame.quality = p_sys->i_quality;
896 /* Ugly work-around for stupid libavcodec behaviour */
898 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
899 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
900 p_enc->fmt_in.video.i_frame_rate_base;
901 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
902 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
903 /* End work-around */
905 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
906 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
910 block_t *p_block = block_New( p_enc, i_out );
911 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
913 /* FIXME, 3-2 pulldown is not handled correctly */
914 p_block->i_length = INT64_C(1000000) *
915 p_enc->fmt_in.video.i_frame_rate_base /
916 p_enc->fmt_in.video.i_frame_rate;
918 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
920 /* No delay -> output pts == input pts */
921 p_block->i_pts = p_block->i_dts = p_pict->date;
923 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
924 p_sys->p_context->coded_frame->pts != 0 &&
925 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
927 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
928 p_block->i_pts = p_sys->p_context->coded_frame->pts;
930 /* Ugly work-around for stupid libavcodec behaviour */
932 int64_t i_framenum = p_block->i_pts *
933 p_enc->fmt_in.video.i_frame_rate /
934 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
936 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
938 /* End work-around */
940 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
941 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
943 p_block->i_dts = p_block->i_pts;
947 if( p_sys->i_last_ref_pts )
949 p_block->i_dts = p_sys->i_last_ref_pts;
953 /* Let's put something sensible */
954 p_block->i_dts = p_block->i_pts;
957 p_sys->i_last_ref_pts = p_block->i_pts;
962 /* Buggy libavcodec which doesn't update coded_frame->pts
964 p_block->i_dts = p_block->i_pts = p_pict->date;
967 switch ( p_sys->p_context->coded_frame->pict_type )
970 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
973 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
976 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
986 /****************************************************************************
987 * EncodeAudio: the whole thing
988 ****************************************************************************/
989 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
991 encoder_sys_t *p_sys = p_enc->p_sys;
992 block_t *p_block, *p_chain = NULL;
994 uint8_t *p_buffer = p_aout_buf->p_buffer;
995 int i_samples = p_aout_buf->i_nb_samples;
996 int i_samples_delay = p_sys->i_samples_delay;
998 p_sys->i_pts = p_aout_buf->start_date -
999 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1000 (mtime_t)p_enc->fmt_in.audio.i_rate;
1002 p_sys->i_samples_delay += i_samples;
1004 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1009 if( i_samples_delay )
1011 /* Take care of the left-over from last time */
1012 int i_delay_size = i_samples_delay * 2 *
1013 p_sys->p_context->channels;
1014 int i_size = p_sys->i_frame_size - i_delay_size;
1016 p_samples = (int16_t *)p_sys->p_buffer;
1017 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1018 p_buffer -= i_delay_size;
1019 i_samples += i_samples_delay;
1020 i_samples_delay = 0;
1024 p_samples = (int16_t *)p_buffer;
1027 i_out = avcodec_encode_audio( p_sys->p_context,
1028 (uint8_t *)p_sys->p_buffer_out,
1029 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
1033 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1035 if( i_out < 0 ) break;
1037 p_buffer += p_sys->i_frame_size;
1038 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1039 i_samples -= p_sys->p_context->frame_size;
1041 if( i_out == 0 ) continue;
1043 p_block = block_New( p_enc, i_out );
1044 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1046 p_block->i_length = (mtime_t)1000000 *
1047 (mtime_t)p_sys->p_context->frame_size /
1048 (mtime_t)p_sys->p_context->sample_rate;
1050 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1053 p_sys->i_pts += p_block->i_length;
1054 block_ChainAppend( &p_chain, p_block );
1057 /* Backup the remaining raw samples */
1060 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1061 p_sys->p_context->channels, p_buffer,
1062 i_samples * 2 * p_sys->p_context->channels );
1068 /*****************************************************************************
1069 * CloseEncoder: ffmpeg encoder destruction
1070 *****************************************************************************/
1071 void CloseEncoder( vlc_object_t *p_this )
1073 encoder_t *p_enc = (encoder_t *)p_this;
1074 encoder_sys_t *p_sys = p_enc->p_sys;
1076 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1079 struct thread_context_t ** pp_contexts =
1080 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1081 for ( i = 0; i < p_enc->i_threads; i++ )
1083 vlc_object_kill( pp_contexts[i] );
1084 vlc_cond_signal( &pp_contexts[i]->cond );
1085 vlc_thread_join( pp_contexts[i] );
1086 vlc_mutex_destroy( &pp_contexts[i]->lock );
1087 vlc_cond_destroy( &pp_contexts[i]->cond );
1088 vlc_object_release( pp_contexts[i] );
1091 free( pp_contexts );
1094 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1095 avcodec_close( p_sys->p_context );
1096 vlc_mutex_unlock( lock );
1097 av_free( p_sys->p_context );
1099 free( p_sys->p_buffer );
1100 free( p_sys->p_buffer_out );