X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=common%2Fcommon.c;h=4b8f803a839e530fff09ec06571f5ba59f3b76d1;hb=c82c7374938f4342971adf8b2495c3a1bbe621c4;hp=b32c5d331f5d96d10d09b1614bd1f0bc2fecc108;hpb=94e476d80b9635508907893c97e8f8d9f0bc9ddf;p=x264 diff --git a/common/common.c b/common/common.c index b32c5d33..4b8f803a 100644 --- a/common/common.c +++ b/common/common.c @@ -1,7 +1,7 @@ /***************************************************************************** * common.c: misc common functions ***************************************************************************** - * Copyright (C) 2003-2015 x264 project + * Copyright (C) 2003-2016 x264 project * * Authors: Loren Merritt * Laurent Aimar @@ -582,7 +582,6 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) int errortype = X264_PARAM_BAD_VALUE; int name_was_bool; int value_was_null = !value; - int i; if( !name ) return X264_PARAM_BAD_NAME; @@ -596,15 +595,18 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) { char *c; name_buf = strdup(name); + if( !name_buf ) + return X264_PARAM_BAD_NAME; while( (c = strchr( name_buf, '_' )) ) *c = '-'; name = name_buf; } - if( (!strncmp( name, "no-", 3 ) && (i = 3)) || - (!strncmp( name, "no", 2 ) && (i = 2)) ) + if( !strncmp( name, "no", 2 ) ) { - name += i; + name += 2; + if( name[0] == '-' ) + name++; value = atobool(value) ? "false" : "true"; } name_was_bool = 0; @@ -618,20 +620,25 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) !strcasecmp(value, "auto") || atobool(value) ? x264_cpu_detect() : 0; if( b_error ) { - char *buf = strdup(value); - char *tok, UNUSED *saveptr=NULL, *init; - b_error = 0; - p->cpu = 0; - for( init=buf; (tok=strtok_r(init, ",", &saveptr)); init=NULL ) + char *buf = strdup( value ); + if( buf ) { - for( i=0; x264_cpu_names[i].flags && strcasecmp(tok, x264_cpu_names[i].name); i++ ); - p->cpu |= x264_cpu_names[i].flags; - if( !x264_cpu_names[i].flags ) - b_error = 1; + char *tok, UNUSED *saveptr=NULL, *init; + b_error = 0; + p->cpu = 0; + for( init=buf; (tok=strtok_r(init, ",", &saveptr)); init=NULL ) + { + int i = 0; + while( x264_cpu_names[i].flags && strcasecmp(tok, x264_cpu_names[i].name) ) + i++; + p->cpu |= x264_cpu_names[i].flags; + if( !x264_cpu_names[i].flags ) + b_error = 1; + } + free( buf ); + if( (p->cpu&X264_CPU_SSSE3) && !(p->cpu&X264_CPU_SSE2_IS_SLOW) ) + p->cpu |= X264_CPU_SSE2_IS_FAST; } - free( buf ); - if( (p->cpu&X264_CPU_SSSE3) && !(p->cpu&X264_CPU_SSE2_IS_SLOW) ) - p->cpu |= X264_CPU_SSE2_IS_FAST; } } OPT("threads") @@ -698,14 +705,12 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) } OPT("fps") { - if( sscanf( value, "%u/%u", &p->i_fps_num, &p->i_fps_den ) == 2 ) - ; - else + if( sscanf( value, "%u/%u", &p->i_fps_num, &p->i_fps_den ) != 2 ) { - float fps = atof(value); - if( fps > 0 && fps <= INT_MAX/1000 ) + double fps = atof(value); + if( fps > 0.0 && fps <= INT_MAX/1000.0 ) { - p->i_fps_num = (int)(fps * 1000 + .5); + p->i_fps_num = (int)(fps * 1000.0 + .5); p->i_fps_den = 1000; } else @@ -1137,6 +1142,7 @@ int x264_picture_alloc( x264_picture_t *pic, int i_csp, int i_width, int i_heigh [X264_CSP_I420] = { 3, { 256*1, 256/2, 256/2 }, { 256*1, 256/2, 256/2 } }, [X264_CSP_YV12] = { 3, { 256*1, 256/2, 256/2 }, { 256*1, 256/2, 256/2 } }, [X264_CSP_NV12] = { 2, { 256*1, 256*1 }, { 256*1, 256/2 }, }, + [X264_CSP_NV21] = { 2, { 256*1, 256*1 }, { 256*1, 256/2 }, }, [X264_CSP_I422] = { 3, { 256*1, 256/2, 256/2 }, { 256*1, 256*1, 256*1 } }, [X264_CSP_YV16] = { 3, { 256*1, 256/2, 256/2 }, { 256*1, 256*1, 256*1 } }, [X264_CSP_NV16] = { 2, { 256*1, 256*1 }, { 256*1, 256*1 }, }, @@ -1269,29 +1275,36 @@ REDUCE_FRACTION( x264_reduce_fraction64, uint64_t ) char *x264_slurp_file( const char *filename ) { int b_error = 0; - size_t i_size; + int64_t i_size; char *buf; FILE *fh = x264_fopen( filename, "rb" ); if( !fh ) return NULL; + b_error |= fseek( fh, 0, SEEK_END ) < 0; b_error |= ( i_size = ftell( fh ) ) <= 0; + if( WORD_SIZE == 4 ) + b_error |= i_size > INT32_MAX; b_error |= fseek( fh, 0, SEEK_SET ) < 0; if( b_error ) goto error; + buf = x264_malloc( i_size+2 ); if( !buf ) goto error; + b_error |= fread( buf, 1, i_size, fh ) != i_size; - if( buf[i_size-1] != '\n' ) - buf[i_size++] = '\n'; - buf[i_size] = 0; fclose( fh ); if( b_error ) { x264_free( buf ); return NULL; } + + if( buf[i_size-1] != '\n' ) + buf[i_size++] = '\n'; + buf[i_size] = '\0'; + return buf; error: fclose( fh );