1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
use libc::{c_void, c_char, c_int, c_uint, c_float, c_double, uint8_t, int64_t};
use super::rational::AVRational;
use super::dict::AVDictionary;
use super::log::AVClass;
use super::pixfmt::AVPixelFormat;
use super::samplefmt::AVSampleFormat;

pub const AV_OPT_FLAG_IMPLICIT_KEY:    c_int = 1;
pub const AV_OPT_FLAG_ENCODING_PARAM:  c_int = 1;
pub const AV_OPT_FLAG_DECODING_PARAM:  c_int = 2;
pub const AV_OPT_FLAG_AUDIO_PARAM:     c_int = 8;
pub const AV_OPT_FLAG_VIDEO_PARAM:     c_int = 16;
pub const AV_OPT_FLAG_SUBTITLE_PARAM:  c_int = 32;
pub const AV_OPT_FLAG_EXPORT:          c_int = 64;
pub const AV_OPT_FLAG_READONLY:        c_int = 128;
pub const AV_OPT_FLAG_FILTERING_PARAM: c_int = 1 << 16;

pub const AV_OPT_SEARCH_CHILDREN:           c_int = 0x0001;
pub const AV_OPT_SEARCH_FAKE_OBJ:           c_int = 0x0002;
pub const AV_OPT_MULTI_COMPONENT_RANGE:     c_int = 0x1000;
pub const AV_OPT_SERIALIZE_SKIP_DEFAULTS:   c_int = 0x00000001;
pub const AV_OPT_SERIALIZE_OPT_FLAGS_EXACT: c_int = 0x00000002;

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[repr(C)]
pub enum AVOptionType {
	AV_OPT_TYPE_FLAGS,
	AV_OPT_TYPE_INT,
	AV_OPT_TYPE_INT64,
	AV_OPT_TYPE_DOUBLE,
	AV_OPT_TYPE_FLOAT,
	AV_OPT_TYPE_STRING,
	AV_OPT_TYPE_RATIONAL,
	AV_OPT_TYPE_BINARY,
	AV_OPT_TYPE_DICT,
	AV_OPT_TYPE_CONST = 128,

	AV_OPT_TYPE_IMAGE_SIZE     = MKBETAG!(b'S', b'I', b'Z', b'E'),
	AV_OPT_TYPE_PIXEL_FMT      = MKBETAG!(b'P', b'F', b'M', b'T'),
	AV_OPT_TYPE_SAMPLE_FMT     = MKBETAG!(b'S', b'F', b'M', b'T'),
	AV_OPT_TYPE_VIDEO_RATE     = MKBETAG!(b'V', b'R', b'A', b'T'),
	AV_OPT_TYPE_DURATION       = MKBETAG!(b'D', b'U', b'R', b' '),
	AV_OPT_TYPE_COLOR          = MKBETAG!(b'C', b'O', b'L', b'R'),
	AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG!(b'C', b'H', b'L', b'A'),
}

#[derive(Debug)]
#[repr(C)]
pub struct AVOption {
	pub name: *const c_char,
	pub help: *const c_char,

	pub offset: c_int,
	pub kind:   AVOptionType,

	pub default_val: [u8; 8],

	pub min: c_double,
	pub max: c_double,

	pub unit: *const c_char,
}

#[derive(Debug)]
#[repr(C)]
pub struct AVOptionRange {
	pub str: *const c_char,

	pub value_min: c_double,
	pub value_max: c_double,

	pub component_min: c_double,
	pub component_max: c_double,

	pub is_range: c_int,
}

#[derive(Debug)]
#[repr(C)]
pub struct AVOptionRanges {
	pub range: *mut *mut AVOptionRange,

	pub nb_ranges:     c_int,
	pub nb_components: c_int,
}

extern {
	pub fn av_opt_show2(obj: *mut c_void, av_log_obj: *mut c_void, req_flags: c_int, rej_flags: c_int) -> c_int;
	pub fn av_opt_set_defaults(s: *mut c_void);
	pub fn av_set_options_string(ctx: *mut c_void, opts: *const c_char, key_val_sep: *const c_char, pairs_sep: *const c_char) -> c_int;
	pub fn av_opt_set_from_string(ctx: *mut c_void, opts: *const c_char, shorthand: *const *const c_char, key_val_sep: *const c_char, pairs_sep: *const c_char) -> c_int;
	pub fn av_opt_free(obj: *mut c_void);
	pub fn av_opt_flag_is_set(obj: *mut c_void, field_name: *const c_char, flag_name: *const c_char) -> c_int;
	pub fn av_opt_set_dict(obj: *mut c_void, options: *mut *mut AVDictionary) -> c_int;
	pub fn av_opt_set_dict2(obj: *mut c_void, options: *mut *mut AVDictionary, search_flags: c_int) -> c_int;
	pub fn av_opt_get_key_value(ropts: *const *const c_char, key_val_sep: *const c_char, pairs_sep: *const c_char, flags: c_uint, rkey: *mut *mut c_char, rval: *mut *mut c_char) -> c_int;

	pub fn av_opt_eval_flags(obj: *mut c_void, o: *mut AVOption, val: *const c_char, flags_out: *mut c_int) -> c_int;
	pub fn av_opt_eval_int(obj: *mut c_void, o: *mut AVOption, val: *const c_char, int_out: *mut c_int) -> c_int;
	pub fn av_opt_eval_int64(obj: *mut c_void, o: *mut AVOption, val: *const c_char, int64_out: *mut int64_t) -> c_int;
	pub fn av_opt_eval_float(obj: *mut c_void, o: *mut AVOption, val: *const c_char, float_out: *mut c_float) -> c_int;
	pub fn av_opt_eval_double(obj: *mut c_void, o: *mut AVOption, val: *const c_char, double_out: *mut c_double) -> c_int;
	pub fn av_opt_eval_q(obj: *mut c_void, o: *mut AVOption, val: *const c_char, q_out: *mut AVRational) -> c_int;

	pub fn av_opt_find(obj: *mut c_void, name: *const c_char, unit: *const c_char, opt_flags: c_int, search_flags: c_int) -> *const AVOption;
	pub fn av_opt_find2(obj: *mut c_void, name: *const c_char, unit: *const c_char, opt_flags: c_int, search_flags: c_int, target_obj: *mut *mut c_void) -> *const AVOption;

	pub fn av_opt_next(obj: *mut c_void, prev: *const AVOption) -> *const AVOption;
	pub fn av_opt_child_next(obj: *mut c_void, prev: *mut c_void) -> *mut c_void;
	pub fn av_opt_child_class_next(parent: *const AVClass, prev: *const AVClass) -> *const AVClass;

	pub fn av_opt_set(obj: *mut c_void, name: *const c_char, val: *const c_char, search_flags: c_int) -> c_int;
	pub fn av_opt_set_int(obj: *mut c_void, name: *const c_char, val: int64_t, search_flags: c_int) -> c_int;
	pub fn av_opt_set_double(obj: *mut c_void, name: *const c_char, val: c_double, search_flags: c_int) -> c_int;
	pub fn av_opt_set_q(obj: *mut c_void, name: *const c_char, val: AVRational, search_flags: c_int) -> c_int;
	pub fn av_opt_set_bin(obj: *mut c_void, name: *const c_char, val: *const uint8_t, len: c_int, search_flags: c_int) -> c_int;
	pub fn av_opt_set_image_size(obj: *mut c_void, name: *const c_char, w: c_int, h: c_int, search_flags: c_int) -> c_int;
	pub fn av_opt_set_pixel_fmt(obj: *mut c_void, name: *const c_char, fmt: AVPixelFormat, search_flags: c_int) -> c_int;
	pub fn av_opt_set_sample_fmt(obj: *mut c_void, name: *const c_char, fmt: AVSampleFormat, search_flags: c_int) -> c_int;
	pub fn av_opt_set_video_rate(obj: *mut c_void, name: *const c_char, val: AVRational, search_flags: c_int) -> c_int;
	pub fn av_opt_set_channel_layout(obj: *mut c_void, name: *const c_char, ch_layout: int64_t, search_flags: c_int) -> c_int;
	pub fn av_opt_set_dict_val(obj: *mut c_void, name: *const c_char, val: *const AVDictionary, search_flags: c_int) -> c_int;

	pub fn av_opt_get(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_val: *mut *mut uint8_t) -> c_int;
	pub fn av_opt_get_int(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_val: *mut int64_t) -> c_int;
	pub fn av_opt_get_double(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_val: *mut c_double) -> c_int;
	pub fn av_opt_get_image_size(obj: *mut c_void, name: *const c_char, search_flags: c_int, w_out: *mut c_int, h_out: *mut c_int) -> c_int;
	pub fn av_opt_get_pixel_fmt(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_fmt: *mut AVPixelFormat) -> c_int;
	pub fn av_opt_get_sample_fmt(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_fmt: *mut AVSampleFormat) -> c_int;
	pub fn av_opt_get_video_rate(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_val: *mut AVRational) -> c_int;
	pub fn av_opt_get_channel_layout(obj: *mut c_void, name: *const c_char, search_flags: c_int, ch_layout: *mut int64_t) -> c_int;
	pub fn av_opt_get_dict_val(obj: *mut c_void, name: *const c_char, search_flags: c_int, out_val: *mut *mut AVDictionary) -> c_int;

	pub fn av_opt_ptr(avclass: *const AVClass, obj: *mut c_void, name: *const c_char);
	pub fn av_opt_freep_ranges(ranges: *mut *mut AVOptionRanges);
	pub fn av_opt_query_ranges(ranges: *mut *mut AVOptionRanges, obj: *mut c_void, key: *const c_char, flags: c_int) -> c_int;
	pub fn av_opt_copy(dest: *mut c_void, src: *mut c_void) -> c_int;
	pub fn av_opt_query_ranges_default(ranges: *mut *mut AVOptionRanges, obj: *mut c_void, key: *const c_char, flags: c_int) -> c_int;
	pub fn av_opt_is_set_to_default(obj: *mut c_void, o: *const AVOption) -> c_int;
	pub fn av_opt_is_set_to_default_by_name(obj: *mut c_void, name: *const c_char, search_flags: c_int) -> c_int;
	pub fn av_opt_serialize(obj: *mut c_void, opt_flags: c_int, flags: c_int, buffer: *mut *mut c_char, key_val_sep: c_char, pairs_sep: c_char) -> c_int;
}