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_codec.h>
36 #include <vlc_interface.h>
40 #ifdef HAVE_FFMPEG_AVCODEC_H
41 # include <ffmpeg/avcodec.h>
48 #define HURRY_UP_GUARD1 (450000)
49 #define HURRY_UP_GUARD2 (300000)
50 #define HURRY_UP_GUARD3 (100000)
52 #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
54 /*****************************************************************************
56 *****************************************************************************/
57 int E_(OpenEncoder) ( vlc_object_t * );
58 void E_(CloseEncoder)( vlc_object_t * );
60 static block_t *EncodeVideo( encoder_t *, picture_t * );
61 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
63 struct thread_context_t;
64 static int FfmpegThread( struct thread_context_t *p_context );
65 static int FfmpegExecute( AVCodecContext *s,
66 int (*pf_func)(AVCodecContext *c2, void *arg2),
67 void **arg, int *ret, int count );
69 /*****************************************************************************
70 * thread_context_t : for multithreaded encoding
71 *****************************************************************************/
72 struct thread_context_t
76 AVCodecContext *p_context;
77 int (* pf_func)(AVCodecContext *c, void *arg);
83 vlc_bool_t b_work, b_done;
86 /*****************************************************************************
87 * encoder_sys_t : ffmpeg encoder descriptor
88 *****************************************************************************/
95 AVCodecContext *p_context;
106 mtime_t i_last_ref_pts;
107 mtime_t i_buggy_pts_detect;
118 /* Encoding settings */
125 vlc_bool_t b_strict_rc;
126 int i_rc_buffer_size;
127 float f_rc_buffer_aggressivity;
129 vlc_bool_t b_hurry_up;
130 vlc_bool_t b_interlace, b_interlace_me;
131 float f_i_quant_factor;
132 int i_noise_reduction;
133 vlc_bool_t b_mpeg4_matrix;
134 vlc_bool_t b_trellis;
135 int i_quality; /* for VBR */
136 float f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
137 int i_luma_elim, i_chroma_elim;
139 /* Used to work around stupid timestamping behaviour in libavcodec */
141 mtime_t pi_delay_pts[MAX_FRAME_DELAY];
144 static const char *ppsz_enc_options[] = {
145 "keyint", "bframes", "vt", "qmin", "qmax", "hq", "strict-rc",
146 "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
147 "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
148 "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
149 "p-masking", "border-masking", "luma-elim-threshold",
150 "chroma-elim-threshold", NULL
153 static const uint16_t mpa_bitrate_tab[2][15] =
155 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
156 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
159 static const uint16_t mpa_freq_tab[6] =
160 { 44100, 48000, 32000, 22050, 24000, 16000 };
162 static const int16_t mpeg4_default_intra_matrix[64] = {
163 8, 17, 18, 19, 21, 23, 25, 27,
164 17, 18, 19, 21, 23, 25, 27, 28,
165 20, 21, 22, 23, 24, 26, 28, 30,
166 21, 22, 23, 24, 26, 28, 30, 32,
167 22, 23, 24, 26, 28, 30, 32, 35,
168 23, 24, 26, 28, 30, 32, 35, 38,
169 25, 26, 28, 30, 32, 35, 38, 41,
170 27, 28, 30, 32, 35, 38, 41, 45,
173 static const int16_t mpeg4_default_non_intra_matrix[64] = {
174 16, 17, 18, 19, 20, 21, 22, 23,
175 17, 18, 19, 20, 21, 22, 23, 24,
176 18, 19, 20, 21, 22, 23, 24, 25,
177 19, 20, 21, 22, 23, 24, 26, 27,
178 20, 21, 22, 23, 25, 26, 27, 28,
179 21, 22, 23, 24, 26, 27, 28, 30,
180 22, 23, 24, 26, 27, 28, 30, 31,
181 23, 24, 25, 27, 28, 30, 31, 33,
185 /*****************************************************************************
186 * OpenEncoder: probe the encoder
187 *****************************************************************************/
189 int E_(OpenEncoder)( vlc_object_t *p_this )
191 encoder_t *p_enc = (encoder_t *)p_this;
192 encoder_sys_t *p_sys = p_enc->p_sys;
193 AVCodecContext *p_context;
195 int i_codec_id, i_cat;
196 const char *psz_namecodec;
200 var_Get( p_enc->p_libvlc_global, "avcodec", &lockval );
202 if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
205 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
207 /* handed chroma output */
211 i_codec_id = CODEC_ID_RAWVIDEO;
212 psz_namecodec = "Raw video";
215 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
217 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
218 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
219 _("\"%s\" is no video encoder."), psz_namecodec );
223 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
225 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
226 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
227 _("\"%s\" is no audio encoder."), psz_namecodec );
231 /* Initialization must be done before avcodec_find_encoder() */
232 E_(InitLibavcodec)(p_this);
234 p_codec = avcodec_find_encoder( i_codec_id );
237 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
238 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
239 _("VLC could not find encoder \"%s\"."), psz_namecodec );
243 /* Allocate the memory needed to store the encoder's structure */
244 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
246 msg_Err( p_enc, "out of memory" );
249 memset( p_sys, 0, sizeof(encoder_sys_t) );
250 p_enc->p_sys = p_sys;
251 p_sys->p_codec = p_codec;
253 p_enc->pf_encode_video = EncodeVideo;
254 p_enc->pf_encode_audio = EncodeAudio;
256 p_sys->p_buffer_out = NULL;
257 p_sys->p_buffer = NULL;
259 p_sys->p_context = p_context = avcodec_alloc_context();
260 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
261 p_context->opaque = (void *)p_this;
263 /* Set CPU capabilities */
264 p_context->dsp_mask = 0;
265 if( !(p_enc->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMX) )
267 p_context->dsp_mask |= FF_MM_MMX;
269 if( !(p_enc->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMXEXT) )
271 p_context->dsp_mask |= FF_MM_MMXEXT;
273 if( !(p_enc->p_libvlc_global->i_cpu & CPU_CAPABILITY_3DNOW) )
275 p_context->dsp_mask |= FF_MM_3DNOW;
277 if( !(p_enc->p_libvlc_global->i_cpu & CPU_CAPABILITY_SSE) )
279 p_context->dsp_mask |= FF_MM_SSE;
280 p_context->dsp_mask |= FF_MM_SSE2;
283 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
285 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
286 p_sys->i_key_int = val.i_int;
288 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
289 p_sys->i_b_frames = val.i_int;
291 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
292 p_sys->i_vtolerance = val.i_int;
294 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
295 p_sys->b_interlace = val.b_bool;
297 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
298 p_sys->b_interlace_me = val.b_bool;
300 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
301 p_sys->b_pre_me = val.b_bool;
303 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
304 p_sys->b_hurry_up = val.b_bool;
305 if( p_sys->b_hurry_up )
307 /* hurry up mode needs noise reduction, even small */
308 p_sys->i_noise_reduction = 1;
311 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
312 p_sys->b_strict_rc = val.b_bool;
313 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
314 p_sys->i_rc_buffer_size = val.i_int;
315 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
316 p_sys->f_rc_buffer_aggressivity = val.f_float;
318 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
319 p_sys->f_i_quant_factor = val.f_float;
321 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
322 p_sys->i_noise_reduction = val.i_int;
324 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
325 p_sys->b_mpeg4_matrix = val.b_bool;
327 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
328 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
329 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
331 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
332 if( val.psz_string && *val.psz_string )
334 if( !strcmp( val.psz_string, "rd" ) )
335 p_sys->i_hq = FF_MB_DECISION_RD;
336 else if( !strcmp( val.psz_string, "bits" ) )
337 p_sys->i_hq = FF_MB_DECISION_BITS;
338 else if( !strcmp( val.psz_string, "simple" ) )
339 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
341 p_sys->i_hq = FF_MB_DECISION_RD;
343 if( val.psz_string ) free( val.psz_string );
345 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
346 p_sys->i_qmin = val.i_int;
347 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
348 p_sys->i_qmax = val.i_int;
349 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
350 p_sys->b_trellis = val.b_bool;
352 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
353 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
354 p_context->strict_std_compliance = val.i_int;
356 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
357 p_sys->f_lumi_masking = val.f_float;
358 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
359 p_sys->f_dark_masking = val.f_float;
360 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
361 p_sys->f_p_masking = val.f_float;
362 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
363 p_sys->f_border_masking = val.f_float;
364 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
365 p_sys->i_luma_elim = val.i_int;
366 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
367 p_sys->i_chroma_elim = val.i_int;
369 if( p_enc->fmt_in.i_cat == VIDEO_ES )
371 int i_aspect_num, i_aspect_den;
373 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
375 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
376 p_enc->fmt_in.video.i_height );
381 p_context->width = p_enc->fmt_in.video.i_width;
382 p_context->height = p_enc->fmt_in.video.i_height;
383 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
384 && (p_context->width > 720 || p_context->height > 576) )
385 p_context->level = 4; /* High level */
387 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
388 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
390 /* Defaults from ffmpeg.c */
391 p_context->qblur = 0.5;
392 p_context->qcompress = 0.5;
393 p_context->b_quant_offset = 1.25;
394 p_context->b_quant_factor = 1.25;
395 p_context->i_quant_offset = 0.0;
396 p_context->i_quant_factor = -0.8;
398 p_context->lumi_masking = p_sys->f_lumi_masking;
399 p_context->dark_masking = p_sys->f_dark_masking;
400 p_context->p_masking = p_sys->f_p_masking;
401 p_context->border_masking = p_sys->f_border_masking;
402 p_context->luma_elim_threshold = p_sys->i_luma_elim;
403 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
405 if( p_sys->i_key_int > 0 )
406 p_context->gop_size = p_sys->i_key_int;
407 p_context->max_b_frames =
408 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
409 p_context->b_frame_strategy = 0;
410 if( !p_context->max_b_frames &&
411 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
412 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
413 p_context->flags |= CODEC_FLAG_LOW_DELAY;
415 av_reduce( &i_aspect_num, &i_aspect_den,
416 p_enc->fmt_in.video.i_aspect,
417 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
418 av_reduce( &p_context->sample_aspect_ratio.num,
419 &p_context->sample_aspect_ratio.den,
420 i_aspect_num * (int64_t)p_context->height,
421 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
423 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
425 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
426 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
427 if( p_codec->pix_fmts )
429 const enum PixelFormat *p = p_codec->pix_fmts;
430 for( ; *p != -1; p++ )
432 if( *p == p_context->pix_fmt ) break;
434 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
435 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
438 if ( p_sys->b_strict_rc )
440 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
441 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
442 /* This is from ffmpeg's ffmpeg.c : */
443 p_context->rc_initial_buffer_occupancy
444 = p_sys->i_rc_buffer_size * 3/4;
445 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
448 if ( p_sys->f_i_quant_factor != 0.0 )
449 p_context->i_quant_factor = p_sys->f_i_quant_factor;
451 p_context->noise_reduction = p_sys->i_noise_reduction;
453 if ( p_sys->b_mpeg4_matrix )
455 p_context->intra_matrix = mpeg4_default_intra_matrix;
456 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
459 if ( p_sys->b_pre_me )
461 p_context->pre_me = 1;
462 p_context->me_pre_cmp = FF_CMP_CHROMA;
465 if ( p_sys->b_interlace )
467 if ( p_context->height <= 280 )
469 if ( p_context->height != 16 || p_context->width != 16 )
471 "disabling interlaced video because height=%d <= 280",
476 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
477 if ( p_sys->b_interlace_me )
478 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
482 if ( p_sys->b_trellis )
483 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
485 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
486 p_context->flags |= CODEC_FLAG_QSCALE;
488 if ( p_enc->i_threads >= 1 )
489 p_context->thread_count = p_enc->i_threads;
491 if( p_sys->i_vtolerance > 0 )
492 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
494 if( p_sys->i_qmin > 0 )
495 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
496 if( p_sys->i_qmax > 0 )
497 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
498 p_context->max_qdiff = 3;
500 p_context->mb_decision = p_sys->i_hq;
502 if( p_sys->i_quality )
504 p_context->flags |= CODEC_FLAG_QSCALE;
505 p_context->global_quality = p_sys->i_quality;
508 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
510 /* work around bug in libmp3lame encoding */
511 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
512 p_enc->fmt_in.audio.i_channels = 2;
514 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
515 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
516 p_context->channels = p_enc->fmt_in.audio.i_channels;
519 /* Misc parameters */
520 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
522 if( i_codec_id == CODEC_ID_RAWVIDEO )
524 /* XXX: hack: Force same codec (will be handled by transcode) */
525 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
526 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
529 /* Make sure we get extradata filled by the encoder */
530 p_context->extradata_size = 0;
531 p_context->extradata = NULL;
532 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
534 vlc_mutex_lock( lockval.p_address );
535 if( avcodec_open( p_context, p_codec ) )
537 vlc_mutex_unlock( lockval.p_address );
538 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
539 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
540 || i_codec_id == CODEC_ID_MP3) )
542 if( p_context->channels > 2 )
544 p_context->channels = 2;
545 p_enc->fmt_in.audio.i_channels = 2; // FIXME
546 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
549 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
553 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
555 if ( p_enc->fmt_out.audio.i_rate
556 == mpa_freq_tab[i_frequency] )
559 if ( i_frequency == 6 )
561 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
562 p_enc->fmt_out.audio.i_rate );
567 for ( i = 1; i < 14; i++ )
569 if ( p_enc->fmt_out.i_bitrate / 1000
570 <= mpa_bitrate_tab[i_frequency / 3][i] )
573 if ( p_enc->fmt_out.i_bitrate / 1000
574 != mpa_bitrate_tab[i_frequency / 3][i] )
577 "MPEG audio doesn't support bitrate=%d, using %d",
578 p_enc->fmt_out.i_bitrate,
579 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
580 p_enc->fmt_out.i_bitrate =
581 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
582 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
586 p_context->codec = NULL;
587 vlc_mutex_lock( lockval.p_address );
588 if( avcodec_open( p_context, p_codec ) )
590 vlc_mutex_unlock( lockval.p_address );
591 msg_Err( p_enc, "cannot open encoder" );
592 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
593 _("VLC could not open the encoder.") );
600 msg_Err( p_enc, "cannot open encoder" );
601 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
602 _("VLC could not open the encoder.") );
607 vlc_mutex_unlock( lockval.p_address );
609 p_enc->fmt_out.i_extra = p_context->extradata_size;
610 if( p_enc->fmt_out.i_extra )
612 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
613 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
614 p_enc->fmt_out.i_extra );
616 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
618 if( p_enc->fmt_in.i_cat == AUDIO_ES )
620 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
621 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
622 p_sys->p_buffer = malloc( p_sys->i_frame_size );
625 msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
630 /****************************************************************************
631 * Ffmpeg threading system
632 ****************************************************************************/
633 static int FfmpegThread( struct thread_context_t *p_context )
635 while ( !p_context->b_die && !p_context->b_error )
637 vlc_mutex_lock( &p_context->lock );
638 while ( !p_context->b_work && !p_context->b_die && !p_context->b_error )
640 vlc_cond_wait( &p_context->cond, &p_context->lock );
642 p_context->b_work = 0;
643 vlc_mutex_unlock( &p_context->lock );
644 if ( p_context->b_die || p_context->b_error )
647 if ( p_context->pf_func )
649 p_context->i_ret = p_context->pf_func( p_context->p_context,
653 vlc_mutex_lock( &p_context->lock );
654 p_context->b_done = 1;
655 vlc_cond_signal( &p_context->cond );
656 vlc_mutex_unlock( &p_context->lock );
662 static int FfmpegExecute( AVCodecContext *s,
663 int (*pf_func)(AVCodecContext *c2, void *arg2),
664 void **arg, int *ret, int count )
666 struct thread_context_t ** pp_contexts =
667 (struct thread_context_t **)s->thread_opaque;
670 /* Note, we can be certain that this is not called with the same
671 * AVCodecContext by different threads at the same time */
672 for ( i = 0; i < count; i++ )
674 vlc_mutex_lock( &pp_contexts[i]->lock );
675 pp_contexts[i]->arg = arg[i];
676 pp_contexts[i]->pf_func = pf_func;
677 pp_contexts[i]->i_ret = 12345;
678 pp_contexts[i]->b_work = 1;
679 vlc_cond_signal( &pp_contexts[i]->cond );
680 vlc_mutex_unlock( &pp_contexts[i]->lock );
682 for ( i = 0; i < count; i++ )
684 vlc_mutex_lock( &pp_contexts[i]->lock );
685 while ( !pp_contexts[i]->b_done )
687 vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
689 pp_contexts[i]->b_done = 0;
690 pp_contexts[i]->pf_func = NULL;
691 vlc_mutex_unlock( &pp_contexts[i]->lock );
695 ret[i] = pp_contexts[i]->i_ret;
702 /****************************************************************************
703 * EncodeVideo: the whole thing
704 ****************************************************************************/
705 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
707 encoder_sys_t *p_sys = p_enc->p_sys;
711 if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
713 struct thread_context_t ** pp_contexts;
717 pp_contexts = malloc( sizeof(struct thread_context_t *)
718 * p_enc->i_threads );
719 p_sys->p_context->thread_opaque = (void *)pp_contexts;
721 for ( i = 0; i < p_enc->i_threads; i++ )
723 pp_contexts[i] = vlc_object_create( p_enc,
724 sizeof(struct thread_context_t) );
725 pp_contexts[i]->p_context = p_sys->p_context;
726 vlc_mutex_init( p_enc, &pp_contexts[i]->lock );
727 vlc_cond_init( p_enc, &pp_contexts[i]->cond );
728 pp_contexts[i]->b_work = 0;
729 pp_contexts[i]->b_done = 0;
730 if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
731 VLC_THREAD_PRIORITY_VIDEO, VLC_FALSE ) )
733 msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
738 p_sys->p_context->execute = FfmpegExecute;
741 memset( &frame, 0, sizeof( AVFrame ) );
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_FOURCC( 'm', 'p', 'g', 'v' ) ||
757 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '1', 'v' ) ||
758 p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '2', 'v' ) )
760 frame.pts = p_pict->date ? p_pict->date : (signed int) AV_NOPTS_VALUE;
762 if ( p_sys->b_hurry_up && frame.pts != (signed int) AV_NOPTS_VALUE )
764 mtime_t current_date = mdate();
766 if ( current_date + HURRY_UP_GUARD3 > frame.pts )
768 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
769 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
770 msg_Dbg( p_enc, "hurry up mode 3" );
774 p_sys->p_context->mb_decision = p_sys->i_hq;
776 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
778 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
779 p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
780 + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
781 msg_Dbg( p_enc, "hurry up mode 2" );
785 if ( p_sys->b_trellis )
786 p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
788 p_sys->p_context->noise_reduction =
789 p_sys->i_noise_reduction;
793 if ( current_date + HURRY_UP_GUARD1 > frame.pts )
795 frame.pict_type = FF_P_TYPE;
796 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
802 frame.pts = AV_NOPTS_VALUE;
805 if ( frame.pts != (signed int) AV_NOPTS_VALUE && frame.pts != 0 )
807 if ( p_sys->i_last_pts == frame.pts )
809 msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
810 "same PTS (" I64Fd ")", frame.pts );
813 else if ( p_sys->i_last_pts > frame.pts )
815 msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
816 "past (current: " I64Fd ", last: "I64Fd")",
817 frame.pts, p_sys->i_last_pts );
822 p_sys->i_last_pts = frame.pts;
826 frame.quality = p_sys->i_quality;
828 /* Ugly work-around for stupid libavcodec behaviour */
830 p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
831 frame.pts = p_sys->i_framenum * AV_TIME_BASE *
832 p_enc->fmt_in.video.i_frame_rate_base;
833 frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
834 frame.pts /= p_enc->fmt_in.video.i_frame_rate;
835 /* End work-around */
837 i_out = avcodec_encode_video( p_sys->p_context, (uint8_t*)p_sys->p_buffer_out,
838 p_sys->p_context->height * p_sys->p_context->width * 3, &frame );
842 block_t *p_block = block_New( p_enc, i_out );
843 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
845 /* FIXME, 3-2 pulldown is not handled correctly */
846 p_block->i_length = I64C(1000000) *
847 p_enc->fmt_in.video.i_frame_rate_base /
848 p_enc->fmt_in.video.i_frame_rate;
850 if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
852 /* No delay -> output pts == input pts */
853 p_block->i_pts = p_block->i_dts = p_pict->date;
855 else if( p_sys->p_context->coded_frame->pts != (signed int) AV_NOPTS_VALUE &&
856 p_sys->p_context->coded_frame->pts != 0 &&
857 p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
859 p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
860 p_block->i_pts = p_sys->p_context->coded_frame->pts;
862 /* Ugly work-around for stupid libavcodec behaviour */
864 int64_t i_framenum = p_block->i_pts *
865 p_enc->fmt_in.video.i_frame_rate /
866 p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
868 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
870 /* End work-around */
872 if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
873 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
875 p_block->i_dts = p_block->i_pts;
879 if( p_sys->i_last_ref_pts )
881 p_block->i_dts = p_sys->i_last_ref_pts;
885 /* Let's put something sensible */
886 p_block->i_dts = p_block->i_pts;
889 p_sys->i_last_ref_pts = p_block->i_pts;
894 /* Buggy libavcodec which doesn't update coded_frame->pts
896 p_block->i_dts = p_block->i_pts = p_pict->date;
899 switch ( p_sys->p_context->coded_frame->pict_type )
902 p_block->i_flags |= BLOCK_FLAG_TYPE_I;
905 p_block->i_flags |= BLOCK_FLAG_TYPE_P;
908 p_block->i_flags |= BLOCK_FLAG_TYPE_B;
918 /****************************************************************************
919 * EncodeAudio: the whole thing
920 ****************************************************************************/
921 static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
923 encoder_sys_t *p_sys = p_enc->p_sys;
924 block_t *p_block, *p_chain = NULL;
926 uint8_t *p_buffer = p_aout_buf->p_buffer;
927 int i_samples = p_aout_buf->i_nb_samples;
928 int i_samples_delay = p_sys->i_samples_delay;
930 p_sys->i_pts = p_aout_buf->start_date -
931 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
932 (mtime_t)p_enc->fmt_in.audio.i_rate;
934 p_sys->i_samples_delay += i_samples;
936 while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
941 if( i_samples_delay )
943 /* Take care of the left-over from last time */
944 int i_delay_size = i_samples_delay * 2 *
945 p_sys->p_context->channels;
946 int i_size = p_sys->i_frame_size - i_delay_size;
948 p_samples = (int16_t *)p_sys->p_buffer;
949 memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
950 p_buffer -= i_delay_size;
951 i_samples += i_samples_delay;
956 p_samples = (int16_t *)p_buffer;
959 i_out = avcodec_encode_audio( p_sys->p_context, (uint8_t *)p_sys->p_buffer_out,
960 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE,
964 msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
966 if( i_out < 0 ) break;
968 p_buffer += p_sys->i_frame_size;
969 p_sys->i_samples_delay -= p_sys->p_context->frame_size;
970 i_samples -= p_sys->p_context->frame_size;
972 if( i_out == 0 ) continue;
974 p_block = block_New( p_enc, i_out );
975 memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
977 p_block->i_length = (mtime_t)1000000 *
978 (mtime_t)p_sys->p_context->frame_size /
979 (mtime_t)p_sys->p_context->sample_rate;
981 p_block->i_dts = p_block->i_pts = p_sys->i_pts;
984 p_sys->i_pts += p_block->i_length;
985 block_ChainAppend( &p_chain, p_block );
988 /* Backup the remaining raw samples */
991 memcpy( p_sys->p_buffer + i_samples_delay * 2 *
992 p_sys->p_context->channels, p_buffer,
993 i_samples * 2 * p_sys->p_context->channels );
999 /*****************************************************************************
1000 * CloseEncoder: ffmpeg encoder destruction
1001 *****************************************************************************/
1002 void E_(CloseEncoder)( vlc_object_t *p_this )
1004 encoder_t *p_enc = (encoder_t *)p_this;
1005 encoder_sys_t *p_sys = p_enc->p_sys;
1006 vlc_value_t lockval;
1008 var_Get( p_enc->p_libvlc_global, "avcodec", &lockval );
1010 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1013 struct thread_context_t ** pp_contexts =
1014 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1015 for ( i = 0; i < p_enc->i_threads; i++ )
1017 pp_contexts[i]->b_die = 1;
1018 vlc_cond_signal( &pp_contexts[i]->cond );
1019 vlc_thread_join( pp_contexts[i] );
1020 vlc_mutex_destroy( &pp_contexts[i]->lock );
1021 vlc_cond_destroy( &pp_contexts[i]->cond );
1022 vlc_object_destroy( pp_contexts[i] );
1025 free( pp_contexts );
1028 vlc_mutex_lock( lockval.p_address );
1029 avcodec_close( p_sys->p_context );
1030 vlc_mutex_unlock( lockval.p_address );
1031 av_free( p_sys->p_context );
1033 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1034 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );