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);
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 */
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 *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, 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 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, 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_out.audio.i_rate;
569 p_context->channels = p_enc->fmt_out.audio.i_channels;
571 if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
573 /* XXX: FAAC does resample only when setting the INPUT samplerate
574 * to the desired value (-R option of the faac frontend) */
575 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;
576 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
577 /* Ignore FF_PROFILE_UNKNOWN */
578 if( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN )
579 p_context->profile = p_sys->i_aac_profile;
584 /* Misc parameters */
585 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
587 if( i_codec_id == CODEC_ID_RAWVIDEO )
589 /* XXX: hack: Force same codec (will be handled by transcode) */
590 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
591 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
594 /* Make sure we get extradata filled by the encoder */
595 p_context->extradata_size = 0;
596 p_context->extradata = NULL;
597 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
599 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
601 if( avcodec_open( p_context, p_codec ) )
603 vlc_mutex_unlock( lock );
604 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
605 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
606 || i_codec_id == CODEC_ID_MP3) )
608 if( p_context->channels > 2 )
610 p_context->channels = 2;
611 p_enc->fmt_in.audio.i_channels = 2; // FIXME
612 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
615 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
619 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
621 if ( p_enc->fmt_out.audio.i_rate
622 == mpa_freq_tab[i_frequency] )
625 if ( i_frequency == 6 )
627 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
628 p_enc->fmt_out.audio.i_rate );
633 for ( i = 1; i < 14; i++ )
635 if ( p_enc->fmt_out.i_bitrate / 1000
636 <= mpa_bitrate_tab[i_frequency / 3][i] )
639 if ( p_enc->fmt_out.i_bitrate / 1000
640 != mpa_bitrate_tab[i_frequency / 3][i] )
643 "MPEG audio doesn't support bitrate=%d, using %d",
644 p_enc->fmt_out.i_bitrate,
645 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
646 p_enc->fmt_out.i_bitrate =
647 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
648 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
652 p_context->codec = NULL;
653 vlc_mutex_lock( lock );
654 if( avcodec_open( p_context, p_codec ) )
656 vlc_mutex_unlock( lock );
657 msg_Err( p_enc, "cannot open encoder" );
658 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
659 _("VLC could not open the encoder.") );
666 msg_Err( p_enc, "cannot open encoder" );
667 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
668 _("VLC could not open the encoder.") );
673 vlc_mutex_unlock( lock);
675 p_enc->fmt_out.i_extra = p_context->extradata_size;
676 if( p_enc->fmt_out.i_extra )
678 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
679 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
680 p_enc->fmt_out.i_extra );
682 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
684 if( p_enc->fmt_in.i_cat == AUDIO_ES )
686 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
687 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
688 p_sys->p_buffer = malloc( p_sys->i_frame_size );
689 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
692 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
697 /****************************************************************************
698 * Ffmpeg threading system
699 ****************************************************************************/
700 static int FfmpegThread( struct thread_context_t *p_context )
702 while ( !p_context->b_die && !p_context->b_error )
704 vlc_mutex_lock( &p_context->lock );
705 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
707 vlc_cond_wait( &p_context->cond, &p_context->lock );
709 p_context->b_work = 0;
710 vlc_mutex_unlock( &p_context->lock );
711 if ( p_context->b_die || p_context->b_error )
714 if ( p_context->pf_func )
716 p_context->i_ret = p_context->pf_func( p_context->p_context,
720 vlc_mutex_lock( &p_context->lock );
721 p_context->b_done = 1;
722 vlc_cond_signal( &p_context->cond );
723 vlc_mutex_unlock( &p_context->lock );
729 static int FfmpegExecute( AVCodecContext *s,
730 int (*pf_func)(AVCodecContext *c2, void *arg2),
731 void **arg, int *ret, int count )
733 struct thread_context_t ** pp_contexts =
734 (struct thread_context_t **)s->thread_opaque;
737 /* Note, we can be certain that this is not called with the same
738 * AVCodecContext by different threads at the same time */
739 for ( i = 0; i < count; i++ )
741 vlc_mutex_lock( &pp_contexts[i]->lock );
742 pp_contexts[i]->arg = arg[i];
743 pp_contexts[i]->pf_func = pf_func;
744 pp_contexts[i]->i_ret = 12345;
745 pp_contexts[i]->b_work = 1;
746 vlc_cond_signal( &pp_contexts[i]->cond );
747 vlc_mutex_unlock( &pp_contexts[i]->lock );
749 for ( i = 0; i < count; i++ )
751 vlc_mutex_lock( &pp_contexts[i]->lock );
752 while ( !pp_contexts[i]->b_done )
754 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
756 pp_contexts[i]->b_done = 0;
757 pp_contexts[i]->pf_func = NULL;
758 vlc_mutex_unlock( &pp_contexts[i]->lock );
762 ret[i] = pp_contexts[i]->i_ret;
769 /****************************************************************************
770 * EncodeVideo: the whole thing
771 ****************************************************************************/
772 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
774 encoder_sys_t *p_sys = p_enc->p_sys;
778 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
780 struct thread_context_t ** pp_contexts;
784 pp_contexts = malloc( sizeof(struct thread_context_t *)
785 * p_enc->i_threads );
786 p_sys->p_context->thread_opaque = (void *)pp_contexts;
788 for ( i = 0; i < p_enc->i_threads; i++ )
790 pp_contexts[i] = vlc_object_create( p_enc,
791 sizeof(struct thread_context_t) );
792 pp_contexts[i]->p_context = p_sys->p_context;
793 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
794 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
795 pp_contexts[i]->b_work = 0;
796 pp_contexts[i]->b_done = 0;
797 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
798 VLC_THREAD_PRIORITY_VIDEO, false ) )
800 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
805 p_sys->p_context->execute = FfmpegExecute;
808 memset( &frame, 0, sizeof( AVFrame ) );
809 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
811 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
812 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
815 /* Let ffmpeg select the frame type */
818 frame.repeat_pict = p_pict->i_nb_fields - 2;
819 frame.interlaced_frame = !p_pict->b_progressive;
820 frame.top_field_first = !!p_pict->b_top_field_first;
822 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
823 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
825 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
827 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
829 mtime_t current_date = mdate();
831 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
833 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
834 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
835 msg_Dbg( p_enc, "hurry up mode 3" );
839 p_sys->p_context->mb_decision = p_sys->i_hq;
841 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
843 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
844 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
845 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
846 msg_Dbg( p_enc, "hurry up mode 2" );
850 if ( p_sys->b_trellis )
851 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
853 p_sys->p_context->noise_reduction =
854 p_sys->i_noise_reduction;
858 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
860 frame.pict_type = FF_P_TYPE;
861 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
867 frame.pts = (int64_t)AV_NOPTS_VALUE;
870 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
872 if ( p_sys->i_last_pts == frame.pts )
874 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
875 "same PTS (%"PRId64 ")", frame.pts );
878 else if ( p_sys->i_last_pts > frame.pts )
880 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
881 "past (current: %"PRId64 ", last: %"PRId64")",
882 frame.pts, p_sys->i_last_pts );
887 p_sys->i_last_pts = frame.pts;
891 frame.quality = p_sys->i_quality;
893 /* Ugly work-around for stupid libavcodec behaviour */
895 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
896 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
897 p_enc->fmt_in.video.i_frame_rate_base;
898 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
899 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
900 /* End work-around */
902 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
903 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
907 block_t *p_block = block_New( p_enc, i_out );
908 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
910 /* FIXME, 3-2 pulldown is not handled correctly */
911 p_block->i_length = I64C(1000000) *
912 p_enc->fmt_in.video.i_frame_rate_base /
913 p_enc->fmt_in.video.i_frame_rate;
915 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
917 /* No delay -> output pts == input pts */
918 p_block->i_pts = p_block->i_dts = p_pict->date;
920 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
921 p_sys->p_context->coded_frame->pts != 0 &&
922 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
924 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
925 p_block->i_pts = p_sys->p_context->coded_frame->pts;
927 /* Ugly work-around for stupid libavcodec behaviour */
929 int64_t i_framenum = p_block->i_pts *
930 p_enc->fmt_in.video.i_frame_rate /
931 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
933 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
935 /* End work-around */
937 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
938 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
940 p_block->i_dts = p_block->i_pts;
944 if( p_sys->i_last_ref_pts )
946 p_block->i_dts = p_sys->i_last_ref_pts;
950 /* Let's put something sensible */
951 p_block->i_dts = p_block->i_pts;
954 p_sys->i_last_ref_pts = p_block->i_pts;
959 /* Buggy libavcodec which doesn't update coded_frame->pts
961 p_block->i_dts = p_block->i_pts = p_pict->date;
964 switch ( p_sys->p_context->coded_frame->pict_type )
967 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
970 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
973 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
983 /****************************************************************************
984 * EncodeAudio: the whole thing
985 ****************************************************************************/
986 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
988 encoder_sys_t *p_sys = p_enc->p_sys;
989 block_t *p_block, *p_chain = NULL;
991 uint8_t *p_buffer = p_aout_buf->p_buffer;
992 int i_samples = p_aout_buf->i_nb_samples;
993 int i_samples_delay = p_sys->i_samples_delay;
995 p_sys->i_pts = p_aout_buf->start_date -
996 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
997 (mtime_t)p_enc->fmt_in.audio.i_rate;
999 p_sys->i_samples_delay += i_samples;
1001 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1006 if( i_samples_delay )
1008 /* Take care of the left-over from last time */
1009 int i_delay_size = i_samples_delay * 2 *
1010 p_sys->p_context->channels;
1011 int i_size = p_sys->i_frame_size - i_delay_size;
1013 p_samples = (int16_t *)p_sys->p_buffer;
1014 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1015 p_buffer -= i_delay_size;
1016 i_samples += i_samples_delay;
1017 i_samples_delay = 0;
1021 p_samples = (int16_t *)p_buffer;
1024 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
1025 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
1029 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1031 if( i_out < 0 ) break;
1033 p_buffer += p_sys->i_frame_size;
1034 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1035 i_samples -= p_sys->p_context->frame_size;
1037 if( i_out == 0 ) continue;
1039 p_block = block_New( p_enc, i_out );
1040 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1042 p_block->i_length = (mtime_t)1000000 *
1043 (mtime_t)p_sys->p_context->frame_size /
1044 (mtime_t)p_sys->p_context->sample_rate;
1046 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1049 p_sys->i_pts += p_block->i_length;
1050 block_ChainAppend( &p_chain, p_block );
1053 /* Backup the remaining raw samples */
1056 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1057 p_sys->p_context->channels, p_buffer,
1058 i_samples * 2 * p_sys->p_context->channels );
1064 /*****************************************************************************
1065 * CloseEncoder: ffmpeg encoder destruction
1066 *****************************************************************************/
1067 void E_(CloseEncoder)( vlc_object_t *p_this )
1069 encoder_t *p_enc = (encoder_t *)p_this;
1070 encoder_sys_t *p_sys = p_enc->p_sys;
1072 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1075 struct thread_context_t ** pp_contexts =
1076 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1077 for ( i = 0; i < p_enc->i_threads; i++ )
1079 vlc_object_kill( pp_contexts[i] );
1080 vlc_cond_signal( &pp_contexts[i]->cond );
1081 vlc_thread_join( pp_contexts[i] );
1082 vlc_mutex_destroy( &pp_contexts[i]->lock );
1083 vlc_cond_destroy( &pp_contexts[i]->cond );
1084 vlc_object_release( pp_contexts[i] );
1087 free( pp_contexts );
1090 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1091 avcodec_close( p_sys->p_context );
1092 vlc_mutex_unlock( lock );
1093 av_free( p_sys->p_context );
1095 free( p_sys->p_buffer );
1096 free( p_sys->p_buffer_out );