1 /*****************************************************************************
2 * encoder.c: video and audio encoder using the ffmpeg library
3 *****************************************************************************
4 * Copyright (C) 1999-2004 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@videolan.org>
9 * Christophe Massiot <massiot@via.ecp.fr>
10 * Part of the file Copyright (C) FFMPEG Project Developers
11 * (mpeg4_default matrixes)
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
26 *****************************************************************************/
28 /*****************************************************************************
30 *****************************************************************************/
35 #include <vlc_common.h>
38 #include <vlc_codec.h>
39 #include <vlc_dialog.h>
40 #include <vlc_avcodec.h>
45 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
46 # include <libavcodec/avcodec.h>
47 #elif defined(HAVE_FFMPEG_AVCODEC_H)
48 # include <ffmpeg/avcodec.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 *, aout_buffer_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 : ffmpeg encoder descriptor
93 *****************************************************************************/
100 AVCodecContext *p_context;
106 uint8_t *p_buffer_out;
112 mtime_t i_last_ref_pts;
113 mtime_t i_buggy_pts_detect;
125 /* Encoding settings */
132 int i_rc_buffer_size;
133 float f_rc_buffer_aggressivity;
136 bool b_interlace, b_interlace_me;
137 float f_i_quant_factor;
138 int i_noise_reduction;
141 int i_quality; /* for VBR */
142 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
143 int i_luma_elim, i_chroma_elim;
144 int i_aac_profile; /* AAC profile to use.*/
145 /* Used to work around stupid timestamping behaviour in libavcodec */
147 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
150 static const char *const ppsz_enc_options[] = {
151 "keyint", "bframes", "vt", "qmin", "qmax", "hq",
152 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
153 "interlace", "interlace-me", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
154 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
155 "p-masking", "border-masking", "luma-elim-threshold",
156 "chroma-elim-threshold",
161 static const uint16_t mpa_bitrate_tab[2][15] =
163 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
164 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
167 static const uint16_t mpa_freq_tab[6] =
168 { 44100, 48000, 32000, 22050, 24000, 16000 };
170 static const uint16_t mpeg4_default_intra_matrix[64] = {
171 8, 17, 18, 19, 21, 23, 25, 27,
172 17, 18, 19, 21, 23, 25, 27, 28,
173 20, 21, 22, 23, 24, 26, 28, 30,
174 21, 22, 23, 24, 26, 28, 30, 32,
175 22, 23, 24, 26, 28, 30, 32, 35,
176 23, 24, 26, 28, 30, 32, 35, 38,
177 25, 26, 28, 30, 32, 35, 38, 41,
178 27, 28, 30, 32, 35, 38, 41, 45,
181 static const uint16_t mpeg4_default_non_intra_matrix[64] = {
182 16, 17, 18, 19, 20, 21, 22, 23,
183 17, 18, 19, 20, 21, 22, 23, 24,
184 18, 19, 20, 21, 22, 23, 24, 25,
185 19, 20, 21, 22, 23, 24, 26, 27,
186 20, 21, 22, 23, 25, 26, 27, 28,
187 21, 22, 23, 24, 26, 27, 28, 30,
188 22, 23, 24, 26, 27, 28, 30, 31,
189 23, 24, 25, 27, 28, 30, 31, 33,
192 /*****************************************************************************
193 * OpenEncoder: probe the encoder
194 *****************************************************************************/
196 int OpenEncoder( vlc_object_t *p_this )
198 encoder_t *p_enc = (encoder_t *)p_this;
199 encoder_sys_t *p_sys;
200 AVCodecContext *p_context;
202 int i_codec_id, i_cat;
203 const char *psz_namecodec;
208 if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
211 if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
213 /* handed chroma output */
217 i_codec_id = CODEC_ID_RAWVIDEO;
218 psz_namecodec = "Raw video";
221 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
223 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
224 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
225 _("\"%s\" is no video encoder."), psz_namecodec );
229 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
231 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
232 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
233 _("\"%s\" is no audio encoder."), psz_namecodec );
237 if( p_enc->fmt_out.i_cat == SPU_ES )
239 /* We don't support subtitle encoding */
243 /* Initialization must be done before avcodec_find_encoder() */
244 InitLibavcodec( p_this );
246 p_codec = avcodec_find_encoder( i_codec_id );
249 msg_Err( p_enc, "cannot find encoder %s\n"
250 "*** Your FFMPEG installation is crippled. ***\n"
251 "*** Please check with your FFMPEG packager. ***\n"
252 "*** This is NOT a VLC media player issue. ***", psz_namecodec );
254 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
255 /* I have had enough of all these MPEG-3 transcoding bug reports.
256 * Downstream packager, you had better not patch this out, or I will be really
257 * annoyed. Think about it - you don't want to fork the VLC translation files,
258 * do you? -- Courmisch, 2008-10-22 */
259 "It seems your FFMPEG (libavcodec) installation lacks the following encoder:\n"
261 "If you don't know how to fix this, ask for support from your distribution.\n"
263 "This is not an error inside VLC media player.\n"
264 "Do not contact the VideoLAN project about this issue.\n"),
269 /* Allocate the memory needed to store the encoder's structure */
270 if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
272 p_enc->p_sys = p_sys;
273 p_sys->p_codec = p_codec;
275 p_enc->pf_encode_video = EncodeVideo;
276 p_enc->pf_encode_audio = EncodeAudio;
278 p_sys->p_buffer = NULL;
279 p_sys->p_buffer_out = NULL;
280 p_sys->i_buffer_out = 0;
282 p_sys->p_context = p_context = avcodec_alloc_context();
283 p_sys->p_context->codec_id = p_sys->p_codec->id;
284 p_context->debug = var_InheritInteger( p_enc, "ffmpeg-debug" );
285 p_context->opaque = (void *)p_this;
287 /* Set CPU capabilities */
288 unsigned i_cpu = vlc_CPU();
289 p_context->dsp_mask = 0;
290 if( !(i_cpu & CPU_CAPABILITY_MMX) )
292 p_context->dsp_mask |= FF_MM_MMX;
294 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
296 p_context->dsp_mask |= FF_MM_MMXEXT;
298 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
300 p_context->dsp_mask |= FF_MM_3DNOW;
302 if( !(i_cpu & CPU_CAPABILITY_SSE) )
304 p_context->dsp_mask |= FF_MM_SSE;
305 p_context->dsp_mask |= FF_MM_SSE2;
308 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
310 p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
311 p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
312 p_sys->i_vtolerance = var_GetInteger( p_enc, ENC_CFG_PREFIX "vt" ) * 1000;
313 p_sys->b_interlace = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace" );
314 p_sys->b_interlace_me = var_GetBool( p_enc, ENC_CFG_PREFIX "interlace-me" );
315 p_sys->b_pre_me = var_GetBool( p_enc, ENC_CFG_PREFIX "pre-me" );
316 p_sys->b_hurry_up = var_GetBool( p_enc, ENC_CFG_PREFIX "hurry-up" );
318 if( p_sys->b_hurry_up )
320 /* hurry up mode needs noise reduction, even small */
321 p_sys->i_noise_reduction = 1;
324 p_sys->i_rc_buffer_size = var_GetInteger( p_enc, ENC_CFG_PREFIX "rc-buffer-size" );
325 p_sys->f_rc_buffer_aggressivity = var_GetFloat( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity" );
326 p_sys->f_i_quant_factor = var_GetFloat( p_enc, ENC_CFG_PREFIX "i-quant-factor" );
327 p_sys->i_noise_reduction = var_GetInteger( p_enc, ENC_CFG_PREFIX "noise-reduction" );
328 p_sys->b_mpeg4_matrix = var_GetBool( p_enc, ENC_CFG_PREFIX "mpeg4-matrix" );
330 f_val = var_GetFloat( p_enc, ENC_CFG_PREFIX "qscale" );
331 if( f_val < 0.01 || f_val > 255.0 ) f_val = 0;
332 p_sys->i_quality = (int)(FF_QP2LAMBDA * f_val + 0.5);
334 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "hq" );
335 p_sys->i_hq = FF_MB_DECISION_RD;
336 if( psz_val && *psz_val )
338 if( !strcmp( psz_val, "rd" ) )
339 p_sys->i_hq = FF_MB_DECISION_RD;
340 else if( !strcmp( psz_val, "bits" ) )
341 p_sys->i_hq = FF_MB_DECISION_BITS;
342 else if( !strcmp( psz_val, "simple" ) )
343 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
345 p_sys->i_hq = FF_MB_DECISION_RD;
348 p_sys->i_hq = FF_MB_DECISION_RD;
351 p_sys->i_qmin = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" );
352 p_sys->i_qmax = var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" );
353 p_sys->b_trellis = var_GetBool( p_enc, ENC_CFG_PREFIX "trellis" );
355 i_val = var_GetInteger( p_enc, ENC_CFG_PREFIX "strict" );
356 if( i_val < - 1 || i_val > 1 ) i_val = 0;
357 p_context->strict_std_compliance = i_val;
359 p_sys->f_lumi_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "lumi-masking" );
360 p_sys->f_dark_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "dark-masking" );
361 p_sys->f_p_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "p-masking" );
362 p_sys->f_border_masking = var_GetFloat( p_enc, ENC_CFG_PREFIX "border-masking" );
363 p_sys->i_luma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "luma-elim-threshold" );
364 p_sys->i_chroma_elim = var_GetInteger( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold" );
366 psz_val = var_GetString( p_enc, ENC_CFG_PREFIX "aac-profile" );
367 /* ffmpeg uses faac encoder atm, and it has issues with
368 * other than low-complexity profile, so default to that */
369 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
370 if( psz_val && *psz_val )
372 if( !strncmp( psz_val, "main", 4 ) )
373 p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
374 else if( !strncmp( psz_val, "low", 3 ) )
375 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
376 #if 0 /* Not supported by FAAC encoder */
377 else if( !strncmp( psz_val, "ssr", 3 ) )
378 p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
380 else if( !strncmp( psz_val, "ltp", 3 ) )
381 p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
384 msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
385 p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
390 if( p_enc->fmt_in.i_cat == VIDEO_ES )
392 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
394 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
395 p_enc->fmt_in.video.i_height );
400 p_context->codec_type = CODEC_TYPE_VIDEO;
402 p_context->width = p_enc->fmt_in.video.i_width;
403 p_context->height = p_enc->fmt_in.video.i_height;
405 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
406 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
408 /* Defaults from ffmpeg.c */
409 p_context->qblur = 0.5;
410 p_context->qcompress = 0.5;
411 p_context->b_quant_offset = 1.25;
412 p_context->b_quant_factor = 1.25;
413 p_context->i_quant_offset = 0.0;
414 p_context->i_quant_factor = -0.8;
416 p_context->lumi_masking = p_sys->f_lumi_masking;
417 p_context->dark_masking = p_sys->f_dark_masking;
418 p_context->p_masking = p_sys->f_p_masking;
419 p_context->border_masking = p_sys->f_border_masking;
420 p_context->luma_elim_threshold = p_sys->i_luma_elim;
421 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
423 if( p_sys->i_key_int > 0 )
424 p_context->gop_size = p_sys->i_key_int;
425 p_context->max_b_frames =
426 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
427 p_context->b_frame_strategy = 0;
428 if( !p_context->max_b_frames &&
429 ( p_enc->fmt_out.i_codec == VLC_CODEC_MPGV ||
430 p_enc->fmt_out.i_codec == VLC_CODEC_MP2V ||
431 p_enc->fmt_out.i_codec == VLC_CODEC_MP1V ) )
432 p_context->flags |= CODEC_FLAG_LOW_DELAY;
434 av_reduce( &p_context->sample_aspect_ratio.num,
435 &p_context->sample_aspect_ratio.den,
436 p_enc->fmt_in.video.i_sar_num,
437 p_enc->fmt_in.video.i_sar_den, 1 << 30 );
439 p_sys->i_buffer_out = p_context->height * p_context->width
440 * 3 /* Assume 24bpp maximum */
441 + 200; /* some room for potential headers (such as BMP) */
443 if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
444 p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
445 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
447 p_enc->fmt_in.i_codec = VLC_CODEC_I420;
448 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
449 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
451 if( p_codec->pix_fmts )
453 const enum PixelFormat *p = p_codec->pix_fmts;
454 for( ; *p != -1; p++ )
456 if( *p == p_context->pix_fmt ) break;
458 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
459 GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
460 p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
464 if ( p_sys->f_i_quant_factor != 0.0 )
465 p_context->i_quant_factor = p_sys->f_i_quant_factor;
467 p_context->noise_reduction = p_sys->i_noise_reduction;
469 if ( p_sys->b_mpeg4_matrix )
471 p_context->intra_matrix = mpeg4_default_intra_matrix;
472 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
475 if ( p_sys->b_pre_me )
477 p_context->pre_me = 1;
478 p_context->me_pre_cmp = FF_CMP_CHROMA;
481 if ( p_sys->b_interlace )
483 if ( p_context->height <= 280 )
485 if ( p_context->height != 16 || p_context->width != 16 )
487 "disabling interlaced video because height=%d <= 280",
492 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
493 if ( p_sys->b_interlace_me )
494 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
498 p_context->trellis = p_sys->b_trellis;
500 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
501 p_context->flags |= CODEC_FLAG_QSCALE;
503 if ( p_enc->i_threads >= 1 )
504 avcodec_thread_init( p_context, p_enc->i_threads );
506 avcodec_thread_init( p_context, vlc_GetCPUCount() );
508 if( p_sys->i_vtolerance > 0 )
509 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
511 /* usually if someone sets bitrate, he likes more to get that bitrate
512 * over quality should help 'normal' user to get asked bitrate
514 if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
520 if( p_sys->i_qmin > 0 )
522 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
523 p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
525 if( p_sys->i_qmax > 0 )
527 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
528 p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
530 p_context->max_qdiff = 3;
532 p_context->mb_decision = p_sys->i_hq;
534 if( p_sys->i_quality )
536 p_context->flags |= CODEC_FLAG_QSCALE;
537 p_context->global_quality = p_sys->i_quality;
541 p_context->rc_qsquish = 1.0;
542 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
543 p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
544 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
545 /* This is from ffmpeg's ffmpeg.c : */
546 p_context->rc_initial_buffer_occupancy
547 = p_sys->i_rc_buffer_size * 3/4;
548 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
551 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
553 /* work around bug in libmp3lame encoding */
554 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
555 p_enc->fmt_in.audio.i_channels = 2;
557 p_context->codec_type = CODEC_TYPE_AUDIO;
558 p_context->sample_fmt = p_codec->sample_fmts ?
559 p_codec->sample_fmts[0] :
561 p_enc->fmt_in.i_codec = VLC_CODEC_S16N;
562 p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
563 p_context->channels = p_enc->fmt_out.audio.i_channels;
565 if ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4A )
567 /* XXX: FAAC does resample only when setting the INPUT samplerate
568 * to the desired value (-R option of the faac frontend)
569 p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
570 /* vlc should default to low-complexity profile, faac encoder
571 * has bug and aac audio has issues otherwise atm */
572 p_context->profile = p_sys->i_aac_profile;
576 /* Misc parameters */
577 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
579 if( i_codec_id == CODEC_ID_RAWVIDEO )
581 /* XXX: hack: Force same codec (will be handled by transcode) */
582 p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
583 GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
586 /* Make sure we get extradata filled by the encoder */
587 p_context->extradata_size = 0;
588 p_context->extradata = NULL;
589 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
593 ret = avcodec_open( p_context, p_codec );
594 vlc_avcodec_unlock();
597 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
598 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
599 || i_codec_id == CODEC_ID_MP3) )
601 if( p_context->channels > 2 )
603 p_context->channels = 2;
604 p_enc->fmt_in.audio.i_channels = 2; // FIXME
605 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
608 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
612 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
614 if ( p_enc->fmt_out.audio.i_rate
615 == mpa_freq_tab[i_frequency] )
618 if ( i_frequency == 6 )
620 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
621 p_enc->fmt_out.audio.i_rate );
626 for ( i = 1; i < 14; i++ )
628 if ( p_enc->fmt_out.i_bitrate / 1000
629 <= mpa_bitrate_tab[i_frequency / 3][i] )
632 if ( p_enc->fmt_out.i_bitrate / 1000
633 != mpa_bitrate_tab[i_frequency / 3][i] )
636 "MPEG audio doesn't support bitrate=%d, using %d",
637 p_enc->fmt_out.i_bitrate,
638 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
639 p_enc->fmt_out.i_bitrate =
640 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
641 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
645 p_context->codec = NULL;
647 ret = avcodec_open( p_context, p_codec );
648 vlc_avcodec_unlock();
651 msg_Err( p_enc, "cannot open encoder" );
653 _("Streaming / Transcoding failed"),
654 "%s", _("VLC could not open the encoder.") );
661 msg_Err( p_enc, "cannot open encoder" );
662 dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
663 "%s", _("VLC could not open the encoder.") );
669 if( i_codec_id == CODEC_ID_FLAC )
671 p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
672 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
673 if( p_enc->fmt_out.p_extra )
675 uint8_t *p = p_enc->fmt_out.p_extra;
680 p[4] = 0x80; /* streaminfo block, last block before audio */
681 p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
682 p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
683 p[7] = ( p_context->extradata_size ) & 0xff;
684 memcpy( &p[8], p_context->extradata, p_context->extradata_size );
688 p_enc->fmt_out.i_extra = 0;
693 p_enc->fmt_out.i_extra = p_context->extradata_size;
694 if( p_enc->fmt_out.i_extra )
696 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
697 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
698 p_enc->fmt_out.i_extra );
702 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
704 if( p_enc->fmt_in.i_cat == AUDIO_ES )
706 GetVlcAudioFormat( &p_enc->fmt_in.i_codec,
707 &p_enc->fmt_in.audio.i_bitspersample,
708 p_sys->p_context->sample_fmt );
709 p_sys->i_sample_bytes = (p_enc->fmt_in.audio.i_bitspersample / 8) *
711 p_sys->i_frame_size = p_context->frame_size > 1 ?
712 p_context->frame_size :
713 RAW_AUDIO_FRAME_SIZE;
714 p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes );
715 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
716 p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( vlc_fourcc_GetCodec( AUDIO_ES, p_enc->fmt_out.i_codec ) );
718 if( p_context->frame_size > 1 )
719 p_sys->i_buffer_out = 8 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
721 p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes;
722 p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
725 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
730 /****************************************************************************
731 * EncodeVideo: the whole thing
732 ****************************************************************************/
733 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
735 encoder_sys_t *p_sys = p_enc->p_sys;
740 memset( &frame, 0, sizeof( AVFrame ) );
741 if( likely(p_pict) ) {
742 for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
744 frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
745 frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
748 /* Let ffmpeg select the frame type */
751 frame.repeat_pict = p_pict->i_nb_fields - 2;
752 frame.interlaced_frame = !p_pict->b_progressive;
753 frame.top_field_first = !!p_pict->b_top_field_first;
755 /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
756 if( p_enc->fmt_out.i_codec != VLC_CODEC_MP4V )
758 frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
760 if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
762 mtime_t current_date = mdate();
764 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
766 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
767 p_sys->p_context->trellis = 0;
768 msg_Dbg( p_enc, "hurry up mode 3" );
772 p_sys->p_context->mb_decision = p_sys->i_hq;
774 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
776 p_sys->p_context->trellis = 0;
777 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
778 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
779 msg_Dbg( p_enc, "hurry up mode 2" );
783 p_sys->p_context->trellis = p_sys->b_trellis;
785 p_sys->p_context->noise_reduction =
786 p_sys->i_noise_reduction;
790 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
792 frame.pict_type = FF_P_TYPE;
793 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
799 frame.pts = (int64_t)AV_NOPTS_VALUE;
802 if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
804 if ( p_sys->i_last_pts == frame.pts )
806 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
807 "same PTS (%"PRId64 ")", frame.pts );
810 else if ( p_sys->i_last_pts > frame.pts )
812 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
813 "past (current: %"PRId64 ", last: %"PRId64")",
814 frame.pts, p_sys->i_last_pts );
819 p_sys->i_last_pts = frame.pts;
823 frame.quality = p_sys->i_quality;
825 /* Ugly work-around for stupid libavcodec behaviour */
827 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
828 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
829 p_enc->fmt_in.video.i_frame_rate_base;
830 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
831 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
832 /* End work-around */
834 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
835 p_sys->i_buffer_out, &frame );
839 i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
840 p_sys->i_buffer_out, NULL);
845 block_t *p_block = block_New( p_enc, i_out );
846 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
848 /* FIXME, 3-2 pulldown is not handled correctly */
849 p_block->i_length = INT64_C(1000000) *
850 p_enc->fmt_in.video.i_frame_rate_base /
851 p_enc->fmt_in.video.i_frame_rate;
853 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
855 /* No delay -> output pts == input pts */
856 p_block->i_pts = p_block->i_dts = p_pict->date;
858 else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
859 p_sys->p_context->coded_frame->pts != 0 &&
860 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
862 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
863 p_block->i_pts = p_sys->p_context->coded_frame->pts;
865 /* Ugly work-around for stupid libavcodec behaviour */
867 int64_t i_framenum = p_block->i_pts *
868 p_enc->fmt_in.video.i_frame_rate /
869 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
871 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
873 /* End work-around */
875 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
876 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
878 p_block->i_dts = p_block->i_pts;
882 if( p_sys->i_last_ref_pts )
884 p_block->i_dts = p_sys->i_last_ref_pts;
888 /* Let's put something sensible */
889 p_block->i_dts = p_block->i_pts;
892 p_sys->i_last_ref_pts = p_block->i_pts;
897 /* Buggy libavcodec which doesn't update coded_frame->pts
899 p_block->i_dts = p_block->i_pts = p_pict->date;
902 switch ( p_sys->p_context->coded_frame->pict_type )
905 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
908 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
911 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
921 /****************************************************************************
922 * EncodeAudio: the whole thing
923 ****************************************************************************/
924 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
926 encoder_sys_t *p_sys = p_enc->p_sys;
928 block_t *p_block, *p_chain = NULL;
930 uint8_t *p_buffer = p_aout_buf->p_buffer;
931 int i_samples = p_aout_buf->i_nb_samples;
932 int i_samples_delay = p_sys->i_samples_delay;
934 p_sys->i_pts = p_aout_buf->i_pts -
935 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
936 (mtime_t)p_enc->fmt_in.audio.i_rate;
938 p_sys->i_samples_delay += i_samples;
940 while( p_sys->i_samples_delay >= p_sys->i_frame_size )
945 if( i_samples_delay )
947 /* Take care of the left-over from last time */
948 int i_delay_size = i_samples_delay;
949 int i_size = (p_sys->i_frame_size - i_delay_size) *
950 p_sys->i_sample_bytes;
952 memcpy( p_sys->p_buffer + i_delay_size * p_sys->i_sample_bytes,
954 p_buffer -= i_delay_size * p_sys->i_sample_bytes;
955 i_samples += i_samples_delay;
958 p_samples = p_sys->p_buffer;
962 p_samples = p_buffer;
965 i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
966 p_sys->i_buffer_out, p_samples );
969 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
971 p_buffer += p_sys->i_frame_size * p_sys->i_sample_bytes;
972 p_sys->i_samples_delay -= p_sys->i_frame_size;
973 i_samples -= p_sys->i_frame_size;
978 p_block = block_New( p_enc, i_out );
979 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
981 p_block->i_length = (mtime_t)1000000 *
982 (mtime_t)p_sys->i_frame_size /
983 (mtime_t)p_sys->p_context->sample_rate;
985 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
988 p_sys->i_pts += p_block->i_length;
989 block_ChainAppend( &p_chain, p_block );
992 /* Backup the remaining raw samples */
995 memcpy( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
997 i_samples * p_sys->i_sample_bytes );
1003 /*****************************************************************************
1004 * CloseEncoder: ffmpeg encoder destruction
1005 *****************************************************************************/
1006 void CloseEncoder( vlc_object_t *p_this )
1008 encoder_t *p_enc = (encoder_t *)p_this;
1009 encoder_sys_t *p_sys = p_enc->p_sys;
1012 avcodec_close( p_sys->p_context );
1013 vlc_avcodec_unlock();
1014 av_free( p_sys->p_context );
1016 free( p_sys->p_buffer );
1017 free( p_sys->p_buffer_out );