FFmpeg
Loading...
Searching...
No Matches
target_dec_fuzzer.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19/* Targeted fuzzer that targets specific codecs depending on two
20 compile-time flags.
21 INSTRUCTIONS:
22
23 * Get clang > 6.0 (https://llvm.org/docs/LibFuzzer.html)
24 * Build ffmpeg for fuzzing:
25 ./configure --enable-debug --toolchain=clang-asan-ubsan-fuzz --enable-ossfuzz
26 make clean && make -j
27 * build the fuzz target.
28 make tools/target_dec_<codec>_fuzzer # e.g. tools/target_dec_jpeg2000_fuzzer
29 * Run fuzzing with a corpus directory:
30 mkdir CORPUS && cp some-files CORPUS # (empty corpus dir is ok too)
31 ./tools/target_dec_<codec>_fuzzer -max_len=100000 CORPUS
32 * Run a test case:
33 ./tools/target_dec_<codec>_fuzzer <testcase>
34
35 More info:
36 http://libfuzzer.info
37 http://tutorial.libfuzzer.info
38 https://github.com/google/oss-fuzz
39 http://lcamtuf.coredump.cx/afl/
40 https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
41*/
42
43#include "config.h"
44#include "libavutil/avassert.h"
45#include "libavutil/avstring.h"
46#include "libavutil/cpu.h"
47#include "libavutil/imgutils.h"
49#include "libavutil/mem.h"
50
51#include "libavcodec/avcodec.h"
55
56//For FF_SANE_NB_CHANNELS, so we dont waste energy testing things that will get instantly rejected
57#include "libavcodec/internal.h"
58
59int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
60
61extern const FFCodec * codec_list[];
62
63static void error(const char *err)
64{
65 fprintf(stderr, "%s", err);
66 exit(1);
67}
68
69static const FFCodec *c = NULL;
70
71#ifndef FFMPEG_DECODER
73{
74 const AVCodec *res;
75
77 if (!res)
78 error("Failed to find decoder");
79 return ffcodec(res);
80}
81#endif
82
83static int subtitle_handler(AVCodecContext *avctx, AVFrame *unused,
84 int *got_sub_ptr, const AVPacket *avpkt)
85{
86 AVSubtitle sub;
87 int ret = avcodec_decode_subtitle2(avctx, &sub, got_sub_ptr, avpkt);
88 av_assert0(ret != AVERROR_BUG);
89 if (ret >= 0 && *got_sub_ptr)
90 avsubtitle_free(&sub);
91 return ret;
92}
93
95 int *got_frame, const AVPacket *dummy)
96{
97 int ret = avcodec_receive_frame(avctx, frame);
98 av_assert0(ret != AVERROR_BUG);
99 *got_frame = ret >= 0;
100 return ret;
101}
102
103// Ensure we don't loop forever
104const uint32_t maxiteration = 8096;
105
106static const uint64_t FUZZ_TAG = 0x4741542D5A5A5546ULL;
107
108static uint64_t alloc_pixels;
109static uint64_t max_alloc_pixels;
110
112{
113 ptrdiff_t linesize1[4];
114 size_t size[4];
115 int linesize_align[AV_NUM_DATA_POINTERS];
116 int i, ret, w = frame->width, h = frame->height;
117
118 avcodec_align_dimensions2(ctx, &w, &h, linesize_align);
119
120 alloc_pixels += (uint64_t)w * h;
122 return AVERROR(ENOMEM);
123
124 ret = av_image_fill_linesizes(frame->linesize, ctx->pix_fmt, w);
125 if (ret < 0)
126 return ret;
127
128 for (i = 0; i < 4 && frame->linesize[i]; i++)
129 linesize1[i] = frame->linesize[i] =
130 FFALIGN(frame->linesize[i], linesize_align[i]);
131 for (; i < 4; i++)
132 linesize1[i] = 0;
133
134 ret = av_image_fill_plane_sizes(size, ctx->pix_fmt, h, linesize1);
135 if (ret < 0)
136 return ret;
137
138 frame->extended_data = frame->data;
139 for (i = 0; i < 4 && size[i]; i++) {
140 switch(ctx->codec_id) {
141 case AV_CODEC_ID_FFV1:
142 frame->buf[i] = av_buffer_alloc(size[i]);
143 break;
144 default:
145 frame->buf[i] = av_buffer_allocz(size[i]);
146 }
147
148 if (!frame->buf[i])
149 goto fail;
150 frame->data[i] = frame->buf[i]->data;
151 }
152 for (; i < AV_NUM_DATA_POINTERS; i++) {
153 frame->data[i] = NULL;
154 frame->linesize[i] = 0;
155 }
156
157 return 0;
158fail:
160 return AVERROR(ENOMEM);
161}
162
164{
165 switch (ctx->codec_type) {
167 return (ctx->codec->capabilities & AV_CODEC_CAP_DR1)
172 default:
173 return AVERROR(EINVAL);
174 }
175}
176
177int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
178 uint64_t maxpixels_per_frame = 4096 * 4096;
179 uint64_t maxpixels;
180
181 uint64_t maxsamples_per_frame = 256*1024*32;
182 uint64_t maxsamples;
183 const uint64_t fuzz_tag = FUZZ_TAG;
184 const uint8_t *last = data;
185 const uint8_t *end = data + size;
186 uint32_t it = 0;
187 uint64_t ec_pixels = 0;
188 uint64_t nb_samples = 0;
189 int (*decode_handler)(AVCodecContext *avctx, AVFrame *picture,
190 int *got_picture_ptr,
191 const AVPacket *avpkt) = NULL;
192 AVCodecParserContext *parser = NULL;
193 uint64_t keyframes = 0;
194 uint64_t flushpattern = -1;
196
197 if (!c) {
198#ifdef FFMPEG_DECODER
199#define DECODER_SYMBOL0(CODEC) ff_##CODEC##_decoder
200#define DECODER_SYMBOL(CODEC) DECODER_SYMBOL0(CODEC)
201 extern FFCodec DECODER_SYMBOL(FFMPEG_DECODER);
202 codec_list[0] = &DECODER_SYMBOL(FFMPEG_DECODER);
203
204 c = &DECODER_SYMBOL(FFMPEG_DECODER);
205#else
206 c = AVCodecInitialize(FFMPEG_CODEC); // Done once.
207#endif
209 }
210
211 switch (c->p.type) {
212 case AVMEDIA_TYPE_AUDIO :
213 case AVMEDIA_TYPE_VIDEO : decode_handler = audio_video_handler ; break;
214 case AVMEDIA_TYPE_SUBTITLE: decode_handler = subtitle_handler ; break;
215 }
216 switch (c->p.id) {
217 case AV_CODEC_ID_APE: maxsamples_per_frame /= 256; break;
218 }
219 maxpixels = maxpixels_per_frame * maxiteration;
220 maxsamples = maxsamples_per_frame * maxiteration;
221 switch (c->p.id) {
222 case AV_CODEC_ID_4XM: maxpixels /= 64; break;
223 case AV_CODEC_ID_AASC: maxpixels /= 1024; break;
224 case AV_CODEC_ID_AGM: maxpixels /= 1024; break;
225 case AV_CODEC_ID_ANM: maxpixels /= 1024; break;
226 case AV_CODEC_ID_APE: maxsamples /= 16384; break;
227 case AV_CODEC_ID_ARBC: maxpixels /= 1024; break;
228 case AV_CODEC_ID_ARGO: maxpixels /= 1024; break;
229 case AV_CODEC_ID_BETHSOFTVID: maxpixels /= 8192; break;
230 case AV_CODEC_ID_BFI: maxpixels /= 8192; break;
231 case AV_CODEC_ID_BINKVIDEO: maxpixels /= 32; break;
232 case AV_CODEC_ID_BMP: maxpixels /= 16; break;
233 case AV_CODEC_ID_BONK: maxsamples /= 1<<20; break;
234 case AV_CODEC_ID_CAVS: maxpixels /= 1024; break;
235 case AV_CODEC_ID_CDTOONS: maxpixels /= 1024; break;
236 case AV_CODEC_ID_CFHD: maxpixels /= 16384; break;
237 case AV_CODEC_ID_CINEPAK: maxpixels /= 128; break;
238 case AV_CODEC_ID_COOK: maxsamples /= 1<<20; break;
239 case AV_CODEC_ID_CPIA: maxpixels /= 256; break;
240 case AV_CODEC_ID_CRI: maxpixels /= 1024; break;
241 case AV_CODEC_ID_CSCD: maxpixels /= 1024; break;
242 case AV_CODEC_ID_DFA: maxpixels /= 1024; break;
243 case AV_CODEC_ID_DIRAC: maxpixels /= 8192; break;
244 case AV_CODEC_ID_DSICINVIDEO: maxpixels /= 1024; break;
245 case AV_CODEC_ID_DST: maxsamples /= 1<<20; break;
246 case AV_CODEC_ID_DVB_SUBTITLE: av_dict_set_int(&opts, "compute_clut", -2, 0); break;
247 case AV_CODEC_ID_DXA: maxpixels /= 32; break;
248 case AV_CODEC_ID_DXV: maxpixels /= 32; break;
249 case AV_CODEC_ID_CMV: maxpixels /= 256; break;
250 case AV_CODEC_ID_EXR: maxpixels /= 1024; break;
251 case AV_CODEC_ID_FFV1: maxpixels /= 32; break;
252 case AV_CODEC_ID_FFWAVESYNTH: maxsamples /= 16384; break;
253 case AV_CODEC_ID_FLAC: maxsamples /= 1024; break;
254 case AV_CODEC_ID_FLIC: maxpixels /= 1024; break;
255 case AV_CODEC_ID_FLV1: maxpixels /= 1024; break;
256 case AV_CODEC_ID_FMVC: maxpixels /= 1024; break;
257 case AV_CODEC_ID_G2M: maxpixels /= 16384; break;
258 case AV_CODEC_ID_GEM: maxpixels /= 512; break;
259 case AV_CODEC_ID_GDV: maxpixels /= 512; break;
260 case AV_CODEC_ID_GIF: maxpixels /= 16; break;
261 case AV_CODEC_ID_H264: maxpixels /= 256; break;
262 case AV_CODEC_ID_HAP: maxpixels /= 128; break;
263 case AV_CODEC_ID_HEVC: maxpixels /= 16384; break;
264 case AV_CODEC_ID_HNM4_VIDEO: maxpixels /= 128; break;
265 case AV_CODEC_ID_HQ_HQA: maxpixels /= 128; break;
266 case AV_CODEC_ID_IFF_ILBM: maxpixels /= 4096; break;
267 case AV_CODEC_ID_INDEO4: maxpixels /= 128; break;
268 case AV_CODEC_ID_INDEO5: maxpixels /= 1024; break;
269 case AV_CODEC_ID_INTERPLAY_ACM: maxsamples /= 16384; break;
270 case AV_CODEC_ID_INTERPLAY_VIDEO: maxpixels /= 256; break;
271 case AV_CODEC_ID_JPEG2000: maxpixels /= 16384; break;
272 case AV_CODEC_ID_JV: maxpixels /= 16384; break;
273 case AV_CODEC_ID_LAGARITH: maxpixels /= 1024; break;
274 case AV_CODEC_ID_LOCO: maxpixels /= 1024; break;
275 case AV_CODEC_ID_VORBIS: maxsamples /= 1024; break;
276 case AV_CODEC_ID_LSCR: maxpixels /= 16; break;
277 case AV_CODEC_ID_MAGICYUV: maxpixels /= 256; break;
278 case AV_CODEC_ID_MMVIDEO: maxpixels /= 256; break;
279 case AV_CODEC_ID_MOTIONPIXELS:maxpixels /= 256; break;
280 case AV_CODEC_ID_MP4ALS: maxsamples /= 65536;
281 av_dict_set_int(&opts, "max_order", 15, 0);
282 break;
283 case AV_CODEC_ID_MUSEPACK8: maxsamples /= 16384; break;
284 case AV_CODEC_ID_MSA1: maxpixels /= 16384; break;
285 case AV_CODEC_ID_MSCC: maxpixels /= 4096; break;
286 case AV_CODEC_ID_MSRLE: maxpixels /= 16; break;
287 case AV_CODEC_ID_MSS2: maxpixels /= 16384; break;
288 case AV_CODEC_ID_MSZH: maxpixels /= 128; break;
289 case AV_CODEC_ID_MTS2: maxpixels /= 4096; break;
290 case AV_CODEC_ID_MV30: maxpixels /= 128; break;
291 case AV_CODEC_ID_MVC1: maxpixels /= 1024; break;
292 case AV_CODEC_ID_MVC2: maxpixels /= 128; break;
293 case AV_CODEC_ID_MVHA: maxpixels /= 16384; break;
294 case AV_CODEC_ID_MVDV: maxpixels /= 1024; break;
295 case AV_CODEC_ID_MWSC: maxpixels /= 256; break;
296 case AV_CODEC_ID_MXPEG: maxpixels /= 128; break;
297 case AV_CODEC_ID_NUV: maxpixels /= 128; break;
298 case AV_CODEC_ID_OPUS: maxsamples /= 16384; break;
299 case AV_CODEC_ID_PIXLET: maxpixels /= 1024; break;
300 case AV_CODEC_ID_PNG: maxpixels /= 128; break;
301 case AV_CODEC_ID_APNG: maxpixels /= 128; break;
302 case AV_CODEC_ID_QTRLE: maxpixels /= 16; break;
303 case AV_CODEC_ID_PAF_VIDEO: maxpixels /= 16; break;
304 case AV_CODEC_ID_PRORES: maxpixels /= 256; break;
305 case AV_CODEC_ID_QDRAW: maxpixels /= 256; break;
306 case AV_CODEC_ID_QOI: maxpixels /= 256; break;
307 case AV_CODEC_ID_QPEG: maxpixels /= 256; break;
308 case AV_CODEC_ID_RKA: maxsamples /= 1<<20; break;
309 case AV_CODEC_ID_RSCC: maxpixels /= 256; break;
310 case AV_CODEC_ID_RASC: maxpixels /= 256; break;
311 case AV_CODEC_ID_RTV1: maxpixels /= 16; break;
312 case AV_CODEC_ID_RV30: maxpixels /= 256; break;
313 case AV_CODEC_ID_RV60: maxpixels /= 256; break;
314 case AV_CODEC_ID_SANM: maxpixels /= 16; break;
315 case AV_CODEC_ID_SCPR: maxpixels /= 32; break;
316 case AV_CODEC_ID_SCREENPRESSO:maxpixels /= 64; break;
317 case AV_CODEC_ID_SGA_VIDEO: maxpixels /= 256; break;
318 case AV_CODEC_ID_SIMBIOSIS_IMX:maxpixels /= 16384; break;
319 case AV_CODEC_ID_SPEEX: maxsamples /= 128; break;
320 case AV_CODEC_ID_SMACKAUDIO: maxsamples /= 4096; break;
321 case AV_CODEC_ID_SMACKVIDEO: maxpixels /= 64; break;
322 case AV_CODEC_ID_SNOW: maxpixels /= 128; break;
323 case AV_CODEC_ID_SRGC: maxpixels /= 128; break;
324 case AV_CODEC_ID_TARGA: maxpixels /= 128; break;
325 case AV_CODEC_ID_TAK: maxsamples /= 1024; break;
326 case AV_CODEC_ID_TDSC: maxpixels /= 128; break;
327 case AV_CODEC_ID_TGV: maxpixels /= 32; break;
328 case AV_CODEC_ID_THEORA: maxpixels /= 16384; break;
329 case AV_CODEC_ID_TQI: maxpixels /= 1024; break;
330 case AV_CODEC_ID_TRUEMOTION2: maxpixels /= 1024; break;
331 case AV_CODEC_ID_TSCC: maxpixels /= 1024; break;
332 case AV_CODEC_ID_UTVIDEO: maxpixels /= 1024; break;
333 case AV_CODEC_ID_VB: maxpixels /= 1024; break;
334 case AV_CODEC_ID_VC1: maxpixels /= 8192; break;
335 case AV_CODEC_ID_VC1IMAGE: maxpixels /= 8192; break;
336 case AV_CODEC_ID_VMNC: maxpixels /= 8192; break;
337 case AV_CODEC_ID_VMDVIDEO: maxpixels /= 1024; break;
338 case AV_CODEC_ID_VMIX: maxpixels /= 8192; break;
339 case AV_CODEC_ID_VP3: maxpixels /= 4096; break;
340 case AV_CODEC_ID_VP4: maxpixels /= 4096; break;
341 case AV_CODEC_ID_VP5: maxpixels /= 256; break;
342 case AV_CODEC_ID_VP6: maxpixels /= 4096; break;
343 case AV_CODEC_ID_VP6F: maxpixels /= 4096; break;
344 case AV_CODEC_ID_VP6A: maxpixels /= 4096; break;
345 case AV_CODEC_ID_VP7: maxpixels /= 256; break;
346 case AV_CODEC_ID_VP8: maxpixels /= 256; break;
347 case AV_CODEC_ID_VP9: maxpixels /= 4096; break;
348 case AV_CODEC_ID_WAVPACK: maxsamples /= 1024; break;
349 case AV_CODEC_ID_WCMV: maxpixels /= 1024; break;
350 case AV_CODEC_ID_WEBP: maxpixels /= 1024; break;
351 case AV_CODEC_ID_WMV3IMAGE: maxpixels /= 8192; break;
352 case AV_CODEC_ID_WMV2: maxpixels /= 1024; break;
353 case AV_CODEC_ID_WMV3: maxpixels /= 1024; break;
354 case AV_CODEC_ID_WS_VQA: maxpixels /= 16384; break;
355 case AV_CODEC_ID_WMALOSSLESS: maxsamples /= 1024; break;
356 case AV_CODEC_ID_WMAPRO: maxsamples /= 16384; break;
357 case AV_CODEC_ID_XAN_WC3: maxpixels /= 1024; break;
358 case AV_CODEC_ID_YLC: maxpixels /= 1024; break;
359 case AV_CODEC_ID_ZEROCODEC: maxpixels /= 128; break;
360 case AV_CODEC_ID_ZLIB: maxpixels /= 4096; break;
361 case AV_CODEC_ID_ZMBV: maxpixels /= 4096; break;
362 }
363
364 maxsamples_per_frame = FFMIN(maxsamples_per_frame, maxsamples);
365 maxpixels_per_frame = FFMIN(maxpixels_per_frame , maxpixels);
366
367 alloc_pixels = 0;
368 max_alloc_pixels = maxpixels;
369
372 if (!ctx || !parser_avctx)
373 error("Failed memory allocation");
374
375 if (ctx->max_pixels == 0 || ctx->max_pixels > maxpixels_per_frame)
376 ctx->max_pixels = maxpixels_per_frame; //To reduce false positive OOM and hangs
377
378 ctx->max_samples = maxsamples_per_frame;
379 ctx->get_buffer2 = fuzz_get_buffer2;
380 if (c->p.capabilities & AV_CODEC_CAP_EXPERIMENTAL)
381 ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
382
383 if (size > 1024) {
384 GetByteContext gbc;
385 int extradata_size;
386 int flags;
387 uint64_t request_channel_layout;
388 int64_t flags64;
389
390 size -= 1024;
391 bytestream2_init(&gbc, data + size, 1024);
392 ctx->width = bytestream2_get_le32(&gbc);
393 ctx->height = bytestream2_get_le32(&gbc);
394 ctx->bit_rate = bytestream2_get_le64(&gbc);
395 ctx->bits_per_coded_sample = bytestream2_get_le32(&gbc);
396 // Try to initialize a parser for this codec, note, this may fail which just means we test without one
397 flags = bytestream2_get_byte(&gbc);
398 if (flags & 1)
399 parser = av_parser_init(c->p.id);
400 if (flags & 2)
401 ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
402 if (flags & 4) {
403 ctx->err_recognition = AV_EF_AGGRESSIVE | AV_EF_COMPLIANT | AV_EF_CAREFUL;
404 if (flags & 8)
405 ctx->err_recognition |= AV_EF_EXPLODE;
406 }
407 if ((flags & 0x10) && c->p.id != AV_CODEC_ID_H264)
408 ctx->flags2 |= AV_CODEC_FLAG2_FAST;
409 if (flags & 0x80)
410 ctx->export_side_data |= AV_CODEC_EXPORT_DATA_MVS;
411
412 if (flags & 0x40)
414
415 extradata_size = bytestream2_get_le32(&gbc);
416
417 ctx->sample_rate = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
418 ctx->ch_layout.nb_channels = (unsigned)bytestream2_get_le32(&gbc) % FF_SANE_NB_CHANNELS;
419 ctx->block_align = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
420 ctx->codec_tag = bytestream2_get_le32(&gbc);
421 if (c->codec_tags) {
422 int n;
423 for (n = 0; c->codec_tags[n] != FF_CODEC_TAGS_END; n++);
424 ctx->codec_tag = c->codec_tags[ctx->codec_tag % n];
425 }
426 keyframes = bytestream2_get_le64(&gbc);
427 request_channel_layout = bytestream2_get_le64(&gbc);
428
429 ctx->idct_algo = bytestream2_get_byte(&gbc) % 25;
430 flushpattern = bytestream2_get_le64(&gbc);
431 ctx->skip_frame = bytestream2_get_byte(&gbc) - 254 + AVDISCARD_ALL;
432
433
434 if (flags & 0x20) {
435 switch (ctx->codec_id) {
436 case AV_CODEC_ID_AC3:
437 case AV_CODEC_ID_EAC3:
438 av_dict_set_int(&opts, "cons_noisegen", bytestream2_get_byte(&gbc) & 1, 0);
439 av_dict_set_int(&opts, "heavy_compr", bytestream2_get_byte(&gbc) & 1, 0);
440 av_dict_set_int(&opts, "target_level", (int)(bytestream2_get_byte(&gbc) % 32) - 31, 0);
441 av_dict_set_int(&opts, "dmix_mode", (int)(bytestream2_get_byte(&gbc) % 4) - 1, 0);
442 break;
443 }
444 }
445
446 // Keep the deprecated request_channel_layout behavior to ensure old fuzzing failures
447 // remain reproducible.
448 if (request_channel_layout) {
449 switch (ctx->codec_id) {
450 case AV_CODEC_ID_AC3:
451 case AV_CODEC_ID_EAC3:
452 case AV_CODEC_ID_MLP:
454 case AV_CODEC_ID_DTS:
455 if (request_channel_layout & ~INT64_MIN) {
456 char *downmix_layout = av_mallocz(19);
457 if (!downmix_layout)
458 error("Failed memory allocation");
459 av_strlcatf(downmix_layout, 19, "0x%"PRIx64, request_channel_layout & ~INT64_MIN);
460 av_dict_set(&opts, "downmix", downmix_layout, AV_DICT_DONT_STRDUP_VAL);
461 }
462 if (ctx->codec_id != AV_CODEC_ID_DTS)
463 break;
466 av_dict_set_int(&opts, "channel_order", !!(request_channel_layout & INT64_MIN), 0);
467 break;
468 }
469 }
470
471 flags64 = bytestream2_get_le64(&gbc);
472 if (flags64 &1)
473 ctx->debug |= FF_DEBUG_SKIP;
474 if (flags64 &2)
475 ctx->debug |= FF_DEBUG_QP;
476 if (flags64 &4)
477 ctx->debug |= FF_DEBUG_MB_TYPE;
478 if (flags64 & 8)
479 ctx->export_side_data |= AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS;
480 if (flags64 & 0x10)
481 ctx->err_recognition |= AV_EF_CRCCHECK;
482
483 ctx->workaround_bugs = bytestream2_get_le32(&gbc);
484
485 if (c->p.max_lowres) {
486 ctx->lowres = bytestream2_get_byte(&gbc) % (c->p.max_lowres+1);
487 }
488
489 if (extradata_size < size) {
490 ctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
491 if (ctx->extradata) {
492 ctx->extradata_size = extradata_size;
493 size -= ctx->extradata_size;
494 memcpy(ctx->extradata, data + size, ctx->extradata_size);
495 }
496 }
497 if (av_image_check_size(ctx->width, ctx->height, 0, ctx))
498 ctx->width = ctx->height = 0;
499 }
500
501 int res = avcodec_open2(ctx, &c->p, &opts);
502 if (res < 0) {
503 av_assert0(res != AVERROR_BUG);
505 av_free(parser_avctx);
506 av_parser_close(parser);
508 return 0; // Failure of avcodec_open2() does not imply that a issue was found
509 }
510 parser_avctx->codec_id = ctx->codec_id;
511 parser_avctx->extradata_size = ctx->extradata_size;
512 parser_avctx->extradata = ctx->extradata ? av_memdup(ctx->extradata, ctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE) : NULL;
513
514
515 int got_frame;
517 AVPacket *avpkt = av_packet_alloc();
518 AVPacket *parsepkt = av_packet_alloc();
519 if (!frame || !avpkt || !parsepkt)
520 error("Failed memory allocation");
521
522 // Read very simple container
523 while (data < end && it < maxiteration) {
524 // Search for the TAG
525 while (data + sizeof(fuzz_tag) < end) {
526 if (data[0] == (fuzz_tag & 0xFF) && AV_RN64(data) == fuzz_tag)
527 break;
528 data++;
529 }
530 if (data + sizeof(fuzz_tag) > end)
531 data = end;
532
533 res = av_new_packet(parsepkt, data - last);
534 if (res < 0)
535 error("Failed memory allocation");
536 memcpy(parsepkt->data, last, data - last);
537 parsepkt->flags = (keyframes & 1) * AV_PKT_FLAG_DISCARD + (!!(keyframes & 2)) * AV_PKT_FLAG_KEY;
538 keyframes = (keyframes >> 2) + (keyframes<<62);
539 data += sizeof(fuzz_tag);
540 last = data;
541
542 while (parsepkt->size > 0) {
543 int decode_more;
544
545 if (parser) {
546 int ret = av_parser_parse2(parser, parser_avctx, &avpkt->data, &avpkt->size,
547 parsepkt->data, parsepkt->size,
548 parsepkt->pts, parsepkt->dts, parsepkt->pos);
549 if (avpkt->data == parsepkt->data) {
550 avpkt->buf = av_buffer_ref(parsepkt->buf);
551 if (!avpkt->buf)
552 error("Failed memory allocation");
553 } else {
554 if (av_packet_make_refcounted(avpkt) < 0)
555 error("Failed memory allocation");
556 }
557 parsepkt->data += ret;
558 parsepkt->size -= ret;
559 parsepkt->pos += ret;
560 avpkt->pts = parser->pts;
561 avpkt->dts = parser->dts;
562 avpkt->pos = parser->pos;
563 if ( parser->key_frame == 1 ||
564 (parser->key_frame == -1 && parser->pict_type == AV_PICTURE_TYPE_I))
565 avpkt->flags |= AV_PKT_FLAG_KEY;
566 avpkt->flags |= parsepkt->flags & AV_PKT_FLAG_DISCARD;
567 } else {
568 av_packet_move_ref(avpkt, parsepkt);
569 }
570
571 if (!(flushpattern & 7))
573 flushpattern = (flushpattern >> 3) + (flushpattern << 61);
574
575 if (ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
576 int ret = avcodec_send_packet(ctx, avpkt);
577 av_assert0(ret != AVERROR_BUG);
578 decode_more = ret >= 0;
579 if(!decode_more) {
580 ec_pixels += (ctx->width + 32LL) * (ctx->height + 32LL);
581 if (it > 20 || ec_pixels > 4 * ctx->max_pixels) {
582 ctx->error_concealment = 0;
584 }
585 if (ec_pixels > maxpixels)
586 goto maximums_reached;
587 }
588 } else
589 decode_more = 1;
590
591 // Iterate through all data
592 while (decode_more && it++ < maxiteration) {
594 int ret = decode_handler(ctx, frame, &got_frame, avpkt);
595
596 ec_pixels += (ctx->width + 32LL) * (ctx->height + 32LL);
597 if (it > 20 || ec_pixels > 4 * ctx->max_pixels) {
598 ctx->error_concealment = 0;
600 }
601 if (ec_pixels > maxpixels)
602 goto maximums_reached;
603
604 if (ctx->codec_type == AVMEDIA_TYPE_AUDIO &&
605 frame->nb_samples == 0 && !got_frame &&
606 (avpkt->flags & AV_PKT_FLAG_DISCARD))
607 nb_samples += ctx->max_samples;
608
609 nb_samples += frame->nb_samples;
610 if (nb_samples > maxsamples)
611 goto maximums_reached;
612
613 if (ret <= 0 || ret > avpkt->size)
614 break;
615
616 if (ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
617 avpkt->data += ret;
618 avpkt->size -= ret;
619 decode_more = avpkt->size > 0;
620 } else
621 decode_more = ret >= 0;
622 }
623 av_packet_unref(avpkt);
624 }
625 av_packet_unref(parsepkt);
626 }
627maximums_reached:
628
629 av_packet_unref(avpkt);
630
631 if (ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
632 int ret = avcodec_send_packet(ctx, NULL);
633 av_assert0(ret != AVERROR_BUG);
634 }
635
636 do {
637 got_frame = 0;
639 decode_handler(ctx, frame, &got_frame, avpkt);
640
641 nb_samples += frame->nb_samples;
642 if (nb_samples > maxsamples)
643 break;
644 } while (got_frame == 1 && it++ < maxiteration);
645
646 // fprintf(stderr, "pixels decoded: %"PRId64", samples decoded: %"PRId64", iterations: %d\n", ec_pixels, nb_samples, it);
647
650 avcodec_free_context(&parser_avctx);
651 av_parser_close(parser);
652 av_packet_free(&avpkt);
653 av_packet_free(&parsepkt);
655 return 0;
656}
static AVFormatContext * ctx
static AVDictionary * opts
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_DEBUG_QP
Definition avcodec.h:1397
#define FF_DEBUG_MB_TYPE
Definition avcodec.h:1396
#define FF_DEBUG_SKIP
Definition avcodec.h:1399
Main libavformat public API header.
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition avstring.c:103
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define FF_CODEC_TAGS_END
FFCodec.codec_tags termination value.
static av_always_inline const FFCodec * ffcodec(const AVCodec *codec)
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition defs.h:62
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition defs.h:48
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
Definition defs.h:55
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
Definition defs.h:56
#define AV_EF_CAREFUL
consider things that violate the spec, are fast to calculate and have not been seen in the wild as er...
Definition defs.h:54
static AVFrame * frame
static int dummy
Definition ffplay.c:3754
#define AV_NUM_DATA_POINTERS
Definition frame.h:473
#define fail
Definition test.h:479
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
Definition avcodec.c:144
#define AV_CODEC_FLAG2_FAST
Allow non spec compliant speedup tricks.
Definition avcodec.h:337
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
Definition options.c:149
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition allcodecs.c:990
void avsubtitle_free(AVSubtitle *sub)
Free all allocated data in the given subtitle struct.
Definition avcodec.c:421
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
#define AV_CODEC_EXPORT_DATA_MVS
Export motion vectors through frame side data.
Definition avcodec.h:390
#define AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS
Decoding only.
Definition avcodec.h:399
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
Definition options.c:164
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
Definition codec.h:90
@ AV_CODEC_ID_DIRAC
Definition codec_id.h:166
@ AV_CODEC_ID_RSCC
Definition codec_id.h:242
@ AV_CODEC_ID_DFA
Definition codec_id.h:200
@ AV_CODEC_ID_IFF_ILBM
Definition codec_id.h:186
@ AV_CODEC_ID_BONK
Definition codec_id.h:550
@ AV_CODEC_ID_XAN_WC3
Definition codec_id.h:90
@ AV_CODEC_ID_AGM
Definition codec_id.h:289
@ AV_CODEC_ID_INTERPLAY_ACM
Definition codec_id.h:531
@ AV_CODEC_ID_BETHSOFTVID
Definition codec_id.h:153
@ AV_CODEC_ID_PAF_VIDEO
Definition codec_id.h:228
@ AV_CODEC_ID_LSCR
Definition codec_id.h:290
@ AV_CODEC_ID_VP6
Definition codec_id.h:141
@ AV_CODEC_ID_VORBIS
Definition codec_id.h:458
@ AV_CODEC_ID_MSA1
Definition codec_id.h:212
@ AV_CODEC_ID_VP3
Definition codec_id.h:79
@ AV_CODEC_ID_CMV
Definition codec_id.h:168
@ AV_CODEC_ID_FLV1
Definition codec_id.h:71
@ AV_CODEC_ID_PNG
Definition codec_id.h:111
@ AV_CODEC_ID_VP6F
Definition codec_id.h:142
@ AV_CODEC_ID_EAC3
Definition codec_id.h:493
@ AV_CODEC_ID_INDEO5
Definition codec_id.h:162
@ AV_CODEC_ID_DVB_SUBTITLE
Definition codec_id.h:567
@ AV_CODEC_ID_SMACKVIDEO
Definition codec_id.h:133
@ AV_CODEC_ID_YLC
Definition codec_id.h:267
@ AV_CODEC_ID_APNG
Definition codec_id.h:260
@ AV_CODEC_ID_RKA
Definition codec_id.h:555
@ AV_CODEC_ID_QTRLE
Definition codec_id.h:105
@ AV_CODEC_ID_INDEO4
Definition codec_id.h:161
@ AV_CODEC_ID_SNOW
Definition codec_id.h:258
@ AV_CODEC_ID_MOTIONPIXELS
Definition codec_id.h:169
@ AV_CODEC_ID_TGV
Definition codec_id.h:170
@ AV_CODEC_ID_DSICINVIDEO
Definition codec_id.h:144
@ AV_CODEC_ID_WCMV
Definition codec_id.h:285
@ AV_CODEC_ID_FFWAVESYNTH
Definition codec_id.h:521
@ AV_CODEC_ID_ARBC
Definition codec_id.h:288
@ AV_CODEC_ID_MP4ALS
Definition codec_id.h:498
@ AV_CODEC_ID_PIXLET
Definition codec_id.h:269
@ AV_CODEC_ID_WS_VQA
Definition codec_id.h:94
@ AV_CODEC_ID_UTVIDEO
Definition codec_id.h:203
@ AV_CODEC_ID_RASC
Definition codec_id.h:286
@ AV_CODEC_ID_GIF
Definition codec_id.h:147
@ AV_CODEC_ID_DOLBY_E
Definition codec_id.h:537
@ AV_CODEC_ID_H264
Definition codec_id.h:77
@ AV_CODEC_ID_VP7
Definition codec_id.h:230
@ AV_CODEC_ID_APE
Definition codec_id.h:485
@ AV_CODEC_ID_CFHD
Definition codec_id.h:262
@ AV_CODEC_ID_TARGA
Definition codec_id.h:143
@ AV_CODEC_ID_MSRLE
Definition codec_id.h:95
@ AV_CODEC_ID_VB
Definition codec_id.h:158
@ AV_CODEC_ID_RV60
Definition codec_id.h:321
@ AV_CODEC_ID_CPIA
Definition codec_id.h:256
@ AV_CODEC_ID_JPEG2000
Definition codec_id.h:138
@ AV_CODEC_ID_ZLIB
Definition codec_id.h:104
@ AV_CODEC_ID_MWSC
Definition codec_id.h:284
@ AV_CODEC_ID_VMNC
Definition codec_id.h:139
@ AV_CODEC_ID_WMV2
Definition codec_id.h:68
@ AV_CODEC_ID_LAGARITH
Definition codec_id.h:197
@ AV_CODEC_ID_MXPEG
Definition codec_id.h:196
@ AV_CODEC_ID_CINEPAK
Definition codec_id.h:93
@ AV_CODEC_ID_MTS2
Definition codec_id.h:214
@ AV_CODEC_ID_VC1IMAGE
Definition codec_id.h:202
@ AV_CODEC_ID_TSCC
Definition codec_id.h:106
@ AV_CODEC_ID_FFV1
Definition codec_id.h:83
@ AV_CODEC_ID_MVC1
Definition codec_id.h:233
@ AV_CODEC_ID_CSCD
Definition codec_id.h:129
@ AV_CODEC_ID_QOI
Definition codec_id.h:309
@ AV_CODEC_ID_GDV
Definition codec_id.h:280
@ AV_CODEC_ID_BINKVIDEO
Definition codec_id.h:185
@ AV_CODEC_ID_INTERPLAY_VIDEO
Definition codec_id.h:89
@ AV_CODEC_ID_SRGC
Definition codec_id.h:278
@ AV_CODEC_ID_VC1
Definition codec_id.h:120
@ AV_CODEC_ID_VP8
Definition codec_id.h:190
@ AV_CODEC_ID_CRI
Definition codec_id.h:303
@ AV_CODEC_ID_WMV3IMAGE
Definition codec_id.h:201
@ AV_CODEC_ID_CDTOONS
Definition codec_id.h:295
@ AV_CODEC_ID_WMALOSSLESS
Definition codec_id.h:491
@ AV_CODEC_ID_ARGO
Definition codec_id.h:302
@ AV_CODEC_ID_VP6A
Definition codec_id.h:156
@ AV_CODEC_ID_CAVS
Definition codec_id.h:137
@ AV_CODEC_ID_SCPR
Definition codec_id.h:272
@ AV_CODEC_ID_VMDVIDEO
Definition codec_id.h:102
@ AV_CODEC_ID_THEORA
Definition codec_id.h:80
@ AV_CODEC_ID_SANM
Definition codec_id.h:231
@ AV_CODEC_ID_FLIC
Definition codec_id.h:100
@ AV_CODEC_ID_MUSEPACK8
Definition codec_id.h:487
@ AV_CODEC_ID_DXV
Definition codec_id.h:240
@ AV_CODEC_ID_TQI
Definition codec_id.h:172
@ AV_CODEC_ID_VMIX
Definition codec_id.h:318
@ AV_CODEC_ID_MSS2
Definition codec_id.h:216
@ AV_CODEC_ID_TAK
Definition codec_id.h:515
@ AV_CODEC_ID_GEM
Definition codec_id.h:306
@ AV_CODEC_ID_NUV
Definition codec_id.h:134
@ AV_CODEC_ID_JV
Definition codec_id.h:199
@ AV_CODEC_ID_FMVC
Definition codec_id.h:271
@ AV_CODEC_ID_DTS
Definition codec_id.h:457
@ AV_CODEC_ID_HEVC
Definition codec_id.h:223
@ AV_CODEC_ID_RV30
Definition codec_id.h:118
@ AV_CODEC_ID_COOK
Definition codec_id.h:473
@ AV_CODEC_ID_MMVIDEO
Definition codec_id.h:130
@ AV_CODEC_ID_G2M
Definition codec_id.h:220
@ AV_CODEC_ID_AASC
Definition codec_id.h:124
@ AV_CODEC_ID_VP4
Definition codec_id.h:291
@ AV_CODEC_ID_PRORES
Definition codec_id.h:198
@ AV_CODEC_ID_BFI
Definition codec_id.h:167
@ AV_CODEC_ID_RTV1
Definition codec_id.h:317
@ AV_CODEC_ID_DST
Definition codec_id.h:534
@ AV_CODEC_ID_TRUEHD
Definition codec_id.h:497
@ AV_CODEC_ID_FLAC
Definition codec_id.h:465
@ AV_CODEC_ID_BMP
Definition codec_id.h:128
@ AV_CODEC_ID_VP5
Definition codec_id.h:140
@ AV_CODEC_ID_TRUEMOTION2
Definition codec_id.h:127
@ AV_CODEC_ID_HAP
Definition codec_id.h:238
@ AV_CODEC_ID_EXR
Definition codec_id.h:229
@ AV_CODEC_ID_HNM4_VIDEO
Definition codec_id.h:222
@ AV_CODEC_ID_SIMBIOSIS_IMX
Definition codec_id.h:304
@ AV_CODEC_ID_MSCC
Definition codec_id.h:277
@ AV_CODEC_ID_MVHA
Definition codec_id.h:294
@ AV_CODEC_ID_MVC2
Definition codec_id.h:234
@ AV_CODEC_ID_AC3
Definition codec_id.h:456
@ AV_CODEC_ID_MVDV
Definition codec_id.h:293
@ AV_CODEC_ID_WEBP
Definition codec_id.h:221
@ AV_CODEC_ID_MV30
Definition codec_id.h:296
@ AV_CODEC_ID_SCREENPRESSO
Definition codec_id.h:241
@ AV_CODEC_ID_QPEG
Definition codec_id.h:110
@ AV_CODEC_ID_QDRAW
Definition codec_id.h:108
@ AV_CODEC_ID_SMACKAUDIO
Definition codec_id.h:476
@ AV_CODEC_ID_MLP
Definition codec_id.h:482
@ AV_CODEC_ID_SGA_VIDEO
Definition codec_id.h:305
@ AV_CODEC_ID_WMV3
Definition codec_id.h:121
@ AV_CODEC_ID_MAGICYUV
Definition codec_id.h:265
@ AV_CODEC_ID_LOCO
Definition codec_id.h:122
@ AV_CODEC_ID_SPEEX
Definition codec_id.h:488
@ AV_CODEC_ID_WAVPACK
Definition codec_id.h:478
@ AV_CODEC_ID_ZMBV
Definition codec_id.h:131
@ AV_CODEC_ID_ANM
Definition codec_id.h:184
@ AV_CODEC_ID_VP9
Definition codec_id.h:217
@ AV_CODEC_ID_ZEROCODEC
Definition codec_id.h:210
@ AV_CODEC_ID_DXA
Definition codec_id.h:148
@ AV_CODEC_ID_OPUS
Definition codec_id.h:513
@ AV_CODEC_ID_TDSC
Definition codec_id.h:236
@ AV_CODEC_ID_MSZH
Definition codec_id.h:103
@ AV_CODEC_ID_HQ_HQA
Definition codec_id.h:237
@ AV_CODEC_ID_4XM
Definition codec_id.h:84
@ AV_CODEC_ID_WMAPRO
Definition codec_id.h:490
int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags)
The default callback for AVCodecContext.get_buffer2().
Definition get_buffer.c:253
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Alias for avcodec_receive_frame_flags(avctx, frame, 0).
Definition avcodec.c:720
void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int linesize_align[AV_NUM_DATA_POINTERS])
Modify width and height values so that they will result in a memory buffer that is acceptable for the...
Definition utils.c:141
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
Supply raw packet data as input to a decoder.
Definition decode.c:730
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, const AVPacket *avpkt)
Decode a subtitle message.
Definition decode.c:935
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
@ AVDISCARD_ALL
discard all
Definition defs.h:232
void avcodec_flush_buffers(AVCodecContext *avctx)
Reset the internal codec state / flush internal buffers.
Definition avcodec.c:389
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
#define AV_PKT_FLAG_DISCARD
Flag is used to discard packets which are required to maintain valid decoder state but are not requir...
Definition packet.h:657
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
int av_packet_make_refcounted(AVPacket *pkt)
Ensure the data described by a given packet is reference counted.
Definition packet.c:497
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition packet.c:491
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition packet.c:63
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition packet.c:98
AVCodecParserContext * av_parser_init(enum AVCodecID codec_id)
Definition parser.c:35
void av_parser_close(AVCodecParserContext *s)
Definition parser.c:203
int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int64_t pts, int64_t dts, int64_t pos)
Parse a packet.
Definition parser.c:120
AVBufferRef * av_buffer_allocz(size_t size)
Same as av_buffer_alloc(), except the returned buffer will be initialized to zero.
Definition buffer.c:93
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:103
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition buffer.c:77
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition dict.c:233
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition dict.h:79
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition dict.c:86
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition dict.c:177
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR(e)
Definition error.h:45
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_PANIC
Something went really wrong and we will crash now.
Definition log.h:197
void av_log_set_level(int level)
Set the log level.
Definition log.c:476
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition mem.c:302
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_SUBTITLE
Definition avutil.h:203
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition imgutils.c:318
int av_image_fill_plane_sizes(size_t sizes[4], enum AVPixelFormat pix_fmt, int height, const ptrdiff_t linesizes[4])
Fill plane sizes for an image with pixel format pix_fmt and height height.
Definition imgutils.c:111
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
Definition imgutils.c:89
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
misc image utilities
#define AV_RN64(p)
common internal api header.
#define FF_SANE_NB_CHANNELS
Definition internal.h:37
#define av_fallthrough
Definition attributes.h:67
void av_force_cpu_flags(int arg)
Disables cpu detection and forces the specified flags.
Definition cpu.c:81
uint8_t w
Definition llvidencdsp.c:39
#define FFMIN(a, b)
Definition macros.h:49
#define FFALIGN(x, a)
Definition macros.h:78
Memory handling functions.
const char data[16]
Definition mxf.c:149
main external API structure.
Definition avcodec.h:443
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVCodecID codec_id
Definition avcodec.h:453
int extradata_size
Definition avcodec.h:527
int64_t pos
Byte position of currently parsed frame in stream.
Definition avcodec.h:2719
int key_frame
Set by parser to 1 for key frames and 0 for non-key frames.
Definition avcodec.h:2666
AVCodec.
Definition codec.h:175
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition packet.h:586
int flags
A combination of AV_PKT_FLAG values.
Definition packet.h:609
int size
Definition packet.h:604
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition packet.h:596
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition packet.h:602
uint8_t * data
Definition packet.h:603
int64_t pos
byte position in stream, -1 if unknown
Definition packet.h:623
#define av_free(p)
#define av_mallocz(s)
static const uint64_t FUZZ_TAG
static uint64_t max_alloc_pixels
static uint64_t alloc_pixels
const uint32_t maxiteration
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
static int fuzz_get_buffer2(AVCodecContext *ctx, AVFrame *frame, int flags)
static void error(const char *err)
static const FFCodec * AVCodecInitialize(enum AVCodecID codec_id)
static int subtitle_handler(AVCodecContext *avctx, AVFrame *unused, int *got_sub_ptr, const AVPacket *avpkt)
const FFCodec * codec_list[]
static int fuzz_video_get_buffer(AVCodecContext *ctx, AVFrame *frame)
static int audio_video_handler(AVCodecContext *avctx, AVFrame *frame, int *got_frame, const AVPacket *dummy)
int size
enum AVCodecID codec_id
static double c[64]