Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
2a3291d
initial code
kpchoi Mar 3, 2026
d399fc7
Merge remote-tracking branch 'origin/main' into apv_raw
kpchoi Mar 4, 2026
0d785d1
need to add companding functionality
kpchoi Mar 4, 2026
c4028b3
refactoring
kpchoi Mar 5, 2026
13cafc8
Merge remote-tracking branch 'origin/main' into apv_raw
kpchoi Mar 5, 2026
013d0d6
maybe working code
kpchoi Mar 5, 2026
ef0809f
added new c file
kpchoi Mar 5, 2026
b8dc9a4
changed profile name
kpchoi Mar 5, 2026
39f34d6
changed profile idc and added use_companding syntax
kpchoi Mar 6, 2026
a03d203
initial commit for decoder
kpchoi Mar 9, 2026
906c56b
fixed bug in colorspace setting
kpchoi Mar 9, 2026
2d89a12
refactoring blk code
kpchoi Mar 9, 2026
bf59009
fixed for P210 format
kpchoi Mar 9, 2026
5bc6c75
clean up blk_from_pic
mss-park Mar 9, 2026
12a5e54
modification of blk_from_pic
mss-park Mar 12, 2026
f6eca1a
Merge remote-tracking branch 'origin/main' into apv_raw
kpchoi Mar 12, 2026
d88480e
separate functions for companding and no-companding (#198)
subhrajitm20 Mar 14, 2026
49c6139
Merge branch 'apv_raw' of https://github.com/AcademySoftwareFoundatio…
kpchoi Mar 14, 2026
76580b8
initial code
kpchoi Mar 16, 2026
d1dfdab
adding PDU level decoding
kpchoi Mar 16, 2026
1cbcd92
fixed typo
kpchoi Mar 16, 2026
a9fa6ce
frame level decoding is working now
kpchoi Mar 27, 2026
e58f681
added partial decoding API
kpchoi Mar 30, 2026
9611950
refactoring
kpchoi Mar 30, 2026
9368cf3
refactoring
kpchoi Mar 30, 2026
e23de74
fixed for decoding tiles
kpchoi Mar 31, 2026
30154fc
added command line option for testing tile-based decoding
kpchoi Apr 1, 2026
6496eaa
fixed memory leak
kpchoi Apr 1, 2026
840807f
inrease version to 1.0.0.0
kpchoi Apr 4, 2026
d4d9cb8
merged with main
kpchoi Jun 29, 2026
ece1f65
refactoring and fuzzing defense code
kpchoi Jun 30, 2026
73d8566
add fuzzing defense code
kpchoi Jun 30, 2026
5da7690
fuzzing protection code
kpchoi Jul 2, 2026
0c654e8
changed to use the safe string parser
kpchoi Jul 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 52 additions & 60 deletions app/oapv_app_args.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include "oapv.h"

#define ARGS_VAL_TYPE_MANDATORY (1 << 0) /* mandatory or not */
Expand All @@ -50,22 +52,28 @@
#define ARGS_MAX_NUM_CONF_FILES (16)

#define ARGS_MAX_KEY_LONG (32)
#define ARGS_MAX_DESC (1024) /* max length of an option description */
/* upper bound of the fixed prefix of a help line: key/key_long, value type,
* "(optional)", default value string and surrounding decoration */
#define ARGS_HELP_PREFIX_MAX (512)
/* buffer size for a formatted help line: description plus its prefix */
#define ARGS_HELP_BUF_SIZE (ARGS_MAX_DESC + ARGS_HELP_PREFIX_MAX)

typedef struct args_opt {
char key; /* option keyword. ex) -f */
char key_long[ARGS_MAX_KEY_LONG]; /* option long keyword, ex) --file */
int val_type; /* value type */
int flag; /* flag to setting or not */
void *val; /* actual value */
char desc[1024]; /* description of option */
int val_size; /* size of value buffer for STRING type (0 for non-STRING) */
char desc[ARGS_MAX_DESC]; /* description of option */
} args_opt_t;

typedef struct args_parser args_parser_t;
struct args_parser {
void (*release)(args_parser_t *args);
int (*parse)(args_parser_t *args, int argc, const char *argv[], char **errstr);
int (*get_help)(args_parser_t *args, int idx, char *help);
int (*get_str)(args_parser_t *args, char *keyl, char *str, int *flag);
int (*get_int)(args_parser_t *args, char *keyl, int *val, int *flag);
int (*set_str)(args_parser_t *args, char *keyl, char *str);
int (*set_int)(args_parser_t *args, char *keyl, int val);
Expand Down Expand Up @@ -120,11 +128,25 @@ static int args_read_value(args_opt_t *ops, const char *argv)

switch(ARGS_GET_CMD_OPT_VAL_TYPE(ops->val_type)) {
case ARGS_VAL_TYPE_INTEGER:
*((int *)ops->val) = atoi(argv);
{
char *endptr;
long val;
errno = 0;
val = strtol(argv, &endptr, 10);
if(endptr == argv || *endptr != '\0' || errno == ERANGE || val < INT_MIN || val > INT_MAX) {
return -1;
}
*((int *)ops->val) = (int)val;
}
break;

case ARGS_VAL_TYPE_STRING:
strcpy((char *)ops->val, argv);
if(ops->val_size > 0) {
strncpy((char *)ops->val, argv, ops->val_size - 1);
((char *)ops->val)[ops->val_size - 1] = '\0';
} else {
return -1; /* STRING option without a known buffer size: reject */
}
break;

default:
Expand All @@ -133,48 +155,13 @@ static int args_read_value(args_opt_t *ops, const char *argv)
return 0;
}

static int args_get_arg(args_opt_t *ops, int idx, char *result)
{
char vtype[32];
char value[512];
args_opt_t *o = ops + idx;

switch(ARGS_GET_CMD_OPT_VAL_TYPE(o->val_type)) {
case ARGS_VAL_TYPE_INTEGER:
strncpy(vtype, "INTEGER", sizeof(vtype) - 1);
sprintf(value, "%d", *((int *)o->val));
break;

case ARGS_VAL_TYPE_STRING:
strncpy(vtype, "STRING", sizeof(vtype) - 1);
sprintf(value, "%s", (char *)o->val);
break;

case ARGS_VAL_TYPE_NONE:
default:
strncpy(vtype, "FLAG", sizeof(vtype) - 1);
sprintf(value, "%d", *((int *)o->val));
break;
}

if(o->flag) {
strcat(value, " (SET)");
}
else {
strcat(value, " (DEFAULT)");
}

sprintf(result, " -%c(--%s) = %s\n : %s", o->key, o->key_long,
value, o->desc);

return 0;
}

static int args_parse_int_x_int(char *str, int *num0, int *num1)
{
char str0_t[64];
int i, cnt0 = 0, cnt1;
char *str0, *str1 = NULL;
char *endptr;
long tmp_val;

str0 = str;
cnt1 = (int)strlen(str);
Expand Down Expand Up @@ -205,8 +192,19 @@ static int args_parse_int_x_int(char *str, int *num0, int *num1)
strncpy(str0_t, str0, cnt0);
str0_t[cnt0] = '\0';

*num0 = atoi(str0_t);
*num1 = atoi(str1);
/* parse first number using strtol with overflow check */
tmp_val = strtol(str0_t, &endptr, 10);
if(endptr == str0_t || tmp_val < INT_MIN || tmp_val > INT_MAX) {
return -1; /* conversion failed or overflow */
}
*num0 = (int)tmp_val;

/* parse second number using strtol with overflow check */
tmp_val = strtol(str1, &endptr, 10);
if(endptr == str1 || tmp_val < INT_MIN || tmp_val > INT_MAX) {
return -1; /* conversion failed or overflow */
}
*num1 = (int)tmp_val;

return 0;
}
Expand Down Expand Up @@ -314,7 +312,7 @@ static int args_parse_cmd(int argc, const char *argv[], args_opt_t *ops,
return -1;
}

static int args_set_variable_by_key_long(args_opt_t *opts, char *key_long, void *var)
static int args_set_variable_by_key_long(args_opt_t *opts, char *key_long, void *var, size_t size)
{
int idx;
char buf[ARGS_MAX_KEY_LONG];
Expand All @@ -337,6 +335,7 @@ static int args_set_variable_by_key_long(args_opt_t *opts, char *key_long, void
if(idx < 0)
return -1;
opts[idx].val = var;
opts[idx].val_size = (int)size;
return 0;
}

Expand Down Expand Up @@ -383,7 +382,12 @@ static int args_set_str(args_parser_t *args, char *keyl, char *str)

idx = args_search_long_key(args->opts, keyl);
if(idx >= 0) {
sprintf((char *)(args->opts[idx].val), "%s", str);
if(args->opts[idx].val_size > 0) {
snprintf((char *)(args->opts[idx].val), args->opts[idx].val_size, "%s", str);
}
else {
return -1; /* STRING option without a known buffer size: reject */
}
args->opts[idx].flag = 1;
return 0;
}
Expand Down Expand Up @@ -434,17 +438,6 @@ static int args_set_flag(args_parser_t *args, char *keyl, int flag)
return -1;
}

static int args_get_str(args_parser_t *args, char *keyl, char *str, int *flag)
{
char *p = NULL;
if(args_get(args, keyl, (void **)&p, flag))
return -1;
if(p) {
if(str)
strcpy(str, p);
}
return 0;
}

static int args_get_int(args_parser_t *args, char *keyl, int *val, int *flag)
{
Expand Down Expand Up @@ -516,7 +509,7 @@ static int args_get_help(args_parser_t *args, int idx, char *help)
case ARGS_VAL_TYPE_STRING:
strncpy(vtype, "STRING", sizeof(vtype) - 1);
if(o->val != NULL)
sprintf(default_value, " [%s]", strlen((char *)(o->val)) == 0 ? "None" : (char *)(o->val));
snprintf(default_value, sizeof(default_value), " [%s]", strlen((char *)(o->val)) == 0 ? "None" : (char *)(o->val));
break;
case ARGS_VAL_TYPE_NONE:
default:
Expand All @@ -528,11 +521,11 @@ static int args_get_help(args_parser_t *args, int idx, char *help)
optional = !(o->val_type & ARGS_VAL_TYPE_MANDATORY);

if(o->key != ARGS_NO_KEY) {
sprintf(help, " -%c, --%s [%s]%s%s\n : %s", o->key, o->key_long,
snprintf(help, ARGS_HELP_BUF_SIZE, " -%c, --%s [%s]%s%s\n : %s", o->key, o->key_long,
vtype, (optional) ? " (optional)" : "", (optional) ? default_value : "", o->desc);
}
else {
sprintf(help, " --%s [%s]%s%s\n : %s", o->key_long,
snprintf(help, ARGS_HELP_BUF_SIZE, " --%s [%s]%s%s\n : %s", o->key_long,
vtype, (optional) ? " (optional)" : "", (optional) ? default_value : "", o->desc);
}

Expand Down Expand Up @@ -584,7 +577,6 @@ static args_parser_t *args_create(const args_opt_t *opt_table, int num_opt)
args->release = args_release;
args->parse = args_parse;
args->get_help = args_get_help;
args->get_str = args_get_str;
args->get_int = args_get_int;
args->set_str = args_set_str;
args->set_int = args_set_int;
Expand Down
Loading
Loading