1 /*****************************************************************************
2 * encoder.c: video and audio encoder using the libavcodec 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>
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 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
577 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
578 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
579 /* This is from ffmpeg's ffmpeg.c : */
580 p_context->rc_initial_buffer_occupancy
581 = p_sys->i_rc_buffer_size * 3/4;
582 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
585 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
587 /* work around bug in libmp3lame encoding */
588 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
589 p_enc->fmt_in.audio.i_channels = 2;
591 p_context->codec_type = AVMEDIA_TYPE_AUDIO;
592 p_context->sample_fmt = p_codec->sample_fmts ?
593 p_codec->sample_fmts[0] :
595 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
596 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
597 p_context->time_base.num = 1;
598 p_context->time_base.den = p_context->sample_rate;
599 p_context->channels = p_enc->fmt_out.audio.i_channels;
601 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
603 /* XXX: FAAC does resample only when setting the INPUT samplerate
604 * to the desired value (-R option of the faac frontend)
605 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
606 /* vlc should default to low-complexity profile, faac encoder
607 * has bug and aac audio has issues otherwise atm */
608 p_context->profile = p_sys->i_aac_profile;
612 /* Misc parameters */
613 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
615 /* Set reasonable defaults to VP8, based on
616 libvpx-720p preset from libvpx ffmpeg-patch */
617 if( i_codec_id == CODEC_ID_VP8 )
619 /* Lets give bitrate tolerance */
620 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
621 /* default to 120 frames between keyframe */
622 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
623 p_context->gop_size = 120;
624 /* Don't set rc-values atm, they were from time before
625 libvpx was officially in FFmpeg */
626 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
627 //p_context->rc_min_rate = 40 * 1000; // 40k
628 /* seems that FFmpeg presets have 720p as divider for buffers */
629 if( p_enc->fmt_out.video.i_height >= 720 )
631 /* Check that we don't overrun users qmin/qmax values */
632 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
634 p_context->qmin = 10;
635 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
638 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
640 p_context->qmax = 42;
641 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
645 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
648 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
653 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
655 p_context->level = 216;
656 p_context->profile = 0;
657 p_context->rc_buffer_aggressivity = 0.95;
658 p_context->token_partitions = 4;
659 p_context->mb_static_threshold = 0;
663 if( i_codec_id == CODEC_ID_RAWVIDEO )
665 /* XXX: hack: Force same codec (will be handled by transcode) */
666 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
667 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
670 /* Make sure we get extradata filled by the encoder */
671 p_context->extradata_size = 0;
672 p_context->extradata = NULL;
673 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
675 if( p_enc->i_threads >= 1)
676 p_context->thread_count = p_enc->i_threads;
678 p_context->thread_count = vlc_GetCPUCount();
682 #if LIBAVCODEC_VERSION_MAJOR < 54
683 ret = avcodec_open( p_context, p_codec );
685 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
687 vlc_avcodec_unlock();
690 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
691 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
692 || i_codec_id == CODEC_ID_MP3) )
694 if( p_context->channels > 2 )
696 p_context->channels = 2;
697 p_enc->fmt_in.audio.i_channels = 2; // FIXME
698 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
701 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
705 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
707 if ( p_enc->fmt_out.audio.i_rate
708 == mpa_freq_tab[i_frequency] )
711 if ( i_frequency == 6 )
713 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
714 p_enc->fmt_out.audio.i_rate );
719 for ( i = 1; i < 14; i++ )
721 if ( p_enc->fmt_out.i_bitrate / 1000
722 <= mpa_bitrate_tab[i_frequency / 3][i] )
725 if ( p_enc->fmt_out.i_bitrate / 1000
726 != mpa_bitrate_tab[i_frequency / 3][i] )
729 "MPEG audio doesn't support bitrate=%d, using %d",
730 p_enc->fmt_out.i_bitrate,
731 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
732 p_enc->fmt_out.i_bitrate =
733 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
734 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
738 p_context->codec = NULL;
740 #if LIBAVCODEC_VERSION_MAJOR < 54
741 ret = avcodec_open( p_context, p_codec );
743 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
745 vlc_avcodec_unlock();
748 msg_Err( p_enc, "cannot open encoder" );
750 _("Streaming / Transcoding failed"),
751 "%s", _("VLC could not open the encoder.") );
758 msg_Err( p_enc, "cannot open encoder" );
759 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
760 "%s", _("VLC could not open the encoder.") );
766 if( i_codec_id == CODEC_ID_FLAC )
768 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
769 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
770 if( p_enc->fmt_out.p_extra )
772 uint8_t *p = p_enc->fmt_out.p_extra;
777 p[4] = 0x80; /* streaminfo block, last block before audio */
778 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
779 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
780 p[7] = ( p_context->extradata_size ) & 0xff;
781 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
785 p_enc->fmt_out.i_extra = 0;
790 p_enc->fmt_out.i_extra = p_context->extradata_size;
791 if( p_enc->fmt_out.i_extra )
793 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
794 if ( p_enc->fmt_out.p_extra == NULL )
798 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
799 p_enc->fmt_out.i_extra );
803 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
805 if( p_enc->fmt_in.i_cat == AUDIO_ES )
807 GetVlcAudioFormat( &p_enc->fmt_in.i_codec,
808 &p_enc->fmt_in.audio.i_bitspersample,
809 p_sys->p_context->sample_fmt );
810 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
812 p_sys->i_frame_size = p_context->frame_size > 1 ?
813 p_context->frame_size :
814 RAW_AUDIO_FRAME_SIZE;
815 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
816 if ( p_sys->p_buffer == NULL )
820 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
821 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( vlc_fourcc_GetCodec( AUDIO_ES, p_enc->fmt_out.i_codec ) );
823 if( p_context->frame_size > 1 )
824 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
826 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
829 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
833 free( p_enc->fmt_out.p_extra );
834 free( p_sys->p_buffer );
839 /****************************************************************************
840 * EncodeVideo: the whole thing
841 ****************************************************************************/
842 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
844 encoder_sys_t *p_sys = p_enc->p_sys;
847 /* Initialize the video output buffer the first time.
848 * This is done here instead of OpenEncoder() because we need the actual
849 * bits_per_pixel value, without having to assume anything.
851 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
852 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
853 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
854 block_t *p_block = block_New( p_enc, blocksize );
856 if( likely(p_pict) ) {
858 frame = avcodec_alloc_frame();
859 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
861 frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
862 frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
865 /* Let libavcodec select the frame type */
866 frame->pict_type = 0;
868 frame->repeat_pict = p_pict->i_nb_fields - 2;
869 frame->interlaced_frame = !p_pict->b_progressive;
870 frame->top_field_first = !!p_pict->b_top_field_first;
872 /* Set the pts of the frame being encoded */
873 frame->pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
875 if ( p_sys->b_hurry_up && frame->pts != (int64_t)AV_NOPTS_VALUE )
877 mtime_t current_date = mdate();
879 if ( current_date + HURRY_UP_GUARD3 > frame->pts )
881 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
882 p_sys->p_context->trellis = 0;
883 msg_Dbg( p_enc, "hurry up mode 3" );
887 p_sys->p_context->mb_decision = p_sys->i_hq;
889 if ( current_date + HURRY_UP_GUARD2 > frame->pts )
891 p_sys->p_context->trellis = 0;
892 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
893 + (HURRY_UP_GUARD2 + current_date - frame->pts) / 500;
894 msg_Dbg( p_enc, "hurry up mode 2" );
898 p_sys->p_context->trellis = p_sys->b_trellis;
900 p_sys->p_context->noise_reduction =
901 p_sys->i_noise_reduction;
905 if ( current_date + HURRY_UP_GUARD1 > frame->pts )
907 frame->pict_type = AV_PICTURE_TYPE_P;
908 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
912 if ( frame->pts != (int64_t)AV_NOPTS_VALUE && frame->pts != 0 )
914 if ( p_sys->i_last_pts == frame->pts )
916 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
917 "same PTS (%"PRId64 ")", frame->pts );
921 else if ( p_sys->i_last_pts > frame->pts )
923 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
924 "past (current: %"PRId64 ", last: %"PRId64")",
925 frame->pts, p_sys->i_last_pts );
931 p_sys->i_last_pts = frame->pts;
935 frame->quality = p_sys->i_quality;
937 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
938 p_block->i_buffer, frame );
943 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
944 p_block->i_buffer, NULL);
949 block_Release( p_block );
953 p_block->i_buffer = i_out;
955 /* FIXME, 3-2 pulldown is not handled correctly */
956 p_block->i_length = INT64_C(1000000) *
957 p_enc->fmt_in.video.i_frame_rate_base /
958 p_enc->fmt_in.video.i_frame_rate;
960 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
962 /* No delay -> output pts == input pts */
964 p_block->i_dts = p_pict->date;
965 p_block->i_pts = p_block->i_dts;
967 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
968 p_sys->p_context->coded_frame->pts != 0 &&
969 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
971 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
972 p_block->i_pts = p_sys->p_context->coded_frame->pts;
974 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
975 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
977 p_block->i_dts = p_block->i_pts;
981 if( p_sys->i_last_ref_pts )
983 p_block->i_dts = p_sys->i_last_ref_pts;
987 /* Let's put something sensible */
988 p_block->i_dts = p_block->i_pts;
991 p_sys->i_last_ref_pts = p_block->i_pts;
996 /* Buggy libavcodec which doesn't update coded_frame->pts
998 p_block->i_dts = p_block->i_pts = p_pict->date;
1001 switch ( p_sys->p_context->coded_frame->pict_type )
1003 case AV_PICTURE_TYPE_I:
1004 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1006 case AV_PICTURE_TYPE_P:
1007 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1009 case AV_PICTURE_TYPE_B:
1010 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1018 /****************************************************************************
1019 * EncodeAudio: the whole thing
1020 ****************************************************************************/
1021 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1023 encoder_sys_t *p_sys = p_enc->p_sys;
1025 block_t *p_block, *p_chain = NULL;
1028 int got_packet,i_out;
1030 /*FIXME: change to use avcodec_encode_audio2 to be able to flush*/
1031 if( unlikely( !p_aout_buf ) )
1033 msg_Dbg(p_enc,"Flushing..");
1035 p_block = block_New( p_enc, p_sys->i_buffer_out );
1036 av_init_packet( &packet );
1037 packet.data = p_block->p_buffer;
1038 packet.size = p_block->i_buffer;
1040 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, NULL, &got_packet );
1041 if( !i_out && got_packet )
1042 block_ChainAppend( &p_chain, p_block );
1043 } while( got_packet && !i_out );
1047 frame = avcodec_alloc_frame();
1049 frame->nb_samples = p_aout_buf->i_nb_samples;
1050 avcodec_fill_audio_frame( frame, p_enc->fmt_in.audio.i_channels,
1051 p_sys->p_context->sample_fmt,
1052 p_aout_buf->p_buffer, p_aout_buf->i_buffer,
1056 frame->pts = p_aout_buf->i_pts;
1058 p_block = block_New( p_enc, p_sys->i_buffer_out );
1059 av_init_packet( &packet );
1060 packet.data = p_block->p_buffer;
1061 packet.size = p_block->i_buffer;
1063 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, frame, &got_packet );
1064 p_block->i_buffer = packet.size;
1066 avcodec_free_frame( &frame );
1067 if( unlikely( !got_packet || i_out ) )
1070 msg_Err( p_enc,"Encoding problem..");
1071 block_Release( p_block );
1075 p_block->i_buffer = packet.size;
1077 p_block->i_length = (mtime_t)1000000 *
1078 (mtime_t)p_sys->i_frame_size /
1079 (mtime_t)p_sys->p_context->sample_rate;
1081 p_block->i_dts = p_block->i_pts = packet.pts;
1086 /*****************************************************************************
1087 * CloseEncoder: libavcodec encoder destruction
1088 *****************************************************************************/
1089 void CloseEncoder( vlc_object_t *p_this )
1091 encoder_t *p_enc = (encoder_t *)p_this;
1092 encoder_sys_t *p_sys = p_enc->p_sys;
1095 avcodec_close( p_sys->p_context );
1096 vlc_avcodec_unlock();
1097 av_free( p_sys->p_context );
1099 free( p_sys->p_buffer );