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 #if LIBAVUTIL_VERSION_CHECK( 52,2,6,0,0 )
50 # include <libavutil/channel_layout.h>
53 #define HURRY_UP_GUARD1 (450000)
54 #define HURRY_UP_GUARD2 (300000)
55 #define HURRY_UP_GUARD3 (100000)
57 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
59 #define RAW_AUDIO_FRAME_SIZE (2048)
61 /*****************************************************************************
63 *****************************************************************************/
64 int OpenEncoder ( vlc_object_t * );
65 void CloseEncoder( vlc_object_t * );
67 static block_t *EncodeVideo( encoder_t *, picture_t * );
68 static block_t *EncodeAudio( encoder_t *, block_t * );
70 struct thread_context_t;
72 /*****************************************************************************
73 * thread_context_t : for multithreaded encoding
74 *****************************************************************************/
75 struct thread_context_t
79 AVCodecContext *p_context;
80 int (* pf_func)(AVCodecContext *c, void *arg);
89 /*****************************************************************************
90 * encoder_sys_t : libavcodec encoder descriptor
91 *****************************************************************************/
95 * libavcodec properties
98 AVCodecContext *p_context;
101 * Common buffer mainly for audio as frame size in there needs usually be constant
105 uint8_t *p_interleave_buf;
110 mtime_t i_last_ref_pts;
111 mtime_t i_buggy_pts_detect;
118 size_t i_sample_bytes;
120 size_t i_samples_delay; //How much samples in delay buffer
122 bool b_variable; //Encoder can be fed with any size frames not just frame_size
126 /* Encoding settings */
133 int i_rc_buffer_size;
134 float f_rc_buffer_aggressivity;
137 bool b_interlace, b_interlace_me;
138 float f_i_quant_factor;
139 int i_noise_reduction;
142 int i_quality; /* for VBR */
143 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
144 #if (LIBAVCODEC_VERSION_MAJOR < 55)
145 int i_luma_elim, i_chroma_elim;
147 int i_aac_profile; /* AAC profile to use.*/
152 static const char *const ppsz_enc_options[] = {
153 "keyint", "bframes", "vt", "qmin", "qmax", "codec", "hq",
154 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
155 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
156 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
157 "p-masking", "border-masking",
158 #if (LIBAVCODEC_VERSION_MAJOR < 55)
159 "luma-elim-threshold", "chroma-elim-threshold",
161 "aac-profile", "options",
165 static const uint16_t mpa_bitrate_tab[2][15] =
167 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
168 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
171 static const uint16_t mpa_freq_tab[6] =
172 { 44100, 48000, 32000, 22050, 24000, 16000 };
174 static const uint16_t mpeg4_default_intra_matrix[64] = {
175 8, 17, 18, 19, 21, 23, 25, 27,
176 17, 18, 19, 21, 23, 25, 27, 28,
177 20, 21, 22, 23, 24, 26, 28, 30,
178 21, 22, 23, 24, 26, 28, 30, 32,
179 22, 23, 24, 26, 28, 30, 32, 35,
180 23, 24, 26, 28, 30, 32, 35, 38,
181 25, 26, 28, 30, 32, 35, 38, 41,
182 27, 28, 30, 32, 35, 38, 41, 45,
185 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
186 16, 17, 18, 19, 20, 21, 22, 23,
187 17, 18, 19, 20, 21, 22, 23, 24,
188 18, 19, 20, 21, 22, 23, 24, 25,
189 19, 20, 21, 22, 23, 24, 26, 27,
190 20, 21, 22, 23, 25, 26, 27, 28,
191 21, 22, 23, 24, 26, 27, 28, 30,
192 22, 23, 24, 26, 27, 28, 30, 31,
193 23, 24, 25, 27, 28, 30, 31, 33,
196 /*****************************************************************************
197 * OpenEncoder: probe the encoder
198 *****************************************************************************/
200 int OpenEncoder( vlc_object_t *p_this )
202 encoder_t *p_enc = (encoder_t *)p_this;
203 encoder_sys_t *p_sys;
204 AVCodecContext *p_context;
205 AVCodec *p_codec = NULL;
206 int i_codec_id, i_cat;
207 const char *psz_namecodec;
211 /* Initialization must be done before avcodec_find_encoder() */
214 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
216 if( p_enc->fmt_out.i_codec == VLC_CODEC_MP3 )
219 i_codec_id = AV_CODEC_ID_MP3;
220 psz_namecodec = "MPEG I/II Layer 3";
222 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP2 )
225 i_codec_id = AV_CODEC_ID_MP2;
226 psz_namecodec = "MPEG I/II Layer 2";
228 else if( p_enc->fmt_out.i_codec == VLC_CODEC_MP1V )
231 i_codec_id = AV_CODEC_ID_MPEG1VIDEO;
232 psz_namecodec = "MPEG-1 video";
234 else if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
237 if( FindFfmpegChroma( p_enc->fmt_out.i_codec ) == PIX_FMT_NONE )
238 return VLC_EGENERIC; /* handed chroma output */
241 i_codec_id = AV_CODEC_ID_RAWVIDEO;
242 psz_namecodec = "Raw video";
245 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
247 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
248 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
249 _("\"%s\" is no video encoder."), psz_namecodec );
253 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
255 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
256 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
257 _("\"%s\" is no audio encoder."), psz_namecodec );
261 if( p_enc->fmt_out.i_cat == SPU_ES )
263 /* We don't support subtitle encoding */
267 char *psz_encoder = var_GetString( p_this, ENC_CFG_PREFIX "codec" );
268 if( psz_encoder && *psz_encoder )
270 p_codec = avcodec_find_encoder_by_name( psz_encoder );
272 msg_Err( p_this, "Encoder `%s' not found", psz_encoder );
273 else if( p_codec->id != i_codec_id )
275 msg_Err( p_this, "Encoder `%s' can't handle %4.4s",
276 psz_encoder, (char*)&p_enc->fmt_out.i_codec );
282 p_codec = avcodec_find_encoder( i_codec_id );
285 msg_Err( p_enc, "cannot find encoder %s\n"
286 "*** Your Libav/FFmpeg installation is crippled. ***\n"
287 "*** Please check with your Libav/FFmpeg packager. ***\n"
288 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
290 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
291 /* I have had enough of all these MPEG-3 transcoding bug reports.
292 * Downstream packager, you had better not patch this out, or I will be really
293 * annoyed. Think about it - you don't want to fork the VLC translation files,
294 * do you? -- Courmisch, 2008-10-22 */
295 "It seems your Libav/FFmpeg (libavcodec) installation lacks the following encoder:\n"
297 "If you don't know how to fix this, ask for support from your distribution.\n"
299 "This is not an error inside VLC media player.\n"
300 "Do not contact the VideoLAN project about this issue.\n"),
305 /* Allocate the memory needed to store the encoder's structure */
306 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
308 p_enc->p_sys = p_sys;
309 p_sys->i_samples_delay = 0;
310 p_sys->p_codec = p_codec;
311 p_sys->b_planar = false;
313 p_sys->p_buffer = NULL;
314 p_sys->p_interleave_buf = NULL;
315 p_sys->i_buffer_out = 0;
317 p_context = avcodec_alloc_context3(p_codec);
318 p_sys->p_context = p_context;
319 p_sys->p_context->codec_id = p_sys->p_codec->id;
320 p_context->thread_type = 0;
321 p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
322 p_context->opaque = (void *)p_this;
324 /* set CPU capabilities */
325 #if LIBAVUTIL_VERSION_CHECK(51, 25, 0, 42, 100)
326 av_set_cpu_flags_mask( INT_MAX & ~GetVlcDspMask() );
328 p_context->dsp_mask = GetVlcDspMask();
331 p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
332 p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
333 p_sys->i_vtolerance = var_GetInteger( p_enc, ENC_CFG_PREFIX "vt" ) * 1000;
334 p_sys->b_interlace = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace" );
335 p_sys->b_interlace_me = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace-me" );
336 p_sys->b_pre_me = var_GetBool( p_enc, ENC_CFG_PREFIX "pre-me" );
337 p_sys->b_hurry_up = var_GetBool( p_enc, ENC_CFG_PREFIX "hurry-up" );
339 if( p_sys->b_hurry_up )
341 /* hurry up mode needs noise reduction, even small */
342 p_sys->i_noise_reduction = 1;
345 p_sys->i_rc_buffer_size = var_GetInteger( p_enc, ENC_CFG_PREFIX "rc-buffer-size" );
346 p_sys->f_rc_buffer_aggressivity = var_GetFloat( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity" );
347 p_sys->f_i_quant_factor = var_GetFloat( p_enc, ENC_CFG_PREFIX "i-quant-factor" );
348 p_sys->i_noise_reduction = var_GetInteger( p_enc, ENC_CFG_PREFIX "noise-reduction" );
349 p_sys->b_mpeg4_matrix = var_GetBool( p_enc, ENC_CFG_PREFIX "mpeg4-matrix" );
351 f_val = var_GetFloat( p_enc, ENC_CFG_PREFIX "qscale" );
353 p_sys->i_quality = 0;
354 if( f_val < 0.01 || f_val > 255.0 )
357 p_sys->i_quality = (int)(FF_QP2LAMBDA * f_val + 0.5);
359 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "hq" );
360 p_sys->i_hq = FF_MB_DECISION_RD;
361 if( psz_val && *psz_val )
363 if( !strcmp( psz_val, "rd" ) )
364 p_sys->i_hq = FF_MB_DECISION_RD;
365 else if( !strcmp( psz_val, "bits" ) )
366 p_sys->i_hq = FF_MB_DECISION_BITS;
367 else if( !strcmp( psz_val, "simple" ) )
368 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
370 p_sys->i_hq = FF_MB_DECISION_RD;
373 p_sys->i_hq = FF_MB_DECISION_RD;
376 p_sys->i_qmin = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" );
377 p_sys->i_qmax = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" );
378 p_sys->b_trellis = var_GetBool( p_enc, ENC_CFG_PREFIX "trellis" );
380 p_context->strict_std_compliance = var_GetInteger( p_enc, ENC_CFG_PREFIX "strict" );
382 p_sys->f_lumi_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "lumi-masking" );
383 p_sys->f_dark_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "dark-masking" );
384 p_sys->f_p_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "p-masking" );
385 p_sys->f_border_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "border-masking" );
386 #if (LIBAVCODEC_VERSION_MAJOR < 55)
387 p_sys->i_luma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "luma-elim-threshold" );
388 p_sys->i_chroma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold" );
391 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "aac-profile" );
392 /* libavcodec uses faac encoder atm, and it has issues with
393 * other than low-complexity profile, so default to that */
394 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
395 if( psz_val && *psz_val )
397 if( !strncmp( psz_val, "main", 4 ) )
398 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
399 else if( !strncmp( psz_val, "low", 3 ) )
400 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
401 #if 0 /* Not supported by FAAC encoder */
402 else if( !strncmp( psz_val, "ssr", 3 ) )
403 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
405 else if( !strncmp( psz_val, "ltp", 3 ) )
406 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
407 #if LIBAVCODEC_VERSION_CHECK( 54, 19, 0, 35, 100 )
408 /* These require libavcodec with libfdk-aac */
409 else if( !strncmp( psz_val, "hev2", 4 ) )
410 p_sys->i_aac_profile = FF_PROFILE_AAC_HE_V2;
411 else if( !strncmp( psz_val, "hev1", 4 ) )
412 p_sys->i_aac_profile = FF_PROFILE_AAC_HE;
416 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
417 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
422 if( p_enc->fmt_in.i_cat == VIDEO_ES )
424 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
426 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
427 p_enc->fmt_in.video.i_height );
432 p_context->codec_type = AVMEDIA_TYPE_VIDEO;
434 p_context->width = p_enc->fmt_in.video.i_width;
435 p_context->height = p_enc->fmt_in.video.i_height;
437 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
438 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
439 if( p_codec->supported_framerates )
441 AVRational target = {
442 .num = p_enc->fmt_in.video.i_frame_rate,
443 .den = p_enc->fmt_in.video.i_frame_rate_base,
445 int idx = av_find_nearest_q_idx(target, p_codec->supported_framerates);
447 p_context->time_base.num = p_codec->supported_framerates[idx].den;
448 p_context->time_base.den = p_codec->supported_framerates[idx].num;
451 /* Defaults from ffmpeg.c */
452 p_context->qblur = 0.5;
453 p_context->qcompress = 0.5;
454 p_context->b_quant_offset = 1.25;
455 p_context->b_quant_factor = 1.25;
456 p_context->i_quant_offset = 0.0;
457 p_context->i_quant_factor = -0.8;
459 p_context->lumi_masking = p_sys->f_lumi_masking;
460 p_context->dark_masking = p_sys->f_dark_masking;
461 p_context->p_masking = p_sys->f_p_masking;
462 p_context->border_masking = p_sys->f_border_masking;
463 #if (LIBAVCODEC_VERSION_MAJOR < 55)
464 p_context->luma_elim_threshold = p_sys->i_luma_elim;
465 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
468 if( p_sys->i_key_int > 0 )
469 p_context->gop_size = p_sys->i_key_int;
470 p_context->max_b_frames =
471 VLC_CLIP( p_sys->i_b_frames, 0, FF_MAX_B_FRAMES );
472 p_context->b_frame_strategy = 0;
473 if( !p_context->max_b_frames &&
474 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
475 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ) )
476 p_context->flags |= CODEC_FLAG_LOW_DELAY;
478 av_reduce( &p_context->sample_aspect_ratio.num,
479 &p_context->sample_aspect_ratio.den,
480 p_enc->fmt_in.video.i_sar_num,
481 p_enc->fmt_in.video.i_sar_den, 1 << 30 );
484 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
485 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
486 GetFfmpegChroma( &p_context->pix_fmt, &p_enc->fmt_in.video );
488 if( p_codec->pix_fmts )
490 const enum PixelFormat *p = p_codec->pix_fmts;
491 for( ; *p != -1; p++ )
493 if( *p == p_context->pix_fmt ) break;
495 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
496 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
497 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
501 if ( p_sys->f_i_quant_factor != 0.0 )
502 p_context->i_quant_factor = p_sys->f_i_quant_factor;
504 p_context->noise_reduction = p_sys->i_noise_reduction;
506 if ( p_sys->b_mpeg4_matrix )
508 p_context->intra_matrix = mpeg4_default_intra_matrix;
509 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
512 if ( p_sys->b_pre_me )
514 p_context->pre_me = 1;
515 p_context->me_pre_cmp = FF_CMP_CHROMA;
518 if ( p_sys->b_interlace )
520 if ( p_context->height <= 280 )
522 if ( p_context->height != 16 || p_context->width != 16 )
524 "disabling interlaced video because height=%d <= 280",
529 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
530 if ( p_sys->b_interlace_me )
531 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
535 p_context->trellis = p_sys->b_trellis;
537 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
538 p_context->flags |= CODEC_FLAG_QSCALE;
539 /* These codecs cause libavcodec to exit if thread_count is > 1.
540 See libavcodec/mpegvideo_enc.c:MPV_encode_init and
541 libavcodec/svq3.c , WMV2 calls MPV_encode_init also.
543 if ( i_codec_id == AV_CODEC_ID_FLV1 ||
544 i_codec_id == AV_CODEC_ID_H261 ||
545 i_codec_id == AV_CODEC_ID_LJPEG ||
546 i_codec_id == AV_CODEC_ID_MJPEG ||
547 i_codec_id == AV_CODEC_ID_H263 ||
548 i_codec_id == AV_CODEC_ID_H263P ||
549 i_codec_id == AV_CODEC_ID_MSMPEG4V1 ||
550 i_codec_id == AV_CODEC_ID_MSMPEG4V2 ||
551 i_codec_id == AV_CODEC_ID_MSMPEG4V3 ||
552 i_codec_id == AV_CODEC_ID_WMV1 ||
553 i_codec_id == AV_CODEC_ID_WMV2 ||
554 i_codec_id == AV_CODEC_ID_RV10 ||
555 i_codec_id == AV_CODEC_ID_RV20 ||
556 i_codec_id == AV_CODEC_ID_SVQ3 )
557 p_enc->i_threads = 1;
559 if( p_sys->i_vtolerance > 0 )
560 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
562 /* usually if someone sets bitrate, he likes more to get that bitrate
563 * over quality should help 'normal' user to get asked bitrate
565 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
571 if( p_sys->i_qmin > 0 )
573 p_context->qmin = p_sys->i_qmin;
574 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
576 if( p_sys->i_qmax > 0 )
578 p_context->qmax = p_sys->i_qmax;
579 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
581 p_context->max_qdiff = 3;
583 p_context->mb_decision = p_sys->i_hq;
585 if( p_sys->i_quality )
587 p_context->flags |= CODEC_FLAG_QSCALE;
588 p_context->global_quality = p_sys->i_quality;
592 p_context->rc_qsquish = 1.0;
593 if( p_sys->i_rc_buffer_size )
595 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
596 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
598 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
599 /* This is from ffmpeg's ffmpeg.c : */
600 p_context->rc_initial_buffer_occupancy
601 = p_sys->i_rc_buffer_size * 3/4;
602 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
605 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
607 /* work around bug in libmp3lame encoding */
608 if( i_codec_id == AV_CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
609 p_enc->fmt_in.audio.i_channels = 2;
611 p_context->codec_type = AVMEDIA_TYPE_AUDIO;
612 p_context->sample_fmt = p_codec->sample_fmts ?
613 p_codec->sample_fmts[0] :
616 /* Try to match avcodec input format to vlc format so we could avoid one
618 if( GetVlcAudioFormat( p_context->sample_fmt ) != p_enc->fmt_in.i_codec )
620 msg_Dbg( p_enc, "Trying to find more suitable sample format instead of %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
621 for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
623 if( GetVlcAudioFormat( p_codec->sample_fmts[i] ) == p_enc->fmt_in.i_codec )
625 p_context->sample_fmt = p_codec->sample_fmts[i];
626 msg_Dbg( p_enc, "Using %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
631 p_sys->b_planar = av_sample_fmt_is_planar( p_context->sample_fmt );
632 // Try if we can use interleaved format for codec input as VLC doesn't really do planar audio yet
633 // FIXME: Remove when planar/interleaved audio in vlc is equally supported
634 if( p_sys->b_planar )
636 msg_Dbg( p_enc, "Trying to find packet sample format instead of planar %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
637 for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
639 if( !av_sample_fmt_is_planar( p_codec->sample_fmts[i] ) )
641 p_context->sample_fmt = p_codec->sample_fmts[i];
642 msg_Dbg( p_enc, "Changing to packet format %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
647 msg_Dbg( p_enc, "Ended up using %s as sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
648 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_context->sample_fmt );
649 p_sys->b_planar = av_sample_fmt_is_planar( p_context->sample_fmt );
651 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
652 date_Init( &p_sys->buffer_date, p_enc->fmt_out.audio.i_rate, 1 );
653 date_Set( &p_sys->buffer_date, 0 );
654 p_context->time_base.num = 1;
655 p_context->time_base.den = p_context->sample_rate;
656 p_context->channels = p_enc->fmt_out.audio.i_channels;
657 #if LIBAVUTIL_VERSION_CHECK( 52, 2, 6, 0, 0)
658 p_context->channel_layout = av_get_default_channel_layout( p_context->channels );
661 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
663 /* XXX: FAAC does resample only when setting the INPUT samplerate
664 * to the desired value (-R option of the faac frontend)
665 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
666 /* vlc should default to low-complexity profile, faac encoder
667 * has bug and aac audio has issues otherwise atm */
668 p_context->profile = p_sys->i_aac_profile;
672 /* Misc parameters */
673 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
675 /* Set reasonable defaults to VP8, based on
676 libvpx-720p preset from libvpx ffmpeg-patch */
677 if( i_codec_id == AV_CODEC_ID_VP8 )
679 /* Lets give bitrate tolerance */
680 p_context->bit_rate_tolerance = __MAX(2 * (int)p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
681 /* default to 120 frames between keyframe */
682 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
683 p_context->gop_size = 120;
684 /* Don't set rc-values atm, they were from time before
685 libvpx was officially in FFmpeg */
686 //p_context->rc_max_rate = 24 * 1000 * 1000; //24M
687 //p_context->rc_min_rate = 40 * 1000; // 40k
688 /* seems that FFmpeg presets have 720p as divider for buffers */
689 if( p_enc->fmt_out.video.i_height >= 720 )
691 /* Check that we don't overrun users qmin/qmax values */
692 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
694 p_context->qmin = 10;
695 p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
698 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
700 p_context->qmax = 42;
701 p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
705 if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
708 p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
713 #if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
715 p_context->level = 216;
716 p_context->profile = 0;
717 p_context->rc_buffer_aggressivity = 0.95;
718 p_context->token_partitions = 4;
719 p_context->mb_static_threshold = 0;
723 if( i_codec_id == AV_CODEC_ID_RAWVIDEO )
725 /* XXX: hack: Force same codec (will be handled by transcode) */
726 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
727 GetFfmpegChroma( &p_context->pix_fmt, &p_enc->fmt_in.video );
730 /* Make sure we get extradata filled by the encoder */
731 p_context->extradata_size = 0;
732 p_context->extradata = NULL;
733 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
735 if( p_enc->i_threads >= 1)
736 p_context->thread_count = p_enc->i_threads;
738 p_context->thread_count = vlc_GetCPUCount();
741 char *psz_opts = var_InheritString(p_enc, ENC_CFG_PREFIX "options");
742 AVDictionary *options = NULL;
743 if (psz_opts && *psz_opts)
744 options = vlc_av_get_options(psz_opts);
748 ret = avcodec_open2( p_context, p_codec, options ? &options : NULL );
749 vlc_avcodec_unlock();
751 AVDictionaryEntry *t = NULL;
752 while ((t = av_dict_get(options, "", t, AV_DICT_IGNORE_SUFFIX))) {
753 msg_Err(p_enc, "Unknown option \"%s\"", t->key);
758 if( p_enc->fmt_in.i_cat != AUDIO_ES ||
759 (p_context->channels <= 2 && i_codec_id != AV_CODEC_ID_MP2
760 && i_codec_id != AV_CODEC_ID_MP3) )
762 msg_Err( p_enc, "cannot open encoder" );
763 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
764 "%s", _("VLC could not open the encoder.") );
765 av_dict_free(&options);
769 if( p_context->channels > 2 )
771 p_context->channels = 2;
772 p_enc->fmt_in.audio.i_channels = 2; // FIXME
773 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
776 if( i_codec_id == AV_CODEC_ID_MP2 || i_codec_id == AV_CODEC_ID_MP3 )
779 es_format_t *fmt = &p_enc->fmt_out;
781 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
782 if ( fmt->audio.i_rate == mpa_freq_tab[i_frequency] )
785 if ( i_frequency == 6 )
787 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
789 av_dict_free(&options);
793 for ( i = 1; i < 14; i++ )
794 if (fmt->i_bitrate/1000 <= mpa_bitrate_tab[i_frequency / 3][i])
797 if (fmt->i_bitrate / 1000 != mpa_bitrate_tab[i_frequency / 3][i])
800 "MPEG audio doesn't support bitrate=%d, using %d",
802 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
803 fmt->i_bitrate = mpa_bitrate_tab[i_frequency / 3][i] * 1000;
804 p_context->bit_rate = fmt->i_bitrate;
808 p_context->codec = NULL;
810 ret = avcodec_open2( p_context, p_codec, options ? &options : NULL );
811 vlc_avcodec_unlock();
814 msg_Err( p_enc, "cannot open encoder" );
816 _("Streaming / Transcoding failed"),
817 "%s", _("VLC could not open the encoder.") );
818 av_dict_free(&options);
823 av_dict_free(&options);
825 p_enc->fmt_out.i_extra = p_context->extradata_size;
826 if( p_enc->fmt_out.i_extra )
828 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
829 if ( p_enc->fmt_out.p_extra == NULL )
833 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
834 p_enc->fmt_out.i_extra );
837 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
839 if( p_enc->fmt_in.i_cat == AUDIO_ES )
841 p_enc->fmt_in.i_codec = GetVlcAudioFormat( p_sys->p_context->sample_fmt );
842 p_enc->fmt_in.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_in.i_codec );
844 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8);
845 p_sys->i_frame_size = p_context->frame_size > 1 ?
846 p_context->frame_size :
848 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels);
849 if ( unlikely( p_sys->p_buffer == NULL ) )
853 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
854 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_out.i_codec );
855 //b_variable tells if we can feed any size frames to encoder
856 p_sys->b_variable = p_context->frame_size ? false : true;
858 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
860 if( p_sys->b_planar )
862 p_sys->p_interleave_buf = malloc( p_sys->i_buffer_out );
863 if( unlikely( p_sys->p_interleave_buf == NULL ) )
868 p_sys->frame = avcodec_alloc_frame();
873 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
875 p_enc->pf_encode_video = EncodeVideo;
876 p_enc->pf_encode_audio = EncodeAudio;
881 free( p_enc->fmt_out.p_extra );
882 free( p_sys->p_buffer );
883 free( p_sys->p_interleave_buf );
888 /****************************************************************************
889 * EncodeVideo: the whole thing
890 ****************************************************************************/
891 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
893 encoder_sys_t *p_sys = p_enc->p_sys;
895 /* Initialize the video output buffer the first time.
896 * This is done here instead of OpenEncoder() because we need the actual
897 * bits_per_pixel value, without having to assume anything.
899 const int bytesPerPixel = p_enc->fmt_out.video.i_bits_per_pixel ?
900 p_enc->fmt_out.video.i_bits_per_pixel / 8 : 3;
901 const int blocksize = __MAX( FF_MIN_BUFFER_SIZE,bytesPerPixel * p_sys->p_context->height * p_sys->p_context->width + 200 );
902 block_t *p_block = block_Alloc( blocksize );
903 if( unlikely(p_block == NULL) )
906 AVFrame *frame = NULL;
907 if( likely(p_pict) ) {
908 frame = p_sys->frame;
909 avcodec_get_frame_defaults( frame );
910 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
912 p_sys->frame->data[i_plane] = p_pict->p[i_plane].p_pixels;
913 p_sys->frame->linesize[i_plane] = p_pict->p[i_plane].i_pitch;
916 /* Let libavcodec select the frame type */
917 frame->pict_type = 0;
919 frame->repeat_pict = p_pict->i_nb_fields - 2;
920 frame->interlaced_frame = !p_pict->b_progressive;
921 frame->top_field_first = !!p_pict->b_top_field_first;
923 /* Set the pts of the frame being encoded */
924 frame->pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
926 if ( p_sys->b_hurry_up && frame->pts != (int64_t)AV_NOPTS_VALUE )
928 mtime_t current_date = mdate();
930 if ( current_date + HURRY_UP_GUARD3 > frame->pts )
932 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
933 p_sys->p_context->trellis = 0;
934 msg_Dbg( p_enc, "hurry up mode 3" );
938 p_sys->p_context->mb_decision = p_sys->i_hq;
940 if ( current_date + HURRY_UP_GUARD2 > frame->pts )
942 p_sys->p_context->trellis = 0;
943 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
944 + (HURRY_UP_GUARD2 + current_date - frame->pts) / 500;
945 msg_Dbg( p_enc, "hurry up mode 2" );
949 p_sys->p_context->trellis = p_sys->b_trellis;
951 p_sys->p_context->noise_reduction =
952 p_sys->i_noise_reduction;
956 if ( current_date + HURRY_UP_GUARD1 > frame->pts )
958 frame->pict_type = AV_PICTURE_TYPE_P;
959 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
963 if ( frame->pts != (int64_t)AV_NOPTS_VALUE && frame->pts != 0 )
965 if ( p_sys->i_last_pts == frame->pts )
967 msg_Warn( p_enc, "almost fed libavcodec with two frames with "
968 "the same PTS (%"PRId64 ")", frame->pts );
971 else if ( p_sys->i_last_pts > frame->pts )
973 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
974 "past (current: %"PRId64 ", last: %"PRId64")",
975 frame->pts, p_sys->i_last_pts );
979 p_sys->i_last_pts = frame->pts;
982 frame->quality = p_sys->i_quality;
985 #if (LIBAVCODEC_VERSION_MAJOR >= 54)
989 av_init_packet( &av_pkt );
990 av_pkt.data = p_block->p_buffer;
991 av_pkt.size = p_block->i_buffer;
993 if( avcodec_encode_video2( p_sys->p_context, &av_pkt, frame, &is_data ) < 0
996 block_Release( p_block );
1000 p_block->i_buffer = av_pkt.size;
1001 p_block->i_length = av_pkt.duration / p_sys->p_context->time_base.den;
1002 p_block->i_pts = av_pkt.pts;
1003 p_block->i_dts = av_pkt.dts;
1004 if( unlikely( av_pkt.flags & AV_PKT_FLAG_CORRUPT ) )
1005 p_block->i_flags |= BLOCK_FLAG_CORRUPTED;
1008 int i_out = avcodec_encode_video( p_sys->p_context, p_block->p_buffer,
1009 p_block->i_buffer, frame );
1012 block_Release( p_block );
1016 p_block->i_buffer = i_out;
1018 /* FIXME, 3-2 pulldown is not handled correctly */
1019 p_block->i_length = INT64_C(1000000) *
1020 p_enc->fmt_in.video.i_frame_rate_base /
1021 p_enc->fmt_in.video.i_frame_rate;
1023 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
1025 /* No delay -> output pts == input pts */
1027 p_block->i_dts = p_pict->date;
1028 p_block->i_pts = p_block->i_dts;
1030 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
1031 p_sys->p_context->coded_frame->pts != 0 &&
1032 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
1034 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
1035 p_block->i_pts = p_sys->p_context->coded_frame->pts;
1037 if( p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_I &&
1038 p_sys->p_context->coded_frame->pict_type != AV_PICTURE_TYPE_P )
1040 p_block->i_dts = p_block->i_pts;
1044 if( p_sys->i_last_ref_pts )
1046 p_block->i_dts = p_sys->i_last_ref_pts;
1050 /* Let's put something sensible */
1051 p_block->i_dts = p_block->i_pts;
1054 p_sys->i_last_ref_pts = p_block->i_pts;
1059 /* Buggy libavcodec which doesn't update coded_frame->pts
1061 p_block->i_dts = p_block->i_pts = p_pict->date;
1065 switch ( p_sys->p_context->coded_frame->pict_type )
1067 case AV_PICTURE_TYPE_I:
1068 case AV_PICTURE_TYPE_SI:
1069 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
1071 case AV_PICTURE_TYPE_P:
1072 case AV_PICTURE_TYPE_SP:
1073 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
1075 case AV_PICTURE_TYPE_B:
1076 case AV_PICTURE_TYPE_BI:
1077 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
1080 p_block->i_flags |= BLOCK_FLAG_TYPE_PB;
1086 /****************************************************************************
1087 * EncodeAudio: the whole thing
1088 ****************************************************************************/
1089 static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
1091 encoder_sys_t *p_sys = p_enc->p_sys;
1093 block_t *p_block, *p_chain = NULL;
1094 int got_packet,i_out;
1095 size_t buffer_delay = 0, i_samples_left = 0;
1097 //i_bytes_left is amount of bytes we get
1098 i_samples_left = p_aout_buf ? p_aout_buf->i_nb_samples : 0;
1099 buffer_delay = p_sys->i_samples_delay * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
1101 //p_sys->i_buffer_out = p_sys->i_frame_size * chan * p_sys->i_sample_bytes
1102 //Calculate how many bytes we would need from current buffer to fill frame
1103 size_t leftover_samples = __MAX(0,__MIN((ssize_t)i_samples_left, (ssize_t)(p_sys->i_frame_size - p_sys->i_samples_delay)));
1105 // Check if we have enough samples in delay_buffer and current p_aout_buf to fill frame
1106 // Or if we are cleaning up
1107 if( ( buffer_delay > 0 ) &&
1108 ( ( p_aout_buf && ( leftover_samples <= p_aout_buf->i_nb_samples ) &&
1109 ( (leftover_samples + p_sys->i_samples_delay ) >= p_sys->i_frame_size )
1115 //How much we need to copy from new packet
1116 const int leftover = leftover_samples * p_enc->fmt_in.audio.i_channels * p_sys->i_sample_bytes;
1118 #if LIBAVUTIL_VERSION_CHECK( 51,27,2,46,100 )
1119 const int align = 0;
1121 const int align = 1;
1124 AVPacket packet = {0};
1125 avcodec_get_frame_defaults( p_sys->frame );
1126 p_sys->frame->format = p_sys->p_context->sample_fmt;
1127 p_sys->frame->pts = date_Get( &p_sys->buffer_date );
1128 p_sys->frame->nb_samples = leftover_samples + p_sys->i_samples_delay;
1129 date_Increment( &p_sys->buffer_date, p_sys->i_frame_size );
1131 if( likely( p_aout_buf ) )
1133 p_aout_buf->i_nb_samples -= leftover_samples;
1134 memcpy( p_sys->p_buffer+buffer_delay, p_aout_buf->p_buffer, leftover );
1136 // We need to deinterleave from p_aout_buf to p_buffer the leftover bytes
1137 if( p_sys->b_planar )
1138 aout_Deinterleave( p_sys->p_interleave_buf, p_sys->p_buffer,
1139 p_sys->i_frame_size, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
1141 memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer, leftover);
1143 p_aout_buf->p_buffer += leftover;
1144 p_aout_buf->i_buffer -= leftover;
1145 p_aout_buf->i_pts = date_Get( &p_sys->buffer_date );
1147 if(unlikely( ( (leftover + buffer_delay) < p_sys->i_buffer_out ) &&
1148 !(p_sys->p_codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME ))
1151 msg_Dbg( p_enc, "No small last frame support, padding");
1152 size_t padding_size = p_sys->i_buffer_out - (leftover+buffer_delay);
1153 memset( p_sys->p_buffer + (leftover+buffer_delay), 0, padding_size );
1154 buffer_delay += padding_size;
1156 if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
1157 p_sys->p_context->sample_fmt, p_sys->b_planar ? p_sys->p_interleave_buf : p_sys->p_buffer,
1158 leftover + buffer_delay,
1160 msg_Err( p_enc, "filling error on fillup" );
1163 p_sys->i_samples_delay = 0;
1165 p_block = block_Alloc( p_sys->i_buffer_out );
1166 av_init_packet( &packet );
1167 packet.data = p_block->p_buffer;
1168 packet.size = p_block->i_buffer;
1170 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, p_sys->frame, &got_packet );
1172 if( unlikely( !got_packet || ( i_out < 0 ) || !packet.size ) )
1176 msg_Err( p_enc,"Encoding problem..");
1179 block_Release( p_block );
1183 p_block->i_buffer = packet.size;
1184 p_block->i_length = (mtime_t)1000000 *
1185 (mtime_t)p_sys->frame->nb_samples /
1186 (mtime_t)p_sys->p_context->sample_rate;
1188 p_block->i_dts = p_block->i_pts = packet.pts;
1190 block_ChainAppend( &p_chain, p_block );
1193 if( unlikely( !p_aout_buf ) )
1195 msg_Dbg(p_enc,"Flushing..");
1197 AVPacket packet = {0};
1198 p_block = block_Alloc( p_sys->i_buffer_out );
1199 av_init_packet( &packet );
1200 packet.data = p_block->p_buffer;
1201 packet.size = p_block->i_buffer;
1203 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, NULL, &got_packet );
1204 p_block->i_buffer = packet.size;
1206 p_block->i_length = (mtime_t)1000000 *
1207 (mtime_t)p_sys->i_frame_size /
1208 (mtime_t)p_sys->p_context->sample_rate;
1210 p_block->i_dts = p_block->i_pts = packet.pts;
1212 if( i_out >= 0 && got_packet )
1213 block_ChainAppend( &p_chain, p_block );
1214 } while( got_packet && (i_out>=0) );
1219 while( ( p_aout_buf->i_nb_samples >= p_sys->i_frame_size ) ||
1220 ( p_sys->b_variable && p_aout_buf->i_nb_samples ) )
1222 AVPacket packet = {0};
1223 #if LIBAVUTIL_VERSION_CHECK( 51,27,2,46,100 )
1224 const int align = 0;
1226 const int align = 1;
1229 if( unlikely( p_aout_buf->i_pts > VLC_TS_INVALID &&
1230 p_aout_buf->i_pts != date_Get( &p_sys->buffer_date ) ) )
1231 date_Set( &p_sys->buffer_date, p_aout_buf->i_pts );
1233 avcodec_get_frame_defaults( p_sys->frame );
1234 if( p_sys->b_variable )
1235 p_sys->frame->nb_samples = p_aout_buf->i_nb_samples;
1237 p_sys->frame->nb_samples = p_sys->i_frame_size;
1238 p_sys->frame->format = p_sys->p_context->sample_fmt;
1239 p_sys->frame->pts = date_Get( &p_sys->buffer_date );
1241 if( p_sys->b_planar )
1243 aout_Deinterleave( p_sys->p_buffer, p_aout_buf->p_buffer,
1244 p_sys->frame->nb_samples, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
1248 if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
1249 p_sys->p_context->sample_fmt,
1250 p_sys->b_planar ? p_sys->p_buffer : p_aout_buf->p_buffer,
1251 __MIN(p_sys->i_buffer_out, p_aout_buf->i_buffer),
1253 msg_Err( p_enc, "filling error on encode" );
1255 p_aout_buf->p_buffer += (p_sys->frame->nb_samples * p_enc->fmt_in.audio.i_channels * p_sys->i_sample_bytes);
1256 p_aout_buf->i_buffer -= (p_sys->frame->nb_samples * p_enc->fmt_in.audio.i_channels * p_sys->i_sample_bytes);
1257 p_aout_buf->i_nb_samples -= p_sys->frame->nb_samples;
1258 date_Increment( &p_sys->buffer_date, p_sys->frame->nb_samples );
1261 p_block = block_Alloc( p_sys->i_buffer_out );
1262 av_init_packet( &packet );
1263 packet.data = p_block->p_buffer;
1264 packet.size = p_block->i_buffer;
1266 i_out = avcodec_encode_audio2( p_sys->p_context, &packet, p_sys->frame, &got_packet );
1267 p_block->i_buffer = packet.size;
1269 if( unlikely( !got_packet || ( i_out < 0 ) ) )
1273 msg_Err( p_enc,"Encoding problem..");
1276 block_Release( p_block );
1280 p_block->i_buffer = packet.size;
1282 p_block->i_length = (mtime_t)1000000 *
1283 (mtime_t)p_sys->frame->nb_samples /
1284 (mtime_t)p_sys->p_context->sample_rate;
1286 p_block->i_dts = p_block->i_pts = packet.pts;
1288 block_ChainAppend( &p_chain, p_block );
1291 // We have leftover samples that don't fill frame_size, and libavcodec doesn't seem to like
1292 // that frame has more data than p_sys->i_frame_size most of the cases currently.
1293 if( p_aout_buf->i_nb_samples > 0 )
1295 memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer,
1296 p_aout_buf->i_nb_samples * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels);
1297 p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
1303 /*****************************************************************************
1304 * CloseEncoder: libavcodec encoder destruction
1305 *****************************************************************************/
1306 void CloseEncoder( vlc_object_t *p_this )
1308 encoder_t *p_enc = (encoder_t *)p_this;
1309 encoder_sys_t *p_sys = p_enc->p_sys;
1311 /*FIXME: we should use avcodec_free_frame, but we don't require so new avcodec that has it*/
1312 av_freep( &p_sys->frame );
1315 avcodec_close( p_sys->p_context );
1316 vlc_avcodec_unlock();
1317 av_free( p_sys->p_context );
1320 free( p_sys->p_interleave_buf );
1321 free( p_sys->p_buffer );