X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=common%2Fcommon.c;h=6999a0060af82bcd795b9896a4d03cb8db0fe385;hb=9f422c0cd9c0abcd6a7abb10b51f8be883c39b2b;hp=f24890f9fda2b296405c66628f40818e2fbe0178;hpb=95d196ef2edde109cfb32f4baa9b0adc67e842e1;p=x264 diff --git a/common/common.c b/common/common.c index f24890f9..6999a006 100644 --- a/common/common.c +++ b/common/common.c @@ -1,7 +1,7 @@ /***************************************************************************** * common.c: misc common functions ***************************************************************************** - * Copyright (C) 2003-2013 x264 project + * Copyright (C) 2003-2015 x264 project * * Authors: Loren Merritt * Laurent Aimar @@ -517,7 +517,7 @@ int x264_param_apply_profile( x264_param_t *param, const char *profile ) static int parse_enum( const char *arg, const char * const *names, int *dst ) { for( int i = 0; names[i]; i++ ) - if( !strcmp( arg, names[i] ) ) + if( !strcasecmp( arg, names[i] ) ) { *dst = i; return 0; @@ -540,12 +540,12 @@ static int parse_cqm( const char *str, uint8_t *cqm, int length ) static int x264_atobool( const char *str, int *b_error ) { if( !strcmp(str, "1") || - !strcmp(str, "true") || - !strcmp(str, "yes") ) + !strcasecmp(str, "true") || + !strcasecmp(str, "yes") ) return 1; if( !strcmp(str, "0") || - !strcmp(str, "false") || - !strcmp(str, "no") ) + !strcasecmp(str, "false") || + !strcasecmp(str, "no") ) return 0; *b_error = 1; return 0; @@ -579,9 +579,9 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) { char *name_buf = NULL; int b_error = 0; + int errortype = X264_PARAM_BAD_VALUE; int name_was_bool; int value_was_null = !value; - int i; if( !name ) return X264_PARAM_BAD_NAME; @@ -595,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; @@ -614,35 +617,40 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) OPT("asm") { p->cpu = isdigit(value[0]) ? atoi(value) : - !strcmp(value, "auto") || atobool(value) ? x264_cpu_detect() : 0; + !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") { - if( !strcmp(value, "auto") ) + if( !strcasecmp(value, "auto") ) p->i_threads = X264_THREADS_AUTO; else p->i_threads = atoi(value); } OPT("lookahead-threads") { - if( !strcmp(value, "auto") ) + if( !strcasecmp(value, "auto") ) p->i_lookahead_threads = X264_THREADS_AUTO; else p->i_lookahead_threads = atoi(value); @@ -651,7 +659,7 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) p->b_sliced_threads = atobool(value); OPT("sync-lookahead") { - if( !strcmp(value, "auto") ) + if( !strcasecmp(value, "auto") ) p->i_sync_lookahead = X264_SYNC_LOOKAHEAD_AUTO; else p->i_sync_lookahead = atoi(value); @@ -671,8 +679,8 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) } OPT("bluray-compat") p->b_bluray_compat = atobool(value); - OPT("avcintra-compat") - p->b_avcintra_compat = atobool(value); + OPT("avcintra-class") + p->i_avcintra_class = atoi(value); OPT("sar") { b_error = ( 2 != sscanf( value, "%d:%d", &p->vui.i_sar_width, &p->vui.i_sar_height ) && @@ -697,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 @@ -1049,7 +1055,10 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) OPT("opencl-device") p->i_opencl_device = atoi( value ); else - return X264_PARAM_BAD_NAME; + { + b_error = 1; + errortype = X264_PARAM_BAD_NAME; + } #undef OPT #undef OPT2 #undef atobool @@ -1060,7 +1069,7 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value ) free( name_buf ); b_error |= value_was_null && !name_was_bool; - return b_error ? X264_PARAM_BAD_VALUE : 0; + return b_error ? errortype : 0; } /**************************************************************************** @@ -1133,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 }, }, @@ -1144,7 +1154,7 @@ int x264_picture_alloc( x264_picture_t *pic, int i_csp, int i_width, int i_heigh }; int csp = i_csp & X264_CSP_MASK; - if( csp <= X264_CSP_NONE || csp >= X264_CSP_MAX ) + if( csp <= X264_CSP_NONE || csp >= X264_CSP_MAX || csp == X264_CSP_V210 ) return -1; x264_picture_init( pic ); pic->img.i_csp = i_csp; @@ -1265,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 );