Merge remote branch 'internal/upstream' into HEAD

Conflicts:
	vp8/vp8_cx_iface.c

Change-Id: Id670128595d04d6a61ec811b2ad896b138acded8
This commit is contained in:
John Koleszar 2010-12-21 07:56:46 -05:00
Родитель ea24bc8760 6cb708d501
Коммит c99c0e1798
8 изменённых файлов: 96 добавлений и 8 удалений

45
args.c
Просмотреть файл

@ -135,6 +135,17 @@ void arg_show_usage(FILE *fp, const struct arg_def *const *defs)
def->long_name, long_val); def->long_name, long_val);
fprintf(fp, " %-37s\t%s\n", option_text, def->desc); fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
if(def->enums)
{
const struct arg_enum_list *listptr;
fprintf(fp, " %-37s\t ", "");
for(listptr = def->enums; listptr->name; listptr++)
fprintf(fp, "%s%s", listptr->name,
listptr[1].name ? ", " : "\n");
}
} }
} }
@ -218,3 +229,37 @@ struct vpx_rational arg_parse_rational(const struct arg *arg)
return rat; return rat;
} }
int arg_parse_enum(const struct arg *arg)
{
const struct arg_enum_list *listptr;
long int rawval;
char *endptr;
/* First see if the value can be parsed as a raw value */
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
/* Got a raw value, make sure it's valid */
for(listptr = arg->def->enums; listptr->name; listptr++)
if(listptr->val == rawval)
return rawval;
}
/* Next see if it can be parsed as a string */
for(listptr = arg->def->enums; listptr->name; listptr++)
if(!strcmp(arg->val, listptr->name))
return listptr->val;
die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
return 0;
}
int arg_parse_enum_or_int(const struct arg *arg)
{
if(arg->def->enums)
return arg_parse_enum(arg);
return arg_parse_int(arg);
}

12
args.h
Просмотреть файл

@ -22,14 +22,23 @@ struct arg
const struct arg_def *def; const struct arg_def *def;
}; };
struct arg_enum_list
{
const char *name;
int val;
};
#define ARG_ENUM_LIST_END {0}
typedef struct arg_def typedef struct arg_def
{ {
const char *short_name; const char *short_name;
const char *long_name; const char *long_name;
int has_val; int has_val;
const char *desc; const char *desc;
const struct arg_enum_list *enums;
} arg_def_t; } arg_def_t;
#define ARG_DEF(s,l,v,d) {s,l,v,d} #define ARG_DEF(s,l,v,d) {s,l,v,d, NULL}
#define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e}
#define ARG_DEF_LIST_END {0} #define ARG_DEF_LIST_END {0}
struct arg arg_init(char **argv); struct arg arg_init(char **argv);
@ -41,4 +50,5 @@ char **argv_dup(int argc, const char **argv);
unsigned int arg_parse_uint(const struct arg *arg); unsigned int arg_parse_uint(const struct arg *arg);
int arg_parse_int(const struct arg *arg); int arg_parse_int(const struct arg *arg);
struct vpx_rational arg_parse_rational(const struct arg *arg); struct vpx_rational arg_parse_rational(const struct arg *arg);
int arg_parse_enum_or_int(const struct arg *arg);
#endif #endif

Просмотреть файл

@ -18,6 +18,7 @@ extern "C"
#endif #endif
#include "vpx/internal/vpx_codec_internal.h" #include "vpx/internal/vpx_codec_internal.h"
#include "vpx/vp8cx.h"
#include "vpx_scale/yv12config.h" #include "vpx_scale/yv12config.h"
#include "type_aliases.h" #include "type_aliases.h"
#include "ppflags.h" #include "ppflags.h"
@ -189,6 +190,8 @@ extern "C"
struct vpx_fixed_buf two_pass_stats_in; struct vpx_fixed_buf two_pass_stats_in;
struct vpx_codec_pkt_list *output_pkt_list; struct vpx_codec_pkt_list *output_pkt_list;
vp8e_tuning tuning;
} VP8_CONFIG; } VP8_CONFIG;

