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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * x264.c: h264 video encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2004-2006 the VideoLAN team
  5.  * $Id: 3b91a51be447a2924f114b0e29dbe29c8d21531f $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_plugin.h>
  31. #include <vlc_vout.h>
  32. #include <vlc_sout.h>
  33. #include <vlc_codec.h>
  34. #include <vlc_charset.h>
  35. #ifdef PTW32_STATIC_LIB
  36. #include <pthread.h>
  37. #endif
  38. #include <x264.h>
  39. #define SOUT_CFG_PREFIX "sout-x264-"
  40. /*****************************************************************************
  41.  * Module descriptor
  42.  *****************************************************************************/
  43. static int  Open ( vlc_object_t * );
  44. static void Close( vlc_object_t * );
  45. /* Frame-type options */
  46. #define KEYINT_TEXT N_("Maximum GOP size")
  47. #define KEYINT_LONGTEXT N_( "Sets maximum interval between IDR-frames." 
  48.     "Larger values save bits, thus improving quality for a given bitrate at " 
  49.     "the cost of seeking precision." )
  50. #define MIN_KEYINT_TEXT N_("Minimum GOP size")
  51. #define MIN_KEYINT_LONGTEXT N_( "Sets minimum interval between IDR-frames. " 
  52.     "In H.264, I-frames do not necessarily bound a closed GOP because it is " 
  53.     "allowable for a P-frame to be predicted from more frames than just the " 
  54.     "one frame before it (also see reference frame option). Therefore, " 
  55.     "I-frames are not necessarily seekable. IDR-frames restrict subsequent " 
  56.     "P-frames from referring to any frame prior to the IDR-frame. n" 
  57.     "If scenecuts appear within this interval, they are still encoded as " 
  58.     "I-frames, but do not start a new GOP." )
  59. #define SCENE_TEXT N_("Extra I-frames aggressivity" )
  60. #define SCENE_LONGTEXT N_( "Scene-cut detection. Controls how " 
  61.     "aggressively to insert extra I-frames. With small values of " 
  62.     "scenecut, the codec often has " 
  63.     "to force an I-frame when it would exceed keyint. " 
  64.     "Good values of scenecut may find a better location for the " 
  65.     "I-frame. Large values use more I-frames " 
  66.     "than necessary, thus wasting bits. -1 disables scene-cut detection, so " 
  67.     "I-frames are inserted only every other keyint frames, which probably " 
  68.     "leads to ugly encoding artifacts. Range 1 to 100." )
  69. #if X264_BUILD >= 55 /* r607 */ && X264_BUILD < 67 /* r1117 */
  70. #define PRESCENE_TEXT N_("Faster, less precise scenecut detection" )
  71. #define PRESCENE_LONGTEXT N_( "Faster, less precise scenecut detection. " 
  72.     "Required and implied by multi-threading." )
  73. #endif
  74. #define BFRAMES_TEXT N_("B-frames between I and P")
  75. #define BFRAMES_LONGTEXT N_( "Number of consecutive B-frames between I and " 
  76.     "P-frames. Range 1 to 16." )
  77. #define B_ADAPT_TEXT N_("Adaptive B-frame decision")
  78. #if X264_BUILD >= 63
  79. #define B_ADAPT_LONGTEXT N_( "Force the specified number of " 
  80.     "consecutive B-frames to be used, except possibly before an I-frame." 
  81.     "Range 0 to 2." )
  82. #else
  83. #define B_ADAPT_LONGTEXT N_( "Force the specified number of " 
  84.     "consecutive B-frames to be used, except possibly before an I-frame." )
  85. #endif
  86. #define B_BIAS_TEXT N_("Influence (bias) B-frames usage")
  87. #define B_BIAS_LONGTEXT N_( "Bias the choice to use B-frames. Positive values " 
  88.     "cause more B-frames, negative values cause less B-frames." )
  89. #define BPYRAMID_TEXT N_("Keep some B-frames as references")
  90. #if X264_BUILD >= 78
  91. #define BPYRAMID_LONGTEXT N_( "Allows B-frames to be used as references for " 
  92.     "predicting other frames. Keeps the middle of 2+ consecutive B-frames " 
  93.     "as a reference, and reorders frame appropriately.n" 
  94.     " - none: Disabledn" 
  95.     " - strict: Strictly hierarchical pyramidn" 
  96.     " - normal: Non-strict (not Blu-ray compatible)n"
  97.     )
  98. #else
  99. #define BPYRAMID_LONGTEXT N_( "Allows B-frames to be used as references for " 
  100.     "predicting other frames. Keeps the middle of 2+ consecutive B-frames " 
  101.     "as a reference, and reorders frame appropriately." )
  102. #endif
  103. #define CABAC_TEXT N_("CABAC")
  104. #define CABAC_LONGTEXT N_( "CABAC (Context-Adaptive Binary Arithmetic "
  105.     "Coding). Slightly slows down encoding and decoding, but should save " 
  106.     "10 to 15% bitrate." )
  107. #define REF_TEXT N_("Number of reference frames")
  108. #define REF_LONGTEXT N_( "Number of previous frames used as predictors. " 
  109.     "This is effective in Anime, but seems to make little difference in " 
  110.     "live-action source material. Some decoders are unable to deal with " 
  111.     "large frameref values. Range 1 to 16." )
  112. #define NF_TEXT N_("Skip loop filter")
  113. #define NF_LONGTEXT N_( "Deactivate the deblocking loop filter (decreases quality).")
  114. #define FILTER_TEXT N_("Loop filter AlphaC0 and Beta parameters alpha:beta")
  115. #define FILTER_LONGTEXT N_( "Loop filter AlphaC0 and Beta parameters. " 
  116.     "Range -6 to 6 for both alpha and beta parameters. -6 means light " 
  117.     "filter, 6 means strong.")
  118.  
  119. #define LEVEL_TEXT N_("H.264 level")
  120. #define LEVEL_LONGTEXT N_( "Specify H.264 level (as defined by Annex A " 
  121.     "of the standard). Levels are not enforced; it's up to the user to select " 
  122.     "a level compatible with the rest of the encoding options. Range 1 to 5.1 " 
  123.     "(10 to 51 is also allowed).")
  124. #define PROFILE_TEXT N_("H.264 profile")
  125. #define PROFILE_LONGTEXT N_("Specify H.264 profile which limits are enforced over" 
  126.         "other settings" )
  127. /* In order to play an interlaced output stream encoded by x264, a decoder needs
  128.    mbaff support. r570 is using the 'mb' part and not 'aff' yet; so it's really
  129.    'pure-interlaced' mode */
  130. #if X264_BUILD >= 51 /* r570 */
  131. #define INTERLACED_TEXT N_("Interlaced mode")
  132. #define INTERLACED_LONGTEXT N_( "Pure-interlaced mode.")
  133. #endif
  134. /* Ratecontrol */
  135. #define QP_TEXT N_("Set QP")
  136. #define QP_LONGTEXT N_( "This selects the quantizer to use. " 
  137.     "Lower values result in better fidelity, but higher bitrates. 26 is a " 
  138.     "good default value. Range 0 (lossless) to 51." )
  139. #define CRF_TEXT N_("Quality-based VBR")
  140. #define CRF_LONGTEXT N_( "1-pass Quality-based VBR. Range 0 to 51." )
  141. #define QPMIN_TEXT N_("Min QP")
  142. #define QPMIN_LONGTEXT N_( "Minimum quantizer parameter. 15 to 35 seems to " 
  143.     "be a useful range." )
  144. #define QPMAX_TEXT N_("Max QP")
  145. #define QPMAX_LONGTEXT N_( "Maximum quantizer parameter." )
  146. #define QPSTEP_TEXT N_("Max QP step")
  147. #define QPSTEP_LONGTEXT N_( "Max QP step between frames.")
  148. #define RATETOL_TEXT N_("Average bitrate tolerance")
  149. #define RATETOL_LONGTEXT N_( "Allowed variance in average " 
  150.     "bitrate (in kbits/s).")
  151. #define VBV_MAXRATE_TEXT N_("Max local bitrate")
  152. #define VBV_MAXRATE_LONGTEXT N_( "Sets a maximum local bitrate (in kbits/s).")
  153. #define VBV_BUFSIZE_TEXT N_("VBV buffer")
  154. #define VBV_BUFSIZE_LONGTEXT N_( "Averaging period for the maximum " 
  155.     "local bitrate (in kbits).")
  156. #define VBV_INIT_TEXT N_("Initial VBV buffer occupancy")
  157. #define VBV_INIT_LONGTEXT N_( "Sets the initial buffer occupancy as a " 
  158.     "fraction of the buffer size. Range 0.0 to 1.0.")
  159. #if X264_BUILD >= 59
  160. #define AQ_MODE_TEXT N_("How AQ distributes bits")
  161. #define AQ_MODE_LONGTEXT N_("Defines bitdistribution mode for AQ, default 1n" 
  162.         " - 0: Disabledn"
  163.         " - 1: Current x264 default moden"
  164.         " - 2: uses log(var)^2 instead of log(var) and attempts to adapt strength per frame")
  165. #define AQ_STRENGTH_TEXT N_("Strength of AQ")
  166. #define AQ_STRENGTH_LONGTEXT N_("Strength to reduce blocking and blurring in flatn"
  167.         "and textured areas, default 1.0 recommented to be between 0..2n"
  168.         " - 0.5: weak AQn"
  169.         " - 1.5: strong AQ")
  170. #endif
  171. /* IP Ratio < 1 is technically valid but should never improve quality */
  172. #define IPRATIO_TEXT N_("QP factor between I and P")
  173. #define IPRATIO_LONGTEXT N_( "QP factor between I and P. Range 1.0 to 2.0.")
  174. /* PB ratio < 1 is not valid and breaks ratecontrol */
  175. #define PBRATIO_TEXT N_("QP factor between P and B")
  176. #define PBRATIO_LONGTEXT N_( "QP factor between P and B. Range 1.0 to 2.0.")
  177. #define CHROMA_QP_OFFSET_TEXT N_("QP difference between chroma and luma")
  178. #define CHROMA_QP_OFFSET_LONGTEXT N_( "QP difference between chroma and luma.")
  179. #define PASS_TEXT N_("Multipass ratecontrol")
  180. #define PASS_LONGTEXT N_( "Multipass ratecontrol:n" 
  181.     " - 1: First pass, creates stats filen" 
  182.     " - 2: Last pass, does not overwrite stats filen" 
  183.     " - 3: Nth pass, overwrites stats filen" )
  184. #define QCOMP_TEXT N_("QP curve compression")
  185. #define QCOMP_LONGTEXT N_( "QP curve compression. Range 0.0 (CBR) to 1.0 (QCP).")
  186. #define CPLXBLUR_TEXT N_("Reduce fluctuations in QP")
  187. #define CPLXBLUR_LONGTEXT N_( "This reduces the fluctuations in QP " 
  188.     "before curve compression. Temporally blurs complexity.")
  189. #define QBLUR_TEXT N_("Reduce fluctuations in QP")
  190. #define QBLUR_LONGTEXT N_( "This reduces the fluctations in QP " 
  191.     "after curve compression. Temporally blurs quants.")
  192. /* Analysis */
  193. #define ANALYSE_TEXT N_("Partitions to consider")
  194. #define ANALYSE_LONGTEXT N_( "Partitions to consider in analyse mode: n" 
  195.     " - none  : n" 
  196.     " - fast  : i4x4n" 
  197.     " - normal: i4x4,p8x8,(i8x8)n" 
  198.     " - slow  : i4x4,p8x8,(i8x8),b8x8n" 
  199.     " - all   : i4x4,p8x8,(i8x8),b8x8,p4x4n" 
  200.     "(p4x4 requires p8x8. i8x8 requires 8x8dct).")
  201. #define DIRECT_PRED_TEXT N_("Direct MV prediction mode")
  202. #define DIRECT_PRED_LONGTEXT N_( "Direct MV prediction mode.")
  203. #if X264_BUILD >= 52 /* r573 */
  204. #define DIRECT_PRED_SIZE_TEXT N_("Direct prediction size")
  205. #define DIRECT_PRED_SIZE_LONGTEXT N_( "Direct prediction size: "
  206.     " -  0: 4x4n" 
  207.     " -  1: 8x8n" 
  208.     " - -1: smallest possible according to leveln" )
  209. #endif
  210. #define WEIGHTB_TEXT N_("Weighted prediction for B-frames")
  211. #define WEIGHTB_LONGTEXT N_( "Weighted prediction for B-frames.")
  212. #define WEIGHTP_TEXT N_("Weighted prediction for P-frames")
  213. #define WEIGHTP_LONGTEXT N_(" Weighted prediction for P-frames: "
  214.     " - 0: Disabledn"
  215.     " - 1: Blind offsetn"
  216.     " - 2: Smart analysisn" )
  217. #define ME_TEXT N_("Integer pixel motion estimation method")
  218. #if X264_BUILD >= 58 /* r728 */
  219. #define ME_LONGTEXT N_( "Selects the motion estimation algorithm: "
  220.     " - dia: diamond search, radius 1 (fast)n" 
  221.     " - hex: hexagonal search, radius 2n" 
  222.     " - umh: uneven multi-hexagon search (better but slower)n" 
  223.     " - esa: exhaustive search (extremely slow, primarily for testing)n" 
  224.     " - tesa: hadamard exhaustive search (extremely slow, primarily for testing)n" )
  225. #else
  226. #define ME_LONGTEXT N_( "Selects the motion estimation algorithm: "
  227.     " - dia: diamond search, radius 1 (fast)n" 
  228.     " - hex: hexagonal search, radius 2n" 
  229.     " - umh: uneven multi-hexagon search (better but slower)n" 
  230.     " - esa: exhaustive search (extremely slow, primarily for testing)n" )
  231. #endif
  232. #if X264_BUILD >= 24
  233. #define MERANGE_TEXT N_("Maximum motion vector search range")
  234. #define MERANGE_LONGTEXT N_( "Maximum distance to search for " 
  235.     "motion estimation, measured from predicted position(s). " 
  236.     "Default of 16 is good for most footage, high motion sequences may " 
  237.     "benefit from settings between 24 and 32. Range 0 to 64." )
  238. #define MVRANGE_TEXT N_("Maximum motion vector length")
  239. #define MVRANGE_LONGTEXT N_( "Maximum motion vector length in pixels. " 
  240.     "-1 is automatic, based on level." )
  241. #endif
  242. #if X264_BUILD >= 55 /* r607 */
  243. #define MVRANGE_THREAD_TEXT N_("Minimum buffer space between threads")
  244. #define MVRANGE_THREAD_LONGTEXT N_( "Minimum buffer space between threads. " 
  245.     "-1 is automatic, based on number of threads." )
  246. #endif
  247. #define SUBME_TEXT N_("Subpixel motion estimation and partition decision " 
  248.     "quality")
  249. #if X264_BUILD >= 65 
  250. #define SUBME_MAX 9
  251. #define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " 
  252.     "tradeoffs involved in the motion estimation decision process " 
  253.     "(lower = quicker and higher = better quality). Range 1 to 9." )
  254. #elif X264_BUILD >= 46 /* r477 */
  255. #define SUBME_MAX 7
  256. #define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " 
  257.     "tradeoffs involved in the motion estimation decision process " 
  258.     "(lower = quicker and higher = better quality). Range 1 to 7." )
  259. #elif X264_BUILD >= 30 /* r262 */
  260. #define SUBME_MAX 6
  261. #define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " 
  262.     "tradeoffs involved in the motion estimation decision process " 
  263.     "(lower = quicker and higher = better quality). Range 1 to 6." )
  264. #else
  265. #define SUBME_MAX 5
  266. #define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " 
  267.     "tradeoffs involved in the motion estimation decision process " 
  268.     "(lower = quicker and higher = better quality). Range 1 to 5." )
  269. #endif
  270. #define B_RDO_TEXT N_("RD based mode decision for B-frames")
  271. #define B_RDO_LONGTEXT N_( "RD based mode decision for B-frames. This " 
  272.     "requires subme 6 (or higher).")
  273. #define MIXED_REFS_TEXT N_("Decide references on a per partition basis")
  274. #define MIXED_REFS_LONGTEXT N_( "Allows each 8x8 or 16x8 partition to " 
  275.     "independently select a reference frame, as opposed to only one ref " 
  276.     "per macroblock." )
  277. #define CHROMA_ME_TEXT N_("Chroma in motion estimation")
  278. #define CHROMA_ME_LONGTEXT N_( "Chroma ME for subpel and mode decision in " 
  279.     "P-frames.")
  280. #define BIME_TEXT N_("Jointly optimize both MVs in B-frames")
  281. #define BIME_LONGTEXT N_( "Joint bidirectional motion refinement.")
  282. #define TRANSFORM_8X8DCT_TEXT N_("Adaptive spatial transform size")
  283. #define TRANSFORM_8X8DCT_LONGTEXT N_( 
  284.     "SATD-based decision for 8x8 transform in inter-MBs.")
  285. #define TRELLIS_TEXT N_("Trellis RD quantization" )
  286. #define TRELLIS_LONGTEXT N_( "Trellis RD quantization: n" 
  287.     " - 0: disabledn" 
  288.     " - 1: enabled only on the final encode of a MBn" 
  289.     " - 2: enabled on all mode decisionsn" 
  290.     "This requires CABAC." )
  291. #define FAST_PSKIP_TEXT N_("Early SKIP detection on P-frames")
  292. #define FAST_PSKIP_LONGTEXT N_( "Early SKIP detection on P-frames.")
  293. #define DCT_DECIMATE_TEXT N_("Coefficient thresholding on P-frames")
  294. #define DCT_DECIMATE_LONGTEXT N_( "Coefficient thresholding on P-frames." 
  295.     "Eliminate dct blocks containing only a small single coefficient.")
  296. /* Noise reduction 1 is too weak to measure, suggest at least 10 */
  297. #define NR_TEXT N_("Noise reduction")
  298. #define NR_LONGTEXT N_( "Dct-domain noise reduction. Adaptive pseudo-deadzone. " 
  299.     "10 to 1000 seems to be a useful range." )
  300. #if X264_BUILD >= 52 /* r573 */
  301. #define DEADZONE_INTER_TEXT N_("Inter luma quantization deadzone")
  302. #define DEADZONE_INTER_LONGTEXT N_( "Set the size of the inter luma quantization deadzone. " 
  303.     "Range 0 to 32." )
  304. #define DEADZONE_INTRA_TEXT N_("Intra luma quantization deadzone")
  305. #define DEADZONE_INTRA_LONGTEXT N_( "Set the size of the intra luma quantization deadzone. " 
  306.     "Range 0 to 32." )
  307. #endif
  308. /* Input/Output */
  309. #if X264_BUILD >= 55 /* r607 */
  310. #define NON_DETERMINISTIC_TEXT N_("Non-deterministic optimizations when threaded")
  311. #define NON_DETERMINISTIC_LONGTEXT N_( "Slightly improve quality of SMP, " 
  312.     "at the cost of repeatability.")
  313. #endif
  314. #define ASM_TEXT N_("CPU optimizations")
  315. #define ASM_LONGTEXT N_( "Use assembler CPU optimizations.")
  316. #define STATS_TEXT N_("Filename for 2 pass stats file")
  317. #define STATS_LONGTEXT N_( "Filename for 2 pass stats file for multi-pass encoding.")
  318. #define PSNR_TEXT N_("PSNR computation")
  319. #define PSNR_LONGTEXT N_( "Compute and print PSNR stats. This has no effect on " 
  320.     "the actual encoding quality." )
  321. #define SSIM_TEXT N_("SSIM computation")
  322. #define SSIM_LONGTEXT N_( "Compute and print SSIM stats. This has no effect on " 
  323.     "the actual encoding quality." )
  324. #define QUIET_TEXT N_("Quiet mode")
  325. #define QUIET_LONGTEXT N_( "Quiet mode.")
  326. #define VERBOSE_TEXT N_("Statistics")
  327. #define VERBOSE_LONGTEXT N_( "Print stats for each frame.")
  328. #if X264_BUILD >= 47 /* r518 */
  329. #define SPS_ID_TEXT N_("SPS and PPS id numbers")
  330. #define SPS_ID_LONGTEXT N_( "Set SPS and PPS id numbers to allow concatenating " 
  331.     "streams with different settings.")
  332. #endif
  333. #define AUD_TEXT N_("Access unit delimiters")
  334. #define AUD_LONGTEXT N_( "Generate access unit delimiter NAL units.")
  335. #if X264_BUILD >= 24 && X264_BUILD < 58
  336. static const char *const enc_me_list[] =
  337.   { "dia", "hex", "umh", "esa" };
  338. static const char *const enc_me_list_text[] =
  339.   { N_("dia"), N_("hex"), N_("umh"), N_("esa") };
  340. #endif
  341. #define LOOKAHEAD_TEXT N_("Framecount to use on frametype lookahead")
  342. #define LOOKAHEAD_LONGTEXT N_("Framecount to use on frametype lookahead. " 
  343.     "Currently default is lower than x264 default because unmuxable output" 
  344.     "doesn't handle larger values that well yet" )
  345. #if X264_BUILD >= 58 /* r728 */
  346. static const char *const enc_me_list[] =
  347.   { "dia", "hex", "umh", "esa", "tesa" };
  348. static const char *const enc_me_list_text[] =
  349.   { N_("dia"), N_("hex"), N_("umh"), N_("esa"), N_("tesa") };
  350. #endif
  351. static const char *const profile_list[] =
  352.   { "baseline", "main", "high" };
  353. #if X264_BUILD >= 78
  354. static const char *const bpyramid_list[] =
  355.   { "none", "strict", "normal" };
  356. #endif
  357. static const char *const enc_analyse_list[] =
  358.   { "none", "fast", "normal", "slow", "all" };
  359. static const char *const enc_analyse_list_text[] =
  360.   { N_("none"), N_("fast"), N_("normal"), N_("slow"), N_("all") };
  361. #if X264_BUILD >= 45 /* r457 */
  362. static const char *const direct_pred_list[] =
  363.   { "none", "spatial", "temporal", "auto" };
  364. static const char *const direct_pred_list_text[] =
  365.   { N_("none"), N_("spatial"), N_("temporal"), N_("auto") };
  366. #else
  367. static const char *const direct_pred_list[] =
  368.   { "none", "spatial", "temporal" };
  369. static const char *const direct_pred_list_text[] =
  370.   { N_("none"), N_("spatial"), N_("temporal") };
  371. #endif
  372. vlc_module_begin ()
  373.     set_description( N_("H.264/MPEG4 AVC encoder (x264)"))
  374.     set_capability( "encoder", 200 )
  375.     set_callbacks( Open, Close )
  376.     set_category( CAT_INPUT )
  377.     set_subcategory( SUBCAT_INPUT_VCODEC )
  378. /* Frame-type options */
  379.     add_integer( SOUT_CFG_PREFIX "keyint", 250, NULL, KEYINT_TEXT,
  380.                  KEYINT_LONGTEXT, false )
  381.     add_integer( SOUT_CFG_PREFIX "min-keyint", 25, NULL, MIN_KEYINT_TEXT,
  382.                  MIN_KEYINT_LONGTEXT, false )
  383.         add_deprecated_alias( SOUT_CFG_PREFIX "keyint-min" ) /* Deprecated since 0.8.5 */
  384.     add_integer( SOUT_CFG_PREFIX "scenecut", 40, NULL, SCENE_TEXT,
  385.                  SCENE_LONGTEXT, false )
  386.         change_integer_range( -1, 100 )
  387. #if X264_BUILD >= 55 /* r607 */
  388. #  if X264_BUILD < 67 /* r1117 */
  389.     add_bool( SOUT_CFG_PREFIX "pre-scenecut", 0, NULL, PRESCENE_TEXT,
  390.               PRESCENE_LONGTEXT, false )
  391. #  else
  392.     add_obsolete_bool( SOUT_CFG_PREFIX "pre-scenecut" )
  393. #  endif
  394. #endif
  395.     add_integer( SOUT_CFG_PREFIX "bframes", 3, NULL, BFRAMES_TEXT,
  396.                  BFRAMES_LONGTEXT, false )
  397.         change_integer_range( 0, 16 )
  398. #if X264_BUILD >= 63
  399.     add_integer( SOUT_CFG_PREFIX "b-adapt", 1, NULL, B_ADAPT_TEXT,
  400.                  B_ADAPT_LONGTEXT, false )
  401.         change_integer_range( 0, 2 )
  402. #elif  X264_BUILD >= 0x0013 /* r137 */
  403.     add_bool( SOUT_CFG_PREFIX "b-adapt", 1, NULL, B_ADAPT_TEXT,
  404.               B_ADAPT_LONGTEXT, false )
  405. #endif
  406. #if  X264_BUILD >= 0x0013 /* r137 */
  407.     add_integer( SOUT_CFG_PREFIX "b-bias", 0, NULL, B_BIAS_TEXT,
  408.                  B_BIAS_LONGTEXT, false )
  409.         change_integer_range( -100, 100 )
  410. #endif
  411. #if X264_BUILD >= 78
  412.     add_string( SOUT_CFG_PREFIX "bpyramid", "none", NULL, BPYRAMID_TEXT,
  413.               BPYRAMID_LONGTEXT, false )
  414.         change_string_list( bpyramid_list, bpyramid_list, 0 );
  415. #else
  416.     add_bool( SOUT_CFG_PREFIX "bpyramid", false, NULL, BPYRAMID_TEXT,
  417.               BPYRAMID_LONGTEXT, false )
  418. #endif
  419.     add_bool( SOUT_CFG_PREFIX "cabac", 1, NULL, CABAC_TEXT, CABAC_LONGTEXT,
  420.               false )
  421.     add_integer( SOUT_CFG_PREFIX "ref", 3, NULL, REF_TEXT,
  422.                  REF_LONGTEXT, false )
  423.         change_integer_range( 1, 16 )
  424.         add_deprecated_alias( SOUT_CFG_PREFIX "frameref" ) /* Deprecated since 0.8.5 */
  425.     add_bool( SOUT_CFG_PREFIX "nf", 0, NULL, NF_TEXT,
  426.               NF_LONGTEXT, false )
  427.         add_deprecated_alias( SOUT_CFG_PREFIX "loopfilter" ) /* Deprecated since 0.8.5 */
  428.     add_string( SOUT_CFG_PREFIX "deblock", "0:0", NULL, FILTER_TEXT,
  429.                  FILTER_LONGTEXT, false )
  430.         add_deprecated_alias( SOUT_CFG_PREFIX "filter" ) /* Deprecated since 0.8.6 */
  431.     add_string( SOUT_CFG_PREFIX "level", "5.1", NULL, LEVEL_TEXT,
  432.                LEVEL_LONGTEXT, false )
  433.     add_string( SOUT_CFG_PREFIX "profile", "high", NULL, PROFILE_TEXT,
  434.                PROFILE_LONGTEXT, false )
  435.         change_string_list( profile_list, profile_list, 0 );
  436. #if X264_BUILD >= 51 /* r570 */
  437.     add_bool( SOUT_CFG_PREFIX "interlaced", 0, NULL, INTERLACED_TEXT, INTERLACED_LONGTEXT,
  438.               false )
  439. #endif
  440. /* Ratecontrol */
  441.     add_integer( SOUT_CFG_PREFIX "qp", -1, NULL, QP_TEXT, QP_LONGTEXT,
  442.                  false )
  443.         change_integer_range( -1, 51 ) /* QP 0 -> lossless encoding */
  444. #if X264_BUILD >= 37 /* r334 */
  445.     add_integer( SOUT_CFG_PREFIX "crf", 23, NULL, CRF_TEXT,
  446.                  CRF_LONGTEXT, false )
  447.         change_integer_range( 0, 51 )
  448. #endif
  449.     add_integer( SOUT_CFG_PREFIX "qpmin", 10, NULL, QPMIN_TEXT,
  450.                  QPMIN_LONGTEXT, false )
  451.         change_integer_range( 0, 51 )
  452.         add_deprecated_alias( SOUT_CFG_PREFIX "qp-min" ) /* Deprecated since 0.8.5 */
  453.     add_integer( SOUT_CFG_PREFIX "qpmax", 51, NULL, QPMAX_TEXT,
  454.                  QPMAX_LONGTEXT, false )
  455.         change_integer_range( 0, 51 )
  456.         add_deprecated_alias( SOUT_CFG_PREFIX "qp-max" ) /* Deprecated since 0.8.5 */
  457.     add_integer( SOUT_CFG_PREFIX "qpstep", 4, NULL, QPSTEP_TEXT,
  458.                  QPSTEP_LONGTEXT, false )
  459.         change_integer_range( 0, 51 )
  460.     add_float( SOUT_CFG_PREFIX "ratetol", 1.0, NULL, RATETOL_TEXT,
  461.                RATETOL_LONGTEXT, false )
  462.         change_float_range( 0, 100 )
  463.         add_deprecated_alias( SOUT_CFG_PREFIX "tolerance" ) /* Deprecated since 0.8.5 */
  464.     add_integer( SOUT_CFG_PREFIX "vbv-maxrate", 0, NULL, VBV_MAXRATE_TEXT,
  465.                  VBV_MAXRATE_LONGTEXT, false )
  466.     add_integer( SOUT_CFG_PREFIX "vbv-bufsize", 0, NULL, VBV_BUFSIZE_TEXT,
  467.                  VBV_BUFSIZE_LONGTEXT, false )
  468.     add_float( SOUT_CFG_PREFIX "vbv-init", 0.9, NULL, VBV_INIT_TEXT,
  469.                VBV_INIT_LONGTEXT, false )
  470.         change_float_range( 0, 1 )
  471.     add_float( SOUT_CFG_PREFIX "ipratio", 1.40, NULL, IPRATIO_TEXT,
  472.                IPRATIO_LONGTEXT, false )
  473.         change_float_range( 1, 2 )
  474.     add_float( SOUT_CFG_PREFIX "pbratio", 1.30, NULL, PBRATIO_TEXT,
  475.                PBRATIO_LONGTEXT, false )
  476.         change_float_range( 1, 2 )
  477. #if X264_BUILD >= 23 /* r190 */
  478.     add_integer( SOUT_CFG_PREFIX "chroma-qp-offset", 0, NULL, CHROMA_QP_OFFSET_TEXT,
  479.                  CHROMA_QP_OFFSET_LONGTEXT, false )
  480. #endif
  481.     add_integer( SOUT_CFG_PREFIX "pass", 0, NULL, PASS_TEXT,
  482.                  PASS_LONGTEXT, false )
  483.         change_integer_range( 0, 3 )
  484.     add_float( SOUT_CFG_PREFIX "qcomp", 0.60, NULL, QCOMP_TEXT,
  485.                QCOMP_LONGTEXT, false )
  486.         change_float_range( 0, 1 )
  487.     add_float( SOUT_CFG_PREFIX "cplxblur", 20.0, NULL, CPLXBLUR_TEXT,
  488.                CPLXBLUR_LONGTEXT, false )
  489.     add_float( SOUT_CFG_PREFIX "qblur", 0.5, NULL, QBLUR_TEXT,
  490.                QBLUR_LONGTEXT, false )
  491. #if X264_BUILD >= 59
  492.     add_integer( SOUT_CFG_PREFIX "aq-mode", X264_AQ_VARIANCE, NULL, AQ_MODE_TEXT,
  493.                  AQ_MODE_LONGTEXT, false )
  494.          change_integer_range( 0, 2 )
  495.     add_float( SOUT_CFG_PREFIX "aq-strength", 1.0, NULL, AQ_STRENGTH_TEXT,
  496.                AQ_STRENGTH_LONGTEXT, false )
  497. #endif
  498. /* Analysis */
  499.     /* x264 partitions = none (default). set at least "normal" mode. */
  500.     add_string( SOUT_CFG_PREFIX "partitions", "normal", NULL, ANALYSE_TEXT,
  501.                 ANALYSE_LONGTEXT, false )
  502.         change_string_list( enc_analyse_list, enc_analyse_list_text, 0 );
  503.         add_deprecated_alias( SOUT_CFG_PREFIX "analyse" ) /* Deprecated since 0.8.6 */
  504.     add_string( SOUT_CFG_PREFIX "direct", "spatial", NULL, DIRECT_PRED_TEXT,
  505.                 DIRECT_PRED_LONGTEXT, false )
  506.         change_string_list( direct_pred_list, direct_pred_list_text, 0 );
  507. #if X264_BUILD >= 52 /* r573 */
  508.     add_integer( SOUT_CFG_PREFIX "direct-8x8", 1, NULL, DIRECT_PRED_SIZE_TEXT,
  509.                  DIRECT_PRED_SIZE_LONGTEXT, false )
  510.         change_integer_range( -1, 1 )
  511. #endif
  512. #if X264_BUILD >= 0x0012 /* r134 */
  513.     add_bool( SOUT_CFG_PREFIX "weightb", 1, NULL, WEIGHTB_TEXT,
  514.               WEIGHTB_LONGTEXT, false )
  515. #endif
  516. #if X264_BUILD >= 79
  517.     add_integer( SOUT_CFG_PREFIX "weightp", 2, NULL, WEIGHTP_TEXT,
  518.               WEIGHTP_LONGTEXT, false )
  519.         change_integer_range( 0, 2 )
  520. #endif
  521. #if X264_BUILD >= 24 /* r221 */
  522.     add_string( SOUT_CFG_PREFIX "me", "hex", NULL, ME_TEXT,
  523.                 ME_LONGTEXT, false )
  524.         change_string_list( enc_me_list, enc_me_list_text, 0 );
  525.     add_integer( SOUT_CFG_PREFIX "merange", 16, NULL, MERANGE_TEXT,
  526.                  MERANGE_LONGTEXT, false )
  527.         change_integer_range( 1, 64 )
  528. #endif
  529.     add_integer( SOUT_CFG_PREFIX "mvrange", -1, NULL, MVRANGE_TEXT,
  530.                  MVRANGE_LONGTEXT, false )
  531. #if X264_BUILD >= 55 /* r607 */
  532.     add_integer( SOUT_CFG_PREFIX "mvrange-thread", -1, NULL, MVRANGE_THREAD_TEXT,
  533.                  MVRANGE_THREAD_LONGTEXT, false )
  534. #endif
  535.     add_integer( SOUT_CFG_PREFIX "subme", 5, NULL, SUBME_TEXT,
  536.                  SUBME_LONGTEXT, false )
  537.         change_integer_range( 1, SUBME_MAX )
  538.         add_deprecated_alias( SOUT_CFG_PREFIX "subpel" ) /* Deprecated since 0.8.5 */
  539. #if X264_BUILD >= 41
  540. # if X264_BUILD < 65 /* r368 */
  541.     add_bool( SOUT_CFG_PREFIX "b-rdo", 0, NULL, B_RDO_TEXT,
  542.               B_RDO_LONGTEXT, false )
  543. # else
  544.     add_obsolete_bool( SOUT_CFG_PREFIX "b-rdo" )
  545. # endif
  546. #endif
  547. #if X264_BUILD >= 36 /* r318 */
  548.     add_bool( SOUT_CFG_PREFIX "mixed-refs", 1, NULL, MIXED_REFS_TEXT,
  549.               MIXED_REFS_LONGTEXT, false )
  550. #endif
  551. #if X264_BUILD >= 23 /* r171 */
  552.     add_bool( SOUT_CFG_PREFIX "chroma-me", 1, NULL, CHROMA_ME_TEXT,
  553.               CHROMA_ME_LONGTEXT, false )
  554. #endif
  555. #if X264_BUILD >= 43
  556. # if X264_BUILD < 65 /* r390 */
  557.     add_bool( SOUT_CFG_PREFIX "bime", 0, NULL, BIME_TEXT,
  558.               BIME_LONGTEXT, false )
  559. # else
  560.     add_obsolete_bool( SOUT_CFG_PREFIX "bime" )
  561. # endif
  562. #endif
  563. #if X264_BUILD >= 30 /* r251 */
  564.     add_bool( SOUT_CFG_PREFIX "8x8dct", 0, NULL, TRANSFORM_8X8DCT_TEXT,
  565.               TRANSFORM_8X8DCT_LONGTEXT, false )
  566. #endif
  567. #if X264_BUILD >= 39 /* r360 */
  568.     add_integer( SOUT_CFG_PREFIX "trellis", 1, NULL, TRELLIS_TEXT,
  569.                  TRELLIS_LONGTEXT, false )
  570.         change_integer_range( 0, 2 )
  571. #endif
  572. #if X264_BUILD >= 42 /* r384 */
  573.     add_bool( SOUT_CFG_PREFIX "fast-pskip", 1, NULL, FAST_PSKIP_TEXT,
  574.               FAST_PSKIP_LONGTEXT, false )
  575. #endif
  576. #if X264_BUILD >= 69
  577.     add_integer( SOUT_CFG_PREFIX "lookahead", 5, NULL, LOOKAHEAD_TEXT,
  578.                  LOOKAHEAD_LONGTEXT, false )
  579.         change_integer_range( 0, 60 )
  580. #endif
  581. #if X264_BUILD >= 46 /* r503 */
  582.     add_bool( SOUT_CFG_PREFIX "dct-decimate", 1, NULL, DCT_DECIMATE_TEXT,
  583.               DCT_DECIMATE_LONGTEXT, false )
  584. #endif
  585. #if X264_BUILD >= 44 /* r398 */
  586.     add_integer( SOUT_CFG_PREFIX "nr", 0, NULL, NR_TEXT,
  587.                  NR_LONGTEXT, false )
  588.         change_integer_range( 0, 1000 )
  589. #endif
  590. #if X264_BUILD >= 52 /* r573 */
  591.     add_integer( SOUT_CFG_PREFIX "deadzone-inter", 21, NULL, DEADZONE_INTER_TEXT,
  592.                  DEADZONE_INTRA_LONGTEXT, false )
  593.         change_integer_range( 0, 32 )
  594.     add_integer( SOUT_CFG_PREFIX "deadzone-intra", 11, NULL, DEADZONE_INTRA_TEXT,
  595.                  DEADZONE_INTRA_LONGTEXT, false )
  596.         change_integer_range( 0, 32 )
  597. #endif
  598. /* Input/Output */
  599. #if X264_BUILD >= 55 /* r607 */
  600.     add_bool( SOUT_CFG_PREFIX "non-deterministic", 0, NULL, NON_DETERMINISTIC_TEXT,
  601.               NON_DETERMINISTIC_LONGTEXT, false )
  602. #endif
  603.     add_bool( SOUT_CFG_PREFIX "asm", 1, NULL, ASM_TEXT,
  604.               ASM_LONGTEXT, false )
  605.     /* x264 psnr = 1 (default). disable PSNR computation for speed. */
  606.     add_bool( SOUT_CFG_PREFIX "psnr", 0, NULL, PSNR_TEXT,
  607.               PSNR_LONGTEXT, false )
  608. #if X264_BUILD >= 50 /* r554 */
  609.     /* x264 ssim = 1 (default). disable SSIM computation for speed. */
  610.     add_bool( SOUT_CFG_PREFIX "ssim", 0, NULL, SSIM_TEXT,
  611.               SSIM_LONGTEXT, false )
  612. #endif
  613.     add_bool( SOUT_CFG_PREFIX "quiet", 0, NULL, QUIET_TEXT,
  614.               QUIET_LONGTEXT, false )
  615. #if X264_BUILD >= 47 /* r518 */
  616.     add_integer( SOUT_CFG_PREFIX "sps-id", 0, NULL, SPS_ID_TEXT,
  617.                  SPS_ID_LONGTEXT, false )
  618. #endif
  619.     add_bool( SOUT_CFG_PREFIX "aud", 0, NULL, AUD_TEXT,
  620.               AUD_LONGTEXT, false )
  621. #if X264_BUILD >= 0x000e /* r81 */
  622.     add_bool( SOUT_CFG_PREFIX "verbose", 0, NULL, VERBOSE_TEXT,
  623.               VERBOSE_LONGTEXT, false )
  624. #endif
  625.     add_string( SOUT_CFG_PREFIX "stats", "x264_2pass.log", NULL, STATS_TEXT,
  626.                 STATS_LONGTEXT, false )
  627. vlc_module_end ()
  628. /*****************************************************************************
  629.  * Local prototypes
  630.  *****************************************************************************/
  631. static const char *const ppsz_sout_options[] = {
  632.     "8x8dct", "analyse", "asm", "aud", "bframes", "bime", "bpyramid",
  633.     "b-adapt", "b-bias", "b-rdo", "cabac", "chroma-me", "chroma-qp-offset",
  634.     "cplxblur", "crf", "dct-decimate", "deadzone-inter", "deadzone-intra",
  635.     "deblock", "direct", "direct-8x8", "filter", "fast-pskip", "frameref",
  636.     "interlaced", "ipratio", "keyint", "keyint-min", "level", "loopfilter",
  637.     "me", "merange", "min-keyint", "mixed-refs", "mvrange", "mvrange-thread",
  638.     "nf", "non-deterministic", "nr", "partitions", "pass", "pbratio",
  639.     "pre-scenecut", "psnr", "qblur", "qp", "qcomp", "qpstep", "qpmax",
  640.     "qpmin", "qp-max", "qp-min", "quiet", "ratetol", "ref", "scenecut",
  641.     "sps-id", "ssim", "stats", "subme", "subpel", "tolerance", "trellis",
  642.     "verbose", "vbv-bufsize", "vbv-init", "vbv-maxrate", "weightb", "weightp", "aq-mode",
  643.     "aq-strength", "profile", "lookahead", NULL
  644. };
  645. static block_t *Encode( encoder_t *, picture_t * );
  646. struct encoder_sys_t
  647. {
  648.     x264_t          *h;
  649.     x264_param_t    param;
  650.     int             i_buffer;
  651.     uint8_t         *p_buffer;
  652.     mtime_t         i_interpolated_dts;
  653.     char *psz_stat_name;
  654. };
  655. /*****************************************************************************
  656.  * Open: probe the encoder
  657.  *****************************************************************************/
  658. static int  Open ( vlc_object_t *p_this )
  659. {
  660.     encoder_t     *p_enc = (encoder_t *)p_this;
  661.     encoder_sys_t *p_sys;
  662.     vlc_value_t    val;
  663.     int i_qmin = 0, i_qmax = 0;
  664.     x264_nal_t    *nal;
  665.     int i, i_nal;
  666.     if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'h', '2', '6', '4' ) &&
  667.         !p_enc->b_force )
  668.     {
  669.         return VLC_EGENERIC;
  670.     }
  671.     /* X264_POINTVER or X264_VERSION are not available */
  672.     msg_Dbg ( p_enc, "version x264 0.%d.X", X264_BUILD );
  673. #if X264_BUILD < 37
  674.     if( p_enc->fmt_in.video.i_width % 16 != 0 ||
  675.         p_enc->fmt_in.video.i_height % 16 != 0 )
  676.     {
  677.         msg_Warn( p_enc, "size is not a multiple of 16 (%ix%i)",
  678.                   p_enc->fmt_in.video.i_width, p_enc->fmt_in.video.i_height );
  679.         if( p_enc->fmt_in.video.i_width < 16 ||
  680.             p_enc->fmt_in.video.i_height < 16 )
  681.         {
  682.             msg_Err( p_enc, "video is too small to be cropped" );
  683.             return VLC_EGENERIC;
  684.         }
  685.         msg_Warn( p_enc, "cropping video to %ix%i",
  686.                   p_enc->fmt_in.video.i_width >> 4 << 4,
  687.                   p_enc->fmt_in.video.i_height >> 4 << 4 );
  688.     }
  689. #endif
  690.     config_ChainParse( p_enc, SOUT_CFG_PREFIX, ppsz_sout_options, p_enc->p_cfg );
  691.     p_enc->fmt_out.i_cat = VIDEO_ES;
  692.     p_enc->fmt_out.i_codec = VLC_FOURCC( 'h', '2', '6', '4' );
  693.     p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0');
  694.     p_enc->pf_encode_video = Encode;
  695.     p_enc->pf_encode_audio = NULL;
  696.     p_enc->p_sys = p_sys = malloc( sizeof( encoder_sys_t ) );
  697.     if( !p_sys )
  698.         return VLC_ENOMEM;
  699.     p_sys->i_interpolated_dts = 0;
  700.     p_sys->psz_stat_name = NULL;
  701.     p_sys->p_buffer = NULL;
  702.     x264_param_default( &p_sys->param );
  703.     p_sys->param.i_width  = p_enc->fmt_in.video.i_width;
  704.     p_sys->param.i_height = p_enc->fmt_in.video.i_height;
  705. #if X264_BUILD < 37
  706.     p_sys->param.i_width  = p_sys->param.i_width >> 4 << 4;
  707.     p_sys->param.i_height = p_sys->param.i_height >> 4 << 4;
  708. #endif
  709.     var_Get( p_enc, SOUT_CFG_PREFIX "qcomp", &val );
  710.     p_sys->param.rc.f_qcompress = val.f_float;
  711.     var_Get( p_enc, SOUT_CFG_PREFIX "qpstep", &val );
  712.     if( val.i_int >= 0 && val.i_int <= 51 ) p_sys->param.rc.i_qp_step = val.i_int;
  713.     var_Get( p_enc, SOUT_CFG_PREFIX "qpmin", &val );
  714.     if( val.i_int >= 0 && val.i_int <= 51 )
  715.     {
  716.         i_qmin = val.i_int;
  717.         p_sys->param.rc.i_qp_min = i_qmin;
  718.     }
  719.     var_Get( p_enc, SOUT_CFG_PREFIX "qpmax", &val );
  720.     if( val.i_int >= 0 && val.i_int <= 51 )
  721.     {
  722.         i_qmax = val.i_int;
  723.         p_sys->param.rc.i_qp_max = i_qmax;
  724.     }
  725.     var_Get( p_enc, SOUT_CFG_PREFIX "qp", &val );
  726.     if( val.i_int >= 0 && val.i_int <= 51 )
  727.     {
  728.         if( i_qmin > val.i_int ) i_qmin = val.i_int;
  729.         if( i_qmax < val.i_int ) i_qmax = val.i_int;
  730.         p_sys->param.rc.i_rc_method = X264_RC_CQP;
  731. #if X264_BUILD >= 0x000a
  732.         p_sys->param.rc.i_qp_constant = val.i_int;
  733.         p_sys->param.rc.i_qp_min = i_qmin;
  734.         p_sys->param.rc.i_qp_max = i_qmax;
  735. #else
  736.         p_sys->param.i_qp_constant = val.i_int;
  737. #endif
  738.     } else if( p_enc->fmt_out.i_bitrate > 0 )
  739.     {
  740.         /* set more to ABR if user specifies bitrate, but qp ain't defined */
  741.         p_sys->param.rc.i_bitrate = p_enc->fmt_out.i_bitrate / 1000;
  742. #if X264_BUILD < 48
  743.     /* cbr = 1 overrides qp or crf and sets an average bitrate
  744.        but maxrate = average bitrate is needed for "real" CBR */
  745.         p_sys->param.rc.b_cbr=1;
  746. #endif
  747.         p_sys->param.rc.i_rc_method = X264_RC_ABR;
  748.     }
  749.     else /* Set default to CRF */
  750.     {
  751. #if X264_BUILD >= 37
  752.         var_Get( p_enc, SOUT_CFG_PREFIX "crf", &val );
  753. #   if X264_BUILD >= 48
  754.         p_sys->param.rc.i_rc_method = X264_RC_CRF;
  755. #   endif
  756.         if( val.i_int > 0 && val.i_int <= 51 )
  757.         {
  758. #   if X264_BUILD >= 54
  759.             p_sys->param.rc.f_rf_constant = val.i_int;
  760. #   else
  761.             p_sys->param.rc.i_rf_constant = val.i_int;
  762. #   endif
  763.         }
  764. #endif
  765.     }
  766. #if X264_BUILD >= 24
  767.     var_Get( p_enc, SOUT_CFG_PREFIX "ratetol", &val );
  768.     p_sys->param.rc.f_rate_tolerance = val.f_float;
  769.     var_Get( p_enc, SOUT_CFG_PREFIX "vbv-init", &val );
  770.     p_sys->param.rc.f_vbv_buffer_init = val.f_float;
  771.     var_Get( p_enc, SOUT_CFG_PREFIX "vbv-bufsize", &val );
  772.     p_sys->param.rc.i_vbv_buffer_size = val.i_int;
  773.     /* max bitrate = average bitrate -> CBR */
  774.     var_Get( p_enc, SOUT_CFG_PREFIX "vbv-maxrate", &val );
  775. #if X264_BUILD >= 48
  776.     if( !val.i_int && p_sys->param.rc.i_rc_method == X264_RC_ABR )
  777.         p_sys->param.rc.i_vbv_max_bitrate = p_sys->param.rc.i_bitrate;
  778.     else
  779. #endif
  780.         p_sys->param.rc.i_vbv_max_bitrate = val.i_int;
  781. #else
  782.     p_sys->param.rc.i_rc_buffer_size = p_sys->param.rc.i_bitrate;
  783.     p_sys->param.rc.i_rc_init_buffer = p_sys->param.rc.i_bitrate / 4;
  784. #endif
  785.     var_Get( p_enc, SOUT_CFG_PREFIX "cabac", &val );
  786.     p_sys->param.b_cabac = val.b_bool;
  787.     /* disable deblocking when nf (no loop filter) is enabled */
  788.     var_Get( p_enc, SOUT_CFG_PREFIX "nf", &val );
  789.     p_sys->param.b_deblocking_filter = !val.b_bool;
  790.     var_Get( p_enc, SOUT_CFG_PREFIX "deblock", &val );
  791.     if( val.psz_string )
  792.     {
  793.         char *p = strchr( val.psz_string, ':' );
  794.         p_sys->param.i_deblocking_filter_alphac0 = atoi( val.psz_string );
  795.         p_sys->param.i_deblocking_filter_beta = p ? atoi( p+1 ) : p_sys->param.i_deblocking_filter_alphac0;
  796.         free( val.psz_string );
  797.     }
  798.     var_Get( p_enc, SOUT_CFG_PREFIX "level", &val );
  799.     if( val.psz_string )
  800.     {
  801.         if( us_atof (val.psz_string) < 6 )
  802.             p_sys->param.i_level_idc = (int) (10 * us_atof (val.psz_string)
  803.                                               + .5);
  804.         else
  805.             p_sys->param.i_level_idc = atoi (val.psz_string);
  806.         free( val.psz_string );
  807.     }
  808. #if X264_BUILD >= 51 /* r570 */
  809.     var_Get( p_enc, SOUT_CFG_PREFIX "interlaced", &val );
  810.     p_sys->param.b_interlaced = val.b_bool;
  811. #endif
  812.     var_Get( p_enc, SOUT_CFG_PREFIX "ipratio", &val );
  813.     p_sys->param.rc.f_ip_factor = val.f_float;
  814.     var_Get( p_enc, SOUT_CFG_PREFIX "pbratio", &val );
  815.     p_sys->param.rc.f_pb_factor = val.f_float;
  816.     var_Get( p_enc, SOUT_CFG_PREFIX "qcomp", &val );
  817.     p_sys->param.rc.f_qcompress = val.f_float;
  818.     var_Get( p_enc, SOUT_CFG_PREFIX "cplxblur", &val );
  819.     p_sys->param.rc.f_complexity_blur = val.f_float;
  820.     var_Get( p_enc, SOUT_CFG_PREFIX "qblur", &val );
  821.     p_sys->param.rc.f_qblur = val.f_float;
  822. #if X264_BUILD >= 59
  823.     var_Get( p_enc, SOUT_CFG_PREFIX "aq-mode", &val );
  824.     p_sys->param.rc.i_aq_mode = val.i_int;
  825.     var_Get( p_enc, SOUT_CFG_PREFIX "aq-strength", &val );
  826.     p_sys->param.rc.f_aq_strength = val.f_float;
  827. #endif
  828. #if X264_BUILD >= 0x000e
  829.     var_Get( p_enc, SOUT_CFG_PREFIX "verbose", &val );
  830.     if( val.b_bool ) p_sys->param.i_log_level = X264_LOG_DEBUG;
  831. #endif
  832.     var_Get( p_enc, SOUT_CFG_PREFIX "quiet", &val );
  833.     if( val.b_bool ) p_sys->param.i_log_level = X264_LOG_NONE;
  834. #if X264_BUILD >= 47 /* r518 */
  835.     var_Get( p_enc, SOUT_CFG_PREFIX "sps-id", &val );
  836.     if( val.i_int >= 0 ) p_sys->param.i_sps_id = val.i_int;
  837. #endif
  838.     var_Get( p_enc, SOUT_CFG_PREFIX "aud", &val );
  839.     if( val.b_bool ) p_sys->param.b_aud = val.b_bool;
  840.     var_Get( p_enc, SOUT_CFG_PREFIX "keyint", &val );
  841. #if X264_BUILD >= 0x000e
  842.     if( val.i_int > 0 ) p_sys->param.i_keyint_max = val.i_int;
  843. #else
  844.     if( val.i_int > 0 ) p_sys->param.i_iframe = val.i_int;
  845. #endif
  846.     var_Get( p_enc, SOUT_CFG_PREFIX "min-keyint", &val );
  847. #if X264_BUILD >= 0x000e
  848.     if( val.i_int > 0 ) p_sys->param.i_keyint_min = val.i_int;
  849. #else
  850.     if( val.i_int > 0 ) p_sys->param.i_idrframe = val.i_int;
  851. #endif
  852.     var_Get( p_enc, SOUT_CFG_PREFIX "bframes", &val );
  853.     if( val.i_int >= 0 && val.i_int <= 16 )
  854.         p_sys->param.i_bframe = val.i_int;
  855. #if X264_BUILD >= 78
  856.     var_Get( p_enc, SOUT_CFG_PREFIX "bpyramid", &val );
  857.     p_sys->param.i_bframe_pyramid = X264_B_PYRAMID_NONE;
  858.     if( !strcmp( val.psz_string, "none" ) )
  859.     {
  860.        p_sys->param.i_bframe_pyramid = X264_B_PYRAMID_NONE;
  861.     } else if ( !strcmp( val.psz_string, "strict" ) )
  862.     {
  863.        p_sys->param.i_bframe_pyramid = X264_B_PYRAMID_STRICT;
  864.     } else if ( !strcmp( val.psz_string, "normal" ) )
  865.     {
  866.        p_sys->param.i_bframe_pyramid = X264_B_PYRAMID_NORMAL;
  867.     }
  868.     free( val.psz_string );
  869. #elif X264_BUILD >= 22
  870.     var_Get( p_enc, SOUT_CFG_PREFIX "bpyramid", &val );
  871.     p_sys->param.b_bframe_pyramid = val.b_bool;
  872. #endif
  873.     var_Get( p_enc, SOUT_CFG_PREFIX "ref", &val );
  874.     if( val.i_int > 0 && val.i_int <= 15 )
  875.         p_sys->param.i_frame_reference = val.i_int;
  876.     var_Get( p_enc, SOUT_CFG_PREFIX "scenecut", &val );
  877. #if X264_BUILD >= 0x000b
  878.     if( val.i_int >= -1 && val.i_int <= 100 )
  879.         p_sys->param.i_scenecut_threshold = val.i_int;
  880. #endif
  881. #if X264_BUILD >= 55 /* r607 */ && X264_BUILD < 67 /* r1117 */
  882.     var_Get( p_enc, SOUT_CFG_PREFIX "pre-scenecut", &val );
  883.     p_sys->param.b_pre_scenecut = val.b_bool;
  884. #endif
  885. #if X264_BUILD >= 55 /* r607 */
  886.     var_Get( p_enc, SOUT_CFG_PREFIX "non-deterministic", &val );
  887.     p_sys->param.b_deterministic = val.b_bool;
  888. #endif
  889.     var_Get( p_enc, SOUT_CFG_PREFIX "subme", &val );
  890.     if( val.i_int >= 1 && val.i_int <= SUBME_MAX )
  891.         p_sys->param.analyse.i_subpel_refine = val.i_int;
  892. #if X264_BUILD >= 24
  893.     var_Get( p_enc, SOUT_CFG_PREFIX "me", &val );
  894.     if( !strcmp( val.psz_string, "dia" ) )
  895.     {
  896.         p_sys->param.analyse.i_me_method = X264_ME_DIA;
  897.     }
  898.     else if( !strcmp( val.psz_string, "hex" ) )
  899.     {
  900.         p_sys->param.analyse.i_me_method = X264_ME_HEX;
  901.     }
  902.     else if( !strcmp( val.psz_string, "umh" ) )
  903.     {
  904.         p_sys->param.analyse.i_me_method = X264_ME_UMH;
  905.     }
  906.     else if( !strcmp( val.psz_string, "esa" ) )
  907.     {
  908.         p_sys->param.analyse.i_me_method = X264_ME_ESA;
  909.     }
  910. #   if X264_BUILD >= 58 /* r728 */
  911.     else if( !strcmp( val.psz_string, "tesa" ) )
  912.     {
  913.         p_sys->param.analyse.i_me_method = X264_ME_TESA;
  914.     }
  915. #   endif
  916.     free( val.psz_string );
  917.     var_Get( p_enc, SOUT_CFG_PREFIX "merange", &val );
  918.     if( val.i_int >= 0 && val.i_int <= 64 )
  919.         p_sys->param.analyse.i_me_range = val.i_int;
  920.     var_Get( p_enc, SOUT_CFG_PREFIX "mvrange", &val );
  921.         p_sys->param.analyse.i_mv_range = val.i_int;
  922. #endif
  923. #if X264_BUILD >= 55 /* r607 */
  924.     var_Get( p_enc, SOUT_CFG_PREFIX "mvrange-thread", &val );
  925.         p_sys->param.analyse.i_mv_range_thread = val.i_int;
  926. #endif
  927.     var_Get( p_enc, SOUT_CFG_PREFIX "direct", &val );
  928.     if( !strcmp( val.psz_string, "none" ) )
  929.     {
  930.         p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_NONE;
  931.     }
  932.     else if( !strcmp( val.psz_string, "spatial" ) )
  933.     {
  934.         p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
  935.     }
  936.     else if( !strcmp( val.psz_string, "temporal" ) )
  937.     {
  938.         p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_TEMPORAL;
  939.     }
  940. #if X264_BUILD >= 45 /* r457 */
  941.     else if( !strcmp( val.psz_string, "auto" ) )
  942.     {
  943.         p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_AUTO;
  944.     }
  945. #endif
  946.     free( val.psz_string );
  947.     var_Get( p_enc, SOUT_CFG_PREFIX "psnr", &val );
  948.     p_sys->param.analyse.b_psnr = val.b_bool;
  949. #if X264_BUILD >= 50 /* r554 */
  950.     var_Get( p_enc, SOUT_CFG_PREFIX "ssim", &val );
  951.     p_sys->param.analyse.b_ssim = val.b_bool;
  952. #endif
  953. #if X264_BUILD >= 0x0012
  954.     var_Get( p_enc, SOUT_CFG_PREFIX "weightb", &val );
  955.     p_sys->param.analyse.b_weighted_bipred = val.b_bool;
  956. #endif
  957. #if X264_BUILD >= 0x0013
  958.     var_Get( p_enc, SOUT_CFG_PREFIX "b-adapt", &val );
  959. #if X264_BUILD >= 63
  960.     p_sys->param.i_bframe_adaptive = val.i_int;
  961. #else
  962.     p_sys->param.b_bframe_adaptive = val.b_bool;
  963. #endif
  964.     var_Get( p_enc, SOUT_CFG_PREFIX "b-bias", &val );
  965.     if( val.i_int >= -100 && val.i_int <= 100 )
  966.         p_sys->param.i_bframe_bias = val.i_int;
  967. #endif
  968. #if X264_BUILD >= 79
  969.     p_sys->param.analyse.i_weighted_pred = var_GetInteger( p_enc, SOUT_CFG_PREFIX "weightp" );
  970. #endif
  971. #if X264_BUILD >= 23
  972.     var_Get( p_enc, SOUT_CFG_PREFIX "chroma-me", &val );
  973.     p_sys->param.analyse.b_chroma_me = val.b_bool;
  974.     var_Get( p_enc, SOUT_CFG_PREFIX "chroma-qp-offset", &val );
  975.     p_sys->param.analyse.i_chroma_qp_offset = val.i_int;
  976. #endif
  977. #if X264_BUILD >= 36
  978.     var_Get( p_enc, SOUT_CFG_PREFIX "mixed-refs", &val );
  979.     p_sys->param.analyse.b_mixed_references = val.b_bool;
  980. #endif
  981. #if X264_BUILD >= 39
  982.     var_Get( p_enc, SOUT_CFG_PREFIX "trellis", &val );
  983.     if( val.i_int >= 0 && val.i_int <= 2 )
  984.         p_sys->param.analyse.i_trellis = val.i_int;
  985. #endif
  986. #if X264_BUILD >= 41 && X264_BUILD < 65
  987.     var_Get( p_enc, SOUT_CFG_PREFIX "b-rdo", &val );
  988.     p_sys->param.analyse.b_bframe_rdo = val.b_bool;
  989. #endif
  990. #if X264_BUILD >= 42
  991.     var_Get( p_enc, SOUT_CFG_PREFIX "fast-pskip", &val );
  992.     p_sys->param.analyse.b_fast_pskip = val.b_bool;
  993. #endif
  994. #if X264_BUILD >= 43 && X264_BUILD < 65
  995.     var_Get( p_enc, SOUT_CFG_PREFIX "bime", &val );
  996.     p_sys->param.analyse.b_bidir_me = val.b_bool;
  997. #endif
  998. #if X264_BUILD >= 44
  999.     var_Get( p_enc, SOUT_CFG_PREFIX "nr", &val );
  1000.     if( val.i_int >= 0 && val.i_int <= 1000 )
  1001.         p_sys->param.analyse.i_noise_reduction = val.i_int;
  1002. #endif
  1003. #if X264_BUILD >= 46
  1004.     var_Get( p_enc, SOUT_CFG_PREFIX "dct-decimate", &val );
  1005.     p_sys->param.analyse.b_dct_decimate = val.b_bool;
  1006. #endif
  1007. #if X264_BUILD >= 52
  1008.     var_Get( p_enc, SOUT_CFG_PREFIX "deadzone-inter", &val );
  1009.     if( val.i_int >= 0 && val.i_int <= 32 )
  1010.         p_sys->param.analyse.i_luma_deadzone[0] = val.i_int;
  1011.     var_Get( p_enc, SOUT_CFG_PREFIX "deadzone-intra", &val );
  1012.     if( val.i_int >= 0 && val.i_int <= 32 )
  1013.         p_sys->param.analyse.i_luma_deadzone[1] = val.i_int;
  1014. #if X264_BUILD <= 65
  1015.     var_Get( p_enc, SOUT_CFG_PREFIX "direct-8x8", &val );
  1016.     if( val.i_int >= -1 && val.i_int <= 1 )
  1017.         p_sys->param.analyse.i_direct_8x8_inference = val.i_int;
  1018. #endif
  1019. #endif
  1020.     var_Get( p_enc, SOUT_CFG_PREFIX "asm", &val );
  1021.     if( !val.b_bool ) p_sys->param.cpu = 0;
  1022. #ifndef X264_ANALYSE_BSUB16x16
  1023. #   define X264_ANALYSE_BSUB16x16 0
  1024. #endif
  1025.     var_Get( p_enc, SOUT_CFG_PREFIX "partitions", &val );
  1026.     if( !strcmp( val.psz_string, "none" ) )
  1027.     {
  1028.         p_sys->param.analyse.inter = 0;
  1029.     }
  1030.     else if( !strcmp( val.psz_string, "fast" ) )
  1031.     {
  1032.         p_sys->param.analyse.inter = X264_ANALYSE_I4x4;
  1033.     }
  1034.     else if( !strcmp( val.psz_string, "normal" ) )
  1035.     {
  1036.         p_sys->param.analyse.inter =
  1037.             X264_ANALYSE_I4x4 |
  1038.             X264_ANALYSE_PSUB16x16;
  1039. #ifdef X264_ANALYSE_I8x8
  1040.         p_sys->param.analyse.inter |= X264_ANALYSE_I8x8;
  1041. #endif
  1042.     }
  1043.     else if( !strcmp( val.psz_string, "slow" ) )
  1044.     {
  1045.         p_sys->param.analyse.inter =
  1046.             X264_ANALYSE_I4x4 |
  1047.             X264_ANALYSE_PSUB16x16 |
  1048.             X264_ANALYSE_BSUB16x16;
  1049. #ifdef X264_ANALYSE_I8x8
  1050.         p_sys->param.analyse.inter |= X264_ANALYSE_I8x8;
  1051. #endif
  1052.     }
  1053.     else if( !strcmp( val.psz_string, "all" ) )
  1054.     {
  1055.         p_sys->param.analyse.inter =
  1056.             X264_ANALYSE_I4x4 |
  1057.             X264_ANALYSE_PSUB16x16 |
  1058.             X264_ANALYSE_BSUB16x16 |
  1059.             X264_ANALYSE_PSUB8x8;
  1060. #ifdef X264_ANALYSE_I8x8
  1061.         p_sys->param.analyse.inter |= X264_ANALYSE_I8x8;
  1062. #endif
  1063.     }
  1064.     free( val.psz_string );
  1065. #if X264_BUILD >= 30
  1066.     var_Get( p_enc, SOUT_CFG_PREFIX "8x8dct", &val );
  1067.     p_sys->param.analyse.b_transform_8x8 = val.b_bool;
  1068. #endif
  1069.     if( p_enc->fmt_in.video.i_aspect > 0 )
  1070.     {
  1071.         int64_t i_num, i_den;
  1072.         unsigned int i_dst_num, i_dst_den;
  1073.         i_num = p_enc->fmt_in.video.i_aspect *
  1074.             (int64_t)p_enc->fmt_in.video.i_height;
  1075.         i_den = VOUT_ASPECT_FACTOR * p_enc->fmt_in.video.i_width;
  1076.         vlc_ureduce( &i_dst_num, &i_dst_den, i_num, i_den, 0 );
  1077.         p_sys->param.vui.i_sar_width = i_dst_num;
  1078.         p_sys->param.vui.i_sar_height = i_dst_den;
  1079.     }
  1080.     if( p_enc->fmt_in.video.i_frame_rate_base > 0 )
  1081.     {
  1082.         p_sys->param.i_fps_num = p_enc->fmt_in.video.i_frame_rate;
  1083.         p_sys->param.i_fps_den = p_enc->fmt_in.video.i_frame_rate_base;
  1084.     }
  1085.     /* x264 vbv-bufsize = 0 (default). if not provided set period
  1086.        in seconds for local maximum bitrate (cache/bufsize) based
  1087.        on average bitrate when use has told bitrate.
  1088.        vbv-buffer size is set to bitrate * secods between keyframes */
  1089.     if( !p_sys->param.rc.i_vbv_buffer_size &&
  1090.          p_sys->param.rc.i_rc_method == X264_RC_ABR &&
  1091.          p_sys->param.i_fps_num )
  1092.     {
  1093.         p_sys->param.rc.i_vbv_buffer_size = p_sys->param.rc.i_bitrate *
  1094.             p_sys->param.i_fps_den;
  1095. #if X264_BUILD >= 0x000e
  1096.         p_sys->param.rc.i_vbv_buffer_size *= p_sys->param.i_keyint_max;
  1097. #else
  1098.         p_sys->param.rc.i_vbv_buffer_size *= p_sys->param.i_idrframe;
  1099. #endif
  1100.         p_sys->param.rc.i_vbv_buffer_size /= p_sys->param.i_fps_num;
  1101.     }
  1102.     /* Check if user has given some profile (baseline,main,high) to limit
  1103.      * settings, and apply those*/
  1104.     var_Get( p_enc, SOUT_CFG_PREFIX "profile", &val );
  1105.     if( val.psz_string )
  1106.     {
  1107.         if( !strcasecmp( val.psz_string, "baseline" ) )
  1108.         {
  1109.             msg_Dbg( p_enc, "Limiting to baseline profile");
  1110.             p_sys->param.analyse.b_transform_8x8 = 0;
  1111.             p_sys->param.b_cabac = 0;
  1112.             p_sys->param.i_bframe = 0;
  1113. #if X264_BUILD >= 79
  1114.             p_sys->param.analyse.i_weighted_pred = X264_WEIGHTP_NONE;
  1115. #endif
  1116.         }
  1117.         else if (!strcasecmp( val.psz_string, "main" ) )
  1118.         {
  1119.             msg_Dbg( p_enc, "Limiting to main-profile");
  1120.             p_sys->param.analyse.b_transform_8x8 = 0;
  1121.         }
  1122.         /* high profile don't restrict stuff*/
  1123.     }
  1124.     free( val.psz_string );
  1125.     unsigned i_cpu = vlc_CPU();
  1126.     if( !(i_cpu & CPU_CAPABILITY_MMX) )
  1127.     {
  1128.         p_sys->param.cpu &= ~X264_CPU_MMX;
  1129.     }
  1130.     if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
  1131.     {
  1132.         p_sys->param.cpu &= ~X264_CPU_MMXEXT;
  1133.     }
  1134.     if( !(i_cpu & CPU_CAPABILITY_SSE) )
  1135.     {
  1136.         p_sys->param.cpu &= ~X264_CPU_SSE;
  1137.     }
  1138.     if( !(i_cpu & CPU_CAPABILITY_SSE2) )
  1139.     {
  1140.         p_sys->param.cpu &= ~X264_CPU_SSE2;
  1141.     }
  1142.     /* BUILD 29 adds support for multi-threaded encoding while BUILD 49 (r543)
  1143.        also adds support for threads = 0 for automatically selecting an optimal
  1144.        value (cores * 1.5) based on detected CPUs. Default behavior for x264 is
  1145.        threads = 1, however VLC usage differs and uses threads = 0 (auto) by
  1146.        default unless ofcourse transcode threads is explicitly specified.. */
  1147. #if X264_BUILD >= 29
  1148.     p_sys->param.i_threads = p_enc->i_threads;
  1149. #endif
  1150.     var_Get( p_enc, SOUT_CFG_PREFIX "stats", &val );
  1151.     if( val.psz_string )
  1152.     {
  1153.         p_sys->param.rc.psz_stat_in  =
  1154.         p_sys->param.rc.psz_stat_out =
  1155.         p_sys->psz_stat_name         = val.psz_string;
  1156.     }
  1157.     var_Get( p_enc, SOUT_CFG_PREFIX "pass", &val );
  1158.     if( val.i_int > 0 && val.i_int <= 3 )
  1159.     {
  1160.         p_sys->param.rc.b_stat_write = val.i_int & 1;
  1161.         p_sys->param.rc.b_stat_read = val.i_int & 2;
  1162.     }
  1163.     /* We need to initialize pthreadw32 before we open the encoder,
  1164.        but only oncce for the whole application. Since pthreadw32
  1165.        doesn't keep a refcount, do it ourselves. */
  1166. #ifdef PTW32_STATIC_LIB
  1167.     vlc_value_t lock, count;
  1168.     var_Create( p_enc->p_libvlc, "pthread_win32_mutex", VLC_VAR_MUTEX );
  1169.     var_Get( p_enc->p_libvlc, "pthread_win32_mutex", &lock );
  1170.     vlc_mutex_lock( lock.p_address );
  1171.     var_Create( p_enc->p_libvlc, "pthread_win32_count", VLC_VAR_INTEGER );
  1172.     var_Get( p_enc->p_libvlc, "pthread_win32_count", &count );
  1173.     if( count.i_int == 0 )
  1174.     {
  1175.         msg_Dbg( p_enc, "initializing pthread-win32" );
  1176.         if( !pthread_win32_process_attach_np() || !pthread_win32_thread_attach_np() )   
  1177.         {
  1178.             msg_Warn( p_enc, "pthread Win32 Initialization failed" );
  1179.             vlc_mutex_unlock( lock.p_address );
  1180.             return VLC_EGENERIC;
  1181.         }
  1182.     }
  1183.     count.i_int++;
  1184.     var_Set( p_enc->p_libvlc, "pthread_win32_count", count );
  1185.     vlc_mutex_unlock( lock.p_address );
  1186. #endif
  1187. #if X264_BUILD >= 69
  1188.     /* Set lookahead value to lower than default,
  1189.      * as rtp-output without mux doesn't handle
  1190.      * difference that well yet*/
  1191.     p_sys->param.rc.i_lookahead= var_GetInteger( p_enc, SOUT_CFG_PREFIX "lookahead" );
  1192. #endif
  1193.     /* Open the encoder */
  1194.     p_sys->h = x264_encoder_open( &p_sys->param );
  1195.     if( p_sys->h == NULL )
  1196.     {
  1197.         msg_Err( p_enc, "cannot open x264 encoder" );
  1198.         Close( VLC_OBJECT(p_enc) );
  1199.         return VLC_EGENERIC;
  1200.     }
  1201.     /* alloc mem */
  1202.     p_sys->i_buffer = 4 * p_enc->fmt_in.video.i_width *
  1203.         p_enc->fmt_in.video.i_height + 1000;
  1204.     p_sys->p_buffer = malloc( p_sys->i_buffer );
  1205.     if( !p_sys->p_buffer )
  1206.     {
  1207.         Close( VLC_OBJECT(p_enc) );
  1208.         return VLC_ENOMEM;
  1209.     }
  1210.     /* get the globals headers */
  1211.     p_enc->fmt_out.i_extra = 0;
  1212.     p_enc->fmt_out.p_extra = NULL;
  1213. #if X264_BUILD >= 76
  1214.     p_enc->fmt_out.i_extra = x264_encoder_headers( p_sys->h, &nal, &i_nal );
  1215.     p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
  1216.     if( !p_enc->fmt_out.p_extra )
  1217.     {
  1218.         Close( VLC_OBJECT(p_enc) );
  1219.         return VLC_ENOMEM;
  1220.     }
  1221.     void *p_tmp = p_enc->fmt_out.p_extra;
  1222.     for( i = 0; i < i_nal; i++ )
  1223.     {
  1224.         memcpy( p_tmp, nal[i].p_payload, nal[i].i_payload );
  1225.         p_tmp += nal[i].i_payload;
  1226.     }
  1227. #else
  1228.     x264_encoder_headers( p_sys->h, &nal, &i_nal );
  1229.     for( i = 0; i < i_nal; i++ )
  1230.     {
  1231.         void *p_tmp;
  1232.         int i_size = p_sys->i_buffer;
  1233.         x264_nal_encode( p_sys->p_buffer, &i_size, 1, &nal[i] );
  1234.         p_tmp = realloc( p_enc->fmt_out.p_extra, p_enc->fmt_out.i_extra + i_size );
  1235.         if( !p_tmp )
  1236.         {
  1237.             Close( VLC_OBJECT(p_enc) );
  1238.             return VLC_ENOMEM;
  1239.         }
  1240.         p_enc->fmt_out.p_extra = p_tmp;
  1241.         memcpy( (uint8_t*)p_enc->fmt_out.p_extra + p_enc->fmt_out.i_extra,
  1242.                 p_sys->p_buffer, i_size );
  1243.         p_enc->fmt_out.i_extra += i_size;
  1244.     }
  1245. #endif
  1246.     return VLC_SUCCESS;
  1247. }
  1248. /****************************************************************************
  1249.  * Encode:
  1250.  ****************************************************************************/
  1251. static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
  1252. {
  1253.     encoder_sys_t *p_sys = p_enc->p_sys;
  1254.     x264_picture_t pic;
  1255.     x264_nal_t *nal;
  1256.     block_t *p_block;
  1257.     int i_nal, i_out, i;
  1258.     /* init pic */
  1259.     memset( &pic, 0, sizeof( x264_picture_t ) );
  1260.     pic.i_pts = p_pict->date;
  1261.     pic.img.i_csp = X264_CSP_I420;
  1262.     pic.img.i_plane = p_pict->i_planes;
  1263.     for( i = 0; i < p_pict->i_planes; i++ )
  1264.     {
  1265.         pic.img.plane[i] = p_pict->p[i].p_pixels;
  1266.         pic.img.i_stride[i] = p_pict->p[i].i_pitch;
  1267.     }
  1268. #if X264_BUILD >= 0x0013
  1269.     x264_encoder_encode( p_sys->h, &nal, &i_nal, &pic, &pic );
  1270. #else
  1271.     x264_encoder_encode( p_sys->h, &nal, &i_nal, &pic );
  1272. #endif
  1273.     if( !i_nal ) return NULL;
  1274.     for( i = 0, i_out = 0; i < i_nal; i++ )
  1275.     {
  1276. #if X264_BUILD >= 76
  1277.         memcpy( p_sys->p_buffer + i_out, nal[i].p_payload, nal[i].i_payload );
  1278.         i_out += nal[i].i_payload;
  1279. #else
  1280.         int i_size = p_sys->i_buffer - i_out;
  1281.         x264_nal_encode( p_sys->p_buffer + i_out, &i_size, 1, &nal[i] );
  1282.         i_out += i_size;
  1283. #endif
  1284.     }
  1285.     p_block = block_New( p_enc, i_out );
  1286.     if( !p_block ) return NULL;
  1287.     memcpy( p_block->p_buffer, p_sys->p_buffer, i_out );
  1288.     if( pic.i_type == X264_TYPE_IDR || pic.i_type == X264_TYPE_I )
  1289.         p_block->i_flags |= BLOCK_FLAG_TYPE_I;
  1290.     else if( pic.i_type == X264_TYPE_P )
  1291.         p_block->i_flags |= BLOCK_FLAG_TYPE_P;
  1292.     else if( pic.i_type == X264_TYPE_B )
  1293.         p_block->i_flags |= BLOCK_FLAG_TYPE_B;
  1294.     /* This isn't really valid for streams with B-frames */
  1295.     p_block->i_length = INT64_C(1000000) *
  1296.         p_enc->fmt_in.video.i_frame_rate_base /
  1297.             p_enc->fmt_in.video.i_frame_rate;
  1298.     p_block->i_pts = pic.i_pts;
  1299.     if( p_sys->param.i_bframe > 0 )
  1300.     {
  1301.         if( p_block->i_flags & BLOCK_FLAG_TYPE_B )
  1302.         {
  1303.             /* FIXME : this is wrong if bpyramid is set */
  1304.             p_block->i_dts = p_block->i_pts;
  1305.             p_sys->i_interpolated_dts = p_block->i_dts;
  1306.         }
  1307.         else
  1308.         {
  1309.             if( p_sys->i_interpolated_dts )
  1310.             {
  1311.                 p_block->i_dts = p_sys->i_interpolated_dts;
  1312.             }
  1313.             else
  1314.             {
  1315.                 /* Let's put something sensible */
  1316.                 p_block->i_dts = p_block->i_pts;
  1317.             }
  1318.             p_sys->i_interpolated_dts += p_block->i_length;
  1319.         }
  1320.     }
  1321.     else
  1322.     {
  1323.         p_block->i_dts = p_block->i_pts;
  1324.     }
  1325.     return p_block;
  1326. }
  1327. /*****************************************************************************
  1328.  * CloseEncoder: x264 encoder destruction
  1329.  *****************************************************************************/
  1330. static void Close( vlc_object_t *p_this )
  1331. {
  1332.     encoder_t     *p_enc = (encoder_t *)p_this;
  1333.     encoder_sys_t *p_sys = p_enc->p_sys;
  1334.     free( p_sys->psz_stat_name );
  1335.     if( p_sys->h )
  1336.         x264_encoder_close( p_sys->h );
  1337. #ifdef PTW32_STATIC_LIB
  1338.     vlc_value_t lock, count;
  1339.     var_Create( p_enc->p_libvlc, "pthread_win32_mutex", VLC_VAR_MUTEX );
  1340.     var_Get( p_enc->p_libvlc, "pthread_win32_mutex", &lock );
  1341.     vlc_mutex_lock( lock.p_address );
  1342.     var_Create( p_enc->p_libvlc, "pthread_win32_count", VLC_VAR_INTEGER );
  1343.     var_Get( p_enc->p_libvlc, "pthread_win32_count", &count );
  1344.     count.i_int--;
  1345.     var_Set( p_enc->p_libvlc, "pthread_win32_count", count );
  1346.     if( count.i_int == 0 )
  1347.     {
  1348.         pthread_win32_thread_detach_np();
  1349.         pthread_win32_process_detach_np();
  1350.         msg_Dbg( p_enc, "pthread-win32 deinitialized" );
  1351.     }
  1352.     vlc_mutex_unlock( lock.p_address );
  1353. #endif
  1354.     free( p_sys->p_buffer );
  1355.     free( p_sys );
  1356. }