]> granicus.if.org Git - libx264/commitdiff
Relax QPfile restrictions
authorFiona Glaser <fiona@x264.com>
Sat, 12 Jul 2008 20:37:58 +0000 (14:37 -0600)
committerFiona Glaser <fiona@x264.com>
Sat, 12 Jul 2008 20:37:58 +0000 (14:37 -0600)
Allow a QPfile to contain fewer frames than the total number of frames in the video and have ratecontrol fill in the rest.
Patch by kemuri9.

x264.c

diff --git a/x264.c b/x264.c
index 14466e50ec9bebaaa48fca81b122a33072211cc4..5741d00ce745022d8441a151b9e44c3142db3f7b 100644 (file)
--- a/x264.c
+++ b/x264.c
@@ -691,11 +691,20 @@ static int  Parse( int argc, char **argv,
 
 static void parse_qpfile( cli_opt_t *opt, x264_picture_t *pic, int i_frame )
 {
-    int num = -1, qp;
+    int num = -1, qp, ret;
     char type;
+    uint64_t file_pos;
     while( num < i_frame )
     {
-        int ret = fscanf( opt->qpfile, "%d %c %d\n", &num, &type, &qp );
+        file_pos = ftell( opt->qpfile );
+        ret = fscanf( opt->qpfile, "%d %c %d\n", &num, &type, &qp );
+               if( num > i_frame || ret == EOF )
+               {
+                       pic->i_type = X264_TYPE_AUTO;
+                       pic->i_qpplus1 = 0;
+                       fseek( opt->qpfile , file_pos , SEEK_SET );
+                       break;
+               }
         if( num < i_frame )
             continue;
         pic->i_qpplus1 = qp+1;
@@ -705,7 +714,7 @@ static void parse_qpfile( cli_opt_t *opt, x264_picture_t *pic, int i_frame )
         else if( type == 'B' ) pic->i_type = X264_TYPE_BREF;
         else if( type == 'b' ) pic->i_type = X264_TYPE_B;
         else ret = 0;
-        if( ret != 3 || qp < 0 || qp > 51 || num > i_frame )
+        if( ret != 3 || qp < -1 || qp > 51 )
         {
             fprintf( stderr, "x264 [error]: can't parse qpfile for frame %d\n", i_frame );
             fclose( opt->qpfile );