Просмотреть файл

@ -507,7 +507,8 @@ void encode_mb_row(VP8_COMP *cpi,
x->rddiv = cpi->RDDIV; x->rddiv = cpi->RDDIV;
x->rdmult = cpi->RDMULT; x->rdmult = cpi->RDMULT;
activity_sum += vp8_activity_masking(cpi, x); if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
activity_sum += vp8_activity_masking(cpi, x);
// Is segmentation enabled // Is segmentation enabled
// MB level adjutment to quantizer // MB level adjutment to quantizer

Просмотреть файл

@ -115,7 +115,8 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data)
x->rddiv = cpi->RDDIV; x->rddiv = cpi->RDDIV;
x->rdmult = cpi->RDMULT; x->rdmult = cpi->RDMULT;
activity_sum += vp8_activity_masking(cpi, x); if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
activity_sum += vp8_activity_masking(cpi, x);
// Is segmentation enabled // Is segmentation enabled
// MB level adjutment to quantizer // MB level adjutment to quantizer

Просмотреть файл

@ -38,6 +38,8 @@ struct vp8_extracfg
unsigned int arnr_strength; /* alt_ref Noise Reduction Strength */ unsigned int arnr_strength; /* alt_ref Noise Reduction Strength */
unsigned int arnr_type; /* alt_ref filter type */ unsigned int arnr_type; /* alt_ref filter type */
unsigned int experimental; unsigned int experimental;
vp8e_tuning tuning;
}; };
struct extraconfig_map struct extraconfig_map
@ -68,6 +70,7 @@ static const struct extraconfig_map extracfg_map[] =
3, /* arnr_strength */ 3, /* arnr_strength */
3, /* arnr_type*/ 3, /* arnr_type*/
0, /* experimental mode */ 0, /* experimental mode */
0, /* tuning*/
} }
} }
}; };
@ -338,6 +341,7 @@ static vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf,
oxcf->arnr_strength = vp8_cfg.arnr_strength; oxcf->arnr_strength = vp8_cfg.arnr_strength;
oxcf->arnr_type = vp8_cfg.arnr_type; oxcf->arnr_type = vp8_cfg.arnr_type;
oxcf->tuning = vp8_cfg.tuning;
/* /*
printf("Current VP8 Settings: \n"); printf("Current VP8 Settings: \n");
@ -451,6 +455,7 @@ static vpx_codec_err_t set_param(vpx_codec_alg_priv_t *ctx,
MAP(VP8E_SET_ARNR_MAXFRAMES, xcfg.arnr_max_frames); MAP(VP8E_SET_ARNR_MAXFRAMES, xcfg.arnr_max_frames);
MAP(VP8E_SET_ARNR_STRENGTH , xcfg.arnr_strength); MAP(VP8E_SET_ARNR_STRENGTH , xcfg.arnr_strength);
MAP(VP8E_SET_ARNR_TYPE , xcfg.arnr_type); MAP(VP8E_SET_ARNR_TYPE , xcfg.arnr_type);
MAP(VP8E_SET_TUNING, xcfg.tuning);
} }
@ -1050,6 +1055,7 @@ static vpx_codec_ctrl_fn_map_t vp8e_ctf_maps[] =
{VP8E_SET_ARNR_MAXFRAMES, set_param}, {VP8E_SET_ARNR_MAXFRAMES, set_param},
{VP8E_SET_ARNR_STRENGTH , set_param}, {VP8E_SET_ARNR_STRENGTH , set_param},
{VP8E_SET_ARNR_TYPE , set_param}, {VP8E_SET_ARNR_TYPE , set_param},
{VP8E_SET_TUNING, set_param},
{ -1, NULL}, { -1, NULL},
}; };

Просмотреть файл

@ -150,7 +150,8 @@ enum vp8e_enc_control_id
VP8E_SET_ARNR_MAXFRAMES, /**< control function to set the max number of frames blurred creating arf*/ VP8E_SET_ARNR_MAXFRAMES, /**< control function to set the max number of frames blurred creating arf*/
VP8E_SET_ARNR_STRENGTH , /**< control function to set the filter strength for the arf */ VP8E_SET_ARNR_STRENGTH , /**< control function to set the filter strength for the arf */
VP8E_SET_ARNR_TYPE , /**< control function to set the type of filter to use for the arf*/ VP8E_SET_ARNR_TYPE , /**< control function to set the type of filter to use for the arf*/
} ; VP8E_SET_TUNING, /**< control function to set visual tuning */
};
/*!\brief vpx 1-D scaling mode /*!\brief vpx 1-D scaling mode
* *
@ -234,6 +235,18 @@ typedef enum
} vp8e_token_partitions; } vp8e_token_partitions;
/*!\brief VP8 model tuning parameters
*
* Changes the encoder to tune for certain types of input material.
*
*/
typedef enum
{
VP8_TUNE_PSNR,
VP8_TUNE_SSIM
} vp8e_tuning;
/*!\brief VP8 encoder control function parameter type /*!\brief VP8 encoder control function parameter type
* *
* Defines the data types that VP8E control functions take. Note that * Defines the data types that VP8E control functions take. Note that
@ -263,7 +276,7 @@ VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS, vp8e_token_partitions)
VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES, unsigned int) VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES, unsigned int)
VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH , unsigned int) VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH , unsigned int)
VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE , unsigned int) VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE , unsigned int)
VPX_CTRL_USE_TYPE(VP8E_SET_TUNING, vp8e_tuning)
VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *) VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *)
VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *) VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *)

Просмотреть файл

@ -997,18 +997,27 @@ static const arg_def_t arnr_strength = ARG_DEF(NULL, "arnr-strength", 1,
"AltRef Strength"); "AltRef Strength");
static const arg_def_t arnr_type = ARG_DEF(NULL, "arnr-type", 1, static const arg_def_t arnr_type = ARG_DEF(NULL, "arnr-type", 1,
"AltRef Type"); "AltRef Type");
static const struct arg_enum_list tuning_enum[] = {
{"psnr", VP8_TUNE_PSNR},
{"ssim", VP8_TUNE_SSIM},
{NULL, 0}
};
static const arg_def_t tune_ssim = ARG_DEF_ENUM(NULL, "tune", 1,
"Material to favor", tuning_enum);
static const arg_def_t *vp8_args[] = static const arg_def_t *vp8_args[] =
{ {
&cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh, &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh,
&token_parts, &arnr_maxframes, &arnr_strength, &arnr_type, NULL &token_parts, &arnr_maxframes, &arnr_strength, &arnr_type,
&tune_ssim, NULL
}; };
static const int vp8_arg_ctrl_map[] = static const int vp8_arg_ctrl_map[] =
{ {
VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF,
VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD,
VP8E_SET_TOKEN_PARTITIONS, VP8E_SET_TOKEN_PARTITIONS,
VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH , VP8E_SET_ARNR_TYPE, 0 VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH , VP8E_SET_ARNR_TYPE,
VP8E_SET_TUNING, 0
}; };
#endif #endif
@ -1325,7 +1334,7 @@ int main(int argc, const char **argv_)
if (arg_ctrl_cnt < ARG_CTRL_CNT_MAX) if (arg_ctrl_cnt < ARG_CTRL_CNT_MAX)
{ {
arg_ctrls[arg_ctrl_cnt][0] = ctrl_args_map[i]; arg_ctrls[arg_ctrl_cnt][0] = ctrl_args_map[i];
arg_ctrls[arg_ctrl_cnt][1] = arg_parse_int(&arg); arg_ctrls[arg_ctrl_cnt][1] = arg_parse_enum_or_int(&arg);
arg_ctrl_cnt++; arg_ctrl_cnt++;
} }
} }