encoder.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:35k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * encoder.c: video and audio encoder using the ffmpeg library
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 the VideoLAN team
  5.  * $Id: 40dcb2bc9cc4a2344268a369a1f6b60d12cd6861 $
  6.  *
  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)
  12.  *
  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.
  17.  *
  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.
  22.  *
  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.  *****************************************************************************/
  27. /*****************************************************************************
  28.  * Preamble
  29.  *****************************************************************************/
  30. #ifdef HAVE_CONFIG_H
  31. # include "config.h"
  32. #endif
  33. #include <vlc_common.h>
  34. #include <vlc_vout.h>
  35. #include <vlc_aout.h>
  36. #include <vlc_sout.h>
  37. #include <vlc_codec.h>
  38. #include <vlc_dialog.h>
  39. #include <vlc_avcodec.h>
  40. /* ffmpeg header */
  41. #define HAVE_MMX 1
  42. #ifdef HAVE_LIBAVCODEC_AVCODEC_H
  43. #   include <libavcodec/avcodec.h>
  44. #elif defined(HAVE_FFMPEG_AVCODEC_H)
  45. #   include <ffmpeg/avcodec.h>
  46. #else
  47. #   include <avcodec.h>
  48. #endif
  49. #include "avcodec.h"
  50. #define HURRY_UP_GUARD1 (450000)
  51. #define HURRY_UP_GUARD2 (300000)
  52. #define HURRY_UP_GUARD3 (100000)
  53. #define MAX_FRAME_DELAY (FF_MAX_B_FRAMES + 2)
  54. /*****************************************************************************
  55.  * Local prototypes
  56.  *****************************************************************************/
  57. int  OpenEncoder ( vlc_object_t * );
  58. void CloseEncoder( vlc_object_t * );
  59. static block_t *EncodeVideo( encoder_t *, picture_t * );
  60. static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
  61. struct thread_context_t;
  62. /*****************************************************************************
  63.  * thread_context_t : for multithreaded encoding
  64.  *****************************************************************************/
  65. struct thread_context_t
  66. {
  67.     VLC_COMMON_MEMBERS
  68.     AVCodecContext  *p_context;
  69.     int             (* pf_func)(AVCodecContext *c, void *arg);
  70.     void            *arg;
  71.     int             i_ret;
  72.     vlc_mutex_t     lock;
  73.     vlc_cond_t      cond;
  74.     bool            b_work, b_done;
  75. };
  76. /*****************************************************************************
  77.  * encoder_sys_t : ffmpeg encoder descriptor
  78.  *****************************************************************************/
  79. struct encoder_sys_t
  80. {
  81.     /*
  82.      * Ffmpeg properties
  83.      */
  84.     AVCodec         *p_codec;
  85.     AVCodecContext  *p_context;
  86.     /*
  87.      * Common properties
  88.      */
  89.     char *p_buffer;
  90.     uint8_t *p_buffer_out;
  91.     size_t i_buffer_out;
  92.     /*
  93.      * Video properties
  94.      */
  95.     mtime_t i_last_ref_pts;
  96.     mtime_t i_buggy_pts_detect;
  97.     mtime_t i_last_pts;
  98.     bool    b_inited;
  99.     /*
  100.      * Audio properties
  101.      */
  102.     int i_frame_size;
  103.     int i_samples_delay;
  104.     mtime_t i_pts;
  105.     /* Encoding settings */
  106.     int        i_key_int;
  107.     int        i_b_frames;
  108.     int        i_vtolerance;
  109.     int        i_qmin;
  110.     int        i_qmax;
  111.     int        i_hq;
  112.     int        i_rc_buffer_size;
  113.     float      f_rc_buffer_aggressivity;
  114.     bool       b_pre_me;
  115.     bool       b_hurry_up;
  116.     bool       b_interlace, b_interlace_me;
  117.     float      f_i_quant_factor;
  118.     int        i_noise_reduction;
  119.     bool       b_mpeg4_matrix;
  120.     bool       b_trellis;
  121.     int        i_quality; /* for VBR */
  122.     float      f_lumi_masking, f_dark_masking, f_p_masking, f_border_masking;
  123.     int        i_luma_elim, i_chroma_elim;
  124. #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
  125.     int        i_aac_profile; /* AAC profile to use.*/
  126. #endif
  127.     /* Used to work around stupid timestamping behaviour in libavcodec */
  128.     uint64_t i_framenum;
  129.     mtime_t  pi_delay_pts[MAX_FRAME_DELAY];
  130. };
  131. static const char *const ppsz_enc_options[] = {
  132.     "keyint", "bframes", "vt", "qmin", "qmax", "hq",
  133.     "rc-buffer-size", "rc-buffer-aggressivity", "pre-me", "hurry-up",
  134.     "interlace", "i-quant-factor", "noise-reduction", "mpeg4-matrix",
  135.     "trellis", "qscale", "strict", "lumi-masking", "dark-masking",
  136.     "p-masking", "border-masking", "luma-elim-threshold",
  137.     "chroma-elim-threshold",
  138. #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
  139.      "aac-profile",
  140. #endif
  141.      NULL
  142. };
  143. static const uint16_t mpa_bitrate_tab[2][15] =
  144. {
  145.     {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384},
  146.     {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
  147. };
  148. static const uint16_t mpa_freq_tab[6] =
  149. { 44100, 48000, 32000, 22050, 24000, 16000 };
  150. static const uint16_t mpeg4_default_intra_matrix[64] = {
  151.   8, 17, 18, 19, 21, 23, 25, 27,
  152.  17, 18, 19, 21, 23, 25, 27, 28,
  153.  20, 21, 22, 23, 24, 26, 28, 30,
  154.  21, 22, 23, 24, 26, 28, 30, 32,
  155.  22, 23, 24, 26, 28, 30, 32, 35,
  156.  23, 24, 26, 28, 30, 32, 35, 38,
  157.  25, 26, 28, 30, 32, 35, 38, 41,
  158.  27, 28, 30, 32, 35, 38, 41, 45,
  159. };
  160. static const uint16_t mpeg4_default_non_intra_matrix[64] = {
  161.  16, 17, 18, 19, 20, 21, 22, 23,
  162.  17, 18, 19, 20, 21, 22, 23, 24,
  163.  18, 19, 20, 21, 22, 23, 24, 25,
  164.  19, 20, 21, 22, 23, 24, 26, 27,
  165.  20, 21, 22, 23, 25, 26, 27, 28,
  166.  21, 22, 23, 24, 26, 27, 28, 30,
  167.  22, 23, 24, 26, 27, 28, 30, 31,
  168.  23, 24, 25, 27, 28, 30, 31, 33,
  169. };
  170. /*****************************************************************************
  171.  * OpenEncoder: probe the encoder
  172.  *****************************************************************************/
  173. int OpenEncoder( vlc_object_t *p_this )
  174. {
  175.     encoder_t *p_enc = (encoder_t *)p_this;
  176.     encoder_sys_t *p_sys = p_enc->p_sys;
  177.     AVCodecContext *p_context;
  178.     AVCodec *p_codec;
  179.     int i_codec_id, i_cat;
  180.     const char *psz_namecodec;
  181.     vlc_value_t val;
  182.     if( !GetFfmpegCodec( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
  183.                              &psz_namecodec ) )
  184.     {
  185.         if( TestFfmpegChroma( -1, p_enc->fmt_out.i_codec ) != VLC_SUCCESS )
  186.         {
  187.             /* handed chroma output */
  188.             return VLC_EGENERIC;
  189.         }
  190.         i_cat      = VIDEO_ES;
  191.         i_codec_id = CODEC_ID_RAWVIDEO;
  192.         psz_namecodec = "Raw video";
  193.     }
  194.     if( p_enc->fmt_out.i_cat == VIDEO_ES && i_cat != VIDEO_ES )
  195.     {
  196.         msg_Err( p_enc, ""%s" is not a video encoder", psz_namecodec );
  197.         dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
  198.                         _(""%s" is no video encoder."), psz_namecodec );
  199.         return VLC_EGENERIC;
  200.     }
  201.     if( p_enc->fmt_out.i_cat == AUDIO_ES && i_cat != AUDIO_ES )
  202.     {
  203.         msg_Err( p_enc, ""%s" is not an audio encoder", psz_namecodec );
  204.         dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
  205.                         _(""%s" is no audio encoder."), psz_namecodec );
  206.         return VLC_EGENERIC;
  207.     }
  208.     if( p_enc->fmt_out.i_cat == SPU_ES )
  209.     {
  210.         /* We don't support subtitle encoding */
  211.         return VLC_EGENERIC;
  212.     }
  213.     /* Initialization must be done before avcodec_find_encoder() */
  214.     InitLibavcodec( p_this );
  215.     p_codec = avcodec_find_encoder( i_codec_id );
  216.     if( !p_codec )
  217.     {
  218.         msg_Err( p_enc, "cannot find encoder %sn"
  219. "*** Your FFMPEG installation is crippled.   ***n"
  220. "*** Please check with your FFMPEG packager. ***n"
  221. "*** This is NOT a VLC media player issue.   ***", psz_namecodec );
  222.         dialog_Fatal( p_enc, _("Streaming / Transcoding failed"), _(
  223. /* I have had enough of all these MPEG-3 transcoding bug reports.
  224.  * Downstream packager, you had better not patch this out, or I will be really
  225.  * annoyed. Think about it - you don't want to fork the VLC translation files,
  226.  * do you? -- Courmisch, 2008-10-22 */
  227. "It seems your FFMPEG (libavcodec) installation lacks the following encoder:n"
  228. "%s.n"
  229. "If you don't know how to fix this, ask for support from your distribution.n"
  230. "n"
  231. "This is not an error inside VLC media player.n"
  232. "Do not contact the VideoLAN project about this issue.n"),
  233.             psz_namecodec );
  234.         return VLC_EGENERIC;
  235.     }
  236.     /* Allocate the memory needed to store the encoder's structure */
  237.     if( ( p_sys = calloc( 1, sizeof(encoder_sys_t) ) ) == NULL )
  238.         return VLC_ENOMEM;
  239.     p_enc->p_sys = p_sys;
  240.     p_sys->p_codec = p_codec;
  241.     p_enc->pf_encode_video = EncodeVideo;
  242.     p_enc->pf_encode_audio = EncodeAudio;
  243.     p_sys->p_buffer = NULL;
  244.     p_sys->p_buffer_out = NULL;
  245.     p_sys->i_buffer_out = 0;
  246.     p_sys->p_context = p_context = avcodec_alloc_context();
  247.     p_context->debug = config_GetInt( p_enc, "ffmpeg-debug" );
  248.     p_context->opaque = (void *)p_this;
  249.     /* Set CPU capabilities */
  250.     unsigned i_cpu = vlc_CPU();
  251.     p_context->dsp_mask = 0;
  252.     if( !(i_cpu & CPU_CAPABILITY_MMX) )
  253.     {
  254.         p_context->dsp_mask |= FF_MM_MMX;
  255.     }
  256.     if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
  257.     {
  258.         p_context->dsp_mask |= FF_MM_MMXEXT;
  259.     }
  260.     if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
  261.     {
  262.         p_context->dsp_mask |= FF_MM_3DNOW;
  263.     }
  264.     if( !(i_cpu & CPU_CAPABILITY_SSE) )
  265.     {
  266.         p_context->dsp_mask |= FF_MM_SSE;
  267.         p_context->dsp_mask |= FF_MM_SSE2;
  268.     }
  269.     config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
  270.     var_Get( p_enc, ENC_CFG_PREFIX "keyint", &val );
  271.     p_sys->i_key_int = val.i_int;
  272.     var_Get( p_enc, ENC_CFG_PREFIX "bframes", &val );
  273.     p_sys->i_b_frames = val.i_int;
  274.     var_Get( p_enc, ENC_CFG_PREFIX "vt", &val );
  275.     p_sys->i_vtolerance = val.i_int * 1000;
  276.     var_Get( p_enc, ENC_CFG_PREFIX "interlace", &val );
  277.     p_sys->b_interlace = val.b_bool;
  278.     var_Get( p_enc, ENC_CFG_PREFIX "interlace-me", &val );
  279.     p_sys->b_interlace_me = val.b_bool;
  280.     var_Get( p_enc, ENC_CFG_PREFIX "pre-me", &val );
  281.     p_sys->b_pre_me = val.b_bool;
  282.     var_Get( p_enc, ENC_CFG_PREFIX "hurry-up", &val );
  283.     p_sys->b_hurry_up = val.b_bool;
  284.     if( p_sys->b_hurry_up )
  285.     {
  286.         /* hurry up mode needs noise reduction, even small */
  287.         p_sys->i_noise_reduction = 1;
  288.     }
  289.     var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-size", &val );
  290.     p_sys->i_rc_buffer_size = val.i_int;
  291.     var_Get( p_enc, ENC_CFG_PREFIX "rc-buffer-aggressivity", &val );
  292.     p_sys->f_rc_buffer_aggressivity = val.f_float;
  293.     var_Get( p_enc, ENC_CFG_PREFIX "i-quant-factor", &val );
  294.     p_sys->f_i_quant_factor = val.f_float;
  295.     var_Get( p_enc, ENC_CFG_PREFIX "noise-reduction", &val );
  296.     p_sys->i_noise_reduction = val.i_int;
  297.     var_Get( p_enc, ENC_CFG_PREFIX "mpeg4-matrix", &val );
  298.     p_sys->b_mpeg4_matrix = val.b_bool;
  299.     var_Get( p_enc, ENC_CFG_PREFIX "qscale", &val );
  300.     if( val.f_float < 0.01 || val.f_float > 255.0 ) val.f_float = 0;
  301.     p_sys->i_quality = (int)(FF_QP2LAMBDA * val.f_float + 0.5);
  302.     var_Get( p_enc, ENC_CFG_PREFIX "hq", &val );
  303.     p_sys->i_hq = FF_MB_DECISION_RD;
  304.     if( val.psz_string && *val.psz_string )
  305.     {
  306.         if( !strcmp( val.psz_string, "rd" ) )
  307.             p_sys->i_hq = FF_MB_DECISION_RD;
  308.         else if( !strcmp( val.psz_string, "bits" ) )
  309.             p_sys->i_hq = FF_MB_DECISION_BITS;
  310.         else if( !strcmp( val.psz_string, "simple" ) )
  311.             p_sys->i_hq = FF_MB_DECISION_SIMPLE;
  312.         else
  313.             p_sys->i_hq = FF_MB_DECISION_RD;
  314.     }
  315.     else
  316.         p_sys->i_hq = FF_MB_DECISION_RD;
  317.     free( val.psz_string );
  318.     var_Get( p_enc, ENC_CFG_PREFIX "qmin", &val );
  319.     p_sys->i_qmin = val.i_int;
  320.     var_Get( p_enc, ENC_CFG_PREFIX "qmax", &val );
  321.     p_sys->i_qmax = val.i_int;
  322.     var_Get( p_enc, ENC_CFG_PREFIX "trellis", &val );
  323.     p_sys->b_trellis = val.b_bool;
  324.     var_Get( p_enc, ENC_CFG_PREFIX "strict", &val );
  325.     if( val.i_int < - 1 || val.i_int > 1 ) val.i_int = 0;
  326.     p_context->strict_std_compliance = val.i_int;
  327.     var_Get( p_enc, ENC_CFG_PREFIX "lumi-masking", &val );
  328.     p_sys->f_lumi_masking = val.f_float;
  329.     var_Get( p_enc, ENC_CFG_PREFIX "dark-masking", &val );
  330.     p_sys->f_dark_masking = val.f_float;
  331.     var_Get( p_enc, ENC_CFG_PREFIX "p-masking", &val );
  332.     p_sys->f_p_masking = val.f_float;
  333.     var_Get( p_enc, ENC_CFG_PREFIX "border-masking", &val );
  334.     p_sys->f_border_masking = val.f_float;
  335.     var_Get( p_enc, ENC_CFG_PREFIX "luma-elim-threshold", &val );
  336.     p_sys->i_luma_elim = val.i_int;
  337.     var_Get( p_enc, ENC_CFG_PREFIX "chroma-elim-threshold", &val );
  338.     p_sys->i_chroma_elim = val.i_int;
  339. #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
  340.     var_Get( p_enc, ENC_CFG_PREFIX "aac-profile", &val );
  341.     /* ffmpeg uses faac encoder atm, and it has issues with
  342.      * other than low-complexity profile, so default to that */
  343.     p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
  344.     if( val.psz_string && *val.psz_string )
  345.     {
  346.         if( !strncmp( val.psz_string, "main", 4 ) )
  347.             p_sys->i_aac_profile = FF_PROFILE_AAC_MAIN;
  348.         else if( !strncmp( val.psz_string, "low", 3 ) )
  349.             p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
  350. #if 0    /* Not supported by FAAC encoder */
  351.         else if( !strncmp( val.psz_string, "ssr", 3 ) )
  352.             p_sys->i_aac_profile = FF_PROFILE_AAC_SSR;
  353. #endif
  354.         else  if( !strncmp( val.psz_string, "ltp", 3 ) )
  355.             p_sys->i_aac_profile = FF_PROFILE_AAC_LTP;
  356.         else
  357.         {
  358.             msg_Warn( p_enc, "unknown AAC profile requested, setting it to low" );
  359.             p_sys->i_aac_profile = FF_PROFILE_AAC_LOW;
  360.         }
  361.     }
  362.     free( val.psz_string );
  363. #endif
  364.     if( p_enc->fmt_in.i_cat == VIDEO_ES )
  365.     {
  366.         int i_aspect_num, i_aspect_den;
  367.         if( !p_enc->fmt_in.video.i_width || !p_enc->fmt_in.video.i_height )
  368.         {
  369.             msg_Warn( p_enc, "invalid size %ix%i", p_enc->fmt_in.video.i_width,
  370.                       p_enc->fmt_in.video.i_height );
  371.             free( p_sys );
  372.             return VLC_EGENERIC;
  373.         }
  374.         p_context->width = p_enc->fmt_in.video.i_width;
  375.         p_context->height = p_enc->fmt_in.video.i_height;
  376.         p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base;
  377.         p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate;
  378.         /* Defaults from ffmpeg.c */
  379.         p_context->qblur = 0.5;
  380.         p_context->qcompress = 0.5;
  381.         p_context->b_quant_offset = 1.25;
  382.         p_context->b_quant_factor = 1.25;
  383.         p_context->i_quant_offset = 0.0;
  384.         p_context->i_quant_factor = -0.8;
  385.         p_context->lumi_masking = p_sys->f_lumi_masking;
  386.         p_context->dark_masking = p_sys->f_dark_masking;
  387.         p_context->p_masking = p_sys->f_p_masking;
  388.         p_context->border_masking = p_sys->f_border_masking;
  389.         p_context->luma_elim_threshold = p_sys->i_luma_elim;
  390.         p_context->chroma_elim_threshold = p_sys->i_chroma_elim;
  391.         if( p_sys->i_key_int > 0 )
  392.             p_context->gop_size = p_sys->i_key_int;
  393.         p_context->max_b_frames =
  394.             __MAX( __MIN( p_sys->i_b_frames, FF_MAX_B_FRAMES ), 0 );
  395.         p_context->b_frame_strategy = 0;
  396.         if( !p_context->max_b_frames  &&
  397.             (  p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '2', 'v') ||
  398.                p_enc->fmt_out.i_codec == VLC_FOURCC('m', 'p', '1', 'v') ) )
  399.             p_context->flags |= CODEC_FLAG_LOW_DELAY;
  400.         av_reduce( &i_aspect_num, &i_aspect_den,
  401.                    p_enc->fmt_in.video.i_aspect,
  402.                    VOUT_ASPECT_FACTOR, 1 << 30 /* something big */ );
  403.         av_reduce( &p_context->sample_aspect_ratio.num,
  404.                    &p_context->sample_aspect_ratio.den,
  405.                    i_aspect_num * (int64_t)p_context->height,
  406.                    i_aspect_den * (int64_t)p_context->width, 1 << 30 );
  407.         p_sys->i_buffer_out = p_context->height * p_context->width * 3;
  408.         if( p_sys->i_buffer_out < FF_MIN_BUFFER_SIZE )
  409.             p_sys->i_buffer_out = FF_MIN_BUFFER_SIZE;
  410.         p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
  411.         p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
  412.         p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
  413.         GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
  414.         if( p_codec->pix_fmts )
  415.         {
  416.             const enum PixelFormat *p = p_codec->pix_fmts;
  417.             for( ; *p != -1; p++ )
  418.             {
  419.                 if( *p == p_context->pix_fmt ) break;
  420.             }
  421.             if( *p == -1 ) p_context->pix_fmt = p_codec->pix_fmts[0];
  422.             GetVlcChroma( &p_enc->fmt_in.video, p_context->pix_fmt );
  423.             p_enc->fmt_in.i_codec = p_enc->fmt_in.video.i_chroma;
  424.         }
  425.         if ( p_sys->f_i_quant_factor != 0.0 )
  426.             p_context->i_quant_factor = p_sys->f_i_quant_factor;
  427.         p_context->noise_reduction = p_sys->i_noise_reduction;
  428.         if ( p_sys->b_mpeg4_matrix )
  429.         {
  430.             p_context->intra_matrix = mpeg4_default_intra_matrix;
  431.             p_context->inter_matrix = mpeg4_default_non_intra_matrix;
  432.         }
  433.         if ( p_sys->b_pre_me )
  434.         {
  435.             p_context->pre_me = 1;
  436.             p_context->me_pre_cmp = FF_CMP_CHROMA;
  437.         }
  438.         if ( p_sys->b_interlace )
  439.         {
  440.             if ( p_context->height <= 280 )
  441.             {
  442.                 if ( p_context->height != 16 || p_context->width != 16 )
  443.                     msg_Warn( p_enc,
  444.                         "disabling interlaced video because height=%d <= 280",
  445.                         p_context->height );
  446.             }
  447.             else
  448.             {
  449.                 p_context->flags |= CODEC_FLAG_INTERLACED_DCT;
  450.                 if ( p_sys->b_interlace_me )
  451.                     p_context->flags |= CODEC_FLAG_INTERLACED_ME;
  452.             }
  453.         }
  454. #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
  455.         if ( p_sys->b_trellis )
  456.             p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
  457. #else
  458.         p_context->trellis = p_sys->b_trellis;
  459. #endif
  460.         if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
  461.             p_context->flags |= CODEC_FLAG_QSCALE;
  462.         if ( p_enc->i_threads >= 1 )
  463.             avcodec_thread_init( p_context, p_enc->i_threads );
  464.         if( p_sys->i_vtolerance > 0 )
  465.             p_context->bit_rate_tolerance = p_sys->i_vtolerance;
  466.         /* usually if someone sets bitrate, he likes more to get that bitrate
  467.          * over quality should help 'normal' user to get asked bitrate
  468.          */
  469.         if( p_enc->fmt_out.i_bitrate > 0 && p_sys->i_qmax == 0 && p_sys->i_qmin == 0 )
  470.         {
  471.             p_sys->i_qmax = 51;
  472.             p_sys->i_qmin = 3;
  473.         }
  474.         if( p_sys->i_qmin > 0 )
  475.         {
  476.             p_context->mb_qmin = p_context->qmin = p_sys->i_qmin;
  477.             p_context->mb_lmin = p_context->lmin = p_sys->i_qmin * FF_QP2LAMBDA;
  478.         }
  479.         if( p_sys->i_qmax > 0 )
  480.         {
  481.             p_context->mb_qmax = p_context->qmax = p_sys->i_qmax;
  482.             p_context->mb_lmax = p_context->lmax = p_sys->i_qmax * FF_QP2LAMBDA;
  483.         }
  484.         p_context->max_qdiff = 3;
  485.         p_context->mb_decision = p_sys->i_hq;
  486.         if( p_sys->i_quality )
  487.         {
  488.             p_context->flags |= CODEC_FLAG_QSCALE;
  489.             p_context->global_quality = p_sys->i_quality;
  490.         }
  491.         else
  492.         {
  493.             p_context->rc_qsquish = 1.0;
  494.             p_context->rc_max_rate = p_enc->fmt_out.i_bitrate;
  495.             p_context->rc_min_rate = p_enc->fmt_out.i_bitrate;
  496.             p_context->rc_buffer_size = p_sys->i_rc_buffer_size;
  497.             /* This is from ffmpeg's ffmpeg.c : */
  498.             p_context->rc_initial_buffer_occupancy
  499.                 = p_sys->i_rc_buffer_size * 3/4;
  500.             p_context->rc_buffer_aggressivity = p_sys->f_rc_buffer_aggressivity;
  501.         }
  502.     }
  503.     else if( p_enc->fmt_in.i_cat == AUDIO_ES )
  504.     {
  505.         /* work around bug in libmp3lame encoding */
  506.         if( i_codec_id == CODEC_ID_MP3 && p_enc->fmt_in.audio.i_channels > 2 )
  507.             p_enc->fmt_in.audio.i_channels = 2;
  508.         p_enc->fmt_in.i_codec  = AOUT_FMT_S16_NE;
  509.         p_context->sample_rate = p_enc->fmt_out.audio.i_rate;
  510.         p_context->channels    = p_enc->fmt_out.audio.i_channels;
  511.         if ( p_enc->fmt_out.i_codec == VLC_FOURCC('m','p','4','a') )
  512.         {
  513.             /* XXX: FAAC does resample only when setting the INPUT samplerate
  514.              * to the desired value (-R option of the faac frontend)
  515.             p_enc->fmt_in.audio.i_rate = p_context->sample_rate;*/
  516. #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
  517.             /* vlc should default to low-complexity profile, faac encoder
  518.              * has bug and aac audio has issues otherwise atm */
  519.             p_context->profile = p_sys->i_aac_profile;
  520. #endif
  521.         }
  522.     }
  523.     /* Misc parameters */
  524.     p_context->bit_rate = p_enc->fmt_out.i_bitrate;
  525.     if( i_codec_id == CODEC_ID_RAWVIDEO )
  526.     {
  527.         /* XXX: hack: Force same codec (will be handled by transcode) */
  528.         p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
  529.         GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
  530.     }
  531.     /* Make sure we get extradata filled by the encoder */
  532.     p_context->extradata_size = 0;
  533.     p_context->extradata = NULL;
  534.     p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
  535.     int ret;
  536.     vlc_avcodec_lock();
  537.     ret = avcodec_open( p_context, p_codec );
  538.     vlc_avcodec_unlock();
  539.     if( ret )
  540.     {
  541.         if( p_enc->fmt_in.i_cat == AUDIO_ES &&
  542.              (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
  543.                || i_codec_id == CODEC_ID_MP3) )
  544.         {
  545.             if( p_context->channels > 2 )
  546.             {
  547.                 p_context->channels = 2;
  548.                 p_enc->fmt_in.audio.i_channels = 2; // FIXME
  549.                 msg_Warn( p_enc, "stereo mode selected (codec limitation)" );
  550.             }
  551.             if( i_codec_id == CODEC_ID_MP2 || i_codec_id == CODEC_ID_MP3 )
  552.             {
  553.                 int i_frequency, i;
  554.                 for ( i_frequency = 0; i_frequency < 6; i_frequency++ )
  555.                 {
  556.                     if ( p_enc->fmt_out.audio.i_rate
  557.                             == mpa_freq_tab[i_frequency] )
  558.                         break;
  559.                 }
  560.                 if ( i_frequency == 6 )
  561.                 {
  562.                     msg_Err( p_enc, "MPEG audio doesn't support frequency=%d",
  563.                              p_enc->fmt_out.audio.i_rate );
  564.                     free( p_sys );
  565.                     return VLC_EGENERIC;
  566.                 }
  567.                 for ( i = 1; i < 14; i++ )
  568.                 {
  569.                     if ( p_enc->fmt_out.i_bitrate / 1000
  570.                           <= mpa_bitrate_tab[i_frequency / 3][i] )
  571.                         break;
  572.                 }
  573.                 if ( p_enc->fmt_out.i_bitrate / 1000
  574.                       != mpa_bitrate_tab[i_frequency / 3][i] )
  575.                 {
  576.                     msg_Warn( p_enc,
  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;
  583.                 }
  584.             }
  585.             p_context->codec = NULL;
  586.             vlc_avcodec_lock();
  587.             ret = avcodec_open( p_context, p_codec );
  588.             vlc_avcodec_unlock();
  589.             if( ret )
  590.             {
  591.                 msg_Err( p_enc, "cannot open encoder" );
  592.                 dialog_Fatal( p_enc,
  593.                                 _("Streaming / Transcoding failed"),
  594.                                 "%s", _("VLC could not open the encoder.") );
  595.                 free( p_sys );
  596.                 return VLC_EGENERIC;
  597.             }
  598.         }
  599.         else
  600.         {
  601.             msg_Err( p_enc, "cannot open encoder" );
  602.             dialog_Fatal( p_enc, _("Streaming / Transcoding failed"),
  603.                             "%s", _("VLC could not open the encoder.") );
  604.             free( p_sys );
  605.             return VLC_EGENERIC;
  606.         }
  607.     }
  608.     if( i_codec_id == CODEC_ID_FLAC )
  609.     {
  610.         p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
  611.         p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
  612.         if( p_enc->fmt_out.p_extra )
  613.         {
  614.             uint8_t *p = p_enc->fmt_out.p_extra;
  615.             p[0] = 0x66;    /* f */
  616.             p[1] = 0x4C;    /* L */
  617.             p[2] = 0x61;    /* a */
  618.             p[3] = 0x43;    /* C */
  619.             p[4] = 0x80;    /* streaminfo block, last block before audio */
  620.             p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
  621.             p[6] = ( p_context->extradata_size >>  8 ) & 0xff;
  622.             p[7] = ( p_context->extradata_size       ) & 0xff;
  623.             memcpy( &p[8], p_context->extradata, p_context->extradata_size );
  624.         }
  625.         else
  626.         {
  627.             p_enc->fmt_out.i_extra = 0;
  628.         }
  629.     }
  630.     else
  631.     {
  632.         p_enc->fmt_out.i_extra = p_context->extradata_size;
  633.         if( p_enc->fmt_out.i_extra )
  634.         {
  635.             p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
  636.             memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
  637.                     p_enc->fmt_out.i_extra );
  638.         }
  639.     }
  640.     p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
  641.     if( p_enc->fmt_in.i_cat == AUDIO_ES )
  642.     {
  643.         p_sys->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;
  644.         p_sys->p_buffer_out = malloc( p_sys->i_buffer_out );
  645.         p_sys->i_frame_size = p_context->frame_size * 2 * p_context->channels;
  646.         p_sys->p_buffer = malloc( p_sys->i_frame_size );
  647.         p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
  648.     }
  649.     msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
  650.     return VLC_SUCCESS;
  651. }
  652. /****************************************************************************
  653.  * EncodeVideo: the whole thing
  654.  ****************************************************************************/
  655. static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
  656. {
  657.     encoder_sys_t *p_sys = p_enc->p_sys;
  658.     AVFrame frame;
  659.     int i_out, i_plane;
  660.     memset( &frame, 0, sizeof( AVFrame ) );
  661.     for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
  662.     {
  663.         frame.data[i_plane] = p_pict->p[i_plane].p_pixels;
  664.         frame.linesize[i_plane] = p_pict->p[i_plane].i_pitch;
  665.     }
  666.     /* Let ffmpeg select the frame type */
  667.     frame.pict_type = 0;
  668.     frame.repeat_pict = p_pict->i_nb_fields - 2;
  669.     frame.interlaced_frame = !p_pict->b_progressive;
  670.     frame.top_field_first = !!p_pict->b_top_field_first;
  671.     /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
  672.     if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )
  673.     {
  674.         frame.pts = p_pict->date ? p_pict->date : (int64_t)AV_NOPTS_VALUE;
  675.         if ( p_sys->b_hurry_up && frame.pts != (int64_t)AV_NOPTS_VALUE )
  676.         {
  677.             mtime_t current_date = mdate();
  678.             if ( current_date + HURRY_UP_GUARD3 > frame.pts )
  679.             {
  680.                 p_sys->p_context->mb_decision = FF_MB_DECISION_SIMPLE;
  681. #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
  682.                 p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
  683. #else
  684.                 p_sys->p_context->trellis = 0;
  685. #endif
  686.                 msg_Dbg( p_enc, "hurry up mode 3" );
  687.             }
  688.             else
  689.             {
  690.                 p_sys->p_context->mb_decision = p_sys->i_hq;
  691.                 if ( current_date + HURRY_UP_GUARD2 > frame.pts )
  692.                 {
  693. #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
  694.                     p_sys->p_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;
  695. #else
  696.                     p_sys->p_context->trellis = 0;
  697. #endif
  698.                     p_sys->p_context->noise_reduction = p_sys->i_noise_reduction
  699.                          + (HURRY_UP_GUARD2 + current_date - frame.pts) / 500;
  700.                     msg_Dbg( p_enc, "hurry up mode 2" );
  701.                 }
  702.                 else
  703.                 {
  704. #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
  705.                     if ( p_sys->b_trellis )
  706.                         p_sys->p_context->flags |= CODEC_FLAG_TRELLIS_QUANT;
  707. #else
  708.                     p_sys->p_context->trellis = p_sys->b_trellis;
  709. #endif
  710.                     p_sys->p_context->noise_reduction =
  711.                         p_sys->i_noise_reduction;
  712.                 }
  713.             }
  714.             if ( current_date + HURRY_UP_GUARD1 > frame.pts )
  715.             {
  716.                 frame.pict_type = FF_P_TYPE;
  717.                 /* msg_Dbg( p_enc, "hurry up mode 1 %lld", current_date + HURRY_UP_GUARD1 - frame.pts ); */
  718.             }
  719.         }
  720.     }
  721.     else
  722.     {
  723.         frame.pts = (int64_t)AV_NOPTS_VALUE;
  724.     }
  725.     if ( frame.pts != (int64_t)AV_NOPTS_VALUE && frame.pts != 0 )
  726.     {
  727.         if ( p_sys->i_last_pts == frame.pts )
  728.         {
  729.             msg_Warn( p_enc, "almost fed libavcodec with two frames with the "
  730.                       "same PTS (%"PRId64 ")", frame.pts );
  731.             return NULL;
  732.         }
  733.         else if ( p_sys->i_last_pts > frame.pts )
  734.         {
  735.             msg_Warn( p_enc, "almost fed libavcodec with a frame in the "
  736.                       "past (current: %"PRId64 ", last: %"PRId64")",
  737.                       frame.pts, p_sys->i_last_pts );
  738.             return NULL;
  739.         }
  740.         else
  741.         {
  742.             p_sys->i_last_pts = frame.pts;
  743.         }
  744.     }
  745.     frame.quality = p_sys->i_quality;
  746.     /* Ugly work-around for stupid libavcodec behaviour */
  747.     p_sys->i_framenum++;
  748.     p_sys->pi_delay_pts[p_sys->i_framenum % MAX_FRAME_DELAY] = frame.pts;
  749.     frame.pts = p_sys->i_framenum * AV_TIME_BASE *
  750.         p_enc->fmt_in.video.i_frame_rate_base;
  751.     frame.pts += p_enc->fmt_in.video.i_frame_rate - 1;
  752.     frame.pts /= p_enc->fmt_in.video.i_frame_rate;
  753.     /* End work-around */
  754.     i_out = avcodec_encode_video( p_sys->p_context, p_sys->p_buffer_out,
  755.                                   p_sys->i_buffer_out, &frame );
  756.     if( i_out > 0 )
  757.     {
  758.         block_t *p_block = block_New( p_enc, i_out );
  759.         memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
  760.         /* FIXME, 3-2 pulldown is not handled correctly */
  761.         p_block->i_length = INT64_C(1000000) *
  762.             p_enc->fmt_in.video.i_frame_rate_base /
  763.                 p_enc->fmt_in.video.i_frame_rate;
  764.         if( !p_sys->p_context->max_b_frames || !p_sys->p_context->delay )
  765.         {
  766.             /* No delay -> output pts == input pts */
  767.             p_block->i_pts = p_block->i_dts = p_pict->date;
  768.         }
  769.         else if( p_sys->p_context->coded_frame->pts != (int64_t)AV_NOPTS_VALUE &&
  770.             p_sys->p_context->coded_frame->pts != 0 &&
  771.             p_sys->i_buggy_pts_detect != p_sys->p_context->coded_frame->pts )
  772.         {
  773.             p_sys->i_buggy_pts_detect = p_sys->p_context->coded_frame->pts;
  774.             p_block->i_pts = p_sys->p_context->coded_frame->pts;
  775.             /* Ugly work-around for stupid libavcodec behaviour */
  776.             {
  777.                 int64_t i_framenum = p_block->i_pts *
  778.                     p_enc->fmt_in.video.i_frame_rate /
  779.                     p_enc->fmt_in.video.i_frame_rate_base / AV_TIME_BASE;
  780.                 p_block->i_pts = p_sys->pi_delay_pts[i_framenum % MAX_FRAME_DELAY];
  781.             }
  782.             /* End work-around */
  783.             if( p_sys->p_context->coded_frame->pict_type != FF_I_TYPE &&
  784.                 p_sys->p_context->coded_frame->pict_type != FF_P_TYPE )
  785.             {
  786.                 p_block->i_dts = p_block->i_pts;
  787.             }
  788.             else
  789.             {
  790.                 if( p_sys->i_last_ref_pts )
  791.                 {
  792.                     p_block->i_dts = p_sys->i_last_ref_pts;
  793.                 }
  794.                 else
  795.                 {
  796.                     /* Let's put something sensible */
  797.                     p_block->i_dts = p_block->i_pts;
  798.                 }
  799.                 p_sys->i_last_ref_pts = p_block->i_pts;
  800.             }
  801.         }
  802.         else
  803.         {
  804.             /* Buggy libavcodec which doesn't update coded_frame->pts
  805.              * correctly */
  806.             p_block->i_dts = p_block->i_pts = p_pict->date;
  807.         }
  808.         switch ( p_sys->p_context->coded_frame->pict_type )
  809.         {
  810.         case FF_I_TYPE:
  811.             p_block->i_flags |= BLOCK_FLAG_TYPE_I;
  812.             break;
  813.         case FF_P_TYPE:
  814.             p_block->i_flags |= BLOCK_FLAG_TYPE_P;
  815.             break;
  816.         case FF_B_TYPE:
  817.             p_block->i_flags |= BLOCK_FLAG_TYPE_B;
  818.             break;
  819.         }
  820.         return p_block;
  821.     }
  822.     return NULL;
  823. }
  824. /****************************************************************************
  825.  * EncodeAudio: the whole thing
  826.  ****************************************************************************/
  827. static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
  828. {
  829.     encoder_sys_t *p_sys = p_enc->p_sys;
  830.     block_t *p_block, *p_chain = NULL;
  831.     uint8_t *p_buffer = p_aout_buf->p_buffer;
  832.     int i_samples = p_aout_buf->i_nb_samples;
  833.     int i_samples_delay = p_sys->i_samples_delay;
  834.     p_sys->i_pts = p_aout_buf->start_date -
  835.                 (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay /
  836.                 (mtime_t)p_enc->fmt_in.audio.i_rate;
  837.     p_sys->i_samples_delay += i_samples;
  838.     while( p_sys->i_samples_delay >= p_sys->p_context->frame_size )
  839.     {
  840.         int16_t *p_samples;
  841.         int i_out;
  842.         if( i_samples_delay )
  843.         {
  844.             /* Take care of the left-over from last time */
  845.             int i_delay_size = i_samples_delay * 2 *
  846.                                  p_sys->p_context->channels;
  847.             int i_size = p_sys->i_frame_size - i_delay_size;
  848.             p_samples = (int16_t *)p_sys->p_buffer;
  849.             memcpy( p_sys->p_buffer + i_delay_size, p_buffer, i_size );
  850.             p_buffer -= i_delay_size;
  851.             i_samples += i_samples_delay;
  852.             i_samples_delay = 0;
  853.         }
  854.         else
  855.         {
  856.             p_samples = (int16_t *)p_buffer;
  857.         }
  858.         i_out = avcodec_encode_audio( p_sys->p_context, p_sys->p_buffer_out,
  859.                                       p_sys->i_buffer_out, p_samples );
  860. #if 0
  861.         msg_Warn( p_enc, "avcodec_encode_audio: %d", i_out );
  862. #endif
  863.         if( i_out < 0 ) break;
  864.         p_buffer += p_sys->i_frame_size;
  865.         p_sys->i_samples_delay -= p_sys->p_context->frame_size;
  866.         i_samples -= p_sys->p_context->frame_size;
  867.         if( i_out == 0 ) continue;
  868.         p_block = block_New( p_enc, i_out );
  869.         memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
  870.         p_block->i_length = (mtime_t)1000000 *
  871.             (mtime_t)p_sys->p_context->frame_size /
  872.             (mtime_t)p_sys->p_context->sample_rate;
  873.         p_block->i_dts = p_block->i_pts = p_sys->i_pts;
  874.         /* Update pts */
  875.         p_sys->i_pts += p_block->i_length;
  876.         block_ChainAppend( &p_chain, p_block );
  877.     }
  878.     /* Backup the remaining raw samples */
  879.     if( i_samples )
  880.     {
  881.         memcpy( p_sys->p_buffer + i_samples_delay * 2 *
  882.                 p_sys->p_context->channels, p_buffer,
  883.                 i_samples * 2 * p_sys->p_context->channels );
  884.     }
  885.     return p_chain;
  886. }
  887. /*****************************************************************************
  888.  * CloseEncoder: ffmpeg encoder destruction
  889.  *****************************************************************************/
  890. void CloseEncoder( vlc_object_t *p_this )
  891. {
  892.     encoder_t *p_enc = (encoder_t *)p_this;
  893.     encoder_sys_t *p_sys = p_enc->p_sys;
  894.     vlc_avcodec_lock();
  895.     avcodec_close( p_sys->p_context );
  896.     vlc_avcodec_unlock();
  897.     av_free( p_sys->p_context );
  898.     free( p_sys->p_buffer );
  899.     free( p_sys->p_buffer_out );
  900.     free( p_sys );
  901. }