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 void* FfmpegThread( vlc_object_t *p_this );
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;
109 uint8_t *p_buffer_out;
115 mtime_t i_last_ref_pts;
116 mtime_t i_buggy_pts_detect;
127 /* 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",
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( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
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 memset( p_sys, 0, sizeof(encoder_sys_t) );
257 p_enc->p_sys = p_sys;
258 p_sys->p_codec = p_codec;
260 p_enc->pf_encode_video = EncodeVideo;
261 p_enc->pf_encode_audio = EncodeAudio;
263 p_sys->p_buffer = NULL;
264 p_sys->p_buffer_out = NULL;
265 p_sys->i_buffer_out = 0;
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 * 1000;
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 "rc-buffer-size", &val );
321 p_sys->i_rc_buffer_size = val.i_int;
322 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
323 p_sys->f_rc_buffer_aggressivity = val.f_float;
325 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
326 p_sys->f_i_quant_factor = val.f_float;
328 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
329 p_sys->i_noise_reduction = val.i_int;
331 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
332 p_sys->b_mpeg4_matrix = val.b_bool;
334 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
335 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
336 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
338 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
339 p_sys->i_hq = FF_MB_DECISION_RD;
340 if( val.psz_string && *val.psz_string )
342 if( !strcmp( val.psz_string, "rd" ) )
343 p_sys->i_hq = FF_MB_DECISION_RD;
344 else if( !strcmp( val.psz_string, "bits" ) )
345 p_sys->i_hq = FF_MB_DECISION_BITS;
346 else if( !strcmp( val.psz_string, "simple" ) )
347 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
349 p_sys->i_hq = FF_MB_DECISION_RD;
352 p_sys->i_hq = FF_MB_DECISION_RD;
353 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_AAC_LOW;
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, setting it to low" );
397 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
400 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->i_buffer_out = p_context->height * p_context->width * 3;
458 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
459 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
460 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
462 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
463 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
464 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
466 if( p_codec->pix_fmts )
468 const enum PixelFormat *p = p_codec->pix_fmts;
469 for( ; *p != -1; p++ )
471 if( *p == p_context->pix_fmt ) break;
473 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
474 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
475 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
479 if ( p_sys->f_i_quant_factor != 0.0 )
480 p_context->i_quant_factor = p_sys->f_i_quant_factor;
482 p_context->noise_reduction = p_sys->i_noise_reduction;
484 if ( p_sys->b_mpeg4_matrix )
486 p_context->intra_matrix = mpeg4_default_intra_matrix;
487 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
490 if ( p_sys->b_pre_me )
492 p_context->pre_me = 1;
493 p_context->me_pre_cmp = FF_CMP_CHROMA;
496 if ( p_sys->b_interlace )
498 if ( p_context->height <= 280 )
500 if ( p_context->height != 16 || p_context->width != 16 )
502 "disabling interlaced video because height=%d <= 280",
507 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
508 if ( p_sys->b_interlace_me )
509 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
513 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
514 if ( p_sys->b_trellis )
515 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
517 p_context->trellis = p_sys->b_trellis;
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
530 * over quality 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;
559 p_context->rc_qsquish = 1.0;
560 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
561 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
562 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
563 /* This is from ffmpeg's ffmpeg.c : */
564 p_context->rc_initial_buffer_occupancy
565 = p_sys->i_rc_buffer_size * 3/4;
566 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
569 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
571 /* work around bug in libmp3lame encoding */
572 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
573 p_enc->fmt_in.audio.i_channels = 2;
575 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
576 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
577 p_context->channels = p_enc->fmt_out.audio.i_channels;
579 if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
581 /* XXX: FAAC does resample only when setting the INPUT samplerate
582 * to the desired value (-R option of the faac frontend)
583 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
584 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
585 /* Ignore FF_PROFILE_UNKNOWN */
586 if( p_sys->i_aac_profile >= FF_PROFILE_AAC_MAIN )
587 p_context->profile = p_sys->i_aac_profile;
592 /* Misc parameters */
593 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
595 if( i_codec_id == CODEC_ID_RAWVIDEO )
597 /* XXX: hack: Force same codec (will be handled by transcode) */
598 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
599 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
602 /* Make sure we get extradata filled by the encoder */
603 p_context->extradata_size = 0;
604 p_context->extradata = NULL;
605 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
607 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
609 if( avcodec_open( p_context, p_codec ) )
611 vlc_mutex_unlock( lock );
612 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
613 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
614 || i_codec_id == CODEC_ID_MP3) )
616 if( p_context->channels > 2 )
618 p_context->channels = 2;
619 p_enc->fmt_in.audio.i_channels = 2; // FIXME
620 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
623 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
627 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
629 if ( p_enc->fmt_out.audio.i_rate
630 == mpa_freq_tab[i_frequency] )
633 if ( i_frequency == 6 )
635 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
636 p_enc->fmt_out.audio.i_rate );
641 for ( i = 1; i < 14; i++ )
643 if ( p_enc->fmt_out.i_bitrate / 1000
644 <= mpa_bitrate_tab[i_frequency / 3][i] )
647 if ( p_enc->fmt_out.i_bitrate / 1000
648 != mpa_bitrate_tab[i_frequency / 3][i] )
651 "MPEG audio doesn't support bitrate=%d, using %d",
652 p_enc->fmt_out.i_bitrate,
653 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
654 p_enc->fmt_out.i_bitrate =
655 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
656 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
660 p_context->codec = NULL;
661 vlc_mutex_lock( lock );
662 if( avcodec_open( p_context, p_codec ) )
664 vlc_mutex_unlock( lock );
665 msg_Err( p_enc, "cannot open encoder" );
666 intf_UserFatal( p_enc, false,
667 _("Streaming / Transcoding failed"),
668 _("VLC could not open the encoder.") );
675 msg_Err( p_enc, "cannot open encoder" );
676 intf_UserFatal( p_enc, false, _("Streaming / Transcoding failed"),
677 _("VLC could not open the encoder.") );
682 vlc_mutex_unlock( lock);
684 p_enc->fmt_out.i_extra = p_context->extradata_size;
685 if( p_enc->fmt_out.i_extra )
687 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
688 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
689 p_enc->fmt_out.i_extra );
691 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
693 if( p_enc->fmt_in.i_cat == AUDIO_ES )
695 p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
696 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
697 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
698 p_sys->p_buffer = malloc( p_sys->i_frame_size );
699 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
702 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
707 /****************************************************************************
708 * Ffmpeg threading system
709 ****************************************************************************/
710 static void* FfmpegThread( vlc_object_t *p_this )
712 struct thread_context_t *p_context = (struct thread_context_t *)p_this;
713 int canc = vlc_savecancel ();
714 while ( vlc_object_alive (p_context) && !p_context->b_error )
716 vlc_mutex_lock( &p_context->lock );
717 while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
719 vlc_cond_wait( &p_context->cond, &p_context->lock );
721 p_context->b_work = 0;
722 vlc_mutex_unlock( &p_context->lock );
723 if ( !vlc_object_alive (p_context) || p_context->b_error )
726 if ( p_context->pf_func )
728 p_context->i_ret = p_context->pf_func( p_context->p_context,
732 vlc_mutex_lock( &p_context->lock );
733 p_context->b_done = 1;
734 vlc_cond_signal( &p_context->cond );
735 vlc_mutex_unlock( &p_context->lock );
738 vlc_restorecancel (canc);
742 static int FfmpegExecute( AVCodecContext *s,
743 int (*pf_func)(AVCodecContext *c2, void *arg2),
744 void **arg, int *ret, int count )
746 struct thread_context_t ** pp_contexts =
747 (struct thread_context_t **)s->thread_opaque;
750 /* Note, we can be certain that this is not called with the same
751 * AVCodecContext by different threads at the same time */
752 for ( i = 0; i < count; i++ )
754 vlc_mutex_lock( &pp_contexts[i]->lock );
755 pp_contexts[i]->arg = arg[i];
756 pp_contexts[i]->pf_func = pf_func;
757 pp_contexts[i]->i_ret = 12345;
758 pp_contexts[i]->b_work = 1;
759 vlc_cond_signal( &pp_contexts[i]->cond );
760 vlc_mutex_unlock( &pp_contexts[i]->lock );
762 for ( i = 0; i < count; i++ )
764 vlc_mutex_lock( &pp_contexts[i]->lock );
765 while ( !pp_contexts[i]->b_done )
767 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
769 pp_contexts[i]->b_done = 0;
770 pp_contexts[i]->pf_func = NULL;
771 vlc_mutex_unlock( &pp_contexts[i]->lock );
775 ret[i] = pp_contexts[i]->i_ret;
782 /****************************************************************************
783 * EncodeVideo: the whole thing
784 ****************************************************************************/
785 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
787 encoder_sys_t *p_sys = p_enc->p_sys;
791 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
793 struct thread_context_t ** pp_contexts;
797 pp_contexts = malloc( sizeof(struct thread_context_t *)
798 * p_enc->i_threads );
799 p_sys->p_context->thread_opaque = (void *)pp_contexts;
801 for ( i = 0; i < p_enc->i_threads; i++ )
803 pp_contexts[i] = vlc_object_create( p_enc,
804 sizeof(struct thread_context_t) );
805 pp_contexts[i]->p_context = p_sys->p_context;
806 vlc_mutex_init( &pp_contexts[i]->lock );
807 vlc_cond_init( &pp_contexts[i]->cond );
808 pp_contexts[i]->b_work = 0;
809 pp_contexts[i]->b_done = 0;
810 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
811 VLC_THREAD_PRIORITY_VIDEO, false ) )
813 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
818 p_sys->p_context->execute = FfmpegExecute;
821 memset( &frame, 0, sizeof( AVFrame ) );
822 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
824 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
825 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
828 /* Let ffmpeg select the frame type */
831 frame.repeat_pict = p_pict->i_nb_fields - 2;
832 frame.interlaced_frame = !p_pict->b_progressive;
833 frame.top_field_first = !!p_pict->b_top_field_first;
835 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
836 if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
838 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
840 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
842 mtime_t current_date = mdate();
844 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
846 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
847 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
848 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
850 p_sys->p_context->trellis = 0;
852 msg_Dbg( p_enc, "hurry up mode 3" );
856 p_sys->p_context->mb_decision = p_sys->i_hq;
858 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
860 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
861 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
863 p_sys->p_context->trellis = 0;
865 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
866 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
867 msg_Dbg( p_enc, "hurry up mode 2" );
871 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
872 if ( p_sys->b_trellis )
873 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
875 p_sys->p_context->trellis = p_sys->b_trellis;
878 p_sys->p_context->noise_reduction =
879 p_sys->i_noise_reduction;
883 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
885 frame.pict_type = FF_P_TYPE;
886 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
892 frame.pts = (int64_t)AV_NOPTS_VALUE;
895 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
897 if ( p_sys->i_last_pts == frame.pts )
899 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
900 "same PTS (%"PRId64 ")", frame.pts );
903 else if ( p_sys->i_last_pts > frame.pts )
905 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
906 "past (current: %"PRId64 ", last: %"PRId64")",
907 frame.pts, p_sys->i_last_pts );
912 p_sys->i_last_pts = frame.pts;
916 frame.quality = p_sys->i_quality;
918 /* Ugly work-around for stupid libavcodec behaviour */
920 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
921 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
922 p_enc->fmt_in.video.i_frame_rate_base;
923 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
924 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
925 /* End work-around */
927 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
928 p_sys->i_buffer_out, &frame );
932 block_t *p_block = block_New( p_enc, i_out );
933 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
935 /* FIXME, 3-2 pulldown is not handled correctly */
936 p_block->i_length = INT64_C(1000000) *
937 p_enc->fmt_in.video.i_frame_rate_base /
938 p_enc->fmt_in.video.i_frame_rate;
940 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
942 /* No delay -> output pts == input pts */
943 p_block->i_pts = p_block->i_dts = p_pict->date;
945 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
946 p_sys->p_context->coded_frame->pts != 0 &&
947 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
949 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
950 p_block->i_pts = p_sys->p_context->coded_frame->pts;
952 /* Ugly work-around for stupid libavcodec behaviour */
954 int64_t i_framenum = p_block->i_pts *
955 p_enc->fmt_in.video.i_frame_rate /
956 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
958 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
960 /* End work-around */
962 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
963 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
965 p_block->i_dts = p_block->i_pts;
969 if( p_sys->i_last_ref_pts )
971 p_block->i_dts = p_sys->i_last_ref_pts;
975 /* Let's put something sensible */
976 p_block->i_dts = p_block->i_pts;
979 p_sys->i_last_ref_pts = p_block->i_pts;
984 /* Buggy libavcodec which doesn't update coded_frame->pts
986 p_block->i_dts = p_block->i_pts = p_pict->date;
989 switch ( p_sys->p_context->coded_frame->pict_type )
992 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
995 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
998 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1008 /****************************************************************************
1009 * EncodeAudio: the whole thing
1010 ****************************************************************************/
1011 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
1013 encoder_sys_t *p_sys = p_enc->p_sys;
1014 block_t *p_block, *p_chain = NULL;
1016 uint8_t *p_buffer = p_aout_buf->p_buffer;
1017 int i_samples = p_aout_buf->i_nb_samples;
1018 int i_samples_delay = p_sys->i_samples_delay;
1020 p_sys->i_pts = p_aout_buf->start_date -
1021 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1022 (mtime_t)p_enc->fmt_in.audio.i_rate;
1024 p_sys->i_samples_delay += i_samples;
1026 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
1031 if( i_samples_delay )
1033 /* Take care of the left-over from last time */
1034 int i_delay_size = i_samples_delay * 2 *
1035 p_sys->p_context->channels;
1036 int i_size = p_sys->i_frame_size - i_delay_size;
1038 p_samples = (int16_t *)p_sys->p_buffer;
1039 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
1040 p_buffer -= i_delay_size;
1041 i_samples += i_samples_delay;
1042 i_samples_delay = 0;
1046 p_samples = (int16_t *)p_buffer;
1049 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
1050 p_sys->i_buffer_out, p_samples );
1053 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1055 if( i_out < 0 ) break;
1057 p_buffer += p_sys->i_frame_size;
1058 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
1059 i_samples -= p_sys->p_context->frame_size;
1061 if( i_out == 0 ) continue;
1063 p_block = block_New( p_enc, i_out );
1064 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
1066 p_block->i_length = (mtime_t)1000000 *
1067 (mtime_t)p_sys->p_context->frame_size /
1068 (mtime_t)p_sys->p_context->sample_rate;
1070 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1073 p_sys->i_pts += p_block->i_length;
1074 block_ChainAppend( &p_chain, p_block );
1077 /* Backup the remaining raw samples */
1080 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
1081 p_sys->p_context->channels, p_buffer,
1082 i_samples * 2 * p_sys->p_context->channels );
1088 /*****************************************************************************
1089 * CloseEncoder: ffmpeg encoder destruction
1090 *****************************************************************************/
1091 void CloseEncoder( vlc_object_t *p_this )
1093 encoder_t *p_enc = (encoder_t *)p_this;
1094 encoder_sys_t *p_sys = p_enc->p_sys;
1096 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1099 struct thread_context_t ** pp_contexts =
1100 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1101 for ( i = 0; i < p_enc->i_threads; i++ )
1103 vlc_object_kill( pp_contexts[i] );
1104 vlc_cond_signal( &pp_contexts[i]->cond );
1105 vlc_thread_join( pp_contexts[i] );
1106 vlc_mutex_destroy( &pp_contexts[i]->lock );
1107 vlc_cond_destroy( &pp_contexts[i]->cond );
1108 vlc_object_release( pp_contexts[i] );
1111 free( pp_contexts );
1114 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
1115 avcodec_close( p_sys->p_context );
1116 vlc_mutex_unlock( lock );
1117 av_free( p_sys->p_context );
1119 free( p_sys->p_buffer );
1120 free( p_sys->p_buffer_out );