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>
38 #include <vlc_codec.h>
39 #include <vlc_dialog.h>
40 #include <vlc_avcodec.h>
45 #include <libavcodec/avcodec.h>
50 #define HURRY_UP_GUARD1 (450000)
51 #define HURRY_UP_GUARD2 (300000)
52 #define HURRY_UP_GUARD3 (100000)
54 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
56 #define RAW_AUDIO_FRAME_SIZE (2048)
58 /*****************************************************************************
60 *****************************************************************************/
61 int OpenEncoder ( vlc_object_t * );
62 void CloseEncoder( vlc_object_t * );
64 static block_t *EncodeVideo( encoder_t *, picture_t * );
65 static block_t *EncodeAudio( encoder_t *, block_t * );
67 struct thread_context_t;
69 /*****************************************************************************
70 * thread_context_t : for multithreaded encoding
71 *****************************************************************************/
72 struct thread_context_t
76 AVCodecContext *p_context;
77 int (* pf_func)(AVCodecContext *c, void *arg);
86 /*****************************************************************************
87 * encoder_sys_t : ffmpeg encoder descriptor
88 *****************************************************************************/
95 AVCodecContext *p_context;
101 uint8_t *p_buffer_out;
107 mtime_t i_last_ref_pts;
108 mtime_t i_buggy_pts_detect;
120 /* Encoding settings */
127 int i_rc_buffer_size;
128 float f_rc_buffer_aggressivity;
131 bool b_interlace, b_interlace_me;
132 float f_i_quant_factor;
133 int i_noise_reduction;
136 int i_quality; /* for VBR */
137 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
138 int i_luma_elim, i_chroma_elim;
139 int i_aac_profile; /* AAC profile to use.*/
140 /* Used to work around stupid timestamping behaviour in libavcodec */
142 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
145 static const char *const ppsz_enc_options[] = {
146 "keyint", "bframes", "vt", "qmin", "qmax", "codec", "hq",
147 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
148 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
149 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
150 "p-masking", "border-masking", "luma-elim-threshold",
151 "chroma-elim-threshold",
156 static const uint16_t mpa_bitrate_tab[2][15] =
158 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
159 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
162 static const uint16_t mpa_freq_tab[6] =
163 { 44100, 48000, 32000, 22050, 24000, 16000 };
165 static const uint16_t mpeg4_default_intra_matrix[64] = {
166 8, 17, 18, 19, 21, 23, 25, 27,
167 17, 18, 19, 21, 23, 25, 27, 28,
168 20, 21, 22, 23, 24, 26, 28, 30,
169 21, 22, 23, 24, 26, 28, 30, 32,
170 22, 23, 24, 26, 28, 30, 32, 35,
171 23, 24, 26, 28, 30, 32, 35, 38,
172 25, 26, 28, 30, 32, 35, 38, 41,
173 27, 28, 30, 32, 35, 38, 41, 45,
176 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
177 16, 17, 18, 19, 20, 21, 22, 23,
178 17, 18, 19, 20, 21, 22, 23, 24,
179 18, 19, 20, 21, 22, 23, 24, 25,
180 19, 20, 21, 22, 23, 24, 26, 27,
181 20, 21, 22, 23, 25, 26, 27, 28,
182 21, 22, 23, 24, 26, 27, 28, 30,
183 22, 23, 24, 26, 27, 28, 30, 31,
184 23, 24, 25, 27, 28, 30, 31, 33,
187 /*****************************************************************************
188 * OpenEncoder: probe the encoder
189 *****************************************************************************/
191 int OpenEncoder( vlc_object_t *p_this )
193 encoder_t *p_enc = (encoder_t *)p_this;
194 encoder_sys_t *p_sys;
195 AVCodecContext *p_context;
196 AVCodec *p_codec = NULL;
197 int i_codec_id, i_cat;
198 const char *psz_namecodec;
202 /* Initialization must be done before avcodec_find_encoder() */
205 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
207 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP3 )
210 i_codec_id = CODEC_ID_MP3;
211 psz_namecodec = "MPEG I/II Layer 3";
213 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP2 )
216 i_codec_id = CODEC_ID_MP2;
217 psz_namecodec = "MPEG I/II Layer 2";
219 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP1V )
222 i_codec_id = CODEC_ID_MPEG1VIDEO;
223 psz_namecodec = "MPEG-1 video";
225 else if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
228 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
230 /* handed chroma output */
234 i_codec_id = CODEC_ID_RAWVIDEO;
235 psz_namecodec = "Raw video";
238 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
240 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
241 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
242 _("\"%s\" is no video encoder."), psz_namecodec );
246 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
248 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
249 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
250 _("\"%s\" is no audio encoder."), psz_namecodec );
254 if( p_enc->fmt_out.i_cat == SPU_ES )
256 /* We don't support subtitle encoding */
260 char *psz_encoder = var_GetString( p_this, ENC_CFG_PREFIX "codec" );
261 if( psz_encoder && *psz_encoder )
263 p_codec = avcodec_find_encoder_by_name( psz_encoder );
265 msg_Err( p_this, "Encoder `%s' not found", psz_encoder );
266 else if( p_codec->id != i_codec_id )
268 msg_Err( p_this, "Encoder `%s' can't handle %4.4s",
269 psz_encoder, (char*)&p_enc->fmt_out.i_codec );
275 p_codec = avcodec_find_encoder( i_codec_id );
278 msg_Err( p_enc, "cannot find encoder %s\n"
279 "*** Your FFMPEG installation is crippled. ***\n"
280 "*** Please check with your FFMPEG packager. ***\n"
281 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
283 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
284 /* I have had enough of all these MPEG-3 transcoding bug reports.
285 * Downstream packager, you had better not patch this out, or I will be really
286 * annoyed. Think about it - you don't want to fork the VLC translation files,
287 * do you? -- Courmisch, 2008-10-22 */
288 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
290 "If you don't know how to fix this, ask for support from your distribution.\n"
292 "This is not an error inside VLC media player.\n"
293 "Do not contact the VideoLAN project about this issue.\n"),
298 /* Allocate the memory needed to store the encoder's structure */
299 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
301 p_enc->p_sys = p_sys;
302 p_sys->p_codec = p_codec;
304 p_enc->pf_encode_video = EncodeVideo;
305 p_enc->pf_encode_audio = EncodeAudio;
307 p_sys->p_buffer = NULL;
308 p_sys->p_buffer_out = NULL;
309 p_sys->i_buffer_out = 0;
311 #if LIBAVCODEC_VERSION_MAJOR < 54
312 p_context = avcodec_alloc_context();
314 p_context = avcodec_alloc_context3(p_codec);
316 p_sys->p_context = p_context;
317 p_sys->p_context->codec_id = p_sys->p_codec->id;
318 p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
319 p_context->opaque = (void *)p_this;
320 p_context->dsp_mask = GetVlcDspMask(); /* set CPU capabilities */
322 p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
323 p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
324 p_sys->i_vtolerance = var_GetInteger( p_enc, ENC_CFG_PREFIX "vt" ) * 1000;
325 p_sys->b_interlace = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace" );
326 p_sys->b_interlace_me = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace-me" );
327 p_sys->b_pre_me = var_GetBool( p_enc, ENC_CFG_PREFIX "pre-me" );
328 p_sys->b_hurry_up = var_GetBool( p_enc, ENC_CFG_PREFIX "hurry-up" );
330 if( p_sys->b_hurry_up )
332 /* hurry up mode needs noise reduction, even small */
333 p_sys->i_noise_reduction = 1;
336 p_sys->i_rc_buffer_size = var_GetInteger( p_enc, ENC_CFG_PREFIX "rc-buffer-size" );
337 p_sys->f_rc_buffer_aggressivity = var_GetFloat( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity" );
338 p_sys->f_i_quant_factor = var_GetFloat( p_enc, ENC_CFG_PREFIX "i-quant-factor" );
339 p_sys->i_noise_reduction = var_GetInteger( p_enc, ENC_CFG_PREFIX "noise-reduction" );
340 p_sys->b_mpeg4_matrix = var_GetBool( p_enc, ENC_CFG_PREFIX "mpeg4-matrix" );
342 f_val = var_GetFloat( p_enc, ENC_CFG_PREFIX "qscale" );
343 if( f_val < 0.01 || f_val > 255.0 ) f_val = 0;
344 p_sys->i_quality = (int)(FF_QP2LAMBDA * f_val + 0.5);
346 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "hq" );
347 p_sys->i_hq = FF_MB_DECISION_RD;
348 if( psz_val && *psz_val )
350 if( !strcmp( psz_val, "rd" ) )
351 p_sys->i_hq = FF_MB_DECISION_RD;
352 else if( !strcmp( psz_val, "bits" ) )
353 p_sys->i_hq = FF_MB_DECISION_BITS;
354 else if( !strcmp( psz_val, "simple" ) )
355 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
357 p_sys->i_hq = FF_MB_DECISION_RD;
360 p_sys->i_hq = FF_MB_DECISION_RD;
363 p_sys->i_qmin = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" );
364 p_sys->i_qmax = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" );
365 p_sys->b_trellis = var_GetBool( p_enc, ENC_CFG_PREFIX "trellis" );
367 p_context->strict_std_compliance = var_GetInteger( p_enc, ENC_CFG_PREFIX "strict" );
369 p_sys->f_lumi_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "lumi-masking" );
370 p_sys->f_dark_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "dark-masking" );
371 p_sys->f_p_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "p-masking" );
372 p_sys->f_border_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "border-masking" );
373 p_sys->i_luma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "luma-elim-threshold" );
374 p_sys->i_chroma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold" );
376 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "aac-profile" );
377 /* ffmpeg uses faac encoder atm, and it has issues with
378 * other than low-complexity profile, so default to that */
379 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
380 if( psz_val && *psz_val )
382 if( !strncmp( psz_val, "main", 4 ) )
383 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
384 else if( !strncmp( psz_val, "low", 3 ) )
385 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
386 #if 0 /* Not supported by FAAC encoder */
387 else if( !strncmp( psz_val, "ssr", 3 ) )
388 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
390 else if( !strncmp( psz_val, "ltp", 3 ) )
391 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
392 #if LIBAVCODEC_VERSION_CHECK( 54, 19, 0, 35, 100 )
393 /* These require ffmpeg with libfdk-aac */
394 else if( !strncmp( psz_val, "hev2", 4 ) )
395 p_sys->i_aac_profile = FF_PROFILE_AAC_HE_V2;
396 else if( !strncmp( psz_val, "hev1", 4 ) )
397 p_sys->i_aac_profile = FF_PROFILE_AAC_HE;
401 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
402 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
407 if( p_enc->fmt_in.i_cat == VIDEO_ES )
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->codec_type = AVMEDIA_TYPE_VIDEO;
419 p_context->width = p_enc->fmt_in.video.i_width;
420 p_context->height = p_enc->fmt_in.video.i_height;
422 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
423 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
424 if( p_codec->supported_framerates )
426 AVRational target = {
427 .num = p_enc->fmt_in.video.i_frame_rate,
428 .den = p_enc->fmt_in.video.i_frame_rate_base,
430 int idx = av_find_nearest_q_idx(target, p_codec->supported_framerates);
432 p_context->time_base.num = p_codec->supported_framerates[idx].den;
433 p_context->time_base.den = p_codec->supported_framerates[idx].num;
436 /* Defaults from ffmpeg.c */
437 p_context->qblur = 0.5;
438 p_context->qcompress = 0.5;
439 p_context->b_quant_offset = 1.25;
440 p_context->b_quant_factor = 1.25;
441 p_context->i_quant_offset = 0.0;
442 p_context->i_quant_factor = -0.8;
444 p_context->lumi_masking = p_sys->f_lumi_masking;
445 p_context->dark_masking = p_sys->f_dark_masking;
446 p_context->p_masking = p_sys->f_p_masking;
447 p_context->border_masking = p_sys->f_border_masking;
448 p_context->luma_elim_threshold = p_sys->i_luma_elim;
449 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
451 if( p_sys->i_key_int > 0 )
452 p_context->gop_size = p_sys->i_key_int;
453 p_context->max_b_frames =
454 VLC_CLIP( p_sys->i_b_frames, 0, FF_MAX_B_FRAMES );
455 p_context->b_frame_strategy = 0;
456 if( !p_context->max_b_frames &&
457 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
458 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ) )
459 p_context->flags |= CODEC_FLAG_LOW_DELAY;
461 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP2V )
462 p_context->idct_algo = FF_IDCT_LIBMPEG2MMX;
464 av_reduce( &p_context->sample_aspect_ratio.num,
465 &p_context->sample_aspect_ratio.den,
466 p_enc->fmt_in.video.i_sar_num,
467 p_enc->fmt_in.video.i_sar_den, 1 << 30 );
469 p_sys->p_buffer_out = NULL;
471 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
472 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
473 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
475 if( p_codec->pix_fmts )
477 const enum PixelFormat *p = p_codec->pix_fmts;
478 for( ; *p != -1; p++ )
480 if( *p == p_context->pix_fmt ) break;
482 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
483 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
484 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
488 if ( p_sys->f_i_quant_factor != 0.0 )
489 p_context->i_quant_factor = p_sys->f_i_quant_factor;
491 p_context->noise_reduction = p_sys->i_noise_reduction;
493 if ( p_sys->b_mpeg4_matrix )
495 p_context->intra_matrix = mpeg4_default_intra_matrix;
496 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
499 if ( p_sys->b_pre_me )
501 p_context->pre_me = 1;
502 p_context->me_pre_cmp = FF_CMP_CHROMA;
505 if ( p_sys->b_interlace )
507 if ( p_context->height <= 280 )
509 if ( p_context->height != 16 || p_context->width != 16 )
511 "disabling interlaced video because height=%d <= 280",
516 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
517 if ( p_sys->b_interlace_me )
518 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
522 p_context->trellis = p_sys->b_trellis;
524 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
525 p_context->flags |= CODEC_FLAG_QSCALE;
526 /* These codecs cause libavcodec to exit if thread_count is > 1.
527 See libavcodec/mpegvideo_enc.c:MPV_encode_init and
528 libavcodec/svq3.c , WMV2 calls MPV_encode_init also.
530 if ( i_codec_id == CODEC_ID_FLV1 ||
531 i_codec_id == CODEC_ID_H261 ||
532 i_codec_id == CODEC_ID_LJPEG ||
533 i_codec_id == CODEC_ID_MJPEG ||
534 i_codec_id == CODEC_ID_H263 ||
535 i_codec_id == CODEC_ID_H263P ||
536 i_codec_id == CODEC_ID_MSMPEG4V1 ||
537 i_codec_id == CODEC_ID_MSMPEG4V2 ||
538 i_codec_id == CODEC_ID_MSMPEG4V3 ||
539 i_codec_id == CODEC_ID_WMV1 ||
540 i_codec_id == CODEC_ID_WMV2 ||
541 i_codec_id == CODEC_ID_RV10 ||
542 i_codec_id == CODEC_ID_RV20 ||
543 i_codec_id == CODEC_ID_SVQ3 )
544 p_enc->i_threads = 1;
546 if( p_sys->i_vtolerance > 0 )
547 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
549 /* usually if someone sets bitrate, he likes more to get that bitrate
550 * over quality should help 'normal' user to get asked bitrate
552 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
558 if( p_sys->i_qmin > 0 )
560 p_context->qmin = p_sys->i_qmin;
561 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
563 if( p_sys->i_qmax > 0 )
565 p_context->qmax = p_sys->i_qmax;
566 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
568 p_context->max_qdiff = 3;
570 p_context->mb_decision = p_sys->i_hq;
572 if( p_sys->i_quality )
574 p_context->flags |= CODEC_FLAG_QSCALE;
575 p_context->global_quality = p_sys->i_quality;
579 p_context->rc_qsquish = 1.0;
580 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
581 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
582 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
583 /* This is from ffmpeg's ffmpeg.c : */
584 p_context->rc_initial_buffer_occupancy
585 = p_sys->i_rc_buffer_size * 3/4;
586 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
589 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
591 /* work around bug in libmp3lame encoding */
592 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
593 p_enc->fmt_in.audio.i_channels = 2;
595 p_context->codec_type = AVMEDIA_TYPE_AUDIO;
596 p_context->sample_fmt = p_codec->sample_fmts ?
597 p_codec->sample_fmts[0] :
599 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
600 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
601 p_context->time_base.num = 1;
602 p_context->time_base.den = p_context->sample_rate;
603 p_context->channels = p_enc->fmt_out.audio.i_channels;
605 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
607 /* XXX: FAAC does resample only when setting the INPUT samplerate
608 * to the desired value (-R option of the faac frontend)
609 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
610 /* vlc should default to low-complexity profile, faac encoder
611 * has bug and aac audio has issues otherwise atm */
612 p_context->profile = p_sys->i_aac_profile;
616 /* Misc parameters */
617 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
619 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 69, 2 )
620 /* Set reasonable defaults to VP8, based on
621 libvpx-720p preset from libvpx ffmpeg-patch */
622 if( i_codec_id == CODEC_ID_VP8 )
624 /* Lets give bitrate tolerance */
625 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
626 /* default to 120 frames between keyframe */
627 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
628 p_context->gop_size = 120;
629 /* Don't set rc-values atm, they were from time before
630 libvpx was officially in ffmpeg */
631 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
632 //p_context->rc_min_rate = 40 * 1000; // 40k
633 /* seems that ffmpeg presets have 720p as divider for buffers */
634 if( p_enc->fmt_out.video.i_height >= 720 )
636 /* Check that we don't overrun users qmin/qmax values */
637 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
639 p_context->qmin = 10;
640 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
643 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
645 p_context->qmax = 42;
646 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
650 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
653 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
658 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
660 p_context->level = 216;
661 p_context->profile = 0;
662 p_context->rc_buffer_aggressivity = 0.95;
663 p_context->token_partitions = 4;
664 p_context->mb_static_threshold = 0;
669 if( i_codec_id == CODEC_ID_RAWVIDEO )
671 /* XXX: hack: Force same codec (will be handled by transcode) */
672 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
673 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
676 /* Make sure we get extradata filled by the encoder */
677 p_context->extradata_size = 0;
678 p_context->extradata = NULL;
679 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
681 if( p_enc->i_threads >= 1)
682 p_context->thread_count = p_enc->i_threads;
684 p_context->thread_count = vlc_GetCPUCount();
688 #if LIBAVCODEC_VERSION_MAJOR < 54
689 ret = avcodec_open( p_context, p_codec );
691 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
693 vlc_avcodec_unlock();
696 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
697 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
698 || i_codec_id == CODEC_ID_MP3) )
700 if( p_context->channels > 2 )
702 p_context->channels = 2;
703 p_enc->fmt_in.audio.i_channels = 2; // FIXME
704 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
707 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
711 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
713 if ( p_enc->fmt_out.audio.i_rate
714 == mpa_freq_tab[i_frequency] )
717 if ( i_frequency == 6 )
719 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
720 p_enc->fmt_out.audio.i_rate );
725 for ( i = 1; i < 14; i++ )
727 if ( p_enc->fmt_out.i_bitrate / 1000
728 <= mpa_bitrate_tab[i_frequency / 3][i] )
731 if ( p_enc->fmt_out.i_bitrate / 1000
732 != mpa_bitrate_tab[i_frequency / 3][i] )
735 "MPEG audio doesn't support bitrate=%d, using %d",
736 p_enc->fmt_out.i_bitrate,
737 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
738 p_enc->fmt_out.i_bitrate =
739 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
740 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
744 p_context->codec = NULL;
746 #if LIBAVCODEC_VERSION_MAJOR < 54
747 ret = avcodec_open( p_context, p_codec );
749 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
751 vlc_avcodec_unlock();
754 msg_Err( p_enc, "cannot open encoder" );
756 _("Streaming / Transcoding failed"),
757 "%s", _("VLC could not open the encoder.") );
764 msg_Err( p_enc, "cannot open encoder" );
765 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
766 "%s", _("VLC could not open the encoder.") );
772 if( i_codec_id == CODEC_ID_FLAC )
774 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
775 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
776 if( p_enc->fmt_out.p_extra )
778 uint8_t *p = p_enc->fmt_out.p_extra;
783 p[4] = 0x80; /* streaminfo block, last block before audio */
784 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
785 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
786 p[7] = ( p_context->extradata_size ) & 0xff;
787 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
791 p_enc->fmt_out.i_extra = 0;
796 p_enc->fmt_out.i_extra = p_context->extradata_size;
797 if( p_enc->fmt_out.i_extra )
799 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
800 if ( p_enc->fmt_out.p_extra == NULL )
804 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
805 p_enc->fmt_out.i_extra );
809 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
811 if( p_enc->fmt_in.i_cat == AUDIO_ES )
813 GetVlcAudioFormat( &p_enc->fmt_in.i_codec,
814 &p_enc->fmt_in.audio.i_bitspersample,
815 p_sys->p_context->sample_fmt );
816 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
818 p_sys->i_frame_size = p_context->frame_size > 1 ?
819 p_context->frame_size :
820 RAW_AUDIO_FRAME_SIZE;
821 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
822 if ( p_sys->p_buffer == NULL )
826 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
827 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( vlc_fourcc_GetCodec( AUDIO_ES, p_enc->fmt_out.i_codec ) );
829 if( p_context->frame_size > 1 )
830 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
832 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
833 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
834 if ( p_sys->p_buffer_out == NULL )
840 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
844 free( p_enc->fmt_out.p_extra );
845 free( p_sys->p_buffer );
846 free( p_sys->p_buffer_out );
851 /****************************************************************************
852 * EncodeVideo: the whole thing
853 ****************************************************************************/
854 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
856 encoder_sys_t *p_sys = p_enc->p_sys;
859 /* Initialize the video output buffer the first time.
860 * This is done here instead of OpenEncoder() because we need the actual
861 * bits_per_pixel value, without having to assume anything.
863 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
864 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
865 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
866 block_t *p_block = block_New( p_enc, blocksize );
868 if( likely(p_pict) ) {
870 memset( &frame, 0, sizeof( AVFrame ) );
871 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
873 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
874 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
877 /* Let ffmpeg select the frame type */
880 frame.repeat_pict = p_pict->i_nb_fields - 2;
881 frame.interlaced_frame = !p_pict->b_progressive;
882 frame.top_field_first = !!p_pict->b_top_field_first;
884 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
885 if( p_enc->fmt_out.i_codec != VLC_CODEC_MP4V )
887 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
889 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
891 mtime_t current_date = mdate();
893 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
895 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
896 p_sys->p_context->trellis = 0;
897 msg_Dbg( p_enc, "hurry up mode 3" );
901 p_sys->p_context->mb_decision = p_sys->i_hq;
903 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
905 p_sys->p_context->trellis = 0;
906 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
907 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
908 msg_Dbg( p_enc, "hurry up mode 2" );
912 p_sys->p_context->trellis = p_sys->b_trellis;
914 p_sys->p_context->noise_reduction =
915 p_sys->i_noise_reduction;
919 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
921 frame.pict_type = AV_PICTURE_TYPE_P;
922 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
928 frame.pts = (int64_t)AV_NOPTS_VALUE;
931 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
933 if ( p_sys->i_last_pts == frame.pts )
935 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
936 "same PTS (%"PRId64 ")", frame.pts );
939 else if ( p_sys->i_last_pts > frame.pts )
941 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
942 "past (current: %"PRId64 ", last: %"PRId64")",
943 frame.pts, p_sys->i_last_pts );
948 p_sys->i_last_pts = frame.pts;
952 frame.quality = p_sys->i_quality;
954 /* Ugly work-around for stupid libavcodec behaviour */
956 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
957 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
958 p_enc->fmt_in.video.i_frame_rate_base;
959 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
960 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
961 /* End work-around */
963 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
964 p_block->i_buffer, &frame );
968 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
969 p_block->i_buffer, NULL);
974 block_Release( p_block );
978 p_block->i_buffer = i_out;
980 /* FIXME, 3-2 pulldown is not handled correctly */
981 p_block->i_length = INT64_C(1000000) *
982 p_enc->fmt_in.video.i_frame_rate_base /
983 p_enc->fmt_in.video.i_frame_rate;
985 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
987 /* No delay -> output pts == input pts */
989 p_block->i_dts = p_pict->date;
990 p_block->i_pts = p_block->i_dts;
992 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
993 p_sys->p_context->coded_frame->pts != 0 &&
994 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
996 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
997 p_block->i_pts = p_sys->p_context->coded_frame->pts;
999 /* Ugly work-around for stupid libavcodec behaviour */
1001 int64_t i_framenum = p_block->i_pts *
1002 p_enc->fmt_in.video.i_frame_rate /
1003 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
1005 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
1007 /* End work-around */
1009 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
1010 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
1012 p_block->i_dts = p_block->i_pts;
1016 if( p_sys->i_last_ref_pts )
1018 p_block->i_dts = p_sys->i_last_ref_pts;
1022 /* Let's put something sensible */
1023 p_block->i_dts = p_block->i_pts;
1026 p_sys->i_last_ref_pts = p_block->i_pts;
1031 /* Buggy libavcodec which doesn't update coded_frame->pts
1033 p_block->i_dts = p_block->i_pts = p_pict->date;
1036 switch ( p_sys->p_context->coded_frame->pict_type )
1038 case AV_PICTURE_TYPE_I:
1039 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1041 case AV_PICTURE_TYPE_P:
1042 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1044 case AV_PICTURE_TYPE_B:
1045 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1053 /****************************************************************************
1054 * EncodeAudio: the whole thing
1055 ****************************************************************************/
1056 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1058 encoder_sys_t *p_sys = p_enc->p_sys;
1060 block_t *p_block, *p_chain = NULL;
1062 uint8_t *p_buffer = p_aout_buf->p_buffer;
1063 int i_samples = p_aout_buf->i_nb_samples;
1064 int i_samples_delay = p_sys->i_samples_delay;
1066 p_sys->i_pts = p_aout_buf->i_pts -
1067 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1068 (mtime_t)p_enc->fmt_in.audio.i_rate;
1070 p_sys->i_samples_delay += i_samples;
1072 while( p_sys->i_samples_delay >= p_sys->i_frame_size )
1076 p_block = block_New( p_enc, p_sys->i_buffer_out );
1078 if( i_samples_delay )
1080 /* Take care of the left-over from last time */
1081 int i_delay_size = i_samples_delay;
1082 int i_size = (p_sys->i_frame_size - i_delay_size) *
1083 p_sys->i_sample_bytes;
1085 memcpy( p_sys->p_buffer + i_delay_size * p_sys->i_sample_bytes,
1087 p_buffer -= i_delay_size * p_sys->i_sample_bytes;
1088 i_samples += i_samples_delay;
1089 i_samples_delay = 0;
1091 p_samples = p_sys->p_buffer;
1095 p_samples = p_buffer;
1098 i_out = avcodec_encode_audio( p_sys->p_context, p_block->p_buffer,
1099 p_block->i_buffer, p_samples );
1102 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1104 p_buffer += p_sys->i_frame_size * p_sys->i_sample_bytes;
1105 p_sys->i_samples_delay -= p_sys->i_frame_size;
1106 i_samples -= p_sys->i_frame_size;
1110 block_Release( p_block );
1114 p_block->i_buffer = i_out;
1116 p_block->i_length = (mtime_t)1000000 *
1117 (mtime_t)p_sys->i_frame_size /
1118 (mtime_t)p_sys->p_context->sample_rate;
1120 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1123 p_sys->i_pts += p_block->i_length;
1124 block_ChainAppend( &p_chain, p_block );
1127 /* Backup the remaining raw samples */
1130 memcpy( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
1132 i_samples * p_sys->i_sample_bytes );
1138 /*****************************************************************************
1139 * CloseEncoder: ffmpeg encoder destruction
1140 *****************************************************************************/
1141 void CloseEncoder( vlc_object_t *p_this )
1143 encoder_t *p_enc = (encoder_t *)p_this;
1144 encoder_sys_t *p_sys = p_enc->p_sys;
1147 avcodec_close( p_sys->p_context );
1148 vlc_avcodec_unlock();
1149 av_free( p_sys->p_context );
1151 free( p_sys->p_buffer );
1152 free( p_sys->p_buffer_out );