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 *****************************************************************************/
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 E_(OpenEncoder) ( vlc_object_t * );
64 void E_(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 int FfmpegThread( struct thread_context_t *p_context );
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);
89 vlc_bool_t b_work, b_done;
92 /*****************************************************************************
93 * encoder_sys_t : ffmpeg encoder descriptor
94 *****************************************************************************/
101 AVCodecContext *p_context;
112 mtime_t i_last_ref_pts;
113 mtime_t i_buggy_pts_detect;
124 /* Encoding settings */
131 vlc_bool_t b_strict_rc;
132 int i_rc_buffer_size;
133 float f_rc_buffer_aggressivity;
135 vlc_bool_t b_hurry_up;
136 vlc_bool_t b_interlace, b_interlace_me;
137 float f_i_quant_factor;
138 int i_noise_reduction;
139 vlc_bool_t b_mpeg4_matrix;
140 vlc_bool_t b_trellis;
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 *ppsz_enc_options[] = {
153 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
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 E_(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( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
213 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
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, VLC_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, VLC_FALSE, _("Streaming / Transcoding failed"),
235 _("\"%s\" is no audio encoder."), psz_namecodec );
239 /* Initialization must be done before avcodec_find_encoder() */
240 E_(InitLibavcodec)(p_this);
242 p_codec = avcodec_find_encoder( i_codec_id );
245 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
246 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
247 _("VLC could not find encoder \"%s\"."), psz_namecodec );
251 /* Allocate the memory needed to store the encoder's structure */
252 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
254 msg_Err( p_enc, "out of memory" );
257 memset( p_sys, 0, sizeof(encoder_sys_t) );
258 p_enc->p_sys = p_sys;
259 p_sys->p_codec = p_codec;
261 p_enc->pf_encode_video = EncodeVideo;
262 p_enc->pf_encode_audio = EncodeAudio;
264 p_sys->p_buffer_out = NULL;
265 p_sys->p_buffer = NULL;
267 p_sys->p_context = p_context = avcodec_alloc_context();
268 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
269 p_context->opaque = (void *)p_this;
271 /* Set CPU capabilities */
272 unsigned i_cpu = vlc_CPU();
273 p_context->dsp_mask = 0;
274 if( !(i_cpu & CPU_CAPABILITY_MMX) )
276 p_context->dsp_mask |= FF_MM_MMX;
278 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
280 p_context->dsp_mask |= FF_MM_MMXEXT;
282 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
284 p_context->dsp_mask |= FF_MM_3DNOW;
286 if( !(i_cpu & CPU_CAPABILITY_SSE) )
288 p_context->dsp_mask |= FF_MM_SSE;
289 p_context->dsp_mask |= FF_MM_SSE2;
292 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
294 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
295 p_sys->i_key_int = val.i_int;
297 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
298 p_sys->i_b_frames = val.i_int;
300 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
301 p_sys->i_vtolerance = val.i_int;
303 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
304 p_sys->b_interlace = val.b_bool;
306 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
307 p_sys->b_interlace_me = val.b_bool;
309 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
310 p_sys->b_pre_me = val.b_bool;
312 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
313 p_sys->b_hurry_up = val.b_bool;
314 if( p_sys->b_hurry_up )
316 /* hurry up mode needs noise reduction, even small */
317 p_sys->i_noise_reduction = 1;
320 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
321 p_sys->b_strict_rc = val.b_bool;
322 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
323 p_sys->i_rc_buffer_size = val.i_int;
324 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
325 p_sys->f_rc_buffer_aggressivity = val.f_float;
327 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
328 p_sys->f_i_quant_factor = val.f_float;
330 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
331 p_sys->i_noise_reduction = val.i_int;
333 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
334 p_sys->b_mpeg4_matrix = val.b_bool;
336 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
337 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
338 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
340 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
341 p_sys->i_hq = FF_MB_DECISION_RD;
342 if( val.psz_string && *val.psz_string )
344 if( !strcmp( val.psz_string, "rd" ) )
345 p_sys->i_hq = FF_MB_DECISION_RD;
346 else if( !strcmp( val.psz_string, "bits" ) )
347 p_sys->i_hq = FF_MB_DECISION_BITS;
348 else if( !strcmp( val.psz_string, "simple" ) )
349 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
351 p_sys->i_hq = FF_MB_DECISION_RD;
354 p_sys->i_hq = FF_MB_DECISION_RD;
355 free( val.psz_string );
357 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
358 p_sys->i_qmin = val.i_int;
359 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
360 p_sys->i_qmax = val.i_int;
361 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
362 p_sys->b_trellis = val.b_bool;
364 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
365 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
366 p_context->strict_std_compliance = val.i_int;
368 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
369 p_sys->f_lumi_masking = val.f_float;
370 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
371 p_sys->f_dark_masking = val.f_float;
372 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
373 p_sys->f_p_masking = val.f_float;
374 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
375 p_sys->f_border_masking = val.f_float;
376 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
377 p_sys->i_luma_elim = val.i_int;
378 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
379 p_sys->i_chroma_elim = val.i_int;
381 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
382 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
383 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
384 if( val.psz_string && *val.psz_string )
386 if( !strncmp( val.psz_string, "main", 4 ) )
387 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
388 else if( !strncmp( val.psz_string, "low", 3 ) )
389 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
390 #if 0 /* Not supported by FAAC encoder */
391 else if( !strncmp( val.psz_string, "ssr", 3 ) )
392 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
394 else if( !strncmp( val.psz_string, "ltp", 3 ) )
395 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
398 msg_Warn( p_enc, "unknown AAC profile requested" );
399 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
402 free( val.psz_string );
405 if( p_enc->fmt_in.i_cat == VIDEO_ES )
407 int i_aspect_num, i_aspect_den;
409 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
411 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
412 p_enc->fmt_in.video.i_height );
417 p_context->width = p_enc->fmt_in.video.i_width;
418 p_context->height = p_enc->fmt_in.video.i_height;
419 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
420 && (p_context->width > 720 || p_context->height > 576) )
421 p_context->level = 4; /* High level */
423 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
424 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
426 /* Defaults from ffmpeg.c */
427 p_context->qblur = 0.5;
428 p_context->qcompress = 0.5;
429 p_context->b_quant_offset = 1.25;
430 p_context->b_quant_factor = 1.25;
431 p_context->i_quant_offset = 0.0;
432 p_context->i_quant_factor = -0.8;
434 p_context->lumi_masking = p_sys->f_lumi_masking;
435 p_context->dark_masking = p_sys->f_dark_masking;
436 p_context->p_masking = p_sys->f_p_masking;
437 p_context->border_masking = p_sys->f_border_masking;
438 p_context->luma_elim_threshold = p_sys->i_luma_elim;
439 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
441 if( p_sys->i_key_int > 0 )
442 p_context->gop_size = p_sys->i_key_int;
443 p_context->max_b_frames =
444 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
445 p_context->b_frame_strategy = 0;
446 if( !p_context->max_b_frames &&
447 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
448 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
449 p_context->flags |= CODEC_FLAG_LOW_DELAY;
451 av_reduce( &i_aspect_num, &i_aspect_den,
452 p_enc->fmt_in.video.i_aspect,
453 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
454 av_reduce( &p_context->sample_aspect_ratio.num,
455 &p_context->sample_aspect_ratio.den,
456 i_aspect_num * (int64_t)p_context->height,
457 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
459 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
461 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
462 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
463 if( p_codec->pix_fmts )
465 const enum PixelFormat *p = p_codec->pix_fmts;
466 for( ; *p != -1; p++ )
468 if( *p == p_context->pix_fmt ) break;
470 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
471 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
474 if ( p_sys->b_strict_rc )
476 p_context->rc_qsquish = 1.0;
477 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
478 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
479 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
480 /* This is from ffmpeg's ffmpeg.c : */
481 p_context->rc_initial_buffer_occupancy
482 = p_sys->i_rc_buffer_size * 3/4;
483 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
486 if ( p_sys->f_i_quant_factor != 0.0 )
487 p_context->i_quant_factor = p_sys->f_i_quant_factor;
489 p_context->noise_reduction = p_sys->i_noise_reduction;
491 if ( p_sys->b_mpeg4_matrix )
493 p_context->intra_matrix = mpeg4_default_intra_matrix;
494 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
497 if ( p_sys->b_pre_me )
499 p_context->pre_me = 1;
500 p_context->me_pre_cmp = FF_CMP_CHROMA;
503 if ( p_sys->b_interlace )
505 if ( p_context->height <= 280 )
507 if ( p_context->height != 16 || p_context->width != 16 )
509 "disabling interlaced video because height=%d <= 280",
514 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
515 if ( p_sys->b_interlace_me )
516 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
520 if ( p_sys->b_trellis )
521 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
523 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
524 p_context->flags |= CODEC_FLAG_QSCALE;
526 if ( p_enc->i_threads >= 1 )
527 p_context->thread_count = p_enc->i_threads;
529 if( p_sys->i_vtolerance > 0 )
530 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
532 /* usually if someone sets bitrate, he likes more to get that bitrate over quality
533 * should help 'normal' user to get asked bitrate
535 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
541 if( p_sys->i_qmin > 0 )
543 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
544 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
546 if( p_sys->i_qmax > 0 )
548 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
549 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
551 p_context->max_qdiff = 3;
553 p_context->mb_decision = p_sys->i_hq;
555 if( p_sys->i_quality )
557 p_context->flags |= CODEC_FLAG_QSCALE;
558 p_context->global_quality = p_sys->i_quality;
561 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
563 /* work around bug in libmp3lame encoding */
564 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
565 p_enc->fmt_in.audio.i_channels = 2;
567 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
568 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
569 p_context->channels = p_enc->fmt_in.audio.i_channels;
571 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
572 /* Ignore FF_PROFILE_UNKNOWN */
573 if( ( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN ) &&
574 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') ) )
575 p_context->profile = p_sys->i_aac_profile;
579 /* Misc parameters */
580 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
582 if( i_codec_id == CODEC_ID_RAWVIDEO )
584 /* XXX: hack: Force same codec (will be handled by transcode) */
585 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
586 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
589 /* Make sure we get extradata filled by the encoder */
590 p_context->extradata_size = 0;
591 p_context->extradata = NULL;
592 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
594 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
596 if( avcodec_open( p_context, p_codec ) )
598 vlc_mutex_unlock( lock );
599 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
600 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
601 || i_codec_id == CODEC_ID_MP3) )
603 if( p_context->channels > 2 )
605 p_context->channels = 2;
606 p_enc->fmt_in.audio.i_channels = 2; // FIXME
607 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
610 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
614 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
616 if ( p_enc->fmt_out.audio.i_rate
617 == mpa_freq_tab[i_frequency] )
620 if ( i_frequency == 6 )
622 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
623 p_enc->fmt_out.audio.i_rate );
628 for ( i = 1; i < 14; i++ )
630 if ( p_enc->fmt_out.i_bitrate / 1000
631 <= mpa_bitrate_tab[i_frequency / 3][i] )
634 if ( p_enc->fmt_out.i_bitrate / 1000
635 != mpa_bitrate_tab[i_frequency / 3][i] )
638 "MPEG audio doesn't support bitrate=%d, using %d",
639 p_enc->fmt_out.i_bitrate,
640 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
641 p_enc->fmt_out.i_bitrate =
642 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
643 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
647 p_context->codec = NULL;
648 vlc_mutex_lock( lock );
649 if( avcodec_open( p_context, p_codec ) )
651 vlc_mutex_unlock( lock );
652 msg_Err( p_enc, "cannot open encoder" );
653 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
654 _("VLC could not open the encoder.") );
661 msg_Err( p_enc, "cannot open encoder" );
662 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
663 _("VLC could not open the encoder.") );
668 vlc_mutex_unlock( lock);
670 p_enc->fmt_out.i_extra = p_context->extradata_size;
671 if( p_enc->fmt_out.i_extra )
673 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
674 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
675 p_enc->fmt_out.i_extra );
677 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
679 if( p_enc->fmt_in.i_cat == AUDIO_ES )
681 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
682 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
683 p_sys->p_buffer = malloc( p_sys->i_frame_size );
684 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
687 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
692 /****************************************************************************
693 * Ffmpeg threading system
694 ****************************************************************************/
695 static int FfmpegThread( struct thread_context_t *p_context )
697 while ( !p_context->b_die && !p_context->b_error )
699 vlc_mutex_lock( &p_context->lock );
700 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
702 vlc_cond_wait( &p_context->cond, &p_context->lock );
704 p_context->b_work = 0;
705 vlc_mutex_unlock( &p_context->lock );
706 if ( p_context->b_die || p_context->b_error )
709 if ( p_context->pf_func )
711 p_context->i_ret = p_context->pf_func( p_context->p_context,
715 vlc_mutex_lock( &p_context->lock );
716 p_context->b_done = 1;
717 vlc_cond_signal( &p_context->cond );
718 vlc_mutex_unlock( &p_context->lock );
724 static int FfmpegExecute( AVCodecContext *s,
725 int (*pf_func)(AVCodecContext *c2, void *arg2),
726 void **arg, int *ret, int count )
728 struct thread_context_t ** pp_contexts =
729 (struct thread_context_t **)s->thread_opaque;
732 /* Note, we can be certain that this is not called with the same
733 * AVCodecContext by different threads at the same time */
734 for ( i = 0; i < count; i++ )
736 vlc_mutex_lock( &pp_contexts[i]->lock );
737 pp_contexts[i]->arg = arg[i];
738 pp_contexts[i]->pf_func = pf_func;
739 pp_contexts[i]->i_ret = 12345;
740 pp_contexts[i]->b_work = 1;
741 vlc_cond_signal( &pp_contexts[i]->cond );
742 vlc_mutex_unlock( &pp_contexts[i]->lock );
744 for ( i = 0; i < count; i++ )
746 vlc_mutex_lock( &pp_contexts[i]->lock );
747 while ( !pp_contexts[i]->b_done )
749 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
751 pp_contexts[i]->b_done = 0;
752 pp_contexts[i]->pf_func = NULL;
753 vlc_mutex_unlock( &pp_contexts[i]->lock );
757 ret[i] = pp_contexts[i]->i_ret;
764 /****************************************************************************
765 * EncodeVideo: the whole thing
766 ****************************************************************************/
767 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
769 encoder_sys_t *p_sys = p_enc->p_sys;
773 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
775 struct thread_context_t ** pp_contexts;
779 pp_contexts = malloc( sizeof(struct thread_context_t *)
780 * p_enc->i_threads );
781 p_sys->p_context->thread_opaque = (void *)pp_contexts;
783 for ( i = 0; i < p_enc->i_threads; i++ )
785 pp_contexts[i] = vlc_object_create( p_enc,
786 sizeof(struct thread_context_t) );
787 pp_contexts[i]->p_context = p_sys->p_context;
788 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
789 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
790 pp_contexts[i]->b_work = 0;
791 pp_contexts[i]->b_done = 0;
792 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
793 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
795 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
800 p_sys->p_context->execute = FfmpegExecute;
803 memset( &frame, 0, sizeof( AVFrame ) );
804 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
806 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
807 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
810 /* Let ffmpeg select the frame type */
813 frame.repeat_pict = p_pict->i_nb_fields - 2;
814 frame.interlaced_frame = !p_pict->b_progressive;
815 frame.top_field_first = !!p_pict->b_top_field_first;
817 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
818 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
820 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
822 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
824 mtime_t current_date = mdate();
826 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
828 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
829 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
830 msg_Dbg( p_enc, "hurry up mode 3" );
834 p_sys->p_context->mb_decision = p_sys->i_hq;
836 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
838 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
839 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
840 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
841 msg_Dbg( p_enc, "hurry up mode 2" );
845 if ( p_sys->b_trellis )
846 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
848 p_sys->p_context->noise_reduction =
849 p_sys->i_noise_reduction;
853 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
855 frame.pict_type = FF_P_TYPE;
856 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
862 frame.pts = (int64_t)AV_NOPTS_VALUE;
865 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
867 if ( p_sys->i_last_pts == frame.pts )
869 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
870 "same PTS (" I64Fd ")", frame.pts );
873 else if ( p_sys->i_last_pts > frame.pts )
875 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
876 "past (current: " I64Fd ", last: "I64Fd")",
877 frame.pts, p_sys->i_last_pts );
882 p_sys->i_last_pts = frame.pts;
886 frame.quality = p_sys->i_quality;
888 /* Ugly work-around for stupid libavcodec behaviour */
890 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
891 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
892 p_enc->fmt_in.video.i_frame_rate_base;
893 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
894 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
895 /* End work-around */
897 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
898 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
902 block_t *p_block = block_New( p_enc, i_out );
903 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
905 /* FIXME, 3-2 pulldown is not handled correctly */
906 p_block->i_length = I64C(1000000) *
907 p_enc->fmt_in.video.i_frame_rate_base /
908 p_enc->fmt_in.video.i_frame_rate;
910 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
912 /* No delay -> output pts == input pts */
913 p_block->i_pts = p_block->i_dts = p_pict->date;
915 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
916 p_sys->p_context->coded_frame->pts != 0 &&
917 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
919 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
920 p_block->i_pts = p_sys->p_context->coded_frame->pts;
922 /* Ugly work-around for stupid libavcodec behaviour */
924 int64_t i_framenum = p_block->i_pts *
925 p_enc->fmt_in.video.i_frame_rate /
926 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
928 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
930 /* End work-around */
932 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
933 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
935 p_block->i_dts = p_block->i_pts;
939 if( p_sys->i_last_ref_pts )
941 p_block->i_dts = p_sys->i_last_ref_pts;
945 /* Let's put something sensible */
946 p_block->i_dts = p_block->i_pts;
949 p_sys->i_last_ref_pts = p_block->i_pts;
954 /* Buggy libavcodec which doesn't update coded_frame->pts
956 p_block->i_dts = p_block->i_pts = p_pict->date;
959 switch ( p_sys->p_context->coded_frame->pict_type )
962 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
965 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
968 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
978 /****************************************************************************
979 * EncodeAudio: the whole thing
980 ****************************************************************************/
981 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
983 encoder_sys_t *p_sys = p_enc->p_sys;
984 block_t *p_block, *p_chain = NULL;
986 uint8_t *p_buffer = p_aout_buf->p_buffer;
987 int i_samples = p_aout_buf->i_nb_samples;
988 int i_samples_delay = p_sys->i_samples_delay;
990 p_sys->i_pts = p_aout_buf->start_date -
991 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
992 (mtime_t)p_enc->fmt_in.audio.i_rate;
994 p_sys->i_samples_delay += i_samples;
996 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1001 if( i_samples_delay )
1003 /* Take care of the left-over from last time */
1004 int i_delay_size = i_samples_delay * 2 *
1005 p_sys->p_context->channels;
1006 int i_size = p_sys->i_frame_size - i_delay_size;
1008 p_samples = (int16_t *)p_sys->p_buffer;
1009 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1010 p_buffer -= i_delay_size;
1011 i_samples += i_samples_delay;
1012 i_samples_delay = 0;
1016 p_samples = (int16_t *)p_buffer;
1019 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
1020 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
1024 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1026 if( i_out < 0 ) break;
1028 p_buffer += p_sys->i_frame_size;
1029 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1030 i_samples -= p_sys->p_context->frame_size;
1032 if( i_out == 0 ) continue;
1034 p_block = block_New( p_enc, i_out );
1035 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1037 p_block->i_length = (mtime_t)1000000 *
1038 (mtime_t)p_sys->p_context->frame_size /
1039 (mtime_t)p_sys->p_context->sample_rate;
1041 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1044 p_sys->i_pts += p_block->i_length;
1045 block_ChainAppend( &p_chain, p_block );
1048 /* Backup the remaining raw samples */
1051 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1052 p_sys->p_context->channels, p_buffer,
1053 i_samples * 2 * p_sys->p_context->channels );
1059 /*****************************************************************************
1060 * CloseEncoder: ffmpeg encoder destruction
1061 *****************************************************************************/
1062 void E_(CloseEncoder)( vlc_object_t *p_this )
1064 encoder_t *p_enc = (encoder_t *)p_this;
1065 encoder_sys_t *p_sys = p_enc->p_sys;
1067 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1070 struct thread_context_t ** pp_contexts =
1071 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1072 for ( i = 0; i < p_enc->i_threads; i++ )
1074 vlc_object_kill( pp_contexts[i] );
1075 vlc_cond_signal( &pp_contexts[i]->cond );
1076 vlc_thread_join( pp_contexts[i] );
1077 vlc_mutex_destroy( &pp_contexts[i]->lock );
1078 vlc_cond_destroy( &pp_contexts[i]->cond );
1079 vlc_object_release( pp_contexts[i] );
1082 free( pp_contexts );
1085 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1086 avcodec_close( p_sys->p_context );
1087 vlc_mutex_unlock( lock );
1088 av_free( p_sys->p_context );
1090 free( p_sys->p_buffer );
1091 free( p_sys->p_buffer_out );