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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
use libc::{c_void, c_char, c_int, uint8_t, int64_t, uint64_t};
use super::dict::AVDictionary;
use super::rational::AVRational;
use super::buffer::AVBufferRef;
use super::pixfmt::{AVColorPrimaries, AVColorRange, AVColorSpace, AVColorTransferCharacteristic, AVChromaLocation};
use super::util::AVPictureType;

pub const AV_NUM_DATA_POINTERS: usize = 8;

pub const AV_FRAME_FLAG_CORRUPT: c_int = 1 << 0;

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[repr(C)]
pub enum AVFrameSideDataType {
	AV_FRAME_DATA_PANSCAN,
	AV_FRAME_DATA_A53_CC,
	AV_FRAME_DATA_STEREO3D,
	AV_FRAME_DATA_MATRIXENCODING,
	AV_FRAME_DATA_DOWNMIX_INFO,
	AV_FRAME_DATA_REPLAYGAIN,
	AV_FRAME_DATA_DISPLAYMATRIX,
	AV_FRAME_DATA_AFD,
	AV_FRAME_DATA_MOTION_VECTORS,
	AV_FRAME_DATA_SKIP_SAMPLES,
	AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
}

#[derive(Debug)]
#[repr(C)]
pub struct AVFrameSideData {
	pub kind: AVFrameSideDataType,
	pub data: *mut uint8_t,
	pub size: c_int,
	pub metadata: *mut AVDictionary,
	pub buf: *mut AVBufferRef,
}

#[derive(Debug)]
#[repr(C)]
pub struct AVFrame {
	pub data: [*mut uint8_t; AV_NUM_DATA_POINTERS],
	pub linesize: [c_int; AV_NUM_DATA_POINTERS],
	pub extended_data: *mut *mut uint8_t,

	pub width: c_int,
	pub height: c_int,
	pub nb_samples: c_int,

	pub format: c_int,
	pub key_frame: c_int,
	pub pict_type: AVPictureType,
	pub sample_aspect_ratio: AVRational,

	pub base: [*mut uint8_t; AV_NUM_DATA_POINTERS],

	pub pts: int64_t,
	pub pkt_pts: int64_t,
	pub pkt_dts: int64_t,

	pub coded_picture_number: c_int,
	pub display_picture_number: c_int,

	pub quality: c_int,

	pub opaque: *mut c_void,
	pub error: [uint8_t; AV_NUM_DATA_POINTERS],

	pub repeat_pict: c_int,
	pub interlaced_frame: c_int,
	pub top_field_first: c_int,

	pub palette_has_changed: c_int,

	pub reordered_opaque: int64_t,
	pub sample_rate: c_int,
	pub channel_layout: uint64_t,

	pub buf: [*mut AVBufferRef; AV_NUM_DATA_POINTERS],
	pub extended_buf: *mut *mut AVBufferRef,
	pub nb_extended_buf: c_int,

	pub side_data: *mut *mut AVFrameSideData,
	pub nb_side_data: c_int,

	pub flags: c_int,

	pub color_range: AVColorRange,
	pub color_primaries: AVColorPrimaries,
	pub color_trc: AVColorTransferCharacteristic,
	pub colorspace: AVColorSpace,
	pub chroma_location: AVChromaLocation,

	pub best_effort_timestamp: int64_t,
	pub pkt_pos: int64_t,
	pub pkt_duration: int64_t,

	pub metadata: *mut AVDictionary,
	pub decode_error_flags: c_int,

	pub channels: c_int,
	pub pkt_size: c_int,

	pub qp_table_buf: *mut AVBufferRef,
}

