"""X264 codec definition.

This file defines how to run encode and decode for the x264 implementation
of H.264.
"""
import encoder
import file_codec

class X264Codec(file_codec.FileCodec):
  def __init__(self, name='x264'):
    super(X264Codec, self).__init__(name)
    self.extension = 'mkv'
    self.option_set = encoder.OptionSet(
    )

  def StartEncoder(self):
    return encoder.Encoder(self, encoder.OptionValueSet(self.option_set, ''))


  def EncodeCommandLine(self, parameters, bitrate, videofile, encodedfile):
    commandline = ('%(x264)s '
      '--vbv-maxrate %(bitrate)d --vbv-bufsize %(bitrate)d --vbv-init 0.8 '
      '--bitrate %(bitrate)d --fps %(framerate)d '
      '--threads 1 '
      '--rc-lookahead 0 '
      '--ref 2 '
      '--profile baseline --no-scenecut --keyint infinite --preset veryslow '
      '--input-res %(width)dx%(height)d '
      '--tune psnr '
      '-o %(outputfile)s %(inputfile)s') % {
      'x264': encoder.Tool('x264'),
      'bitrate': bitrate,
      'framerate': videofile.framerate,
      'width': videofile.width,
      'height': videofile.height,
      'outputfile': encodedfile,
      'inputfile': videofile.filename}
    return commandline


  def DecodeCommandLine(self, videofile, encodedfile, yuvfile):
    commandline = '%s -i %s %s' % (encoder.Tool("ffmpeg"),
                                    encodedfile, yuvfile)
    return commandline

  def ResultData(self, encodedfile):
    more_results = {}
    more_results['frame'] = file_codec.MatroskaFrameInfo(encodedfile)
    return more_results


@@ -214,16 +214,32 @@
 e='x264'
+, formatter=None
 ):%0A    s
@@ -273,81 +273,334 @@
 t__(
-name)%0A    self.extension = 'mkv'%0A    self.option_set = encoder.OptionSet(
+%0A      name,%0A      formatter=(formatter or encoder.OptionFormatter(prefix='--', infix=' ')))%0A    self.extension = 'mkv'%0A    self.option_set = encoder.OptionSet(%0A      encoder.Option('rc-lookahead', %5B'0', '30', '60'%5D),%0A      encoder.Option('vbv-init', %5B'0.5', '0.8', '0.9'%5D),%0A      encoder.Option('ref', %5B'1', '2', '3', '16'%5D),
 %0A   
@@ -685,16 +685,23 @@
 alueSet(
+%0A      
 self.opt
@@ -712,11 +712,95 @@
 set,
- ''
+%0A      '--rc-lookahead 0 --ref 2 --vbv-init 0.8',%0A      formatter=self.option_formatter
 ))%0A%0A
@@ -970,23 +970,8 @@
 e)d 
---vbv-init 0.8 
 '%0A  
@@ -1044,51 +1044,8 @@
 1 '%0A
-      '--rc-lookahead 0 '%0A      '--ref 2 '%0A
     
@@ -1181,16 +1181,40 @@
  psnr '%0A
+      '%25(parameters)s '%0A
       '-
@@ -1256,16 +1256,18 @@
 %7B%0A      
+  
 'x264': 
@@ -1288,16 +1288,18 @@
 x264'),%0A
+  
       'b
@@ -1322,16 +1322,18 @@
 ,%0A      
+  
 'framera
@@ -1354,24 +1354,26 @@
 .framerate,%0A
+  
       'width
@@ -1398,16 +1398,18 @@
 ,%0A      
+  
 'height'
@@ -1428,16 +1428,18 @@
 height,%0A
+  
       'o
@@ -1469,16 +1469,18 @@
 ,%0A      
+  
 'inputfi
@@ -1502,16 +1502,61 @@
 filename
+,%0A        'parameters': parameters.ToString()
 %7D%0A    re
@@ -1932,9 +1932,8 @@
 results%0A
-%0A

Add parameter variation to the x264 codec