OSDN Git Service

Added CRF x264 rate control method to HBTest.
authorjbrjake <jbrjake@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 4 Jan 2007 19:48:54 +0000 (19:48 +0000)
committerjbrjake <jbrjake@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 4 Jan 2007 19:48:54 +0000 (19:48 +0000)
Constant quantizer is maintained as the default so nothing changes:
HBTest -i input -o output -e x264 -q 0.60

Switch to constant rate factor by throwing a -Q on the end:
HBTest -i input -o output -e x264 -q 0.60 -Q

git-svn-id: svn://localhost/HandBrake/trunk@89 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.h
libhb/encx264.c
test/test.c

index 0bd8971..eba152f 100644 (file)
@@ -124,7 +124,8 @@ struct hb_job_s
     int             pass;
     int             h264_13;
        int                             h264_level;
-
+       int                             crf;
+       
     /* Audio tracks:
          Indexes in hb_title_t's audios list, starting from 0.
          -1 indicates the end of the list */
index a72a960..1bc2486 100644 (file)
@@ -77,11 +77,23 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
        
     if( job->vquality >= 0.0 && job->vquality <= 1.0 )
     {
-        /* Constant QP */
-        param.rc.i_rc_method = X264_RC_CQP;
-        param.rc.i_qp_constant = 51 - job->vquality * 51;
-        hb_log( "encx264: encoding at constant QP %d",
+        switch(job->crf)
+               {
+                       case 1:
+                       /*Constant RF*/
+                       param.rc.i_rc_method = X264_RC_CRF;
+                       param.rc.f_rf_constant = 51 - job->vquality * 51;
+                       hb_log( "encx264: Encoding at constant RF %f",                                  param.rc.f_rf_constant );
+                       break;
+               
+                       case 0:
+                       /*Constant QP*/
+                       param.rc.i_rc_method = X264_RC_CQP;
+               param.rc.i_qp_constant = 51 - job->vquality * 51;
+               hb_log( "encx264: encoding at constant QP %d",
                 param.rc.i_qp_constant );
+                       break;
+               }
     }
     else
     {
index de499f4..9d65430 100644 (file)
@@ -41,6 +41,7 @@ static int    mux         = 0;
 static int    acodec      = 0;
 static int    chapter_start = 0;
 static int    chapter_end   = 0;
+static int       crf                   = 0;
 
 /* Exit cleanly on Ctrl-C */
 static volatile int die = 0;
@@ -412,6 +413,11 @@ static int HandleEvents( hb_handle_t * h )
             }
             job->file = strdup( output );
 
+                       if( crf )
+                       {
+                               job->crf = 1;
+                       }
+
             if( twoPass )
             {
                 job->pass = 1;
@@ -538,6 +544,7 @@ static void ShowHelp()
     fprintf( stderr, " kHz)\n"
     "    -b, --vb <kb/s>         Set video bitrate (default: 1000)\n"
     "    -q, --quality <float>   Set video quality (0.0..1.0)\n"
+       "    -Q, --crf               Use with -q for CRF instead of CQP\n"
     "    -S, --size <MB>         Set target size\n"
     "    -B, --ab <kb/s>         Set audio bitrate (default: 128)\n"
     "    -w, --width <number>    Set picture width\n"
@@ -583,7 +590,8 @@ static int ParseOptions( int argc, char ** argv )
             { "ab",          required_argument, NULL,    'B' },
             { "rate",        required_argument, NULL,    'r' },
             { "arate",       required_argument, NULL,    'R' },
-
+                       { "crf",                 no_argument,           NULL,    'Q' },
+                       
             { 0, 0, 0, 0 }
           };
 
@@ -591,7 +599,7 @@ static int ParseOptions( int argc, char ** argv )
         int c;
 
         c = getopt_long( argc, argv,
-                         "hvuC:f:i:o:t:c:a:s:e:E:2dgw:l:n:b:q:S:B:r:R:",
+                         "hvuC:f:i:o:t:c:a:s:e:E:2dgw:l:n:b:q:S:B:r:R:Q",
                          long_options, &option_index );
         if( c < 0 )
         {
@@ -769,6 +777,9 @@ static int ParseOptions( int argc, char ** argv )
             case 'B':
                 abitrate = atoi( optarg );
                 break;
+                       case 'Q':
+                               crf = 1;
+                               break;
 
             default:
                 fprintf( stderr, "unknown option (%s)\n", argv[optind] );