FFmpeg
Loading...
Searching...
No Matches
aic.c
Go to the documentation of this file.
1/*
2 * Apple Intermediate Codec decoder
3 *
4 * Copyright (c) 2013 Konstantin Shishkov
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include <inttypes.h>
24
25#include "libavutil/mem.h"
27
28#include "avcodec.h"
29#include "bytestream.h"
30#include "codec_internal.h"
31#include "get_bits.h"
32#include "golomb.h"
33#include "idctdsp.h"
34#include "thread.h"
35#include "unary.h"
36
37#define AIC_HDR_SIZE 24
38#define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
39
47
48static const uint8_t aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
49
50static const uint16_t aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
51
52static const uint8_t aic_quant_matrix[64] = {
53 8, 16, 19, 22, 22, 26, 26, 27,
54 16, 16, 22, 22, 26, 27, 27, 29,
55 19, 22, 26, 26, 27, 29, 29, 35,
56 22, 24, 27, 27, 29, 32, 34, 38,
57 26, 27, 29, 29, 32, 35, 38, 46,
58 27, 29, 34, 34, 35, 40, 46, 56,
59 29, 34, 34, 37, 40, 48, 56, 69,
60 34, 37, 38, 40, 48, 58, 69, 83,
61};
62
63static const uint8_t aic_y_scan[64] = {
64 0, 4, 1, 2, 5, 8, 12, 9,
65 6, 3, 7, 10, 13, 14, 11, 15,
66 47, 43, 46, 45, 42, 39, 35, 38,
67 41, 44, 40, 37, 34, 33, 36, 32,
68 16, 20, 17, 18, 21, 24, 28, 25,
69 22, 19, 23, 26, 29, 30, 27, 31,
70 63, 59, 62, 61, 58, 55, 51, 54,
71 57, 60, 56, 53, 50, 49, 52, 48,
72};
73
74static const uint8_t aic_y_ext_scan[192] = {
75 64, 72, 65, 66, 73, 80, 88, 81,
76 74, 67, 75, 82, 89, 90, 83, 91,
77 0, 4, 1, 2, 5, 8, 12, 9,
78 6, 3, 7, 10, 13, 14, 11, 15,
79 16, 20, 17, 18, 21, 24, 28, 25,
80 22, 19, 23, 26, 29, 30, 27, 31,
81 155, 147, 154, 153, 146, 139, 131, 138,
82 145, 152, 144, 137, 130, 129, 136, 128,
83 47, 43, 46, 45, 42, 39, 35, 38,
84 41, 44, 40, 37, 34, 33, 36, 32,
85 63, 59, 62, 61, 58, 55, 51, 54,
86 57, 60, 56, 53, 50, 49, 52, 48,
87 96, 104, 97, 98, 105, 112, 120, 113,
88 106, 99, 107, 114, 121, 122, 115, 123,
89 68, 76, 69, 70, 77, 84, 92, 85,
90 78, 71, 79, 86, 93, 94, 87, 95,
91 100, 108, 101, 102, 109, 116, 124, 117,
92 110, 103, 111, 118, 125, 126, 119, 127,
93 187, 179, 186, 185, 178, 171, 163, 170,
94 177, 184, 176, 169, 162, 161, 168, 160,
95 159, 151, 158, 157, 150, 143, 135, 142,
96 149, 156, 148, 141, 134, 133, 140, 132,
97 191, 183, 190, 189, 182, 175, 167, 174,
98 181, 188, 180, 173, 166, 165, 172, 164,
99};
100
101static const uint8_t aic_c_scan[64] = {
102 0, 4, 1, 2, 5, 8, 12, 9,
103 6, 3, 7, 10, 13, 14, 11, 15,
104 31, 27, 30, 29, 26, 23, 19, 22,
105 25, 28, 24, 21, 18, 17, 20, 16,
106 32, 36, 33, 34, 37, 40, 44, 41,
107 38, 35, 39, 42, 45, 46, 43, 47,
108 63, 59, 62, 61, 58, 55, 51, 54,
109 57, 60, 56, 53, 50, 49, 52, 48,
110};
111
112static const uint8_t aic_c_ext_scan[192] = {
113 16, 24, 17, 18, 25, 32, 40, 33,
114 26, 19, 27, 34, 41, 42, 35, 43,
115 0, 4, 1, 2, 5, 8, 12, 9,
116 6, 3, 7, 10, 13, 14, 11, 15,
117 20, 28, 21, 22, 29, 36, 44, 37,
118 30, 23, 31, 38, 45, 46, 39, 47,
119 95, 87, 94, 93, 86, 79, 71, 78,
120 85, 92, 84, 77, 70, 69, 76, 68,
121 63, 59, 62, 61, 58, 55, 51, 54,
122 57, 60, 56, 53, 50, 49, 52, 48,
123 91, 83, 90, 89, 82, 75, 67, 74,
124 81, 88, 80, 73, 66, 65, 72, 64,
125 112, 120, 113, 114, 121, 128, 136, 129,
126 122, 115, 123, 130, 137, 138, 131, 139,
127 96, 100, 97, 98, 101, 104, 108, 105,
128 102, 99, 103, 106, 109, 110, 107, 111,
129 116, 124, 117, 118, 125, 132, 140, 133,
130 126, 119, 127, 134, 141, 142, 135, 143,
131 191, 183, 190, 189, 182, 175, 167, 174,
132 181, 188, 180, 173, 166, 165, 172, 164,
133 159, 155, 158, 157, 154, 151, 147, 150,
134 153, 156, 152, 149, 146, 145, 148, 144,
135 187, 179, 186, 185, 178, 171, 163, 170,
136 177, 184, 176, 169, 162, 161, 168, 160,
137};
138
139static const uint8_t * const aic_scan[NUM_BANDS] = {
141};
142
160
161static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
162{
163 uint32_t frame_size;
164 int width, height;
165
166 if (src[0] != 1) {
167 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid version %d\n", src[0]);
168 return AVERROR_INVALIDDATA;
169 }
170 if (src[1] != AIC_HDR_SIZE - 2) {
171 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid header size %d\n", src[1]);
172 return AVERROR_INVALIDDATA;
173 }
174 frame_size = AV_RB32(src + 2);
175 width = AV_RB16(src + 6);
176 height = AV_RB16(src + 8);
177 if (frame_size > size) {
178 av_log(ctx->avctx, AV_LOG_ERROR, "Frame size should be %"PRIu32" got %d\n",
180 return AVERROR_INVALIDDATA;
181 }
182 if (width != ctx->avctx->width || height != ctx->avctx->height) {
183 av_log(ctx->avctx, AV_LOG_ERROR,
184 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
185 ctx->avctx->width, ctx->avctx->height, width, height);
186 return AVERROR_INVALIDDATA;
187 }
188 ctx->quant = src[15];
189 ctx->interlaced = ((src[16] >> 4) == 3);
190
191 return 0;
192}
193
194#define GET_CODE(val, type, add_bits) \
195 do { \
196 if (type) \
197 val = get_ue_golomb(gb); \
198 else \
199 val = get_unary(gb, 1, 31); \
200 if (add_bits) \
201 val = (val << add_bits) + get_bits(gb, add_bits); \
202 } while (0)
203
204static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
205 int band, int slice_width, int force_chroma)
206{
207 int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
208 const int num_coeffs = aic_num_band_coeffs[band];
209 const uint8_t *scan = aic_scan[band | force_chroma];
210 int mb, idx;
211 unsigned val;
212
213 if (get_bits_left(gb) < 5)
214 return AVERROR_INVALIDDATA;
215
216 has_skips = get_bits1(gb);
217 coeff_type = get_bits1(gb);
218 coeff_bits = get_bits(gb, 3);
219
220 if (has_skips) {
221 skip_type = get_bits1(gb);
222 skip_bits = get_bits(gb, 3);
223
224 for (mb = 0; mb < slice_width; mb++) {
225 idx = -1;
226 do {
227 GET_CODE(val, skip_type, skip_bits);
228 if (val >= 0x10000)
229 return AVERROR_INVALIDDATA;
230 idx += val + 1;
231 if (idx >= num_coeffs)
232 break;
233 GET_CODE(val, coeff_type, coeff_bits);
234 val++;
235 if (val >= 0x10000)
236 return AVERROR_INVALIDDATA;
237 dst[scan[idx]] = val;
238 } while (idx < num_coeffs - 1);
239 dst += num_coeffs;
240 }
241 } else {
242 for (mb = 0; mb < slice_width; mb++) {
243 for (idx = 0; idx < num_coeffs; idx++) {
244 GET_CODE(val, coeff_type, coeff_bits);
245 if (val >= 0x10000)
246 return AVERROR_INVALIDDATA;
247 dst[scan[idx]] = val;
248 }
249 dst += num_coeffs;
250 }
251 }
252 return 0;
253}
254
255static void recombine_block(int16_t *dst, const uint8_t *scan,
256 int16_t **base, int16_t **ext)
257{
258 int i, j;
259
260 for (i = 0; i < 4; i++) {
261 for (j = 0; j < 4; j++)
262 dst[scan[i * 8 + j]] = (*base)[j];
263 for (j = 0; j < 4; j++)
264 dst[scan[i * 8 + j + 4]] = (*ext)[j];
265 *base += 4;
266 *ext += 4;
267 }
268 for (; i < 8; i++) {
269 for (j = 0; j < 8; j++)
270 dst[scan[i * 8 + j]] = (*ext)[j];
271 *ext += 8;
272 }
273}
274
275static void recombine_block_il(int16_t *dst, const uint8_t *scan,
276 int16_t **base, int16_t **ext,
277 int block_no)
278{
279 int i, j;
280
281 if (block_no < 2) {
282 for (i = 0; i < 8; i++) {
283 for (j = 0; j < 4; j++)
284 dst[scan[i * 8 + j]] = (*base)[j];
285 for (j = 0; j < 4; j++)
286 dst[scan[i * 8 + j + 4]] = (*ext)[j];
287 *base += 4;
288 *ext += 4;
289 }
290 } else {
291 for (i = 0; i < 64; i++)
292 dst[scan[i]] = (*ext)[i];
293 *ext += 64;
294 }
295}
296
297static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
298{
299 int i;
300
301 for (i = 0; i < 64; i++) {
302 int val = (uint16_t)block[i];
303 int sign = val & 1;
304
305 block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
306 + sign;
307 }
308}
309
310static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
311 const uint8_t *src, int src_size)
312{
313 GetBitContext gb;
314 int ret, i, mb, blk;
315 int slice_width = FFMIN(ctx->slice_width, ctx->mb_width - mb_x);
316 int last_row = mb_y && mb_y == ctx->mb_height - 1;
317 int y_pos, c_pos;
318 uint8_t *Y, *C[2];
319 uint8_t *dst;
320 int16_t *base_y = ctx->data_ptr[COEFF_LUMA];
321 int16_t *base_c = ctx->data_ptr[COEFF_CHROMA];
322 int16_t *ext_y = ctx->data_ptr[COEFF_LUMA_EXT];
323 int16_t *ext_c = ctx->data_ptr[COEFF_CHROMA_EXT];
324 const int ystride = ctx->frame->linesize[0];
325
326 if (last_row) {
327 y_pos = (ctx->avctx->height - 16);
328 c_pos = ((ctx->avctx->height+1)/2 - 8);
329 } else {
330 y_pos = mb_y * 16;
331 c_pos = mb_y * 8;
332 }
333
334 Y = ctx->frame->data[0] + mb_x * 16 + y_pos * ystride;
335 for (i = 0; i < 2; i++)
336 C[i] = ctx->frame->data[i + 1] + mb_x * 8
337 + c_pos * ctx->frame->linesize[i + 1];
338 init_get_bits(&gb, src, src_size * 8);
339
340 memset(ctx->slice_data, 0,
341 sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
342 for (i = 0; i < NUM_BANDS; i++)
343 if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
344 i, slice_width,
345 !ctx->interlaced)) < 0)
346 return ret;
347
348 for (mb = 0; mb < slice_width; mb++) {
349 for (blk = 0; blk < 4; blk++) {
350 if (!ctx->interlaced)
351 recombine_block(ctx->block, ctx->idsp.idct_permutation,
352 &base_y, &ext_y);
353 else
354 recombine_block_il(ctx->block, ctx->idsp.idct_permutation,
355 &base_y, &ext_y, blk);
356 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
357 ctx->idsp.idct(ctx->block);
358
359 if (!ctx->interlaced) {
360 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
361 ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
362 } else {
363 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
364 ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
365 ystride * 2);
366 }
367 }
368 Y += 16;
369
370 for (blk = 0; blk < 2; blk++) {
371 recombine_block(ctx->block, ctx->idsp.idct_permutation,
372 &base_c, &ext_c);
373 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
374 ctx->idsp.idct(ctx->block);
375 ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
376 ctx->frame->linesize[blk + 1]);
377 C[blk] += 8;
378 }
379 }
380
381 return 0;
382}
383
385 int *got_frame, AVPacket *avpkt)
386{
387 AICContext *ctx = avctx->priv_data;
388 const uint8_t *buf = avpkt->data;
389 int buf_size = avpkt->size;
391 uint32_t off;
392 int x, y, ret;
393 int slice_size;
394
395 ctx->frame = frame;
396
397 off = FFALIGN(AIC_HDR_SIZE + ctx->num_x_slices * ctx->mb_height * 2, 4);
398
399 if (buf_size < off) {
400 av_log(avctx, AV_LOG_ERROR, "Too small frame\n");
401 return AVERROR_INVALIDDATA;
402 }
403
404 ret = aic_decode_header(ctx, buf, buf_size);
405 if (ret < 0) {
406 av_log(avctx, AV_LOG_ERROR, "Invalid header\n");
407 return ret;
408 }
409
410 if ((ret = ff_thread_get_buffer(avctx, ctx->frame, 0)) < 0)
411 return ret;
412
414 ctx->num_x_slices * ctx->mb_height * 2);
415
416 for (y = 0; y < ctx->mb_height; y++) {
417 for (x = 0; x < ctx->mb_width; x += ctx->slice_width) {
418 slice_size = bytestream2_get_le16(&gb) * 4;
419 if (slice_size + off > buf_size || !slice_size) {
420 av_log(avctx, AV_LOG_ERROR,
421 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
422 return AVERROR_INVALIDDATA;
423 }
424
425 ret = aic_decode_slice(ctx, x, y, buf + off, slice_size);
426 if (ret < 0) {
427 av_log(avctx, AV_LOG_ERROR,
428 "Error decoding slice at %d.%d\n", x, y);
429 return ret;
430 }
431
432 off += slice_size;
433 }
434 }
435
436 *got_frame = 1;
437
438 return avpkt->size;
439}
440
442{
443 AICContext *ctx = avctx->priv_data;
444 int i;
445
446 ctx->avctx = avctx;
447
449
450 ff_idctdsp_init(&ctx->idsp, avctx);
451
452 for (i = 0; i < 64; i++)
453 ctx->quant_matrix[ctx->idsp.idct_permutation[i]] = aic_quant_matrix[i];
454
455 ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
456 ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
457
458 ctx->num_x_slices = (ctx->mb_width + 15) >> 4;
459 ctx->slice_width = 16;
460 for (i = 1; i < ctx->mb_width; i++) {
461 if (!(ctx->mb_width % i) && (ctx->mb_width / i <= 32)) {
462 ctx->slice_width = ctx->mb_width / i;
463 ctx->num_x_slices = i;
464 break;
465 }
466 }
467
468 ctx->slice_data = av_calloc(ctx->slice_width, AIC_BAND_COEFFS * sizeof(*ctx->slice_data));
469 if (!ctx->slice_data) {
470 av_log(avctx, AV_LOG_ERROR, "Error allocating slice buffer\n");
471
472 return AVERROR(ENOMEM);
473 }
474
475 for (i = 0; i < NUM_BANDS; i++)
476 ctx->data_ptr[i] = ctx->slice_data + ctx->slice_width
477 * aic_band_off[i];
478
479 return 0;
480}
481
483{
484 AICContext *ctx = avctx->priv_data;
485
486 av_freep(&ctx->slice_data);
487
488 return 0;
489}
490
492 .p.name = "aic",
493 CODEC_LONG_NAME("Apple Intermediate Codec"),
494 .p.type = AVMEDIA_TYPE_VIDEO,
495 .p.id = AV_CODEC_ID_AIC,
496 .priv_data_size = sizeof(AICContext),
501};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static double val(void *priv, double ch)
Definition aeval.c:77
static const uint8_t aic_y_scan[64]
Definition aic.c:63
static const uint8_t aic_c_ext_scan[192]
Definition aic.c:112
static void recombine_block_il(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext, int block_no)
Definition aic.c:275
static void recombine_block(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext)
Definition aic.c:255
const FFCodec ff_aic_decoder
Definition aic.c:491
static const uint8_t aic_quant_matrix[64]
Definition aic.c:52
AICBands
Definition aic.c:40
@ COEFF_CHROMA_EXT
Definition aic.c:44
@ NUM_BANDS
Definition aic.c:45
@ COEFF_LUMA_EXT
Definition aic.c:43
@ COEFF_LUMA
Definition aic.c:41
@ COEFF_CHROMA
Definition aic.c:42
#define GET_CODE(val, type, add_bits)
Definition aic.c:194
static int aic_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition aic.c:384
static av_cold int aic_decode_init(AVCodecContext *avctx)
Definition aic.c:441
static const uint8_t aic_num_band_coeffs[NUM_BANDS]
Definition aic.c:48
static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
Definition aic.c:297
static av_cold int aic_decode_close(AVCodecContext *avctx)
Definition aic.c:482
static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst, int band, int slice_width, int force_chroma)
Definition aic.c:204
static const uint8_t aic_c_scan[64]
Definition aic.c:101
static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
Definition aic.c:161
static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, const uint8_t *src, int src_size)
Definition aic.c:310
#define AIC_BAND_COEFFS
Definition aic.c:38
static const uint16_t aic_band_off[NUM_BANDS]
Definition aic.c:50
static const uint8_t *const aic_scan[NUM_BANDS]
Definition aic.c:139
static const uint8_t aic_y_ext_scan[192]
Definition aic.c:74
#define AIC_HDR_SIZE
Definition aic.c:37
static AVFormatContext * ctx
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
Libavcodec external API header.
#define Y
Definition boxblur.h:37
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define mb(name)
Definition cbs_lcevc.c:95
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
static int16_t block[64]
Definition dct.c:125
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static const uint8_t frame_size[4]
Definition g723_1.h:222
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition get_bits.h:517
exp golomb vlc stuff
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition codec.h:98
@ AV_CODEC_ID_AIC
Definition codec_id.h:218
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_RB32(p)
#define AV_RB16(p)
#define C
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition idctdsp.c:228
Multithreading API for decoders.
#define av_cold
Definition attributes.h:117
#define FFMIN(a, b)
Definition macros.h:49
#define FFALIGN(x, a)
Definition macros.h:78
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define blk(i)
Definition sha.c:55
int mb_width
Definition aic.c:150
int mb_height
Definition aic.c:150
AVFrame * frame
Definition aic.c:145
AVCodecContext * avctx
Definition aic.c:144
int interlaced
Definition aic.c:152
int16_t block[64]
Definition aic.c:157
IDCTDSPContext idsp
Definition aic.c:146
int16_t * slice_data
Definition aic.c:154
uint8_t quant_matrix[64]
Definition aic.c:158
int quant
Definition aic.c:151
int16_t * data_ptr[NUM_BANDS]
Definition aic.c:155
int slice_width
Definition aic.c:149
int num_x_slices
Definition aic.c:148
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
int size
uint8_t base
Definition vp3data.h:128