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 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 69, 2 )
616 /* Set reasonable defaults to VP8, based on
617 libvpx-720p preset from libvpx ffmpeg-patch */
618 if( i_codec_id == CODEC_ID_VP8 )
620 /* Lets give bitrate tolerance */
621 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
622 /* default to 120 frames between keyframe */
623 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
624 p_context->gop_size = 120;
625 /* Don't set rc-values atm, they were from time before
626 libvpx was officially in FFmpeg */
627 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
628 //p_context->rc_min_rate = 40 * 1000; // 40k
629 /* seems that FFmpeg presets have 720p as divider for buffers */
630 if( p_enc->fmt_out.video.i_height >= 720 )
632 /* Check that we don't overrun users qmin/qmax values */
633 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
635 p_context->qmin = 10;
636 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
639 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
641 p_context->qmax = 42;
642 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
646 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
649 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
654 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
656 p_context->level = 216;
657 p_context->profile = 0;
658 p_context->rc_buffer_aggressivity = 0.95;
659 p_context->token_partitions = 4;
660 p_context->mb_static_threshold = 0;
665 if( i_codec_id == CODEC_ID_RAWVIDEO )
667 /* XXX: hack: Force same codec (will be handled by transcode) */
668 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
669 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
672 /* Make sure we get extradata filled by the encoder */
673 p_context->extradata_size = 0;
674 p_context->extradata = NULL;
675 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
677 if( p_enc->i_threads >= 1)
678 p_context->thread_count = p_enc->i_threads;
680 p_context->thread_count = vlc_GetCPUCount();
684 #if LIBAVCODEC_VERSION_MAJOR < 54
685 ret = avcodec_open( p_context, p_codec );
687 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
689 vlc_avcodec_unlock();
692 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
693 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
694 || i_codec_id == CODEC_ID_MP3) )
696 if( p_context->channels > 2 )
698 p_context->channels = 2;
699 p_enc->fmt_in.audio.i_channels = 2; // FIXME
700 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
703 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
707 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
709 if ( p_enc->fmt_out.audio.i_rate
710 == mpa_freq_tab[i_frequency] )
713 if ( i_frequency == 6 )
715 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
716 p_enc->fmt_out.audio.i_rate );
721 for ( i = 1; i < 14; i++ )
723 if ( p_enc->fmt_out.i_bitrate / 1000
724 <= mpa_bitrate_tab[i_frequency / 3][i] )
727 if ( p_enc->fmt_out.i_bitrate / 1000
728 != mpa_bitrate_tab[i_frequency / 3][i] )
731 "MPEG audio doesn't support bitrate=%d, using %d",
732 p_enc->fmt_out.i_bitrate,
733 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
734 p_enc->fmt_out.i_bitrate =
735 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
736 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
740 p_context->codec = NULL;
742 #if LIBAVCODEC_VERSION_MAJOR < 54
743 ret = avcodec_open( p_context, p_codec );
745 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
747 vlc_avcodec_unlock();
750 msg_Err( p_enc, "cannot open encoder" );
752 _("Streaming / Transcoding failed"),
753 "%s", _("VLC could not open the encoder.") );
760 msg_Err( p_enc, "cannot open encoder" );
761 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
762 "%s", _("VLC could not open the encoder.") );
768 if( i_codec_id == CODEC_ID_FLAC )
770 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
771 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
772 if( p_enc->fmt_out.p_extra )
774 uint8_t *p = p_enc->fmt_out.p_extra;
779 p[4] = 0x80; /* streaminfo block, last block before audio */
780 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
781 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
782 p[7] = ( p_context->extradata_size ) & 0xff;
783 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
787 p_enc->fmt_out.i_extra = 0;
792 p_enc->fmt_out.i_extra = p_context->extradata_size;
793 if( p_enc->fmt_out.i_extra )
795 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
796 if ( p_enc->fmt_out.p_extra == NULL )
800 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
801 p_enc->fmt_out.i_extra );
805 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
807 if( p_enc->fmt_in.i_cat == AUDIO_ES )
809 GetVlcAudioFormat( &p_enc->fmt_in.i_codec,
810 &p_enc->fmt_in.audio.i_bitspersample,
811 p_sys->p_context->sample_fmt );
812 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
814 p_sys->i_frame_size = p_context->frame_size > 1 ?
815 p_context->frame_size :
816 RAW_AUDIO_FRAME_SIZE;
817 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
818 if ( p_sys->p_buffer == NULL )
822 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
823 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( vlc_fourcc_GetCodec( AUDIO_ES, p_enc->fmt_out.i_codec ) );
825 if( p_context->frame_size > 1 )
826 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
828 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
831 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
835 free( p_enc->fmt_out.p_extra );
836 free( p_sys->p_buffer );
841 /****************************************************************************
842 * EncodeVideo: the whole thing
843 ****************************************************************************/
844 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
846 encoder_sys_t *p_sys = p_enc->p_sys;
849 /* Initialize the video output buffer the first time.
850 * This is done here instead of OpenEncoder() because we need the actual
851 * bits_per_pixel value, without having to assume anything.
853 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
854 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
855 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
856 block_t *p_block = block_New( p_enc, blocksize );
858 if( likely(p_pict) ) {
860 frame = avcodec_alloc_frame();
861 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
863 frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
864 frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
867 /* Let libavcodec select the frame type */
868 frame->pict_type = 0;
870 frame->repeat_pict = p_pict->i_nb_fields - 2;
871 frame->interlaced_frame = !p_pict->b_progressive;
872 frame->top_field_first = !!p_pict->b_top_field_first;
874 /* Set the pts of the frame being encoded */
875 frame->pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
877 if ( p_sys->b_hurry_up && frame->pts != (int64_t)AV_NOPTS_VALUE )
879 mtime_t current_date = mdate();
881 if ( current_date + HURRY_UP_GUARD3 > frame->pts )
883 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
884 p_sys->p_context->trellis = 0;
885 msg_Dbg( p_enc, "hurry up mode 3" );
889 p_sys->p_context->mb_decision = p_sys->i_hq;
891 if ( current_date + HURRY_UP_GUARD2 > frame->pts )
893 p_sys->p_context->trellis = 0;
894 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
895 + (HURRY_UP_GUARD2 + current_date - frame->pts) / 500;
896 msg_Dbg( p_enc, "hurry up mode 2" );
900 p_sys->p_context->trellis = p_sys->b_trellis;
902 p_sys->p_context->noise_reduction =
903 p_sys->i_noise_reduction;
907 if ( current_date + HURRY_UP_GUARD1 > frame->pts )
909 frame->pict_type = AV_PICTURE_TYPE_P;
910 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
914 if ( frame->pts != (int64_t)AV_NOPTS_VALUE && frame->pts != 0 )
916 if ( p_sys->i_last_pts == frame->pts )
918 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
919 "same PTS (%"PRId64 ")", frame->pts );
923 else if ( p_sys->i_last_pts > frame->pts )
925 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
926 "past (current: %"PRId64 ", last: %"PRId64")",
927 frame->pts, p_sys->i_last_pts );
933 p_sys->i_last_pts = frame->pts;
937 frame->quality = p_sys->i_quality;
939 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
940 p_block->i_buffer, frame );
945 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
946 p_block->i_buffer, NULL);
951 block_Release( p_block );
955 p_block->i_buffer = i_out;
957 /* FIXME, 3-2 pulldown is not handled correctly */
958 p_block->i_length = INT64_C(1000000) *
959 p_enc->fmt_in.video.i_frame_rate_base /
960 p_enc->fmt_in.video.i_frame_rate;
962 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
964 /* No delay -> output pts == input pts */
966 p_block->i_dts = p_pict->date;
967 p_block->i_pts = p_block->i_dts;
969 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
970 p_sys->p_context->coded_frame->pts != 0 &&
971 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
973 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
974 p_block->i_pts = p_sys->p_context->coded_frame->pts;
976 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
977 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
979 p_block->i_dts = p_block->i_pts;
983 if( p_sys->i_last_ref_pts )
985 p_block->i_dts = p_sys->i_last_ref_pts;
989 /* Let's put something sensible */
990 p_block->i_dts = p_block->i_pts;
993 p_sys->i_last_ref_pts = p_block->i_pts;
998 /* Buggy libavcodec which doesn't update coded_frame->pts
1000 p_block->i_dts = p_block->i_pts = p_pict->date;
1003 switch ( p_sys->p_context->coded_frame->pict_type )
1005 case AV_PICTURE_TYPE_I:
1006 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1008 case AV_PICTURE_TYPE_P:
1009 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1011 case AV_PICTURE_TYPE_B:
1012 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1020 /****************************************************************************
1021 * EncodeAudio: the whole thing
1022 ****************************************************************************/
1023 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1025 encoder_sys_t *p_sys = p_enc->p_sys;
1027 block_t *p_block, *p_chain = NULL;
1029 /*FIXME: change to use avcodec_encode_audio2 to be able to flush*/
1030 if( unlikely( !p_aout_buf ) ) return NULL;
1032 uint8_t *p_buffer = p_aout_buf->p_buffer;
1033 int i_samples = p_aout_buf->i_nb_samples;
1034 int i_samples_delay = p_sys->i_samples_delay;
1036 p_sys->i_pts = p_aout_buf->i_pts -
1037 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1038 (mtime_t)p_enc->fmt_in.audio.i_rate;
1040 p_sys->i_samples_delay += i_samples;
1042 while( p_sys->i_samples_delay >= p_sys->i_frame_size )
1046 p_block = block_New( p_enc, p_sys->i_buffer_out );
1048 if( i_samples_delay )
1050 /* Take care of the left-over from last time */
1051 int i_delay_size = i_samples_delay;
1052 int i_size = (p_sys->i_frame_size - i_delay_size) *
1053 p_sys->i_sample_bytes;
1055 memcpy( p_sys->p_buffer + i_delay_size * p_sys->i_sample_bytes,
1057 p_buffer -= i_delay_size * p_sys->i_sample_bytes;
1058 i_samples += i_samples_delay;
1059 i_samples_delay = 0;
1061 p_samples = p_sys->p_buffer;
1065 p_samples = p_buffer;
1068 i_out = avcodec_encode_audio( p_sys->p_context, p_block->p_buffer,
1069 p_block->i_buffer, p_samples );
1072 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
1074 p_buffer += p_sys->i_frame_size * p_sys->i_sample_bytes;
1075 p_sys->i_samples_delay -= p_sys->i_frame_size;
1076 i_samples -= p_sys->i_frame_size;
1080 block_Release( p_block );
1084 p_block->i_buffer = i_out;
1086 p_block->i_length = (mtime_t)1000000 *
1087 (mtime_t)p_sys->i_frame_size /
1088 (mtime_t)p_sys->p_context->sample_rate;
1090 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
1093 p_sys->i_pts += p_block->i_length;
1094 block_ChainAppend( &p_chain, p_block );
1097 /* Backup the remaining raw samples */
1100 memcpy( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
1102 i_samples * p_sys->i_sample_bytes );
1108 /*****************************************************************************
1109 * CloseEncoder: libavcodec encoder destruction
1110 *****************************************************************************/
1111 void CloseEncoder( vlc_object_t *p_this )
1113 encoder_t *p_enc = (encoder_t *)p_this;
1114 encoder_sys_t *p_sys = p_enc->p_sys;
1117 avcodec_close( p_sys->p_context );
1118 vlc_avcodec_unlock();
1119 av_free( p_sys->p_context );
1121 free( p_sys->p_buffer );