extern {
	pub fn av_frame_get_best_effort_timestamp(frame: *const AVFrame) -> int64_t;
	pub fn av_frame_set_best_effort_timestamp(frame: *mut AVFrame, val: int64_t);

	pub fn av_frame_get_pkt_duration(frame: *const AVFrame) -> int64_t;
	pub fn av_frame_set_pkt_duration(frame: *mut AVFrame, val: int64_t);
	
	pub fn av_frame_get_pkt_pos(frame: *const AVFrame) -> int64_t;
	pub fn av_frame_set_pkt_pos(frame: *mut AVFrame, val: int64_t);

	pub fn av_frame_get_channel_layout(frame: *const AVFrame) -> int64_t;
	pub fn av_frame_set_channel_layout(frame: *mut AVFrame, val: int64_t);

	pub fn av_frame_get_channels(frame: *const AVFrame) -> c_int;
	pub fn av_frame_set_channels(frame: *mut AVFrame, val: c_int);

	pub fn av_frame_get_sample_rate(frame: *const AVFrame) -> c_int;
	pub fn av_frame_set_sample_rate(frame: *mut AVFrame, val: c_int);

	pub fn av_frame_get_metadata(frame: *const AVFrame) -> *mut AVDictionary;
	pub fn av_frame_set_metadata(frame: *mut AVFrame, val: *mut AVDictionary);

	pub fn av_frame_get_decode_error_flags(frame: *const AVFrame) -> c_int;
	pub fn av_frame_set_decode_error_flags(frame: *mut AVFrame, val: c_int);

	pub fn av_frame_get_pkt_size(frame: *const AVFrame) -> c_int;
	pub fn av_frame_set_pkt_size(frame: *mut AVFrame, val: c_int);

	pub fn av_frame_get_metadatap(frame: *mut AVFrame) -> *mut *mut AVDictionary;

	pub fn av_frame_get_qp_table(f: *mut AVFrame, stride: *mut c_int, kind: *mut c_int);
	pub fn av_frame_set_qp_table(f: *mut AVFrame, buf: *mut AVBufferRef, stride: c_int, kind: c_int) -> c_int;

	pub fn av_frame_get_colorspace(frame: *const AVFrame) -> AVColorSpace;
	pub fn av_frame_set_colorspace(frame: *mut AVFrame, val: AVColorSpace);

	pub fn av_frame_get_color_range(frame: *const AVFrame) -> AVColorRange;
	pub fn av_frame_set_color_range(frame: *mut AVFrame, val: AVColorRange);

	pub fn av_get_colorspace_name(val: AVColorSpace) -> *const c_char;

	pub fn av_frame_alloc() -> *mut AVFrame;
	pub fn av_frame_free(frame: *mut *mut AVFrame);
	pub fn av_frame_ref(dst: *mut AVFrame, src: *const AVFrame) -> c_int;
	pub fn av_frame_clone(src: *const AVFrame) -> *mut AVFrame;
	pub fn av_frame_unref(frame: *mut AVFrame);
	pub fn av_frame_move_ref(dst: *mut AVFrame, src: *mut AVFrame);

	pub fn av_frame_get_buffer(frame: *mut AVFrame, align: c_int) -> c_int;

	pub fn av_frame_is_writable(frame: *mut AVFrame) -> c_int;
	pub fn av_frame_make_writable(frame: *mut AVFrame) -> c_int;

	pub fn av_frame_copy(dst: *mut AVFrame, src: *const AVFrame) -> c_int;
	pub fn av_frame_copy_props(dst: *mut AVFrame, src: *const AVFrame) -> c_int;

	pub fn av_frame_get_plane_buffer(frame: *mut AVFrame, plane: c_int) -> *mut AVBufferRef;

	pub fn av_frame_new_side_data(frame: *mut AVFrame, kind: AVFrameSideDataType, size: c_int) -> *mut AVFrameSideData;
	pub fn av_frame_get_side_data(frame: *const AVFrame, kind: AVFrameSideDataType) -> *mut AVFrameSideData;
	pub fn av_frame_remove_side_data(frame: *mut AVFrame, kind: AVFrameSideDataType);
	pub fn av_frame_side_data_name(kind: AVFrameSideDataType) -> *const c_char;
}