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;
353 if( val.psz_string ) free( val.psz_string );
355 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
356 p_sys->i_qmin = val.i_int;
357 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
358 p_sys->i_qmax = val.i_int;
359 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
360 p_sys->b_trellis = val.b_bool;
362 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
363 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
364 p_context->strict_std_compliance = val.i_int;
366 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
367 p_sys->f_lumi_masking = val.f_float;
368 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
369 p_sys->f_dark_masking = val.f_float;
370 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
371 p_sys->f_p_masking = val.f_float;
372 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
373 p_sys->f_border_masking = val.f_float;
374 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
375 p_sys->i_luma_elim = val.i_int;
376 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
377 p_sys->i_chroma_elim = val.i_int;
379 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
380 var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
381 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
382 if( val.psz_string && *val.psz_string )
384 if( !strncmp( val.psz_string, "main", 4 ) )
385 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
386 else if( !strncmp( val.psz_string, "low", 3 ) )
387 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
388 #if 0 /* Not supported by FAAC encoder */
389 else if( !strncmp( val.psz_string, "ssr", 3 ) )
390 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
392 else if( !strncmp( val.psz_string, "ltp", 3 ) )
393 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
396 msg_Warn( p_enc, "unknown AAC profile requested" );
397 p_sys->i_aac_profile = FF_PROFILE_UNKNOWN;
400 if( val.psz_string ) free( val.psz_string );
403 if( p_enc->fmt_in.i_cat == VIDEO_ES )
405 int i_aspect_num, i_aspect_den;
407 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
409 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
410 p_enc->fmt_in.video.i_height );
415 p_context->width = p_enc->fmt_in.video.i_width;
416 p_context->height = p_enc->fmt_in.video.i_height;
417 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
418 && (p_context->width > 720 || p_context->height > 576) )
419 p_context->level = 4; /* High level */
421 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
422 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
424 /* Defaults from ffmpeg.c */
425 p_context->qblur = 0.5;
426 p_context->qcompress = 0.5;
427 p_context->b_quant_offset = 1.25;
428 p_context->b_quant_factor = 1.25;
429 p_context->i_quant_offset = 0.0;
430 p_context->i_quant_factor = -0.8;
432 p_context->lumi_masking = p_sys->f_lumi_masking;
433 p_context->dark_masking = p_sys->f_dark_masking;
434 p_context->p_masking = p_sys->f_p_masking;
435 p_context->border_masking = p_sys->f_border_masking;
436 p_context->luma_elim_threshold = p_sys->i_luma_elim;
437 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
439 if( p_sys->i_key_int > 0 )
440 p_context->gop_size = p_sys->i_key_int;
441 p_context->max_b_frames =
442 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
443 p_context->b_frame_strategy = 0;
444 if( !p_context->max_b_frames &&
445 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
446 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
447 p_context->flags |= CODEC_FLAG_LOW_DELAY;
449 av_reduce( &i_aspect_num, &i_aspect_den,
450 p_enc->fmt_in.video.i_aspect,
451 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
452 av_reduce( &p_context->sample_aspect_ratio.num,
453 &p_context->sample_aspect_ratio.den,
454 i_aspect_num * (int64_t)p_context->height,
455 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
457 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
459 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
460 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
461 if( p_codec->pix_fmts )
463 const enum PixelFormat *p = p_codec->pix_fmts;
464 for( ; *p != -1; p++ )
466 if( *p == p_context->pix_fmt ) break;
468 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
469 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
472 if ( p_sys->b_strict_rc )
474 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
475 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
476 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
477 /* This is from ffmpeg's ffmpeg.c : */
478 p_context->rc_initial_buffer_occupancy
479 = p_sys->i_rc_buffer_size * 3/4;
480 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
483 if ( p_sys->f_i_quant_factor != 0.0 )
484 p_context->i_quant_factor = p_sys->f_i_quant_factor;
486 p_context->noise_reduction = p_sys->i_noise_reduction;
488 if ( p_sys->b_mpeg4_matrix )
490 p_context->intra_matrix = mpeg4_default_intra_matrix;
491 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
494 if ( p_sys->b_pre_me )
496 p_context->pre_me = 1;
497 p_context->me_pre_cmp = FF_CMP_CHROMA;
500 if ( p_sys->b_interlace )
502 if ( p_context->height <= 280 )
504 if ( p_context->height != 16 || p_context->width != 16 )
506 "disabling interlaced video because height=%d <= 280",
511 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
512 if ( p_sys->b_interlace_me )
513 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
517 if ( p_sys->b_trellis )
518 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
520 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
521 p_context->flags |= CODEC_FLAG_QSCALE;
523 if ( p_enc->i_threads >= 1 )
524 p_context->thread_count = p_enc->i_threads;
526 if( p_sys->i_vtolerance > 0 )
527 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
529 /* usually if someone sets bitrate, he likes more to get that bitrate over quality
530 * should help 'normal' user to get asked bitrate
532 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
538 if( p_sys->i_qmin > 0 )
540 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
541 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
543 if( p_sys->i_qmax > 0 )
545 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
546 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
548 p_context->max_qdiff = 3;
550 p_context->mb_decision = p_sys->i_hq;
552 if( p_sys->i_quality )
554 p_context->flags |= CODEC_FLAG_QSCALE;
555 p_context->global_quality = p_sys->i_quality;
558 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
560 /* work around bug in libmp3lame encoding */
561 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
562 p_enc->fmt_in.audio.i_channels = 2;
564 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
565 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
566 p_context->channels = p_enc->fmt_in.audio.i_channels;
568 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
569 /* Ignore FF_PROFILE_UNKNOWN */
570 if( ( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN ) &&
571 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') ) )
572 p_context->profile = p_sys->i_aac_profile;
576 /* Misc parameters */
577 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
579 if( i_codec_id == CODEC_ID_RAWVIDEO )
581 /* XXX: hack: Force same codec (will be handled by transcode) */
582 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
583 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
586 /* Make sure we get extradata filled by the encoder */
587 p_context->extradata_size = 0;
588 p_context->extradata = NULL;
589 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
591 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
593 if( avcodec_open( p_context, p_codec ) )
595 vlc_mutex_unlock( lock );
596 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
597 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
598 || i_codec_id == CODEC_ID_MP3) )
600 if( p_context->channels > 2 )
602 p_context->channels = 2;
603 p_enc->fmt_in.audio.i_channels = 2; // FIXME
604 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
607 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
611 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
613 if ( p_enc->fmt_out.audio.i_rate
614 == mpa_freq_tab[i_frequency] )
617 if ( i_frequency == 6 )
619 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
620 p_enc->fmt_out.audio.i_rate );
625 for ( i = 1; i < 14; i++ )
627 if ( p_enc->fmt_out.i_bitrate / 1000
628 <= mpa_bitrate_tab[i_frequency / 3][i] )
631 if ( p_enc->fmt_out.i_bitrate / 1000
632 != mpa_bitrate_tab[i_frequency / 3][i] )
635 "MPEG audio doesn't support bitrate=%d, using %d",
636 p_enc->fmt_out.i_bitrate,
637 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
638 p_enc->fmt_out.i_bitrate =
639 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
640 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
644 p_context->codec = NULL;
645 vlc_mutex_lock( lock );
646 if( avcodec_open( p_context, p_codec ) )
648 vlc_mutex_unlock( lock );
649 msg_Err( p_enc, "cannot open encoder" );
650 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
651 _("VLC could not open the encoder.") );
658 msg_Err( p_enc, "cannot open encoder" );
659 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
660 _("VLC could not open the encoder.") );
665 vlc_mutex_unlock( lock);
667 p_enc->fmt_out.i_extra = p_context->extradata_size;
668 if( p_enc->fmt_out.i_extra )
670 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
671 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
672 p_enc->fmt_out.i_extra );
674 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
676 if( p_enc->fmt_in.i_cat == AUDIO_ES )
678 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
679 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
680 p_sys->p_buffer = malloc( p_sys->i_frame_size );
681 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
684 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
689 /****************************************************************************
690 * Ffmpeg threading system
691 ****************************************************************************/
692 static int FfmpegThread( struct thread_context_t *p_context )
694 while ( !p_context->b_die && !p_context->b_error )
696 vlc_mutex_lock( &p_context->lock );
697 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
699 vlc_cond_wait( &p_context->cond, &p_context->lock );
701 p_context->b_work = 0;
702 vlc_mutex_unlock( &p_context->lock );
703 if ( p_context->b_die || p_context->b_error )
706 if ( p_context->pf_func )
708 p_context->i_ret = p_context->pf_func( p_context->p_context,
712 vlc_mutex_lock( &p_context->lock );
713 p_context->b_done = 1;
714 vlc_cond_signal( &p_context->cond );
715 vlc_mutex_unlock( &p_context->lock );
721 static int FfmpegExecute( AVCodecContext *s,
722 int (*pf_func)(AVCodecContext *c2, void *arg2),
723 void **arg, int *ret, int count )
725 struct thread_context_t ** pp_contexts =
726 (struct thread_context_t **)s->thread_opaque;
729 /* Note, we can be certain that this is not called with the same
730 * AVCodecContext by different threads at the same time */
731 for ( i = 0; i < count; i++ )
733 vlc_mutex_lock( &pp_contexts[i]->lock );
734 pp_contexts[i]->arg = arg[i];
735 pp_contexts[i]->pf_func = pf_func;
736 pp_contexts[i]->i_ret = 12345;
737 pp_contexts[i]->b_work = 1;
738 vlc_cond_signal( &pp_contexts[i]->cond );
739 vlc_mutex_unlock( &pp_contexts[i]->lock );
741 for ( i = 0; i < count; i++ )
743 vlc_mutex_lock( &pp_contexts[i]->lock );
744 while ( !pp_contexts[i]->b_done )
746 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
748 pp_contexts[i]->b_done = 0;
749 pp_contexts[i]->pf_func = NULL;
750 vlc_mutex_unlock( &pp_contexts[i]->lock );
754 ret[i] = pp_contexts[i]->i_ret;
761 /****************************************************************************
762 * EncodeVideo: the whole thing
763 ****************************************************************************/
764 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
766 encoder_sys_t *p_sys = p_enc->p_sys;
770 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
772 struct thread_context_t ** pp_contexts;
776 pp_contexts = malloc( sizeof(struct thread_context_t *)
777 * p_enc->i_threads );
778 p_sys->p_context->thread_opaque = (void *)pp_contexts;
780 for ( i = 0; i < p_enc->i_threads; i++ )
782 pp_contexts[i] = vlc_object_create( p_enc,
783 sizeof(struct thread_context_t) );
784 pp_contexts[i]->p_context = p_sys->p_context;
785 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
786 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
787 pp_contexts[i]->b_work = 0;
788 pp_contexts[i]->b_done = 0;
789 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
790 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
792 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
797 p_sys->p_context->execute = FfmpegExecute;
800 memset( &frame, 0, sizeof( AVFrame ) );
801 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
803 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
804 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
807 /* Let ffmpeg select the frame type */
810 frame.repeat_pict = p_pict->i_nb_fields - 2;
811 frame.interlaced_frame = !p_pict->b_progressive;
812 frame.top_field_first = !!p_pict->b_top_field_first;
814 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
815 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
817 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
819 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
821 mtime_t current_date = mdate();
823 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
825 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
826 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
827 msg_Dbg( p_enc, "hurry up mode 3" );
831 p_sys->p_context->mb_decision = p_sys->i_hq;
833 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
835 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
836 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
837 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
838 msg_Dbg( p_enc, "hurry up mode 2" );
842 if ( p_sys->b_trellis )
843 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
845 p_sys->p_context->noise_reduction =
846 p_sys->i_noise_reduction;
850 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
852 frame.pict_type = FF_P_TYPE;
853 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
859 frame.pts = (int64_t)AV_NOPTS_VALUE;
862 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
864 if ( p_sys->i_last_pts == frame.pts )
866 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
867 "same PTS (" I64Fd ")", frame.pts );
870 else if ( p_sys->i_last_pts > frame.pts )
872 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
873 "past (current: " I64Fd ", last: "I64Fd")",
874 frame.pts, p_sys->i_last_pts );
879 p_sys->i_last_pts = frame.pts;
883 frame.quality = p_sys->i_quality;
885 /* Ugly work-around for stupid libavcodec behaviour */
887 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
888 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
889 p_enc->fmt_in.video.i_frame_rate_base;
890 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
891 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
892 /* End work-around */
894 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
895 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
899 block_t *p_block = block_New( p_enc, i_out );
900 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
902 /* FIXME, 3-2 pulldown is not handled correctly */
903 p_block->i_length = I64C(1000000) *
904 p_enc->fmt_in.video.i_frame_rate_base /
905 p_enc->fmt_in.video.i_frame_rate;
907 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
909 /* No delay -> output pts == input pts */
910 p_block->i_pts = p_block->i_dts = p_pict->date;
912 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
913 p_sys->p_context->coded_frame->pts != 0 &&
914 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
916 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
917 p_block->i_pts = p_sys->p_context->coded_frame->pts;
919 /* Ugly work-around for stupid libavcodec behaviour */
921 int64_t i_framenum = p_block->i_pts *
922 p_enc->fmt_in.video.i_frame_rate /
923 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
925 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
927 /* End work-around */
929 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
930 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
932 p_block->i_dts = p_block->i_pts;
936 if( p_sys->i_last_ref_pts )
938 p_block->i_dts = p_sys->i_last_ref_pts;
942 /* Let's put something sensible */
943 p_block->i_dts = p_block->i_pts;
946 p_sys->i_last_ref_pts = p_block->i_pts;
951 /* Buggy libavcodec which doesn't update coded_frame->pts
953 p_block->i_dts = p_block->i_pts = p_pict->date;
956 switch ( p_sys->p_context->coded_frame->pict_type )
959 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
962 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
965 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
975 /****************************************************************************
976 * EncodeAudio: the whole thing
977 ****************************************************************************/
978 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
980 encoder_sys_t *p_sys = p_enc->p_sys;
981 block_t *p_block, *p_chain = NULL;
983 uint8_t *p_buffer = p_aout_buf->p_buffer;
984 int i_samples = p_aout_buf->i_nb_samples;
985 int i_samples_delay = p_sys->i_samples_delay;
987 p_sys->i_pts = p_aout_buf->start_date -
988 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
989 (mtime_t)p_enc->fmt_in.audio.i_rate;
991 p_sys->i_samples_delay += i_samples;
993 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
998 if( i_samples_delay )
1000 /* Take care of the left-over from last time */
1001 int i_delay_size = i_samples_delay * 2 *
1002 p_sys->p_context->channels;
1003 int i_size = p_sys->i_frame_size - i_delay_size;
1005 p_samples = (int16_t *)p_sys->p_buffer;
1006 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1007 p_buffer -= i_delay_size;
1008 i_samples += i_samples_delay;
1009 i_samples_delay = 0;
1013 p_samples = (int16_t *)p_buffer;
1016 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
1017 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
1021 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1023 if( i_out < 0 ) break;
1025 p_buffer += p_sys->i_frame_size;
1026 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1027 i_samples -= p_sys->p_context->frame_size;
1029 if( i_out == 0 ) continue;
1031 p_block = block_New( p_enc, i_out );
1032 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1034 p_block->i_length = (mtime_t)1000000 *
1035 (mtime_t)p_sys->p_context->frame_size /
1036 (mtime_t)p_sys->p_context->sample_rate;
1038 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1041 p_sys->i_pts += p_block->i_length;
1042 block_ChainAppend( &p_chain, p_block );
1045 /* Backup the remaining raw samples */
1048 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1049 p_sys->p_context->channels, p_buffer,
1050 i_samples * 2 * p_sys->p_context->channels );
1056 /*****************************************************************************
1057 * CloseEncoder: ffmpeg encoder destruction
1058 *****************************************************************************/
1059 void E_(CloseEncoder)( vlc_object_t *p_this )
1061 encoder_t *p_enc = (encoder_t *)p_this;
1062 encoder_sys_t *p_sys = p_enc->p_sys;
1064 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1067 struct thread_context_t ** pp_contexts =
1068 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1069 for ( i = 0; i < p_enc->i_threads; i++ )
1071 vlc_object_kill( pp_contexts[i] );
1072 vlc_cond_signal( &pp_contexts[i]->cond );
1073 vlc_thread_join( pp_contexts[i] );
1074 vlc_mutex_destroy( &pp_contexts[i]->lock );
1075 vlc_cond_destroy( &pp_contexts[i]->cond );
1076 vlc_object_release( pp_contexts[i] );
1079 free( pp_contexts );
1082 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1083 avcodec_close( p_sys->p_context );
1084 vlc_mutex_unlock( lock );
1085 av_free( p_sys->p_context );
1087 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1088 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );