1 /*****************************************************************************
2 * encoder.c: video and audio encoder using the libavcodec library
3 *****************************************************************************
4 * Copyright (C) 1999-2004 VLC authors and VideoLAN
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 it
14 * under the terms of the GNU Lesser General Public License as published by
15 * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public License
24 * along with this program; if not, write to the Free Software Foundation,
25 * 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>
44 #include <libavcodec/avcodec.h>
49 #define HURRY_UP_GUARD1 (450000)
50 #define HURRY_UP_GUARD2 (300000)
51 #define HURRY_UP_GUARD3 (100000)
53 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
55 #define RAW_AUDIO_FRAME_SIZE (2048)
57 /*****************************************************************************
59 *****************************************************************************/
60 int OpenEncoder ( vlc_object_t * );
61 void CloseEncoder( vlc_object_t * );
63 static block_t *EncodeVideo( encoder_t *, picture_t * );
64 static block_t *EncodeAudio( encoder_t *, block_t * );
66 struct thread_context_t;
68 /*****************************************************************************
69 * thread_context_t : for multithreaded encoding
70 *****************************************************************************/
71 struct thread_context_t
75 AVCodecContext *p_context;
76 int (* pf_func)(AVCodecContext *c, void *arg);
85 /*****************************************************************************
86 * encoder_sys_t : libavcodec encoder descriptor
87 *****************************************************************************/
91 * libavcodec properties
94 AVCodecContext *p_context;
105 mtime_t i_last_ref_pts;
106 mtime_t i_buggy_pts_detect;
118 /* Encoding settings */
125 int i_rc_buffer_size;
126 float f_rc_buffer_aggressivity;
129 bool b_interlace, b_interlace_me;
130 float f_i_quant_factor;
131 int i_noise_reduction;
134 int i_quality; /* for VBR */
135 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
136 int i_luma_elim, i_chroma_elim;
137 int i_aac_profile; /* AAC profile to use.*/
140 static const char *const ppsz_enc_options[] = {
141 "keyint", "bframes", "vt", "qmin", "qmax", "codec", "hq",
142 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
143 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
144 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
145 "p-masking", "border-masking", "luma-elim-threshold",
146 "chroma-elim-threshold",
151 static const uint16_t mpa_bitrate_tab[2][15] =
153 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
154 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
157 static const uint16_t mpa_freq_tab[6] =
158 { 44100, 48000, 32000, 22050, 24000, 16000 };
160 static const uint16_t mpeg4_default_intra_matrix[64] = {
161 8, 17, 18, 19, 21, 23, 25, 27,
162 17, 18, 19, 21, 23, 25, 27, 28,
163 20, 21, 22, 23, 24, 26, 28, 30,
164 21, 22, 23, 24, 26, 28, 30, 32,
165 22, 23, 24, 26, 28, 30, 32, 35,
166 23, 24, 26, 28, 30, 32, 35, 38,
167 25, 26, 28, 30, 32, 35, 38, 41,
168 27, 28, 30, 32, 35, 38, 41, 45,
171 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
172 16, 17, 18, 19, 20, 21, 22, 23,
173 17, 18, 19, 20, 21, 22, 23, 24,
174 18, 19, 20, 21, 22, 23, 24, 25,
175 19, 20, 21, 22, 23, 24, 26, 27,
176 20, 21, 22, 23, 25, 26, 27, 28,
177 21, 22, 23, 24, 26, 27, 28, 30,
178 22, 23, 24, 26, 27, 28, 30, 31,
179 23, 24, 25, 27, 28, 30, 31, 33,
182 /*****************************************************************************
183 * OpenEncoder: probe the encoder
184 *****************************************************************************/
186 int OpenEncoder( vlc_object_t *p_this )
188 encoder_t *p_enc = (encoder_t *)p_this;
189 encoder_sys_t *p_sys;
190 AVCodecContext *p_context;
191 AVCodec *p_codec = NULL;
192 int i_codec_id, i_cat;
193 const char *psz_namecodec;
197 /* Initialization must be done before avcodec_find_encoder() */
200 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
202 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP3 )
205 i_codec_id = CODEC_ID_MP3;
206 psz_namecodec = "MPEG I/II Layer 3";
208 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP2 )
211 i_codec_id = CODEC_ID_MP2;
212 psz_namecodec = "MPEG I/II Layer 2";
214 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP1V )
217 i_codec_id = CODEC_ID_MPEG1VIDEO;
218 psz_namecodec = "MPEG-1 video";
220 else if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
223 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
225 /* handed chroma output */
229 i_codec_id = CODEC_ID_RAWVIDEO;
230 psz_namecodec = "Raw video";
233 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
235 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
236 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
237 _("\"%s\" is no video encoder."), psz_namecodec );
241 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
243 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
244 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
245 _("\"%s\" is no audio encoder."), psz_namecodec );
249 if( p_enc->fmt_out.i_cat == SPU_ES )
251 /* We don't support subtitle encoding */
255 char *psz_encoder = var_GetString( p_this, ENC_CFG_PREFIX "codec" );
256 if( psz_encoder && *psz_encoder )
258 p_codec = avcodec_find_encoder_by_name( psz_encoder );
260 msg_Err( p_this, "Encoder `%s' not found", psz_encoder );
261 else if( p_codec->id != i_codec_id )
263 msg_Err( p_this, "Encoder `%s' can't handle %4.4s",
264 psz_encoder, (char*)&p_enc->fmt_out.i_codec );
270 p_codec = avcodec_find_encoder( i_codec_id );
273 msg_Err( p_enc, "cannot find encoder %s\n"
274 "*** Your Libav/FFmpeg installation is crippled. ***\n"
275 "*** Please check with your Libav/FFmpeg packager. ***\n"
276 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
278 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
279 /* I have had enough of all these MPEG-3 transcoding bug reports.
280 * Downstream packager, you had better not patch this out, or I will be really
281 * annoyed. Think about it - you don't want to fork the VLC translation files,
282 * do you? -- Courmisch, 2008-10-22 */
283 "It seems your Libav/FFmpeg (libavcodec) installation lacks the following encoder:\n"
285 "If you don't know how to fix this, ask for support from your distribution.\n"
287 "This is not an error inside VLC media player.\n"
288 "Do not contact the VideoLAN project about this issue.\n"),
293 /* Allocate the memory needed to store the encoder's structure */
294 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
296 p_enc->p_sys = p_sys;
297 p_sys->p_codec = p_codec;
299 p_enc->pf_encode_video = EncodeVideo;
300 p_enc->pf_encode_audio = EncodeAudio;
302 p_sys->p_buffer = NULL;
303 p_sys->i_buffer_out = 0;
305 #if LIBAVCODEC_VERSION_MAJOR < 54
306 p_context = avcodec_alloc_context();
308 p_context = avcodec_alloc_context3(p_codec);
310 p_sys->p_context = p_context;
311 p_sys->p_context->codec_id = p_sys->p_codec->id;
312 p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
313 p_context->opaque = (void *)p_this;
315 /* set CPU capabilities */
316 #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 51, 25, 0 )
317 av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
319 p_context->dsp_mask = GetVlcDspMask();
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 /* libavcodec 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 libavcodec 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 av_reduce( &p_context->sample_aspect_ratio.num,
462 &p_context->sample_aspect_ratio.den,
463 p_enc->fmt_in.video.i_sar_num,
464 p_enc->fmt_in.video.i_sar_den, 1 << 30 );
467 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
468 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
469 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
471 if( p_codec->pix_fmts )
473 const enum PixelFormat *p = p_codec->pix_fmts;
474 for( ; *p != -1; p++ )
476 if( *p == p_context->pix_fmt ) break;
478 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
479 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
480 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
484 if ( p_sys->f_i_quant_factor != 0.0 )
485 p_context->i_quant_factor = p_sys->f_i_quant_factor;
487 p_context->noise_reduction = p_sys->i_noise_reduction;
489 if ( p_sys->b_mpeg4_matrix )
491 p_context->intra_matrix = mpeg4_default_intra_matrix;
492 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
495 if ( p_sys->b_pre_me )
497 p_context->pre_me = 1;
498 p_context->me_pre_cmp = FF_CMP_CHROMA;
501 if ( p_sys->b_interlace )
503 if ( p_context->height <= 280 )
505 if ( p_context->height != 16 || p_context->width != 16 )
507 "disabling interlaced video because height=%d <= 280",
512 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
513 if ( p_sys->b_interlace_me )
514 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
518 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;
522 /* These codecs cause libavcodec to exit if thread_count is > 1.
523 See libavcodec/mpegvideo_enc.c:MPV_encode_init and
524 libavcodec/svq3.c , WMV2 calls MPV_encode_init also.
526 if ( i_codec_id == CODEC_ID_FLV1 ||
527 i_codec_id == CODEC_ID_H261 ||
528 i_codec_id == CODEC_ID_LJPEG ||
529 i_codec_id == CODEC_ID_MJPEG ||
530 i_codec_id == CODEC_ID_H263 ||
531 i_codec_id == CODEC_ID_H263P ||
532 i_codec_id == CODEC_ID_MSMPEG4V1 ||
533 i_codec_id == CODEC_ID_MSMPEG4V2 ||
534 i_codec_id == CODEC_ID_MSMPEG4V3 ||
535 i_codec_id == CODEC_ID_WMV1 ||
536 i_codec_id == CODEC_ID_WMV2 ||
537 i_codec_id == CODEC_ID_RV10 ||
538 i_codec_id == CODEC_ID_RV20 ||
539 i_codec_id == CODEC_ID_SVQ3 )
540 p_enc->i_threads = 1;
542 if( p_sys->i_vtolerance > 0 )
543 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
545 /* usually if someone sets bitrate, he likes more to get that bitrate
546 * over quality should help 'normal' user to get asked bitrate
548 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
554 if( p_sys->i_qmin > 0 )
556 p_context->qmin = p_sys->i_qmin;
557 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
559 if( p_sys->i_qmax > 0 )
561 p_context->qmax = p_sys->i_qmax;
562 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
564 p_context->max_qdiff = 3;
566 p_context->mb_decision = p_sys->i_hq;
568 if( p_sys->i_quality )
570 p_context->flags |= CODEC_FLAG_QSCALE;
571 p_context->global_quality = p_sys->i_quality;
575 p_context->rc_qsquish = 1.0;
576 if( p_sys->i_rc_buffer_size )
578 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
579 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
581 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
582 /* This is from ffmpeg's ffmpeg.c : */
583 p_context->rc_initial_buffer_occupancy
584 = p_sys->i_rc_buffer_size * 3/4;
585 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
588 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
590 /* work around bug in libmp3lame encoding */
591 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
592 p_enc->fmt_in.audio.i_channels = 2;
594 p_context->codec_type = AVMEDIA_TYPE_AUDIO;
595 p_context->sample_fmt = p_codec->sample_fmts ?
596 p_codec->sample_fmts[0] :
598 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
599 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
600 p_context->time_base.num = 1;
601 p_context->time_base.den = p_context->sample_rate;
602 p_context->channels = p_enc->fmt_out.audio.i_channels;
604 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
606 /* XXX: FAAC does resample only when setting the INPUT samplerate
607 * to the desired value (-R option of the faac frontend)
608 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
609 /* vlc should default to low-complexity profile, faac encoder
610 * has bug and aac audio has issues otherwise atm */
611 p_context->profile = p_sys->i_aac_profile;
615 /* Misc parameters */
616 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
618 /* Set reasonable defaults to VP8, based on
619 libvpx-720p preset from libvpx ffmpeg-patch */
620 if( i_codec_id == CODEC_ID_VP8 )
622 /* Lets give bitrate tolerance */
623 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
624 /* default to 120 frames between keyframe */
625 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
626 p_context->gop_size = 120;
627 /* Don't set rc-values atm, they were from time before
628 libvpx was officially in FFmpeg */
629 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
630 //p_context->rc_min_rate = 40 * 1000; // 40k
631 /* seems that FFmpeg presets have 720p as divider for buffers */
632 if( p_enc->fmt_out.video.i_height >= 720 )
634 /* Check that we don't overrun users qmin/qmax values */
635 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
637 p_context->qmin = 10;
638 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
641 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
643 p_context->qmax = 42;
644 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
648 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
651 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
656 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
658 p_context->level = 216;
659 p_context->profile = 0;
660 p_context->rc_buffer_aggressivity = 0.95;
661 p_context->token_partitions = 4;
662 p_context->mb_static_threshold = 0;
666 if( i_codec_id == CODEC_ID_RAWVIDEO )
668 /* XXX: hack: Force same codec (will be handled by transcode) */
669 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
670 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
673 /* Make sure we get extradata filled by the encoder */
674 p_context->extradata_size = 0;
675 p_context->extradata = NULL;
676 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
678 if( p_enc->i_threads >= 1)
679 p_context->thread_count = p_enc->i_threads;
681 p_context->thread_count = vlc_GetCPUCount();
685 #if LIBAVCODEC_VERSION_MAJOR < 54
686 ret = avcodec_open( p_context, p_codec );
688 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
690 vlc_avcodec_unlock();
693 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
694 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
695 || i_codec_id == CODEC_ID_MP3) )
697 if( p_context->channels > 2 )
699 p_context->channels = 2;
700 p_enc->fmt_in.audio.i_channels = 2; // FIXME
701 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
704 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
708 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
710 if ( p_enc->fmt_out.audio.i_rate
711 == mpa_freq_tab[i_frequency] )
714 if ( i_frequency == 6 )
716 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
717 p_enc->fmt_out.audio.i_rate );
722 for ( i = 1; i < 14; i++ )
724 if ( p_enc->fmt_out.i_bitrate / 1000
725 <= mpa_bitrate_tab[i_frequency / 3][i] )
728 if ( p_enc->fmt_out.i_bitrate / 1000
729 != mpa_bitrate_tab[i_frequency / 3][i] )
732 "MPEG audio doesn't support bitrate=%d, using %d",
733 p_enc->fmt_out.i_bitrate,
734 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
735 p_enc->fmt_out.i_bitrate =
736 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
737 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
741 p_context->codec = NULL;
743 #if LIBAVCODEC_VERSION_MAJOR < 54
744 ret = avcodec_open( p_context, p_codec );
746 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
748 vlc_avcodec_unlock();
751 msg_Err( p_enc, "cannot open encoder" );
753 _("Streaming / Transcoding failed"),
754 "%s", _("VLC could not open the encoder.") );
761 msg_Err( p_enc, "cannot open encoder" );
762 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
763 "%s", _("VLC could not open the encoder.") );
769 if( i_codec_id == CODEC_ID_FLAC )
771 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
772 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
773 if( p_enc->fmt_out.p_extra )
775 uint8_t *p = p_enc->fmt_out.p_extra;
780 p[4] = 0x80; /* streaminfo block, last block before audio */
781 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
782 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
783 p[7] = ( p_context->extradata_size ) & 0xff;
784 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
788 p_enc->fmt_out.i_extra = 0;
793 p_enc->fmt_out.i_extra = p_context->extradata_size;
794 if( p_enc->fmt_out.i_extra )
796 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
797 if ( p_enc->fmt_out.p_extra == NULL )
801 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
802 p_enc->fmt_out.i_extra );
806 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
808 if( p_enc->fmt_in.i_cat == AUDIO_ES )
810 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_sys->p_context->sample_fmt );
811 p_enc->fmt_in.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_in.i_codec );
813 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
815 p_sys->i_frame_size = p_context->frame_size > 1 ?
816 p_context->frame_size :
817 RAW_AUDIO_FRAME_SIZE;
818 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
819 if ( p_sys->p_buffer == NULL )
823 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
824 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_out.i_codec );
826 if( p_context->frame_size > 1 )
827 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
829 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
832 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
836 free( p_enc->fmt_out.p_extra );
837 free( p_sys->p_buffer );
842 /****************************************************************************
843 * EncodeVideo: the whole thing
844 ****************************************************************************/
845 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
847 encoder_sys_t *p_sys = p_enc->p_sys;
850 /* Initialize the video output buffer the first time.
851 * This is done here instead of OpenEncoder() because we need the actual
852 * bits_per_pixel value, without having to assume anything.
854 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
855 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
856 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
857 block_t *p_block = block_Alloc( blocksize );
859 if( likely(p_pict) ) {
861 frame = avcodec_alloc_frame();
862 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
864 frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
865 frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
868 /* Let libavcodec select the frame type */
869 frame->pict_type = 0;
871 frame->repeat_pict = p_pict->i_nb_fields - 2;
872 frame->interlaced_frame = !p_pict->b_progressive;
873 frame->top_field_first = !!p_pict->b_top_field_first;
875 /* Set the pts of the frame being encoded */
876 frame->pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
878 if ( p_sys->b_hurry_up && frame->pts != (int64_t)AV_NOPTS_VALUE )
880 mtime_t current_date = mdate();
882 if ( current_date + HURRY_UP_GUARD3 > frame->pts )
884 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
885 p_sys->p_context->trellis = 0;
886 msg_Dbg( p_enc, "hurry up mode 3" );
890 p_sys->p_context->mb_decision = p_sys->i_hq;
892 if ( current_date + HURRY_UP_GUARD2 > frame->pts )
894 p_sys->p_context->trellis = 0;
895 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
896 + (HURRY_UP_GUARD2 + current_date - frame->pts) / 500;
897 msg_Dbg( p_enc, "hurry up mode 2" );
901 p_sys->p_context->trellis = p_sys->b_trellis;
903 p_sys->p_context->noise_reduction =
904 p_sys->i_noise_reduction;
908 if ( current_date + HURRY_UP_GUARD1 > frame->pts )
910 frame->pict_type = AV_PICTURE_TYPE_P;
911 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
915 if ( frame->pts != (int64_t)AV_NOPTS_VALUE && frame->pts != 0 )
917 if ( p_sys->i_last_pts == frame->pts )
919 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
920 "same PTS (%"PRId64 ")", frame->pts );
924 else if ( p_sys->i_last_pts > frame->pts )
926 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
927 "past (current: %"PRId64 ", last: %"PRId64")",
928 frame->pts, p_sys->i_last_pts );
934 p_sys->i_last_pts = frame->pts;
938 frame->quality = p_sys->i_quality;
940 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
941 p_block->i_buffer, frame );
946 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
947 p_block->i_buffer, NULL);
952 block_Release( p_block );
956 p_block->i_buffer = i_out;
958 /* FIXME, 3-2 pulldown is not handled correctly */
959 p_block->i_length = INT64_C(1000000) *
960 p_enc->fmt_in.video.i_frame_rate_base /
961 p_enc->fmt_in.video.i_frame_rate;
963 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
965 /* No delay -> output pts == input pts */
967 p_block->i_dts = p_pict->date;
968 p_block->i_pts = p_block->i_dts;
970 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
971 p_sys->p_context->coded_frame->pts != 0 &&
972 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
974 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
975 p_block->i_pts = p_sys->p_context->coded_frame->pts;
977 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
978 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
980 p_block->i_dts = p_block->i_pts;
984 if( p_sys->i_last_ref_pts )
986 p_block->i_dts = p_sys->i_last_ref_pts;
990 /* Let's put something sensible */
991 p_block->i_dts = p_block->i_pts;
994 p_sys->i_last_ref_pts = p_block->i_pts;
999 /* Buggy libavcodec which doesn't update coded_frame->pts
1001 p_block->i_dts = p_block->i_pts = p_pict->date;
1004 switch ( p_sys->p_context->coded_frame->pict_type )
1006 case AV_PICTURE_TYPE_I:
1007 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1009 case AV_PICTURE_TYPE_P:
1010 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1012 case AV_PICTURE_TYPE_B:
1013 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1021 /****************************************************************************
1022 * EncodeAudio: the whole thing
1023 ****************************************************************************/
1024 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1026 encoder_sys_t *p_sys = p_enc->p_sys;
1028 block_t *p_block, *p_chain = NULL;
1031 int got_packet,i_out;
1033 /*FIXME: change to use avcodec_encode_audio2 to be able to flush*/
1034 if( unlikely( !p_aout_buf ) )
1036 msg_Dbg(p_enc,"Flushing..");
1038 p_block = block_Alloc( p_sys->i_buffer_out );
1039 av_init_packet( &packet );
1040 packet.data = p_block->p_buffer;
1041 packet.size = p_block->i_buffer;
1043 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, NULL, &got_packet );
1044 if( !i_out && got_packet )
1045 block_ChainAppend( &p_chain, p_block );
1046 } while( got_packet && !i_out );
1050 frame = avcodec_alloc_frame();
1052 frame->nb_samples = p_aout_buf->i_nb_samples;
1053 avcodec_fill_audio_frame( frame, p_enc->fmt_in.audio.i_channels,
1054 p_sys->p_context->sample_fmt,
1055 p_aout_buf->p_buffer, p_aout_buf->i_buffer,
1059 frame->pts = p_aout_buf->i_pts;
1061 p_block = block_Alloc( p_sys->i_buffer_out );
1062 av_init_packet( &packet );
1063 packet.data = p_block->p_buffer;
1064 packet.size = p_block->i_buffer;
1066 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, frame, &got_packet );
1067 p_block->i_buffer = packet.size;
1070 if( unlikely( !got_packet || i_out ) )
1073 msg_Err( p_enc,"Encoding problem..");
1074 block_Release( p_block );
1078 p_block->i_buffer = packet.size;
1080 p_block->i_length = (mtime_t)1000000 *
1081 (mtime_t)p_sys->i_frame_size /
1082 (mtime_t)p_sys->p_context->sample_rate;
1084 p_block->i_dts = p_block->i_pts = packet.pts;
1089 /*****************************************************************************
1090 * CloseEncoder: libavcodec encoder destruction
1091 *****************************************************************************/
1092 void CloseEncoder( vlc_object_t *p_this )
1094 encoder_t *p_enc = (encoder_t *)p_this;
1095 encoder_sys_t *p_sys = p_enc->p_sys;
1098 avcodec_close( p_sys->p_context );
1099 vlc_avcodec_unlock();
1100 av_free( p_sys->p_context );
1102 free( p_sys->p_buffer );