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;
97 * Common buffer mainly for audio as frame size in there needs usually be constant
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 #if (LIBAVCODEC_VERSION_MAJOR < 55)
137 int i_luma_elim, i_chroma_elim;
139 int i_aac_profile; /* AAC profile to use.*/
144 static const char *const ppsz_enc_options[] = {
145 "keyint", "bframes", "vt", "qmin", "qmax", "codec", "hq",
146 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
147 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
148 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
149 "p-masking", "border-masking",
150 #if (LIBAVCODEC_VERSION_MAJOR < 55)
151 "luma-elim-threshold", "chroma-elim-threshold",
157 static const uint16_t mpa_bitrate_tab[2][15] =
159 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
160 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
163 static const uint16_t mpa_freq_tab[6] =
164 { 44100, 48000, 32000, 22050, 24000, 16000 };
166 static const uint16_t mpeg4_default_intra_matrix[64] = {
167 8, 17, 18, 19, 21, 23, 25, 27,
168 17, 18, 19, 21, 23, 25, 27, 28,
169 20, 21, 22, 23, 24, 26, 28, 30,
170 21, 22, 23, 24, 26, 28, 30, 32,
171 22, 23, 24, 26, 28, 30, 32, 35,
172 23, 24, 26, 28, 30, 32, 35, 38,
173 25, 26, 28, 30, 32, 35, 38, 41,
174 27, 28, 30, 32, 35, 38, 41, 45,
177 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
178 16, 17, 18, 19, 20, 21, 22, 23,
179 17, 18, 19, 20, 21, 22, 23, 24,
180 18, 19, 20, 21, 22, 23, 24, 25,
181 19, 20, 21, 22, 23, 24, 26, 27,
182 20, 21, 22, 23, 25, 26, 27, 28,
183 21, 22, 23, 24, 26, 27, 28, 30,
184 22, 23, 24, 26, 27, 28, 30, 31,
185 23, 24, 25, 27, 28, 30, 31, 33,
188 /*****************************************************************************
189 * OpenEncoder: probe the encoder
190 *****************************************************************************/
192 int OpenEncoder( vlc_object_t *p_this )
194 encoder_t *p_enc = (encoder_t *)p_this;
195 encoder_sys_t *p_sys;
196 AVCodecContext *p_context;
197 AVCodec *p_codec = NULL;
198 int i_codec_id, i_cat;
199 const char *psz_namecodec;
203 /* Initialization must be done before avcodec_find_encoder() */
206 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
208 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP3 )
211 i_codec_id = AV_CODEC_ID_MP3;
212 psz_namecodec = "MPEG I/II Layer 3";
214 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP2 )
217 i_codec_id = AV_CODEC_ID_MP2;
218 psz_namecodec = "MPEG I/II Layer 2";
220 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP1V )
223 i_codec_id = AV_CODEC_ID_MPEG1VIDEO;
224 psz_namecodec = "MPEG-1 video";
226 else if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
229 if( FindFfmpegChroma( p_enc->fmt_out.i_codec ) == PIX_FMT_NONE )
230 return VLC_EGENERIC; /* handed chroma output */
233 i_codec_id = AV_CODEC_ID_RAWVIDEO;
234 psz_namecodec = "Raw video";
237 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
239 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
240 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
241 _("\"%s\" is no video encoder."), psz_namecodec );
245 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
247 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
248 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
249 _("\"%s\" is no audio encoder."), psz_namecodec );
253 if( p_enc->fmt_out.i_cat == SPU_ES )
255 /* We don't support subtitle encoding */
259 char *psz_encoder = var_GetString( p_this, ENC_CFG_PREFIX "codec" );
260 if( psz_encoder && *psz_encoder )
262 p_codec = avcodec_find_encoder_by_name( psz_encoder );
264 msg_Err( p_this, "Encoder `%s' not found", psz_encoder );
265 else if( p_codec->id != i_codec_id )
267 msg_Err( p_this, "Encoder `%s' can't handle %4.4s",
268 psz_encoder, (char*)&p_enc->fmt_out.i_codec );
274 p_codec = avcodec_find_encoder( i_codec_id );
277 msg_Err( p_enc, "cannot find encoder %s\n"
278 "*** Your Libav/FFmpeg installation is crippled. ***\n"
279 "*** Please check with your Libav/FFmpeg packager. ***\n"
280 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
282 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
283 /* I have had enough of all these MPEG-3 transcoding bug reports.
284 * Downstream packager, you had better not patch this out, or I will be really
285 * annoyed. Think about it - you don't want to fork the VLC translation files,
286 * do you? -- Courmisch, 2008-10-22 */
287 "It seems your Libav/FFmpeg (libavcodec) installation lacks the following encoder:\n"
289 "If you don't know how to fix this, ask for support from your distribution.\n"
291 "This is not an error inside VLC media player.\n"
292 "Do not contact the VideoLAN project about this issue.\n"),
297 /* Allocate the memory needed to store the encoder's structure */
298 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
300 p_enc->p_sys = p_sys;
301 p_sys->i_samples_delay = 0;
302 p_sys->p_codec = p_codec;
304 p_sys->p_buffer = NULL;
305 p_sys->i_buffer_out = 0;
307 p_context = avcodec_alloc_context3(p_codec);
308 p_sys->p_context = p_context;
309 p_sys->p_context->codec_id = p_sys->p_codec->id;
310 p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
311 p_context->opaque = (void *)p_this;
313 /* set CPU capabilities */
314 #if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
315 av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
317 p_context->dsp_mask = GetVlcDspMask();
320 p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
321 p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
322 p_sys->i_vtolerance = var_GetInteger( p_enc, ENC_CFG_PREFIX "vt" ) * 1000;
323 p_sys->b_interlace = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace" );
324 p_sys->b_interlace_me = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace-me" );
325 p_sys->b_pre_me = var_GetBool( p_enc, ENC_CFG_PREFIX "pre-me" );
326 p_sys->b_hurry_up = var_GetBool( p_enc, ENC_CFG_PREFIX "hurry-up" );
328 if( p_sys->b_hurry_up )
330 /* hurry up mode needs noise reduction, even small */
331 p_sys->i_noise_reduction = 1;
334 p_sys->i_rc_buffer_size = var_GetInteger( p_enc, ENC_CFG_PREFIX "rc-buffer-size" );
335 p_sys->f_rc_buffer_aggressivity = var_GetFloat( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity" );
336 p_sys->f_i_quant_factor = var_GetFloat( p_enc, ENC_CFG_PREFIX "i-quant-factor" );
337 p_sys->i_noise_reduction = var_GetInteger( p_enc, ENC_CFG_PREFIX "noise-reduction" );
338 p_sys->b_mpeg4_matrix = var_GetBool( p_enc, ENC_CFG_PREFIX "mpeg4-matrix" );
340 f_val = var_GetFloat( p_enc, ENC_CFG_PREFIX "qscale" );
341 if( f_val < 0.01 || f_val > 255.0 ) f_val = 0;
342 p_sys->i_quality = (int)(FF_QP2LAMBDA * f_val + 0.5);
344 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "hq" );
345 p_sys->i_hq = FF_MB_DECISION_RD;
346 if( psz_val && *psz_val )
348 if( !strcmp( psz_val, "rd" ) )
349 p_sys->i_hq = FF_MB_DECISION_RD;
350 else if( !strcmp( psz_val, "bits" ) )
351 p_sys->i_hq = FF_MB_DECISION_BITS;
352 else if( !strcmp( psz_val, "simple" ) )
353 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
355 p_sys->i_hq = FF_MB_DECISION_RD;
358 p_sys->i_hq = FF_MB_DECISION_RD;
361 p_sys->i_qmin = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" );
362 p_sys->i_qmax = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" );
363 p_sys->b_trellis = var_GetBool( p_enc, ENC_CFG_PREFIX "trellis" );
365 p_context->strict_std_compliance = var_GetInteger( p_enc, ENC_CFG_PREFIX "strict" );
367 p_sys->f_lumi_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "lumi-masking" );
368 p_sys->f_dark_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "dark-masking" );
369 p_sys->f_p_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "p-masking" );
370 p_sys->f_border_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "border-masking" );
371 #if (LIBAVCODEC_VERSION_MAJOR < 55)
372 p_sys->i_luma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "luma-elim-threshold" );
373 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 /* These require libavcodec with libfdk-aac */
393 else if( !strncmp( psz_val, "hev2", 4 ) )
394 p_sys->i_aac_profile = FF_PROFILE_AAC_HE_V2;
395 else if( !strncmp( psz_val, "hev1", 4 ) )
396 p_sys->i_aac_profile = FF_PROFILE_AAC_HE;
399 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
400 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
405 if( p_enc->fmt_in.i_cat == VIDEO_ES )
407 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
409 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
410 p_enc->fmt_in.video.i_height );
415 p_context->codec_type = AVMEDIA_TYPE_VIDEO;
417 p_context->width = p_enc->fmt_in.video.i_width;
418 p_context->height = p_enc->fmt_in.video.i_height;
420 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
421 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
422 if( p_codec->supported_framerates )
424 AVRational target = {
425 .num = p_enc->fmt_in.video.i_frame_rate,
426 .den = p_enc->fmt_in.video.i_frame_rate_base,
428 int idx = av_find_nearest_q_idx(target, p_codec->supported_framerates);
430 p_context->time_base.num = p_codec->supported_framerates[idx].den;
431 p_context->time_base.den = p_codec->supported_framerates[idx].num;
434 /* Defaults from ffmpeg.c */
435 p_context->qblur = 0.5;
436 p_context->qcompress = 0.5;
437 p_context->b_quant_offset = 1.25;
438 p_context->b_quant_factor = 1.25;
439 p_context->i_quant_offset = 0.0;
440 p_context->i_quant_factor = -0.8;
442 p_context->lumi_masking = p_sys->f_lumi_masking;
443 p_context->dark_masking = p_sys->f_dark_masking;
444 p_context->p_masking = p_sys->f_p_masking;
445 p_context->border_masking = p_sys->f_border_masking;
446 #if (LIBAVCODEC_VERSION_MAJOR < 55)
447 p_context->luma_elim_threshold = p_sys->i_luma_elim;
448 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 == AV_CODEC_ID_FLV1 ||
527 i_codec_id == AV_CODEC_ID_H261 ||
528 i_codec_id == AV_CODEC_ID_LJPEG ||
529 i_codec_id == AV_CODEC_ID_MJPEG ||
530 i_codec_id == AV_CODEC_ID_H263 ||
531 i_codec_id == AV_CODEC_ID_H263P ||
532 i_codec_id == AV_CODEC_ID_MSMPEG4V1 ||
533 i_codec_id == AV_CODEC_ID_MSMPEG4V2 ||
534 i_codec_id == AV_CODEC_ID_MSMPEG4V3 ||
535 i_codec_id == AV_CODEC_ID_WMV1 ||
536 i_codec_id == AV_CODEC_ID_WMV2 ||
537 i_codec_id == AV_CODEC_ID_RV10 ||
538 i_codec_id == AV_CODEC_ID_RV20 ||
539 i_codec_id == AV_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 == AV_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] :
599 // Try if we can use interleaved format for codec input as VLC doesn't really do planar audio yet
600 // FIXME: Remove when planar/interleaved audio in vlc is equally supported
601 if( av_sample_fmt_is_planar( p_context->sample_fmt ) )
603 msg_Dbg( p_enc, "Trying to find packet sample format instead of %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
604 for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
606 if( !av_sample_fmt_is_planar( p_codec->sample_fmts[i] ) )
608 p_context->sample_fmt = p_codec->sample_fmts[i];
609 msg_Dbg( p_enc, "Using %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
614 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_context->sample_fmt );
616 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
617 p_context->time_base.num = 1;
618 p_context->time_base.den = p_context->sample_rate;
619 p_context->channels = p_enc->fmt_out.audio.i_channels;
621 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
623 /* XXX: FAAC does resample only when setting the INPUT samplerate
624 * to the desired value (-R option of the faac frontend)
625 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
626 /* vlc should default to low-complexity profile, faac encoder
627 * has bug and aac audio has issues otherwise atm */
628 p_context->profile = p_sys->i_aac_profile;
632 /* Misc parameters */
633 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
635 /* Set reasonable defaults to VP8, based on
636 libvpx-720p preset from libvpx ffmpeg-patch */
637 if( i_codec_id == AV_CODEC_ID_VP8 )
639 /* Lets give bitrate tolerance */
640 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
641 /* default to 120 frames between keyframe */
642 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
643 p_context->gop_size = 120;
644 /* Don't set rc-values atm, they were from time before
645 libvpx was officially in FFmpeg */
646 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
647 //p_context->rc_min_rate = 40 * 1000; // 40k
648 /* seems that FFmpeg presets have 720p as divider for buffers */
649 if( p_enc->fmt_out.video.i_height >= 720 )
651 /* Check that we don't overrun users qmin/qmax values */
652 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
654 p_context->qmin = 10;
655 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
658 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
660 p_context->qmax = 42;
661 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
665 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
668 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
673 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
675 p_context->level = 216;
676 p_context->profile = 0;
677 p_context->rc_buffer_aggressivity = 0.95;
678 p_context->token_partitions = 4;
679 p_context->mb_static_threshold = 0;
683 if( i_codec_id == AV_CODEC_ID_RAWVIDEO )
685 /* XXX: hack: Force same codec (will be handled by transcode) */
686 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
687 GetFfmpegChroma( &p_context->pix_fmt, &p_enc->fmt_in.video );
690 /* Make sure we get extradata filled by the encoder */
691 p_context->extradata_size = 0;
692 p_context->extradata = NULL;
693 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
695 if( p_enc->i_threads >= 1)
696 p_context->thread_count = p_enc->i_threads;
698 p_context->thread_count = vlc_GetCPUCount();
702 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
703 vlc_avcodec_unlock();
706 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
707 (p_context->channels > 2 || i_codec_id == AV_CODEC_ID_MP2
708 || i_codec_id == AV_CODEC_ID_MP3) )
710 if( p_context->channels > 2 )
712 p_context->channels = 2;
713 p_enc->fmt_in.audio.i_channels = 2; // FIXME
714 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
717 if( i_codec_id == AV_CODEC_ID_MP2 || i_codec_id == AV_CODEC_ID_MP3 )
721 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
723 if ( p_enc->fmt_out.audio.i_rate
724 == mpa_freq_tab[i_frequency] )
727 if ( i_frequency == 6 )
729 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
730 p_enc->fmt_out.audio.i_rate );
735 for ( i = 1; i < 14; i++ )
737 if ( p_enc->fmt_out.i_bitrate / 1000
738 <= mpa_bitrate_tab[i_frequency / 3][i] )
741 if ( p_enc->fmt_out.i_bitrate / 1000
742 != mpa_bitrate_tab[i_frequency / 3][i] )
745 "MPEG audio doesn't support bitrate=%d, using %d",
746 p_enc->fmt_out.i_bitrate,
747 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
748 p_enc->fmt_out.i_bitrate =
749 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
750 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
754 p_context->codec = NULL;
756 ret = avcodec_open2( p_context, p_codec, NULL /* options */ );
757 vlc_avcodec_unlock();
760 msg_Err( p_enc, "cannot open encoder" );
762 _("Streaming / Transcoding failed"),
763 "%s", _("VLC could not open the encoder.") );
770 msg_Err( p_enc, "cannot open encoder" );
771 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
772 "%s", _("VLC could not open the encoder.") );
778 if( i_codec_id == AV_CODEC_ID_FLAC )
780 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
781 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
782 if( p_enc->fmt_out.p_extra )
784 uint8_t *p = p_enc->fmt_out.p_extra;
789 p[4] = 0x80; /* streaminfo block, last block before audio */
790 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
791 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
792 p[7] = ( p_context->extradata_size ) & 0xff;
793 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
797 p_enc->fmt_out.i_extra = 0;
802 p_enc->fmt_out.i_extra = p_context->extradata_size;
803 if( p_enc->fmt_out.i_extra )
805 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
806 if ( p_enc->fmt_out.p_extra == NULL )
810 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
811 p_enc->fmt_out.i_extra );
815 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
817 if( p_enc->fmt_in.i_cat == AUDIO_ES )
819 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_sys->p_context->sample_fmt );
820 p_enc->fmt_in.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_in.i_codec );
822 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
824 p_sys->i_frame_size = p_context->frame_size > 1 ?
825 p_context->frame_size :
826 RAW_AUDIO_FRAME_SIZE;
827 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
828 if ( p_sys->p_buffer == NULL )
832 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
833 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_out.i_codec );
835 if( p_context->frame_size > 1 )
836 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
838 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
841 p_sys->frame = avcodec_alloc_frame();
846 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
848 p_enc->pf_encode_video = EncodeVideo;
849 p_enc->pf_encode_audio = EncodeAudio;
854 free( p_enc->fmt_out.p_extra );
855 free( p_sys->p_buffer );
860 /****************************************************************************
861 * EncodeVideo: the whole thing
862 ****************************************************************************/
863 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
865 encoder_sys_t *p_sys = p_enc->p_sys;
868 /* Initialize the video output buffer the first time.
869 * This is done here instead of OpenEncoder() because we need the actual
870 * bits_per_pixel value, without having to assume anything.
872 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
873 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
874 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
875 block_t *p_block = block_Alloc( blocksize );
877 if( likely(p_pict) ) {
878 avcodec_get_frame_defaults( p_sys->frame );
879 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
881 p_sys->frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
882 p_sys->frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
885 /* Let libavcodec select the frame type */
886 p_sys->frame->pict_type = 0;
888 p_sys->frame->repeat_pict = p_pict->i_nb_fields - 2;
889 p_sys->frame->interlaced_frame = !p_pict->b_progressive;
890 p_sys->frame->top_field_first = !!p_pict->b_top_field_first;
892 /* Set the pts of the frame being encoded */
893 p_sys->frame->pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
895 if ( p_sys->b_hurry_up && p_sys->frame->pts != (int64_t)AV_NOPTS_VALUE )
897 mtime_t current_date = mdate();
899 if ( current_date + HURRY_UP_GUARD3 > p_sys->frame->pts )
901 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
902 p_sys->p_context->trellis = 0;
903 msg_Dbg( p_enc, "hurry up mode 3" );
907 p_sys->p_context->mb_decision = p_sys->i_hq;
909 if ( current_date + HURRY_UP_GUARD2 > p_sys->frame->pts )
911 p_sys->p_context->trellis = 0;
912 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
913 + (HURRY_UP_GUARD2 + current_date - p_sys->frame->pts) / 500;
914 msg_Dbg( p_enc, "hurry up mode 2" );
918 p_sys->p_context->trellis = p_sys->b_trellis;
920 p_sys->p_context->noise_reduction =
921 p_sys->i_noise_reduction;
925 if ( current_date + HURRY_UP_GUARD1 > p_sys->frame->pts )
927 p_sys->frame->pict_type = AV_PICTURE_TYPE_P;
928 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
932 if ( p_sys->frame->pts != (int64_t)AV_NOPTS_VALUE && p_sys->frame->pts != 0 )
934 if ( p_sys->i_last_pts == p_sys->frame->pts )
936 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
937 "same PTS (%"PRId64 ")", p_sys->frame->pts );
940 else if ( p_sys->i_last_pts > p_sys->frame->pts )
942 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
943 "past (current: %"PRId64 ", last: %"PRId64")",
944 p_sys->frame->pts, p_sys->i_last_pts );
949 p_sys->i_last_pts = p_sys->frame->pts;
953 p_sys->frame->quality = p_sys->i_quality;
955 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
956 p_block->i_buffer, p_sys->frame );
960 i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
961 p_block->i_buffer, NULL);
966 block_Release( p_block );
970 p_block->i_buffer = i_out;
972 /* FIXME, 3-2 pulldown is not handled correctly */
973 p_block->i_length = INT64_C(1000000) *
974 p_enc->fmt_in.video.i_frame_rate_base /
975 p_enc->fmt_in.video.i_frame_rate;
977 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
979 /* No delay -> output pts == input pts */
981 p_block->i_dts = p_pict->date;
982 p_block->i_pts = p_block->i_dts;
984 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
985 p_sys->p_context->coded_frame->pts != 0 &&
986 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
988 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
989 p_block->i_pts = p_sys->p_context->coded_frame->pts;
991 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
992 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
994 p_block->i_dts = p_block->i_pts;
998 if( p_sys->i_last_ref_pts )
1000 p_block->i_dts = p_sys->i_last_ref_pts;
1004 /* Let's put something sensible */
1005 p_block->i_dts = p_block->i_pts;
1008 p_sys->i_last_ref_pts = p_block->i_pts;
1013 /* Buggy libavcodec which doesn't update coded_frame->pts
1015 p_block->i_dts = p_block->i_pts = p_pict->date;
1018 switch ( p_sys->p_context->coded_frame->pict_type )
1020 case AV_PICTURE_TYPE_I:
1021 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1023 case AV_PICTURE_TYPE_P:
1024 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1026 case AV_PICTURE_TYPE_B:
1027 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1035 /****************************************************************************
1036 * EncodeAudio: the whole thing
1037 ****************************************************************************/
1038 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1040 encoder_sys_t *p_sys = p_enc->p_sys;
1042 block_t *p_block, *p_chain = NULL;
1043 int got_packet,i_out,i_samples_left=0,i_data_offset = 0;
1045 //i_samples_left is amount of samples we get
1046 i_samples_left = p_aout_buf ? p_aout_buf->i_nb_samples : 0;
1048 if( p_sys->i_samples_delay > 0 )
1051 //How much we need to copy from new packet
1052 const int leftover = __MAX(0,__MIN(i_samples_left, (p_sys->i_frame_size - p_sys->i_samples_delay)));
1054 avcodec_get_frame_defaults( p_sys->frame );
1055 p_sys->frame->nb_samples = p_sys->i_samples_delay + leftover;
1056 p_sys->frame->format = p_sys->p_context->sample_fmt;
1058 //Copy samples from new packet to buffer to get frame size
1059 if( likely( leftover ) )
1061 if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
1062 aout_Deinterleave( p_sys->p_buffer+(p_sys->i_samples_delay*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels ),
1063 p_aout_buf->p_buffer, leftover, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
1065 memcpy( p_sys->p_buffer+(p_sys->i_samples_delay*p_sys->i_sample_bytes),
1066 p_aout_buf->p_buffer,
1067 leftover * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels
1071 if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
1072 p_sys->p_context->sample_fmt,
1074 (p_sys->i_samples_delay + leftover) * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels,
1076 msg_Err( p_enc, "Filling on leftovers error i_leftover %d i_samples_left %d samples_delay %d frame size %d", leftover, i_samples_left, p_sys->i_samples_delay, p_sys->i_frame_size );
1078 if( likely( p_aout_buf ) )
1079 p_sys->frame->pts = p_aout_buf->i_pts -
1080 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
1081 (mtime_t)p_enc->fmt_in.audio.i_rate;
1083 p_sys->i_samples_delay = 0;
1084 i_data_offset += leftover * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
1085 i_samples_left -= leftover;
1087 p_block = block_Alloc( p_sys->i_buffer_out );
1088 av_init_packet( &packet );
1089 packet.data = p_block->p_buffer;
1090 packet.size = p_block->i_buffer;
1092 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, p_sys->frame, &got_packet );
1093 p_block->i_buffer = packet.size;
1096 if( unlikely( !got_packet || ( i_out < 0 ) ) )
1100 msg_Err( p_enc,"Encoding problem...");
1104 p_block->i_buffer = packet.size;
1106 p_block->i_length = (mtime_t)1000000 *
1107 (mtime_t)p_sys->i_frame_size /
1108 (mtime_t)p_sys->p_context->sample_rate;
1110 p_block->i_dts = p_block->i_pts = packet.pts;
1112 block_ChainAppend( &p_chain, p_block );
1116 if( unlikely( !p_aout_buf ) )
1118 msg_Dbg(p_enc,"Flushing..");
1121 p_block = block_Alloc( p_sys->i_buffer_out );
1122 av_init_packet( &packet );
1123 packet.data = p_block->p_buffer;
1124 packet.size = p_block->i_buffer;
1126 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, NULL, &got_packet );
1127 p_block->i_buffer = packet.size;
1129 p_block->i_length = (mtime_t)1000000 *
1130 (mtime_t)p_sys->i_frame_size /
1131 (mtime_t)p_sys->p_context->sample_rate;
1133 p_block->i_dts = p_block->i_pts = packet.pts;
1135 if( !i_out && got_packet )
1136 block_ChainAppend( &p_chain, p_block );
1137 } while( got_packet && !i_out );
1141 while( i_samples_left >= p_sys->i_frame_size )
1143 AVPacket packet = {0};
1145 p_sys->frame->nb_samples = p_sys->i_frame_size;
1146 p_sys->frame->format = p_sys->p_context->sample_fmt;
1148 if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
1150 aout_Deinterleave( p_sys->p_buffer, p_aout_buf->p_buffer+i_data_offset,
1151 p_sys->i_frame_size, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
1152 if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
1153 p_sys->p_context->sample_fmt,
1155 p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels,
1157 msg_Err( p_enc, "filling error on encode" );
1159 if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
1160 p_sys->p_context->sample_fmt,
1161 p_aout_buf->p_buffer+i_data_offset,
1162 p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels,
1164 msg_Err( p_enc, "filling error on encode" );
1167 i_samples_left -= p_sys->i_frame_size;
1168 i_data_offset += p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
1170 p_sys->frame->pts = p_aout_buf->i_pts;
1172 p_block = block_Alloc( p_sys->i_buffer_out );
1173 av_init_packet( &packet );
1174 packet.data = p_block->p_buffer;
1175 packet.size = p_block->i_buffer;
1177 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, p_sys->frame, &got_packet );
1178 p_block->i_buffer = packet.size;
1180 if( unlikely( !got_packet || ( i_out < 0 ) ) )
1184 msg_Err( p_enc,"Encoding problem..");
1187 block_Release( p_block );
1191 p_block->i_buffer = packet.size;
1193 p_block->i_length = (mtime_t)1000000 *
1194 (mtime_t)p_sys->i_frame_size /
1195 (mtime_t)p_sys->p_context->sample_rate;
1197 p_block->i_dts = p_block->i_pts = packet.pts;
1199 block_ChainAppend( &p_chain, p_block );
1201 if( i_samples_left < 0 )
1202 msg_Err( p_enc, "I_data_left overflow");
1204 // We have leftover samples that don't fill frame_size, and libavcodec doesn't seem to like
1205 // that frame has more data than p_sys->i_frame_size most of the cases currently.
1206 if( i_samples_left > 0 )
1208 if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
1209 aout_Deinterleave( p_sys->p_buffer, p_aout_buf->p_buffer+i_data_offset, i_samples_left, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
1211 memcpy( p_sys->p_buffer, p_aout_buf->p_buffer+i_data_offset , i_samples_left*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels);
1212 p_sys->i_samples_delay = i_samples_left;
1218 /*****************************************************************************
1219 * CloseEncoder: libavcodec encoder destruction
1220 *****************************************************************************/
1221 void CloseEncoder( vlc_object_t *p_this )
1223 encoder_t *p_enc = (encoder_t *)p_this;
1224 encoder_sys_t *p_sys = p_enc->p_sys;
1226 /*FIXME: we should use avcodec_free_frame, but we don't require so new avcodec that has it*/
1227 av_freep( &p_sys->frame );
1230 avcodec_close( p_sys->p_context );
1231 vlc_avcodec_unlock();
1232 av_free( p_sys->p_context );
1235 free( p_sys->p_buffer );