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 *****************************************************************************/
37 #include <vlc_common.h>
40 #include <vlc_codec.h>
41 #include <vlc_dialog.h>
42 #include <vlc_avcodec.h>
45 #include <libavcodec/avcodec.h>
46 #include <libavutil/audioconvert.h>
51 #if LIBAVUTIL_VERSION_CHECK( 52,2,6,0,0 )
52 # include <libavutil/channel_layout.h>
55 #define HURRY_UP_GUARD1 (450000)
56 #define HURRY_UP_GUARD2 (300000)
57 #define HURRY_UP_GUARD3 (100000)
59 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
61 #define RAW_AUDIO_FRAME_SIZE (2048)
63 /*****************************************************************************
65 *****************************************************************************/
66 int OpenEncoder ( vlc_object_t * );
67 void CloseEncoder( vlc_object_t * );
69 static block_t *EncodeVideo( encoder_t *, picture_t * );
70 static block_t *EncodeAudio( encoder_t *, block_t * );
72 struct thread_context_t;
74 /*****************************************************************************
75 * thread_context_t : for multithreaded encoding
76 *****************************************************************************/
77 struct thread_context_t
81 AVCodecContext *p_context;
82 int (* pf_func)(AVCodecContext *c, void *arg);
91 /*****************************************************************************
92 * encoder_sys_t : libavcodec encoder descriptor
93 *****************************************************************************/
97 * libavcodec properties
100 AVCodecContext *p_context;
103 * Common buffer mainly for audio as frame size in there needs usually be constant
107 uint8_t *p_interleave_buf;
112 mtime_t i_last_ref_pts;
113 mtime_t i_buggy_pts_detect;
120 size_t i_sample_bytes;
122 size_t i_samples_delay; //How much samples in delay buffer
124 bool b_variable; //Encoder can be fed with any size frames not just frame_size
128 /* Multichannel (>2) channel reordering */
129 uint8_t i_channels_to_reorder;
130 uint8_t pi_reorder_layout[AOUT_CHAN_MAX];
132 /* Encoding settings */
139 int i_rc_buffer_size;
140 float f_rc_buffer_aggressivity;
143 bool b_interlace, b_interlace_me;
144 float f_i_quant_factor;
145 int i_noise_reduction;
148 int i_quality; /* for VBR */
149 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
150 #if (LIBAVCODEC_VERSION_MAJOR < 55)
151 int i_luma_elim, i_chroma_elim;
153 int i_aac_profile; /* AAC profile to use.*/
159 /* Taken from audio.c*/
160 static const uint64_t pi_channels_map[][2] =
162 { AV_CH_FRONT_LEFT, AOUT_CHAN_LEFT },
163 { AV_CH_FRONT_RIGHT, AOUT_CHAN_RIGHT },
164 { AV_CH_FRONT_CENTER, AOUT_CHAN_CENTER },
165 { AV_CH_LOW_FREQUENCY, AOUT_CHAN_LFE },
166 { AV_CH_BACK_LEFT, AOUT_CHAN_REARLEFT },
167 { AV_CH_BACK_RIGHT, AOUT_CHAN_REARRIGHT },
168 { AV_CH_FRONT_LEFT_OF_CENTER, 0 },
169 { AV_CH_FRONT_RIGHT_OF_CENTER, 0 },
170 { AV_CH_BACK_CENTER, AOUT_CHAN_REARCENTER },
171 { AV_CH_SIDE_LEFT, AOUT_CHAN_MIDDLELEFT },
172 { AV_CH_SIDE_RIGHT, AOUT_CHAN_MIDDLERIGHT },
173 { AV_CH_TOP_CENTER, 0 },
174 { AV_CH_TOP_FRONT_LEFT, 0 },
175 { AV_CH_TOP_FRONT_CENTER, 0 },
176 { AV_CH_TOP_FRONT_RIGHT, 0 },
177 { AV_CH_TOP_BACK_LEFT, 0 },
178 { AV_CH_TOP_BACK_CENTER, 0 },
179 { AV_CH_TOP_BACK_RIGHT, 0 },
180 { AV_CH_STEREO_LEFT, 0 },
181 { AV_CH_STEREO_RIGHT, 0 },
184 static const uint32_t channel_mask[][2] = {
186 {AOUT_CHAN_CENTER, AV_CH_LAYOUT_MONO},
187 {AOUT_CHANS_STEREO, AV_CH_LAYOUT_STEREO},
188 {AOUT_CHANS_2_1, AV_CH_LAYOUT_2POINT1},
189 {AOUT_CHANS_4_0, AV_CH_LAYOUT_4POINT0},
190 {AOUT_CHANS_4_1, AV_CH_LAYOUT_4POINT1},
191 {AOUT_CHANS_5_1, AV_CH_LAYOUT_5POINT1_BACK},
192 {AOUT_CHANS_7_0, AV_CH_LAYOUT_7POINT0},
193 {AOUT_CHANS_7_1, AV_CH_LAYOUT_7POINT1},
194 {AOUT_CHANS_8_1, AV_CH_LAYOUT_OCTAGONAL},
197 static const char *const ppsz_enc_options[] = {
198 "keyint", "bframes", "vt", "qmin", "qmax", "codec", "hq",
199 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
200 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
201 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
202 "p-masking", "border-masking",
203 #if (LIBAVCODEC_VERSION_MAJOR < 55)
204 "luma-elim-threshold", "chroma-elim-threshold",
206 "aac-profile", "options",
210 static const uint16_t mpa_bitrate_tab[2][15] =
212 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
213 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
216 static const uint16_t mpa_freq_tab[6] =
217 { 44100, 48000, 32000, 22050, 24000, 16000 };
219 static const uint16_t mpeg4_default_intra_matrix[64] = {
220 8, 17, 18, 19, 21, 23, 25, 27,
221 17, 18, 19, 21, 23, 25, 27, 28,
222 20, 21, 22, 23, 24, 26, 28, 30,
223 21, 22, 23, 24, 26, 28, 30, 32,
224 22, 23, 24, 26, 28, 30, 32, 35,
225 23, 24, 26, 28, 30, 32, 35, 38,
226 25, 26, 28, 30, 32, 35, 38, 41,
227 27, 28, 30, 32, 35, 38, 41, 45,
230 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
231 16, 17, 18, 19, 20, 21, 22, 23,
232 17, 18, 19, 20, 21, 22, 23, 24,
233 18, 19, 20, 21, 22, 23, 24, 25,
234 19, 20, 21, 22, 23, 24, 26, 27,
235 20, 21, 22, 23, 25, 26, 27, 28,
236 21, 22, 23, 24, 26, 27, 28, 30,
237 22, 23, 24, 26, 27, 28, 30, 31,
238 23, 24, 25, 27, 28, 30, 31, 33,
241 static const int DEFAULT_ALIGN = 0;
244 /*****************************************************************************
245 * OpenEncoder: probe the encoder
246 *****************************************************************************/
248 int OpenEncoder( vlc_object_t *p_this )
250 encoder_t *p_enc = (encoder_t *)p_this;
251 encoder_sys_t *p_sys;
252 AVCodecContext *p_context;
253 AVCodec *p_codec = NULL;
256 const char *psz_namecodec;
260 /* Initialization must be done before avcodec_find_encoder() */
261 vlc_init_avcodec(p_this);
263 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
265 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP1V )
268 i_codec_id = AV_CODEC_ID_MPEG1VIDEO;
269 psz_namecodec = "MPEG-1 video";
271 else if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
274 if( FindFfmpegChroma( p_enc->fmt_out.i_codec ) == PIX_FMT_NONE )
275 return VLC_EGENERIC; /* handed chroma output */
278 i_codec_id = AV_CODEC_ID_RAWVIDEO;
279 psz_namecodec = "Raw video";
282 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
284 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
285 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
286 _("\"%s\" is no video encoder."), psz_namecodec );
290 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
292 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
293 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
294 _("\"%s\" is no audio encoder."), psz_namecodec );
298 if( p_enc->fmt_out.i_cat == SPU_ES )
300 /* We don't support subtitle encoding */
304 char *psz_encoder = var_GetString( p_this, ENC_CFG_PREFIX "codec" );
305 if( psz_encoder && *psz_encoder )
307 p_codec = avcodec_find_encoder_by_name( psz_encoder );
309 msg_Err( p_this, "Encoder `%s' not found", psz_encoder );
310 else if( p_codec->id != i_codec_id )
312 msg_Err( p_this, "Encoder `%s' can't handle %4.4s",
313 psz_encoder, (char*)&p_enc->fmt_out.i_codec );
319 p_codec = avcodec_find_encoder( i_codec_id );
322 msg_Err( p_enc, "cannot find encoder %s\n"
323 "*** Your Libav/FFmpeg installation is crippled. ***\n"
324 "*** Please check with your Libav/FFmpeg packager. ***\n"
325 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
327 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
328 /* I have had enough of all these MPEG-3 transcoding bug reports.
329 * Downstream packager, you had better not patch this out, or I will be really
330 * annoyed. Think about it - you don't want to fork the VLC translation files,
331 * do you? -- Courmisch, 2008-10-22 */
332 "It seems your Libav/FFmpeg (libavcodec) installation lacks the following encoder:\n"
334 "If you don't know how to fix this, ask for support from your distribution.\n"
336 "This is not an error inside VLC media player.\n"
337 "Do not contact the VideoLAN project about this issue.\n"),
342 /* Allocate the memory needed to store the encoder's structure */
343 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
345 p_enc->p_sys = p_sys;
346 p_sys->i_samples_delay = 0;
347 p_sys->p_codec = p_codec;
348 p_sys->b_planar = false;
350 p_sys->p_buffer = NULL;
351 p_sys->p_interleave_buf = NULL;
352 p_sys->i_buffer_out = 0;
354 p_context = avcodec_alloc_context3(p_codec);
355 p_sys->p_context = p_context;
356 p_sys->p_context->codec_id = p_sys->p_codec->id;
357 p_context->thread_type = 0;
358 p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
359 p_context->opaque = (void *)p_this;
361 p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
362 p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
363 p_sys->i_vtolerance = var_GetInteger( p_enc, ENC_CFG_PREFIX "vt" ) * 1000;
364 p_sys->b_interlace = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace" );
365 p_sys->b_interlace_me = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace-me" );
366 p_sys->b_pre_me = var_GetBool( p_enc, ENC_CFG_PREFIX "pre-me" );
367 p_sys->b_hurry_up = var_GetBool( p_enc, ENC_CFG_PREFIX "hurry-up" );
369 if( p_sys->b_hurry_up )
371 /* hurry up mode needs noise reduction, even small */
372 p_sys->i_noise_reduction = 1;
375 p_sys->i_rc_buffer_size = var_GetInteger( p_enc, ENC_CFG_PREFIX "rc-buffer-size" );
376 p_sys->f_rc_buffer_aggressivity = var_GetFloat( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity" );
377 p_sys->f_i_quant_factor = var_GetFloat( p_enc, ENC_CFG_PREFIX "i-quant-factor" );
378 p_sys->i_noise_reduction = var_GetInteger( p_enc, ENC_CFG_PREFIX "noise-reduction" );
379 p_sys->b_mpeg4_matrix = var_GetBool( p_enc, ENC_CFG_PREFIX "mpeg4-matrix" );
381 f_val = var_GetFloat( p_enc, ENC_CFG_PREFIX "qscale" );
383 p_sys->i_quality = 0;
384 if( f_val < .01f || f_val > 255.f )
387 p_sys->i_quality = lroundf(FF_QP2LAMBDA * f_val);
389 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "hq" );
390 p_sys->i_hq = FF_MB_DECISION_RD;
391 if( psz_val && *psz_val )
393 if( !strcmp( psz_val, "rd" ) )
394 p_sys->i_hq = FF_MB_DECISION_RD;
395 else if( !strcmp( psz_val, "bits" ) )
396 p_sys->i_hq = FF_MB_DECISION_BITS;
397 else if( !strcmp( psz_val, "simple" ) )
398 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
400 p_sys->i_hq = FF_MB_DECISION_RD;
403 p_sys->i_hq = FF_MB_DECISION_RD;
406 p_sys->i_qmin = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" );
407 p_sys->i_qmax = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" );
408 p_sys->b_trellis = var_GetBool( p_enc, ENC_CFG_PREFIX "trellis" );
410 p_context->strict_std_compliance = var_GetInteger( p_enc, ENC_CFG_PREFIX "strict" );
412 p_sys->f_lumi_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "lumi-masking" );
413 p_sys->f_dark_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "dark-masking" );
414 p_sys->f_p_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "p-masking" );
415 p_sys->f_border_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "border-masking" );
416 #if (LIBAVCODEC_VERSION_MAJOR < 55)
417 p_sys->i_luma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "luma-elim-threshold" );
418 p_sys->i_chroma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold" );
421 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "aac-profile" );
422 /* libavcodec uses faac encoder atm, and it has issues with
423 * other than low-complexity profile, so default to that */
424 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
425 if( psz_val && *psz_val )
427 if( !strncmp( psz_val, "main", 4 ) )
428 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
429 else if( !strncmp( psz_val, "low", 3 ) )
430 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
431 else if( !strncmp( psz_val, "ssr", 3 ) )
432 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
433 else if( !strncmp( psz_val, "ltp", 3 ) )
434 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
435 #if LIBAVCODEC_VERSION_CHECK( 54, 19, 0, 35, 100 )
436 /* These require libavcodec with libfdk-aac */
437 else if( !strncmp( psz_val, "hev2", 4 ) )
438 p_sys->i_aac_profile = FF_PROFILE_AAC_HE_V2;
439 else if( !strncmp( psz_val, "hev1", 4 ) )
440 p_sys->i_aac_profile = FF_PROFILE_AAC_HE;
441 else if( !strncmp( psz_val, "ld", 2 ) )
442 p_sys->i_aac_profile = FF_PROFILE_AAC_LD;
443 else if( !strncmp( psz_val, "eld", 3 ) )
444 p_sys->i_aac_profile = FF_PROFILE_AAC_ELD;
448 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
449 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
454 if( p_enc->fmt_in.i_cat == VIDEO_ES )
456 if( !p_enc->fmt_in.video.i_visible_width || !p_enc->fmt_in.video.i_visible_height )
458 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_visible_width,
459 p_enc->fmt_in.video.i_visible_height );
464 p_context->codec_type = AVMEDIA_TYPE_VIDEO;
466 p_context->width = p_enc->fmt_in.video.i_visible_width;
467 p_context->height = p_enc->fmt_in.video.i_visible_height;
469 /* if we don't have i_frame_rate_base, we are probing and just checking if we can find codec
470 * so set fps to 25 as some codecs (DIV3 atleast) needs time_base data */
471 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base ? p_enc->fmt_in.video.i_frame_rate_base : 1;
472 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate_base ? p_enc->fmt_in.video.i_frame_rate : 25 ;
473 if( p_codec->supported_framerates )
475 AVRational target = {
476 .num = p_enc->fmt_in.video.i_frame_rate,
477 .den = p_enc->fmt_in.video.i_frame_rate_base,
479 int idx = av_find_nearest_q_idx(target, p_codec->supported_framerates);
481 p_context->time_base.num = p_codec->supported_framerates[idx].den;
482 p_context->time_base.den = p_codec->supported_framerates[idx].num;
484 msg_Dbg( p_enc, "Time base set to %d/%d", p_context->time_base.num, p_context->time_base.den );
486 /* Defaults from ffmpeg.c */
487 p_context->qblur = 0.5;
488 p_context->qcompress = 0.5;
489 p_context->b_quant_offset = 1.25;
490 p_context->b_quant_factor = 1.25;
491 p_context->i_quant_offset = 0.0;
492 p_context->i_quant_factor = -0.8;
494 p_context->lumi_masking = p_sys->f_lumi_masking;
495 p_context->dark_masking = p_sys->f_dark_masking;
496 p_context->p_masking = p_sys->f_p_masking;
497 p_context->border_masking = p_sys->f_border_masking;
498 #if (LIBAVCODEC_VERSION_MAJOR < 55)
499 p_context->luma_elim_threshold = p_sys->i_luma_elim;
500 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
503 if( p_sys->i_key_int > 0 )
504 p_context->gop_size = p_sys->i_key_int;
505 p_context->max_b_frames =
506 VLC_CLIP( p_sys->i_b_frames, 0, FF_MAX_B_FRAMES );
507 p_context->b_frame_strategy = 0;
508 if( !p_context->max_b_frames &&
509 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
510 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ) )
511 p_context->flags |= CODEC_FLAG_LOW_DELAY;
513 av_reduce( &p_context->sample_aspect_ratio.num,
514 &p_context->sample_aspect_ratio.den,
515 p_enc->fmt_in.video.i_sar_num,
516 p_enc->fmt_in.video.i_sar_den, 1 << 30 );
519 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
521 /* Very few application support YUV in TIFF, not even VLC */
522 if( p_enc->fmt_out.i_codec == VLC_CODEC_TIFF )
523 p_enc->fmt_in.i_codec = VLC_CODEC_RGB24;
525 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
526 GetFfmpegChroma( &p_context->pix_fmt, &p_enc->fmt_in.video );
528 if( p_codec->pix_fmts )
530 const enum PixelFormat *p = p_codec->pix_fmts;
531 for( ; *p != -1; p++ )
533 if( *p == p_context->pix_fmt ) break;
535 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
536 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
537 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
541 if ( p_sys->f_i_quant_factor != 0.f )
542 p_context->i_quant_factor = p_sys->f_i_quant_factor;
544 p_context->noise_reduction = p_sys->i_noise_reduction;
546 if ( p_sys->b_mpeg4_matrix )
548 p_context->intra_matrix = mpeg4_default_intra_matrix;
549 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
552 if ( p_sys->b_pre_me )
554 p_context->pre_me = 1;
555 p_context->me_pre_cmp = FF_CMP_CHROMA;
558 if ( p_sys->b_interlace )
560 if ( p_context->height <= 280 )
562 if ( p_context->height != 16 || p_context->width != 16 )
564 "disabling interlaced video because height=%d <= 280",
569 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
570 if ( p_sys->b_interlace_me )
571 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
575 p_context->trellis = p_sys->b_trellis;
577 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
578 p_context->flags |= CODEC_FLAG_QSCALE;
579 /* These codecs cause libavcodec to exit if thread_count is > 1.
580 See libavcodec/mpegvideo_enc.c:MPV_encode_init and
581 libavcodec/svq3.c , WMV2 calls MPV_encode_init also.
583 if ( i_codec_id == AV_CODEC_ID_FLV1 ||
584 i_codec_id == AV_CODEC_ID_H261 ||
585 i_codec_id == AV_CODEC_ID_LJPEG ||
586 i_codec_id == AV_CODEC_ID_MJPEG ||
587 i_codec_id == AV_CODEC_ID_H263 ||
588 i_codec_id == AV_CODEC_ID_H263P ||
589 i_codec_id == AV_CODEC_ID_MSMPEG4V1 ||
590 i_codec_id == AV_CODEC_ID_MSMPEG4V2 ||
591 i_codec_id == AV_CODEC_ID_MSMPEG4V3 ||
592 i_codec_id == AV_CODEC_ID_WMV1 ||
593 i_codec_id == AV_CODEC_ID_WMV2 ||
594 i_codec_id == AV_CODEC_ID_RV10 ||
595 i_codec_id == AV_CODEC_ID_RV20 ||
596 i_codec_id == AV_CODEC_ID_SVQ3 )
597 p_enc->i_threads = 1;
599 if( p_sys->i_vtolerance > 0 )
600 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
602 /* usually if someone sets bitrate, he likes more to get that bitrate
603 * over quality should help 'normal' user to get asked bitrate
605 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
611 if( p_sys->i_qmin > 0 )
613 p_context->qmin = p_sys->i_qmin;
614 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
616 if( p_sys->i_qmax > 0 )
618 p_context->qmax = p_sys->i_qmax;
619 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
621 p_context->max_qdiff = 3;
623 p_context->mb_decision = p_sys->i_hq;
625 if( p_sys->i_quality )
627 p_context->flags |= CODEC_FLAG_QSCALE;
628 p_context->global_quality = p_sys->i_quality;
632 p_context->rc_qsquish = 1.0;
633 /* Default to 1/2 second buffer for given bitrate unless defined otherwise*/
634 if( !p_sys->i_rc_buffer_size )
636 p_sys->i_rc_buffer_size = p_enc->fmt_out.i_bitrate * 8 / 2;
638 msg_Dbg( p_enc, "rc buffer size %d bits", p_sys->i_rc_buffer_size );
639 /* Set maxrate/minrate to bitrate to try to get CBR */
640 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
641 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
642 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
643 /* This is from ffmpeg's ffmpeg.c : */
644 p_context->rc_initial_buffer_occupancy
645 = p_sys->i_rc_buffer_size * 3/4;
646 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
649 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
651 /* work around bug in libmp3lame encoding */
652 if( i_codec_id == AV_CODEC_ID_MP3 && p_enc->fmt_out.audio.i_channels > 2 )
653 p_enc->fmt_out.audio.i_channels = 2;
654 p_context->codec_type = AVMEDIA_TYPE_AUDIO;
655 p_context->sample_fmt = p_codec->sample_fmts ?
656 p_codec->sample_fmts[0] :
659 /* Try to match avcodec input format to vlc format so we could avoid one
661 if( GetVlcAudioFormat( p_context->sample_fmt ) != p_enc->fmt_in.i_codec
662 && p_codec->sample_fmts )
664 msg_Dbg( p_enc, "Trying to find more suitable sample format instead of %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
665 for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
667 if( GetVlcAudioFormat( p_codec->sample_fmts[i] ) == p_enc->fmt_in.i_codec )
669 p_context->sample_fmt = p_codec->sample_fmts[i];
670 msg_Dbg( p_enc, "Using %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
675 p_sys->b_planar = av_sample_fmt_is_planar( p_context->sample_fmt );
676 // Try if we can use interleaved format for codec input as VLC doesn't really do planar audio yet
677 // FIXME: Remove when planar/interleaved audio in vlc is equally supported
678 if( p_sys->b_planar && p_codec->sample_fmts )
680 msg_Dbg( p_enc, "Trying to find packet sample format instead of planar %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
681 for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
683 if( !av_sample_fmt_is_planar( p_codec->sample_fmts[i] ) )
685 p_context->sample_fmt = p_codec->sample_fmts[i];
686 msg_Dbg( p_enc, "Changing to packet format %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
691 msg_Dbg( p_enc, "Ended up using %s as sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
692 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_context->sample_fmt );
693 p_sys->b_planar = av_sample_fmt_is_planar( p_context->sample_fmt );
695 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
696 date_Init( &p_sys->buffer_date, p_enc->fmt_out.audio.i_rate, 1 );
697 date_Set( &p_sys->buffer_date, AV_NOPTS_VALUE );
698 p_context->time_base.num = 1;
699 p_context->time_base.den = p_context->sample_rate;
700 p_context->channels = p_enc->fmt_out.audio.i_channels;
701 #if LIBAVUTIL_VERSION_CHECK( 52, 2, 6, 0, 0)
702 p_context->channel_layout = channel_mask[p_context->channels][1];
704 /* Setup Channel ordering for multichannel audio
705 * as VLC channel order isn't same as libavcodec expects
708 p_sys->i_channels_to_reorder = 0;
711 * Copied from audio.c
713 const unsigned i_order_max = 8 * sizeof(p_context->channel_layout);
714 uint32_t pi_order_dst[AOUT_CHAN_MAX] = { };
715 int i_channels_src = 0;
717 if( p_context->channel_layout )
719 msg_Dbg( p_enc, "Creating channel order for reordering");
720 for( unsigned i = 0; i < sizeof(pi_channels_map)/sizeof(*pi_channels_map); i++ )
722 if( p_context->channel_layout & pi_channels_map[i][0] )
724 msg_Dbg( p_enc, "%d %"PRIx64" mapped to %"PRIx64"", i_channels_src, pi_channels_map[i][0], pi_channels_map[i][1]);
725 pi_order_dst[i_channels_src++] = pi_channels_map[i][1];
731 msg_Dbg( p_enc, "Creating default channel order for reordering");
732 /* Create default order */
733 for( unsigned int i = 0; i < __MIN( i_order_max, (unsigned)p_sys->p_context->channels ); i++ )
735 if( i < sizeof(pi_channels_map)/sizeof(*pi_channels_map) )
737 msg_Dbg( p_enc, "%d channel is %"PRIx64"", i_channels_src, pi_channels_map[i][1]);
738 pi_order_dst[i_channels_src++] = pi_channels_map[i][1];
742 if( i_channels_src != p_context->channels )
743 msg_Err( p_enc, "Channel layout not understood" );
745 p_sys->i_channels_to_reorder = aout_CheckChannelReorder( NULL, pi_order_dst,
746 channel_mask[p_context->channels][0], p_sys->pi_reorder_layout );
749 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
751 /* XXX: FAAC does resample only when setting the INPUT samplerate
752 * to the desired value (-R option of the faac frontend)
753 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
754 /* vlc should default to low-complexity profile, faac encoder
755 * has bug and aac audio has issues otherwise atm */
756 p_context->profile = p_sys->i_aac_profile;
760 /* Misc parameters */
761 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
763 /* Set reasonable defaults to VP8, based on
764 libvpx-720p preset from libvpx ffmpeg-patch */
765 if( i_codec_id == AV_CODEC_ID_VP8 )
767 /* Lets give bitrate tolerance */
768 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
769 /* default to 120 frames between keyframe */
770 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
771 p_context->gop_size = 120;
772 /* Don't set rc-values atm, they were from time before
773 libvpx was officially in FFmpeg */
774 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
775 //p_context->rc_min_rate = 40 * 1000; // 40k
776 /* seems that FFmpeg presets have 720p as divider for buffers */
777 if( p_enc->fmt_out.video.i_visible_height >= 720 )
779 /* Check that we don't overrun users qmin/qmax values */
780 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
782 p_context->qmin = 10;
783 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
786 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
788 p_context->qmax = 42;
789 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
793 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
796 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
801 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
803 p_context->level = 216;
804 p_context->profile = 0;
805 p_context->rc_buffer_aggressivity = 0.95;
806 p_context->token_partitions = 4;
807 p_context->mb_static_threshold = 0;
811 if( i_codec_id == AV_CODEC_ID_RAWVIDEO )
813 /* XXX: hack: Force same codec (will be handled by transcode) */
814 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
815 GetFfmpegChroma( &p_context->pix_fmt, &p_enc->fmt_in.video );
818 /* Make sure we get extradata filled by the encoder */
819 p_context->extradata_size = 0;
820 p_context->extradata = NULL;
821 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
823 if( p_enc->i_threads >= 1)
824 p_context->thread_count = p_enc->i_threads;
826 p_context->thread_count = vlc_GetCPUCount();
829 char *psz_opts = var_InheritString(p_enc, ENC_CFG_PREFIX "options");
830 AVDictionary *options = NULL;
831 if (psz_opts && *psz_opts)
832 options = vlc_av_get_options(psz_opts);
836 ret = avcodec_open2( p_context, p_codec, options ? &options : NULL );
837 vlc_avcodec_unlock();
839 AVDictionaryEntry *t = NULL;
840 while ((t = av_dict_get(options, "", t, AV_DICT_IGNORE_SUFFIX))) {
841 msg_Err(p_enc, "Unknown option \"%s\"", t->key);
846 if( p_enc->fmt_in.i_cat != AUDIO_ES ||
847 (p_context->channels <= 2 && i_codec_id != AV_CODEC_ID_MP2
848 && i_codec_id != AV_CODEC_ID_MP3) )
851 static const char types[][12] = {
852 [UNKNOWN_ES] = N_("unknown"), [VIDEO_ES] = N_("video"),
853 [AUDIO_ES] = N_("audio"), [SPU_ES] = N_("subpicture"),
855 const char *type = types[0];
860 } fcc = { .value = p_enc->fmt_out.i_codec };
862 if (likely((unsigned)p_enc->fmt_in.i_cat < sizeof (types) / sizeof (types[0])))
863 type = types[p_enc->fmt_in.i_cat];
864 msg_Err( p_enc, "cannot open %4.4s %s encoder", fcc.txt, type );
865 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
866 _("VLC could not open the %4.4s %s encoder."),
867 fcc.txt, vlc_gettext(type) );
868 av_dict_free(&options);
872 if( p_context->channels > 2 )
874 p_context->channels = 2;
875 p_enc->fmt_in.audio.i_channels = 2; // FIXME
876 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
879 if( i_codec_id == AV_CODEC_ID_MP2 || i_codec_id == AV_CODEC_ID_MP3 )
882 es_format_t *fmt = &p_enc->fmt_out;
884 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
885 if ( fmt->audio.i_rate == mpa_freq_tab[i_frequency] )
888 if ( i_frequency == 6 )
890 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
892 av_dict_free(&options);
896 for ( i = 1; i < 14; i++ )
897 if (fmt->i_bitrate/1000 <= mpa_bitrate_tab[i_frequency / 3][i])
900 if (fmt->i_bitrate / 1000 != mpa_bitrate_tab[i_frequency / 3][i])
903 "MPEG audio doesn't support bitrate=%d, using %d",
905 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
906 fmt->i_bitrate = mpa_bitrate_tab[i_frequency / 3][i] * 1000;
907 p_context->bit_rate = fmt->i_bitrate;
911 p_context->codec = NULL;
913 ret = avcodec_open2( p_context, p_codec, options ? &options : NULL );
914 vlc_avcodec_unlock();
919 av_dict_free(&options);
921 if( i_codec_id == AV_CODEC_ID_FLAC )
923 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
924 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
925 if( p_enc->fmt_out.p_extra )
927 uint8_t *p = p_enc->fmt_out.p_extra;
932 p[4] = 0x80; /* streaminfo block, last block before audio */
933 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
934 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
935 p[7] = ( p_context->extradata_size ) & 0xff;
936 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
940 p_enc->fmt_out.i_extra = 0;
945 p_enc->fmt_out.i_extra = p_context->extradata_size;
946 if( p_enc->fmt_out.i_extra )
948 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
949 if ( p_enc->fmt_out.p_extra == NULL )
953 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
954 p_enc->fmt_out.i_extra );
958 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
960 if( p_enc->fmt_in.i_cat == AUDIO_ES )
962 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_sys->p_context->sample_fmt );
963 p_enc->fmt_in.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_in.i_codec );
965 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8);
966 p_sys->i_frame_size = p_context->frame_size > 1 ?
967 p_context->frame_size :
969 p_sys->i_buffer_out = av_samples_get_buffer_size(NULL,
970 p_sys->p_context->channels, p_sys->i_frame_size,
971 p_sys->p_context->sample_fmt, DEFAULT_ALIGN);
972 p_sys->p_buffer = av_malloc( p_sys->i_buffer_out );
973 if ( unlikely( p_sys->p_buffer == NULL ) )
977 p_enc->fmt_out.audio.i_frame_length = p_context->frame_size;
978 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
979 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_out.i_codec );
980 //b_variable tells if we can feed any size frames to encoder
981 p_sys->b_variable = p_context->frame_size ? false : true;
984 if( p_sys->b_planar )
986 p_sys->p_interleave_buf = av_malloc( p_sys->i_buffer_out );
987 if( unlikely( p_sys->p_interleave_buf == NULL ) )
992 p_sys->frame = avcodec_alloc_frame();
997 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
999 p_enc->pf_encode_video = EncodeVideo;
1000 p_enc->pf_encode_audio = EncodeAudio;
1005 free( p_enc->fmt_out.p_extra );
1006 av_free( p_sys->p_buffer );
1007 av_free( p_sys->p_interleave_buf );
1018 static void vlc_av_packet_Release(block_t *block)
1020 vlc_av_packet_t *b = (void *) block;
1022 av_free_packet(&b->packet);
1026 static block_t *vlc_av_packet_Wrap(AVPacket *packet, mtime_t i_length)
1028 vlc_av_packet_t *b = malloc( sizeof( *b ) );
1029 if( unlikely(b == NULL) )
1032 block_t *p_block = &b->self;
1034 block_Init( p_block, packet->data, packet->size );
1035 p_block->i_nb_samples = 0;
1036 p_block->pf_release = vlc_av_packet_Release;
1037 b->packet = *packet;
1039 p_block->i_length = i_length;
1040 p_block->i_pts = packet->pts;
1041 p_block->i_dts = packet->dts;
1042 if( unlikely( packet->flags & AV_PKT_FLAG_CORRUPT ) )
1043 p_block->i_flags |= BLOCK_FLAG_CORRUPTED;
1048 /****************************************************************************
1049 * EncodeVideo: the whole thing
1050 ****************************************************************************/
1051 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
1053 encoder_sys_t *p_sys = p_enc->p_sys;
1056 AVFrame *frame = NULL;
1057 if( likely(p_pict) ) {
1058 frame = p_sys->frame;
1059 avcodec_get_frame_defaults( frame );
1060 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
1062 p_sys->frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
1063 p_sys->frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
1066 /* Let libavcodec select the frame type */
1067 frame->pict_type = 0;
1069 frame->repeat_pict = p_pict->i_nb_fields - 2;
1070 frame->interlaced_frame = !p_pict->b_progressive;
1071 frame->top_field_first = !!p_pict->b_top_field_first;
1073 /* Set the pts of the frame being encoded */
1074 frame->pts = (p_pict->date == VLC_TS_INVALID) ? AV_NOPTS_VALUE : p_pict->date;
1076 if ( p_sys->b_hurry_up && frame->pts != AV_NOPTS_VALUE )
1078 mtime_t current_date = mdate();
1080 if ( current_date + HURRY_UP_GUARD3 > frame->pts )
1082 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
1083 p_sys->p_context->trellis = 0;
1084 msg_Dbg( p_enc, "hurry up mode 3" );
1088 p_sys->p_context->mb_decision = p_sys->i_hq;
1090 if ( current_date + HURRY_UP_GUARD2 > frame->pts )
1092 p_sys->p_context->trellis = 0;
1093 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
1094 + (HURRY_UP_GUARD2 + current_date - frame->pts) / 500;
1095 msg_Dbg( p_enc, "hurry up mode 2" );
1099 p_sys->p_context->trellis = p_sys->b_trellis;
1101 p_sys->p_context->noise_reduction =
1102 p_sys->i_noise_reduction;
1106 if ( current_date + HURRY_UP_GUARD1 > frame->pts )
1108 frame->pict_type = AV_PICTURE_TYPE_P;
1109 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
1113 if ( ( frame->pts != AV_NOPTS_VALUE ) && ( frame->pts != VLC_TS_INVALID ) )
1115 if ( p_sys->i_last_pts == frame->pts )
1117 msg_Warn( p_enc, "almost fed libavcodec with two frames with "
1118 "the same PTS (%"PRId64 ")", frame->pts );
1121 else if ( p_sys->i_last_pts > frame->pts )
1123 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
1124 "past (current: %"PRId64 ", last: %"PRId64")",
1125 frame->pts, p_sys->i_last_pts );
1129 p_sys->i_last_pts = frame->pts;
1132 frame->quality = p_sys->i_quality;
1140 av_init_packet( &av_pkt );
1142 if( avcodec_encode_video2( p_sys->p_context, &av_pkt, frame, &is_data ) < 0
1148 block_t *p_block = vlc_av_packet_Wrap( &av_pkt,
1149 av_pkt.duration / p_sys->p_context->time_base.den );
1150 if( unlikely(p_block == NULL) )
1152 av_free_packet( &av_pkt );
1156 switch ( p_sys->p_context->coded_frame->pict_type )
1158 case AV_PICTURE_TYPE_I:
1159 case AV_PICTURE_TYPE_SI:
1160 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1162 case AV_PICTURE_TYPE_P:
1163 case AV_PICTURE_TYPE_SP:
1164 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1166 case AV_PICTURE_TYPE_B:
1167 case AV_PICTURE_TYPE_BI:
1168 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1171 p_block->i_flags |= BLOCK_FLAG_TYPE_PB;
1177 static block_t *encode_audio_buffer( encoder_t *p_enc, encoder_sys_t *p_sys, AVFrame *frame )
1179 int got_packet, i_out;
1181 AVPacket packet = {0};
1182 block_t *p_block = block_Alloc( p_sys->i_buffer_out );
1183 av_init_packet( &packet );
1184 packet.data = p_block->p_buffer;
1185 packet.size = p_block->i_buffer;
1187 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, frame, &got_packet );
1188 if( unlikely( !got_packet || ( i_out < 0 ) ) )
1192 msg_Err( p_enc,"Encoding problem..");
1194 block_Release( p_block );
1197 p_block->i_buffer = packet.size;
1199 p_block->i_length = (mtime_t)CLOCK_FREQ *
1200 (mtime_t)p_sys->i_frame_size /
1201 (mtime_t)p_sys->p_context->sample_rate;
1203 if( likely( packet.pts != AV_NOPTS_VALUE ) )
1204 p_block->i_dts = p_block->i_pts = packet.pts;
1206 p_block->i_dts = p_block->i_pts = VLC_TS_INVALID;
1210 static block_t *handle_delay_buffer( encoder_t *p_enc, encoder_sys_t *p_sys, int buffer_delay, block_t *p_aout_buf, int leftover_samples )
1212 block_t *p_block = NULL;
1213 //How much we need to copy from new packet
1214 const int leftover = leftover_samples * p_sys->p_context->channels * p_sys->i_sample_bytes;
1216 avcodec_get_frame_defaults( p_sys->frame );
1217 p_sys->frame->format = p_sys->p_context->sample_fmt;
1218 p_sys->frame->nb_samples = leftover_samples + p_sys->i_samples_delay;
1221 p_sys->frame->pts = date_Get( &p_sys->buffer_date );
1223 if( likely( p_sys->frame->pts != AV_NOPTS_VALUE) )
1224 date_Increment( &p_sys->buffer_date, p_sys->frame->nb_samples );
1226 if( likely( p_aout_buf ) )
1229 p_aout_buf->i_nb_samples -= leftover_samples;
1230 memcpy( p_sys->p_buffer+buffer_delay, p_aout_buf->p_buffer, leftover );
1232 // We need to deinterleave from p_aout_buf to p_buffer the leftover bytes
1233 if( p_sys->b_planar )
1234 aout_Deinterleave( p_sys->p_interleave_buf, p_sys->p_buffer,
1235 p_sys->i_frame_size, p_sys->p_context->channels, p_enc->fmt_in.i_codec );
1237 memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer, leftover);
1239 p_aout_buf->p_buffer += leftover;
1240 p_aout_buf->i_buffer -= leftover;
1241 if( likely( p_sys->frame->pts != AV_NOPTS_VALUE) )
1242 p_aout_buf->i_pts = date_Get( &p_sys->buffer_date );
1245 if(unlikely( ( (leftover + buffer_delay) < p_sys->i_buffer_out ) &&
1246 !(p_sys->p_codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME )))
1248 msg_Dbg( p_enc, "No small last frame support, padding");
1249 size_t padding_size = p_sys->i_buffer_out - (leftover+buffer_delay);
1250 memset( p_sys->p_buffer + (leftover+buffer_delay), 0, padding_size );
1251 buffer_delay += padding_size;
1253 if( avcodec_fill_audio_frame( p_sys->frame, p_sys->p_context->channels,
1254 p_sys->p_context->sample_fmt, p_sys->b_planar ? p_sys->p_interleave_buf : p_sys->p_buffer,
1255 p_sys->i_buffer_out,
1256 DEFAULT_ALIGN) < 0 )
1258 msg_Err( p_enc, "filling error on fillup" );
1259 p_sys->frame->nb_samples = 0;
1263 p_sys->i_samples_delay = 0;
1265 p_block = encode_audio_buffer( p_enc, p_sys, p_sys->frame );
1270 /****************************************************************************
1271 * EncodeAudio: the whole thing
1272 ****************************************************************************/
1273 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1275 encoder_sys_t *p_sys = p_enc->p_sys;
1277 block_t *p_block, *p_chain = NULL;
1278 size_t buffer_delay = 0, i_samples_left = 0;
1281 //i_bytes_left is amount of bytes we get
1282 i_samples_left = p_aout_buf ? p_aout_buf->i_nb_samples : 0;
1283 buffer_delay = p_sys->i_samples_delay * p_sys->i_sample_bytes * p_sys->p_context->channels;
1285 //p_sys->i_buffer_out = p_sys->i_frame_size * chan * p_sys->i_sample_bytes
1286 //Calculate how many bytes we would need from current buffer to fill frame
1287 size_t leftover_samples = __MAX(0,__MIN((ssize_t)i_samples_left, (ssize_t)(p_sys->i_frame_size - p_sys->i_samples_delay)));
1289 if( p_aout_buf && ( p_aout_buf->i_pts > VLC_TS_INVALID ) )
1291 date_Set( &p_sys->buffer_date, p_aout_buf->i_pts );
1292 /* take back amount we have leftover from previous buffer*/
1293 if( p_sys->i_samples_delay > 0 )
1294 date_Decrement( &p_sys->buffer_date, p_sys->i_samples_delay );
1296 /* Handle reordering here so we have p_sys->p_buffer always in correct
1298 if( p_aout_buf && p_sys->i_channels_to_reorder > 0 )
1300 aout_ChannelReorder( p_aout_buf->p_buffer, p_aout_buf->i_buffer,
1301 p_sys->i_channels_to_reorder, p_sys->pi_reorder_layout,
1302 p_enc->fmt_in.i_codec );
1305 // Check if we have enough samples in delay_buffer and current p_aout_buf to fill frame
1306 // Or if we are cleaning up
1307 if( ( buffer_delay > 0 ) &&
1308 ( ( p_aout_buf && ( leftover_samples <= p_aout_buf->i_nb_samples ) &&
1309 ( (leftover_samples + p_sys->i_samples_delay ) >= p_sys->i_frame_size )
1315 p_chain = handle_delay_buffer( p_enc, p_sys, buffer_delay, p_aout_buf, leftover_samples );
1317 if( unlikely( !p_chain ) )
1321 if( unlikely( !p_aout_buf ) )
1323 msg_Dbg(p_enc,"Flushing..");
1325 p_block = encode_audio_buffer( p_enc, p_sys, NULL );
1326 if( likely( p_block ) )
1328 block_ChainAppend( &p_chain, p_block );
1335 while( ( p_aout_buf->i_nb_samples >= p_sys->i_frame_size ) ||
1336 ( p_sys->b_variable && p_aout_buf->i_nb_samples ) )
1338 avcodec_get_frame_defaults( p_sys->frame );
1339 if( p_sys->b_variable )
1340 p_sys->frame->nb_samples = p_aout_buf->i_nb_samples;
1342 p_sys->frame->nb_samples = p_sys->i_frame_size;
1343 p_sys->frame->format = p_sys->p_context->sample_fmt;
1344 p_sys->frame->pts = date_Get( &p_sys->buffer_date );
1346 const int in_bytes = p_sys->frame->nb_samples *
1347 p_sys->p_context->channels * p_sys->i_sample_bytes;
1349 if( p_sys->b_planar )
1351 aout_Deinterleave( p_sys->p_buffer, p_aout_buf->p_buffer,
1352 p_sys->frame->nb_samples, p_sys->p_context->channels, p_enc->fmt_in.i_codec );
1357 memcpy(p_sys->p_buffer, p_aout_buf->p_buffer, in_bytes);
1360 if( avcodec_fill_audio_frame( p_sys->frame, p_sys->p_context->channels,
1361 p_sys->p_context->sample_fmt,
1363 p_sys->i_buffer_out,
1364 DEFAULT_ALIGN) < 0 )
1366 msg_Err( p_enc, "filling error on encode" );
1367 p_sys->frame->nb_samples = 0;
1370 p_aout_buf->p_buffer += in_bytes;
1371 p_aout_buf->i_buffer -= in_bytes;
1372 p_aout_buf->i_nb_samples -= p_sys->frame->nb_samples;
1373 if( likely( p_sys->frame->pts != AV_NOPTS_VALUE) )
1374 date_Increment( &p_sys->buffer_date, p_sys->frame->nb_samples );
1376 p_block = encode_audio_buffer( p_enc, p_sys, p_sys->frame );
1377 if( likely( p_block ) )
1378 block_ChainAppend( &p_chain, p_block );
1381 // We have leftover samples that don't fill frame_size, and libavcodec doesn't seem to like
1382 // that frame has more data than p_sys->i_frame_size most of the cases currently.
1383 if( p_aout_buf->i_nb_samples > 0 )
1385 memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer,
1386 p_aout_buf->i_nb_samples * p_sys->i_sample_bytes * p_sys->p_context->channels);
1387 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1393 /*****************************************************************************
1394 * CloseEncoder: libavcodec encoder destruction
1395 *****************************************************************************/
1396 void CloseEncoder( vlc_object_t *p_this )
1398 encoder_t *p_enc = (encoder_t *)p_this;
1399 encoder_sys_t *p_sys = p_enc->p_sys;
1401 /*FIXME: we should use avcodec_free_frame, but we don't require so new avcodec that has it*/
1402 av_freep( &p_sys->frame );
1405 avcodec_close( p_sys->p_context );
1406 vlc_avcodec_unlock();
1407 av_free( p_sys->p_context );
1410 av_free( p_sys->p_interleave_buf );
1411 av_free( p_sys->p_buffer );