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;
198 vlc_mutex_t *lock = var_GetGlobalMutex( "avcodec" );
200 if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
203 if( E_(GetFfmpegChroma)( p_enc->fmt_out.i_codec ) < 0 )
205 /* handed chroma output */
209 i_codec_id = CODEC_ID_RAWVIDEO;
210 psz_namecodec = "Raw video";
213 if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
215 msg_Err( p_enc, "\"%s\" is not a video encoder", psz_namecodec );
216 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
217 _("\"%s\" is no video encoder."), psz_namecodec );
221 if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
223 msg_Err( p_enc, "\"%s\" is not an audio encoder", psz_namecodec );
224 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
225 _("\"%s\" is no audio encoder."), psz_namecodec );
229 /* Initialization must be done before avcodec_find_encoder() */
230 E_(InitLibavcodec)(p_this);
232 p_codec = avcodec_find_encoder( i_codec_id );
235 msg_Err( p_enc, "cannot find encoder %s", psz_namecodec );
236 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
237 _("VLC could not find encoder \"%s\"."), psz_namecodec );
241 /* Allocate the memory needed to store the encoder's structure */
242 if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
244 msg_Err( p_enc, "out of memory" );
247 memset( p_sys, 0, sizeof(encoder_sys_t) );
248 p_enc->p_sys = p_sys;
249 p_sys->p_codec = p_codec;
251 p_enc->pf_encode_video = EncodeVideo;
252 p_enc->pf_encode_audio = EncodeAudio;
254 p_sys->p_buffer_out = NULL;
255 p_sys->p_buffer = NULL;
257 p_sys->p_context = p_context = avcodec_alloc_context();
258 p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
259 p_context->opaque = (void *)p_this;
261 /* Set CPU capabilities */
262 unsigned i_cpu = vlc_CPU();
263 p_context->dsp_mask = 0;
264 if( !(i_cpu & CPU_CAPABILITY_MMX) )
266 p_context->dsp_mask |= FF_MM_MMX;
268 if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
270 p_context->dsp_mask |= FF_MM_MMXEXT;
272 if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
274 p_context->dsp_mask |= FF_MM_3DNOW;
276 if( !(i_cpu & CPU_CAPABILITY_SSE) )
278 p_context->dsp_mask |= FF_MM_SSE;
279 p_context->dsp_mask |= FF_MM_SSE2;
282 config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
284 var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
285 p_sys->i_key_int = val.i_int;
287 var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
288 p_sys->i_b_frames = val.i_int;
290 var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
291 p_sys->i_vtolerance = val.i_int;
293 var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
294 p_sys->b_interlace = val.b_bool;
296 var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
297 p_sys->b_interlace_me = val.b_bool;
299 var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
300 p_sys->b_pre_me = val.b_bool;
302 var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
303 p_sys->b_hurry_up = val.b_bool;
304 if( p_sys->b_hurry_up )
306 /* hurry up mode needs noise reduction, even small */
307 p_sys->i_noise_reduction = 1;
310 var_Get( p_enc, ENC_CFG_PREFIX "strict-rc", &val );
311 p_sys->b_strict_rc = val.b_bool;
312 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
313 p_sys->i_rc_buffer_size = val.i_int;
314 var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
315 p_sys->f_rc_buffer_aggressivity = val.f_float;
317 var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
318 p_sys->f_i_quant_factor = val.f_float;
320 var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
321 p_sys->i_noise_reduction = val.i_int;
323 var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
324 p_sys->b_mpeg4_matrix = val.b_bool;
326 var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
327 if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
328 p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
330 var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
331 if( val.psz_string && *val.psz_string )
333 if( !strcmp( val.psz_string, "rd" ) )
334 p_sys->i_hq = FF_MB_DECISION_RD;
335 else if( !strcmp( val.psz_string, "bits" ) )
336 p_sys->i_hq = FF_MB_DECISION_BITS;
337 else if( !strcmp( val.psz_string, "simple" ) )
338 p_sys->i_hq = FF_MB_DECISION_SIMPLE;
340 p_sys->i_hq = FF_MB_DECISION_RD;
342 if( val.psz_string ) free( val.psz_string );
344 var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
345 p_sys->i_qmin = val.i_int;
346 var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
347 p_sys->i_qmax = val.i_int;
348 var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
349 p_sys->b_trellis = val.b_bool;
351 var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
352 if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
353 p_context->strict_std_compliance = val.i_int;
355 var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
356 p_sys->f_lumi_masking = val.f_float;
357 var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
358 p_sys->f_dark_masking = val.f_float;
359 var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
360 p_sys->f_p_masking = val.f_float;
361 var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
362 p_sys->f_border_masking = val.f_float;
363 var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
364 p_sys->i_luma_elim = val.i_int;
365 var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
366 p_sys->i_chroma_elim = val.i_int;
368 if( p_enc->fmt_in.i_cat == VIDEO_ES )
370 int i_aspect_num, i_aspect_den;
372 if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
374 msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
375 p_enc->fmt_in.video.i_height );
380 p_context->width = p_enc->fmt_in.video.i_width;
381 p_context->height = p_enc->fmt_in.video.i_height;
382 if( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v')
383 && (p_context->width > 720 || p_context->height > 576) )
384 p_context->level = 4; /* High level */
386 p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
387 p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
389 /* Defaults from ffmpeg.c */
390 p_context->qblur = 0.5;
391 p_context->qcompress = 0.5;
392 p_context->b_quant_offset = 1.25;
393 p_context->b_quant_factor = 1.25;
394 p_context->i_quant_offset = 0.0;
395 p_context->i_quant_factor = -0.8;
397 p_context->lumi_masking = p_sys->f_lumi_masking;
398 p_context->dark_masking = p_sys->f_dark_masking;
399 p_context->p_masking = p_sys->f_p_masking;
400 p_context->border_masking = p_sys->f_border_masking;
401 p_context->luma_elim_threshold = p_sys->i_luma_elim;
402 p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
404 if( p_sys->i_key_int > 0 )
405 p_context->gop_size = p_sys->i_key_int;
406 p_context->max_b_frames =
407 __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
408 p_context->b_frame_strategy = 0;
409 if( !p_context->max_b_frames &&
410 ( p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
411 p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
412 p_context->flags |= CODEC_FLAG_LOW_DELAY;
414 av_reduce( &i_aspect_num, &i_aspect_den,
415 p_enc->fmt_in.video.i_aspect,
416 VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
417 av_reduce( &p_context->sample_aspect_ratio.num,
418 &p_context->sample_aspect_ratio.den,
419 i_aspect_num * (int64_t)p_context->height,
420 i_aspect_den * (int64_t)p_context->width, 1 << 30 );
422 p_sys->p_buffer_out = malloc( p_context->height * p_context->width * 3 );
424 p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
425 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
426 if( p_codec->pix_fmts )
428 const enum PixelFormat *p = p_codec->pix_fmts;
429 for( ; *p != -1; p++ )
431 if( *p == p_context->pix_fmt ) break;
433 if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
434 p_enc->fmt_in.i_codec = E_(GetVlcChroma)( p_context->pix_fmt );
437 if ( p_sys->b_strict_rc )
439 p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
440 p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
441 /* This is from ffmpeg's ffmpeg.c : */
442 p_context->rc_initial_buffer_occupancy
443 = p_sys->i_rc_buffer_size * 3/4;
444 p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
447 if ( p_sys->f_i_quant_factor != 0.0 )
448 p_context->i_quant_factor = p_sys->f_i_quant_factor;
450 p_context->noise_reduction = p_sys->i_noise_reduction;
452 if ( p_sys->b_mpeg4_matrix )
454 p_context->intra_matrix = mpeg4_default_intra_matrix;
455 p_context->inter_matrix = mpeg4_default_non_intra_matrix;
458 if ( p_sys->b_pre_me )
460 p_context->pre_me = 1;
461 p_context->me_pre_cmp = FF_CMP_CHROMA;
464 if ( p_sys->b_interlace )
466 if ( p_context->height <= 280 )
468 if ( p_context->height != 16 || p_context->width != 16 )
470 "disabling interlaced video because height=%d <= 280",
475 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
476 if ( p_sys->b_interlace_me )
477 p_context->flags |= CODEC_FLAG_INTERLACED_ME;
481 if ( p_sys->b_trellis )
482 p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
484 if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
485 p_context->flags |= CODEC_FLAG_QSCALE;
487 if ( p_enc->i_threads >= 1 )
488 p_context->thread_count = p_enc->i_threads;
490 if( p_sys->i_vtolerance > 0 )
491 p_context->bit_rate_tolerance = p_sys->i_vtolerance;
493 if( p_sys->i_qmin > 0 )
494 p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
495 if( p_sys->i_qmax > 0 )
496 p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
497 p_context->max_qdiff = 3;
499 p_context->mb_decision = p_sys->i_hq;
501 if( p_sys->i_quality )
503 p_context->flags |= CODEC_FLAG_QSCALE;
504 p_context->global_quality = p_sys->i_quality;
507 else if( p_enc->fmt_in.i_cat == AUDIO_ES )
509 /* work around bug in libmp3lame encoding */
510 if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
511 p_enc->fmt_in.audio.i_channels = 2;
513 p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
514 p_context->sample_rate = p_enc->fmt_in.audio.i_rate;
515 p_context->channels = p_enc->fmt_in.audio.i_channels;
518 /* Misc parameters */
519 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
521 if( i_codec_id == CODEC_ID_RAWVIDEO )
523 /* XXX: hack: Force same codec (will be handled by transcode) */
524 p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
525 p_context->pix_fmt = E_(GetFfmpegChroma)( p_enc->fmt_in.i_codec );
528 /* Make sure we get extradata filled by the encoder */
529 p_context->extradata_size = 0;
530 p_context->extradata = NULL;
531 p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
533 vlc_mutex_lock( lock );
534 if( avcodec_open( p_context, p_codec ) )
536 vlc_mutex_unlock( lock );
537 if( p_enc->fmt_in.i_cat == AUDIO_ES &&
538 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
539 || i_codec_id == CODEC_ID_MP3) )
541 if( p_context->channels > 2 )
543 p_context->channels = 2;
544 p_enc->fmt_in.audio.i_channels = 2; // FIXME
545 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
548 if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
552 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
554 if ( p_enc->fmt_out.audio.i_rate
555 == mpa_freq_tab[i_frequency] )
558 if ( i_frequency == 6 )
560 msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
561 p_enc->fmt_out.audio.i_rate );
566 for ( i = 1; i < 14; i++ )
568 if ( p_enc->fmt_out.i_bitrate / 1000
569 <= mpa_bitrate_tab[i_frequency / 3][i] )
572 if ( p_enc->fmt_out.i_bitrate / 1000
573 != mpa_bitrate_tab[i_frequency / 3][i] )
576 "MPEG audio doesn't support bitrate=%d, using %d",
577 p_enc->fmt_out.i_bitrate,
578 mpa_bitrate_tab[i_frequency / 3][i] * 1000 );
579 p_enc->fmt_out.i_bitrate =
580 mpa_bitrate_tab[i_frequency / 3][i] * 1000;
581 p_context->bit_rate = p_enc->fmt_out.i_bitrate;
585 p_context->codec = NULL;
586 vlc_mutex_lock( lock );
587 if( avcodec_open( p_context, p_codec ) )
589 vlc_mutex_unlock( lock );
590 msg_Err( p_enc, "cannot open encoder" );
591 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
592 _("VLC could not open the encoder.") );
599 msg_Err( p_enc, "cannot open encoder" );
600 intf_UserFatal( p_enc, VLC_FALSE, _("Streaming / Transcoding failed"),
601 _("VLC could not open the encoder.") );
606 vlc_mutex_unlock( lock);
608 p_enc->fmt_out.i_extra = p_context->extradata_size;
609 if( p_enc->fmt_out.i_extra )
611 p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
612 memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
613 p_enc->fmt_out.i_extra );
615 p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
617 if( p_enc->fmt_in.i_cat == AUDIO_ES )
619 p_sys->p_buffer_out = malloc( 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE );
620 p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
621 p_sys->p_buffer = malloc( p_sys->i_frame_size );
622 p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
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 : (int64_t)AV_NOPTS_VALUE;
762 if ( p_sys->b_hurry_up && frame.pts != (int64_t)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 = (int64_t)AV_NOPTS_VALUE;
805 if ( frame.pts != (int64_t)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 != (int64_t)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_mutex_t *lock = var_GetGlobalMutex( "avcodec" );
1008 if ( p_sys->b_inited && p_enc->i_threads >= 1 )
1011 struct thread_context_t ** pp_contexts =
1012 (struct thread_context_t **)p_sys->p_context->thread_opaque;
1013 for ( i = 0; i < p_enc->i_threads; i++ )
1015 vlc_object_kill( pp_contexts[i] );
1016 vlc_cond_signal( &pp_contexts[i]->cond );
1017 vlc_thread_join( pp_contexts[i] );
1018 vlc_mutex_destroy( &pp_contexts[i]->lock );
1019 vlc_cond_destroy( &pp_contexts[i]->cond );
1020 vlc_object_destroy( pp_contexts[i] );
1023 free( pp_contexts );
1026 vlc_mutex_lock( lock );
1027 avcodec_close( p_sys->p_context );
1028 vlc_mutex_unlock( lock );
1029 av_free( p_sys->p_context );
1031 if( p_sys->p_buffer ) free( p_sys->p_buffer );
1032 if( p_sys->p_buffer_out ) free( p_sys->p_buffer_out );