2 * This file is part of FFmpeg.
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.
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.
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
19 /* Targeted fuzzer that targets specific codecs depending on two
23 * Get the very fresh clang, e.g. see http://libfuzzer.info#versions
24 * Get and build libFuzzer:
25 svn co http://llvm.org/svn/llvm-project/llvm/trunk/lib/Fuzzer
27 * build ffmpeg for fuzzing:
28 FLAGS="-fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp -g" CC="clang $FLAGS" CXX="clang++ $FLAGS" ./configure --disable-x86asm
30 * build the fuzz target.
31 Choose the value of FFMPEG_CODEC (e.g. AV_CODEC_ID_DVD_SUBTITLE) and
32 choose one of FUZZ_FFMPEG_VIDEO, FUZZ_FFMPEG_AUDIO, FUZZ_FFMPEG_SUBTITLE.
33 clang -fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp tools/target_dec_fuzzer.c -o target_dec_fuzzer -I. -DFFMPEG_CODEC=AV_CODEC_ID_MPEG1VIDEO -DFUZZ_FFMPEG_VIDEO ../../libfuzzer/libFuzzer.a -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil -lavdevice -lavfilter -lavformat -lavcodec -lswresample -lswscale -lavutil -ldl -lxcb -lxcb-shm -lxcb -lxcb-xfixes -lxcb -lxcb-shape -lxcb -lX11 -lasound -lm -lbz2 -lz -pthread
34 * create a corpus directory and put some samples there (empty dir is ok too):
35 mkdir CORPUS && cp some-files CORPUS
38 ./target_dec_fuzzer -max_len=100000 CORPUS
42 http://tutorial.libfuzzer.info
43 https://github.com/google/oss-fuzz
44 http://lcamtuf.coredump.cx/afl/
45 https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
49 #include "libavutil/avassert.h"
50 #include "libavutil/avstring.h"
51 #include "libavutil/cpu.h"
52 #include "libavutil/imgutils.h"
53 #include "libavutil/intreadwrite.h"
55 #include "libavcodec/avcodec.h"
56 #include "libavcodec/bytestream.h"
57 #include "libavcodec/codec_internal.h"
58 #include "libavformat/avformat.h"
60 //For FF_SANE_NB_CHANNELS, so we dont waste energy testing things that will get instantly rejected
61 #include "libavcodec/internal.h"
63 int LLVMFuzzerTestOneInput(const uint8_t *data
, size_t size
);
65 extern const FFCodec
* codec_list
[];
67 static void error(const char *err
)
69 fprintf(stderr
, "%s", err
);
73 static const FFCodec
*c
= NULL
;
74 static const FFCodec
*AVCodecInitialize(enum AVCodecID codec_id
)
78 res
= avcodec_find_decoder(codec_id
);
80 error("Failed to find decoder");
84 static int subtitle_handler(AVCodecContext
*avctx
, void *frame
,
85 int *got_sub_ptr
, AVPacket
*avpkt
)
88 int ret
= avcodec_decode_subtitle2(avctx
, &sub
, got_sub_ptr
, avpkt
);
89 if (ret
>= 0 && *got_sub_ptr
)
90 avsubtitle_free(&sub
);
94 static int audio_video_handler(AVCodecContext
*avctx
, AVFrame
*frame
,
95 int *got_frame
, const AVPacket
*dummy
)
97 int ret
= avcodec_receive_frame(avctx
, frame
);
98 *got_frame
= ret
>= 0;
102 // Ensure we don't loop forever
103 const uint32_t maxiteration
= 8096;
105 static const uint64_t FUZZ_TAG
= 0x4741542D5A5A5546ULL
;
107 static int fuzz_video_get_buffer(AVCodecContext
*ctx
, AVFrame
*frame
)
109 ptrdiff_t linesize1
[4];
111 int linesize_align
[AV_NUM_DATA_POINTERS
];
112 int i
, ret
, w
= frame
->width
, h
= frame
->height
;
114 avcodec_align_dimensions2(ctx
, &w
, &h
, linesize_align
);
115 ret
= av_image_fill_linesizes(frame
->linesize
, ctx
->pix_fmt
, w
);
119 for (i
= 0; i
< 4 && frame
->linesize
[i
]; i
++)
120 linesize1
[i
] = frame
->linesize
[i
] =
121 FFALIGN(frame
->linesize
[i
], linesize_align
[i
]);
125 ret
= av_image_fill_plane_sizes(size
, ctx
->pix_fmt
, h
, linesize1
);
129 frame
->extended_data
= frame
->data
;
130 for (i
= 0; i
< 4 && size
[i
]; i
++) {
131 switch(ctx
->codec_id
) {
132 case AV_CODEC_ID_FFV1
:
133 frame
->buf
[i
] = av_buffer_alloc(size
[i
]);
136 frame
->buf
[i
] = av_buffer_allocz(size
[i
]);
141 frame
->data
[i
] = frame
->buf
[i
]->data
;
143 for (; i
< AV_NUM_DATA_POINTERS
; i
++) {
144 frame
->data
[i
] = NULL
;
145 frame
->linesize
[i
] = 0;
150 av_frame_unref(frame
);
151 return AVERROR(ENOMEM
);
154 static int fuzz_get_buffer2(AVCodecContext
*ctx
, AVFrame
*frame
, int flags
)
156 switch (ctx
->codec_type
) {
157 case AVMEDIA_TYPE_VIDEO
:
158 return (ctx
->codec
->capabilities
& AV_CODEC_CAP_DR1
)
159 ? fuzz_video_get_buffer(ctx
, frame
)
160 : avcodec_default_get_buffer2(ctx
, frame
, flags
);
161 case AVMEDIA_TYPE_AUDIO
:
162 return avcodec_default_get_buffer2(ctx
, frame
, flags
);
164 return AVERROR(EINVAL
);
168 int LLVMFuzzerTestOneInput(const uint8_t *data
, size_t size
) {
169 uint64_t maxpixels_per_frame
= 4096 * 4096;
172 uint64_t maxsamples_per_frame
= 256*1024*32;
174 const uint64_t fuzz_tag
= FUZZ_TAG
;
175 const uint8_t *last
= data
;
176 const uint8_t *end
= data
+ size
;
178 uint64_t ec_pixels
= 0;
179 uint64_t nb_samples
= 0;
180 int (*decode_handler
)(AVCodecContext
*avctx
, AVFrame
*picture
,
181 int *got_picture_ptr
,
182 const AVPacket
*avpkt
) = NULL
;
183 AVCodecParserContext
*parser
= NULL
;
184 uint64_t keyframes
= 0;
185 uint64_t flushpattern
= -1;
186 AVDictionary
*opts
= NULL
;
189 #ifdef FFMPEG_DECODER
190 #define DECODER_SYMBOL0(CODEC) ff_##CODEC##_decoder
191 #define DECODER_SYMBOL(CODEC) DECODER_SYMBOL0(CODEC)
192 extern FFCodec
DECODER_SYMBOL(FFMPEG_DECODER
);
193 codec_list
[0] = &DECODER_SYMBOL(FFMPEG_DECODER
);
195 #if FFMPEG_DECODER == tiff || FFMPEG_DECODER == tdsc
196 extern FFCodec
DECODER_SYMBOL(mjpeg
);
197 codec_list
[1] = &DECODER_SYMBOL(mjpeg
);
200 c
= &DECODER_SYMBOL(FFMPEG_DECODER
);
202 c
= AVCodecInitialize(FFMPEG_CODEC
); // Done once.
204 av_log_set_level(AV_LOG_PANIC
);
208 case AVMEDIA_TYPE_AUDIO
:
209 case AVMEDIA_TYPE_VIDEO
: decode_handler
= audio_video_handler
; break;
210 case AVMEDIA_TYPE_SUBTITLE
: decode_handler
= subtitle_handler
; break;
213 case AV_CODEC_ID_APE
: maxsamples_per_frame
/= 256; break;
215 maxpixels
= maxpixels_per_frame
* maxiteration
;
216 maxsamples
= maxsamples_per_frame
* maxiteration
;
218 case AV_CODEC_ID_AASC
: maxpixels
/= 1024; break;
219 case AV_CODEC_ID_AGM
: maxpixels
/= 1024; break;
220 case AV_CODEC_ID_ANM
: maxpixels
/= 1024; break;
221 case AV_CODEC_ID_ARBC
: maxpixels
/= 1024; break;
222 case AV_CODEC_ID_ARGO
: maxpixels
/= 1024; break;
223 case AV_CODEC_ID_BINKVIDEO
: maxpixels
/= 32; break;
224 case AV_CODEC_ID_CDTOONS
: maxpixels
/= 1024; break;
225 case AV_CODEC_ID_CFHD
: maxpixels
/= 16384; break;
226 case AV_CODEC_ID_CINEPAK
: maxpixels
/= 128; break;
227 case AV_CODEC_ID_COOK
: maxsamples
/= 1<<20; break;
228 case AV_CODEC_ID_CSCD
: maxpixels
/= 1024; break;
229 case AV_CODEC_ID_DFA
: maxpixels
/= 1024; break;
230 case AV_CODEC_ID_DIRAC
: maxpixels
/= 8192; break;
231 case AV_CODEC_ID_DSICINVIDEO
: maxpixels
/= 1024; break;
232 case AV_CODEC_ID_DST
: maxsamples
/= 1<<20; break;
233 case AV_CODEC_ID_DVB_SUBTITLE
: av_dict_set_int(&opts
, "compute_clut", -2, 0); break;
234 case AV_CODEC_ID_DXA
: maxpixels
/= 32; break;
235 case AV_CODEC_ID_DXV
: maxpixels
/= 32; break;
236 case AV_CODEC_ID_FFWAVESYNTH
: maxsamples
/= 16384; break;
237 case AV_CODEC_ID_FLAC
: maxsamples
/= 1024; break;
238 case AV_CODEC_ID_FLIC
: maxpixels
/= 1024; break;
239 case AV_CODEC_ID_FLV1
: maxpixels
/= 1024; break;
240 case AV_CODEC_ID_G2M
: maxpixels
/= 1024; break;
241 case AV_CODEC_ID_GEM
: maxpixels
/= 512; break;
242 case AV_CODEC_ID_GDV
: maxpixels
/= 512; break;
243 case AV_CODEC_ID_GIF
: maxpixels
/= 16; break;
244 case AV_CODEC_ID_H264
: maxpixels
/= 256; break;
245 case AV_CODEC_ID_HAP
: maxpixels
/= 128; break;
246 case AV_CODEC_ID_HEVC
: maxpixels
/= 16384; break;
247 case AV_CODEC_ID_HNM4_VIDEO
: maxpixels
/= 128; break;
248 case AV_CODEC_ID_HQ_HQA
: maxpixels
/= 128; break;
249 case AV_CODEC_ID_IFF_ILBM
: maxpixels
/= 128; break;
250 case AV_CODEC_ID_INDEO4
: maxpixels
/= 128; break;
251 case AV_CODEC_ID_INTERPLAY_ACM
: maxsamples
/= 16384; break;
252 case AV_CODEC_ID_JPEG2000
: maxpixels
/= 16; break;
253 case AV_CODEC_ID_LAGARITH
: maxpixels
/= 1024; break;
254 case AV_CODEC_ID_LOCO
: maxpixels
/= 1024; break;
255 case AV_CODEC_ID_VORBIS
: maxsamples
/= 1024; break;
256 case AV_CODEC_ID_LSCR
: maxpixels
/= 16; break;
257 case AV_CODEC_ID_MMVIDEO
: maxpixels
/= 256; break;
258 case AV_CODEC_ID_MOTIONPIXELS
:maxpixels
/= 256; break;
259 case AV_CODEC_ID_MP4ALS
: maxsamples
/= 65536; break;
260 case AV_CODEC_ID_MSA1
: maxpixels
/= 16384; break;
261 case AV_CODEC_ID_MSRLE
: maxpixels
/= 16; break;
262 case AV_CODEC_ID_MSS2
: maxpixels
/= 16384; break;
263 case AV_CODEC_ID_MSZH
: maxpixels
/= 128; break;
264 case AV_CODEC_ID_MVC2
: maxpixels
/= 128; break;
265 case AV_CODEC_ID_MXPEG
: maxpixels
/= 128; break;
266 case AV_CODEC_ID_OPUS
: maxsamples
/= 16384; break;
267 case AV_CODEC_ID_PNG
: maxpixels
/= 128; break;
268 case AV_CODEC_ID_APNG
: maxpixels
/= 128; break;
269 case AV_CODEC_ID_QTRLE
: maxpixels
/= 16; break;
270 case AV_CODEC_ID_PAF_VIDEO
: maxpixels
/= 16; break;
271 case AV_CODEC_ID_PRORES
: maxpixels
/= 256; break;
272 case AV_CODEC_ID_RASC
: maxpixels
/= 16; break;
273 case AV_CODEC_ID_RTV1
: maxpixels
/= 16; break;
274 case AV_CODEC_ID_SANM
: maxpixels
/= 16; break;
275 case AV_CODEC_ID_SCPR
: maxpixels
/= 32; break;
276 case AV_CODEC_ID_SCREENPRESSO
:maxpixels
/= 64; break;
277 case AV_CODEC_ID_SIMBIOSIS_IMX
:maxpixels
/= 16384; break;
278 case AV_CODEC_ID_SPEEX
: maxsamples
/= 128; break;
279 case AV_CODEC_ID_SMACKAUDIO
: maxsamples
/= 4096; break;
280 case AV_CODEC_ID_SMACKVIDEO
: maxpixels
/= 64; break;
281 case AV_CODEC_ID_SNOW
: maxpixels
/= 128; break;
282 case AV_CODEC_ID_TARGA
: maxpixels
/= 128; break;
283 case AV_CODEC_ID_TAK
: maxsamples
/= 1024; break;
284 case AV_CODEC_ID_TGV
: maxpixels
/= 32; break;
285 case AV_CODEC_ID_THEORA
: maxpixels
/= 16384; break;
286 case AV_CODEC_ID_TQI
: maxpixels
/= 1024; break;
287 case AV_CODEC_ID_TRUEMOTION2
: maxpixels
/= 1024; break;
288 case AV_CODEC_ID_TSCC
: maxpixels
/= 1024; break;
289 case AV_CODEC_ID_VC1
: maxpixels
/= 8192; break;
290 case AV_CODEC_ID_VC1IMAGE
: maxpixels
/= 8192; break;
291 case AV_CODEC_ID_VMNC
: maxpixels
/= 8192; break;
292 case AV_CODEC_ID_VP3
: maxpixels
/= 4096; break;
293 case AV_CODEC_ID_VP4
: maxpixels
/= 4096; break;
294 case AV_CODEC_ID_VP5
: maxpixels
/= 256; break;
295 case AV_CODEC_ID_VP6F
: maxpixels
/= 4096; break;
296 case AV_CODEC_ID_VP7
: maxpixels
/= 256; break;
297 case AV_CODEC_ID_VP9
: maxpixels
/= 4096; break;
298 case AV_CODEC_ID_WAVPACK
: maxsamples
/= 1024; break;
299 case AV_CODEC_ID_WCMV
: maxpixels
/= 1024; break;
300 case AV_CODEC_ID_WMV3IMAGE
: maxpixels
/= 8192; break;
301 case AV_CODEC_ID_WMV2
: maxpixels
/= 1024; break;
302 case AV_CODEC_ID_WMV3
: maxpixels
/= 1024; break;
303 case AV_CODEC_ID_WS_VQA
: maxpixels
/= 16384; break;
304 case AV_CODEC_ID_WMALOSSLESS
: maxsamples
/= 1024; break;
305 case AV_CODEC_ID_WMAPRO
: maxsamples
/= 16384; break;
306 case AV_CODEC_ID_YLC
: maxpixels
/= 1024; break;
307 case AV_CODEC_ID_ZEROCODEC
: maxpixels
/= 128; break;
310 maxsamples_per_frame
= FFMIN(maxsamples_per_frame
, maxsamples
);
311 maxpixels_per_frame
= FFMIN(maxpixels_per_frame
, maxpixels
);
313 AVCodecContext
* ctx
= avcodec_alloc_context3(&c
->p
);
314 AVCodecContext
* parser_avctx
= avcodec_alloc_context3(NULL
);
315 if (!ctx
|| !parser_avctx
)
316 error("Failed memory allocation");
318 if (ctx
->max_pixels
== 0 || ctx
->max_pixels
> maxpixels_per_frame
)
319 ctx
->max_pixels
= maxpixels_per_frame
; //To reduce false positive OOM and hangs
321 ctx
->max_samples
= maxsamples_per_frame
;
322 ctx
->get_buffer2
= fuzz_get_buffer2
;
328 uint64_t request_channel_layout
;
332 bytestream2_init(&gbc
, data
+ size
, 1024);
333 ctx
->width
= bytestream2_get_le32(&gbc
);
334 ctx
->height
= bytestream2_get_le32(&gbc
);
335 ctx
->bit_rate
= bytestream2_get_le64(&gbc
);
336 ctx
->bits_per_coded_sample
= bytestream2_get_le32(&gbc
);
337 // Try to initialize a parser for this codec, note, this may fail which just means we test without one
338 flags
= bytestream2_get_byte(&gbc
);
340 parser
= av_parser_init(c
->p
.id
);
342 ctx
->strict_std_compliance
= FF_COMPLIANCE_EXPERIMENTAL
;
344 ctx
->err_recognition
= AV_EF_AGGRESSIVE
| AV_EF_COMPLIANT
| AV_EF_CAREFUL
;
346 ctx
->err_recognition
|= AV_EF_EXPLODE
;
348 if ((flags
& 0x10) && c
->p
.id
!= AV_CODEC_ID_H264
)
349 ctx
->flags2
|= AV_CODEC_FLAG2_FAST
;
351 ctx
->flags2
|= AV_CODEC_FLAG2_EXPORT_MVS
;
354 av_force_cpu_flags(0);
356 extradata_size
= bytestream2_get_le32(&gbc
);
358 ctx
->sample_rate
= bytestream2_get_le32(&gbc
) & 0x7FFFFFFF;
359 ctx
->ch_layout
.nb_channels
= (unsigned)bytestream2_get_le32(&gbc
) % FF_SANE_NB_CHANNELS
;
360 ctx
->block_align
= bytestream2_get_le32(&gbc
) & 0x7FFFFFFF;
361 ctx
->codec_tag
= bytestream2_get_le32(&gbc
);
364 for (n
= 0; c
->codec_tags
[n
] != FF_CODEC_TAGS_END
; n
++);
365 ctx
->codec_tag
= c
->codec_tags
[ctx
->codec_tag
% n
];
367 keyframes
= bytestream2_get_le64(&gbc
);
368 request_channel_layout
= bytestream2_get_le64(&gbc
);
370 ctx
->idct_algo
= bytestream2_get_byte(&gbc
) % 25;
371 flushpattern
= bytestream2_get_le64(&gbc
);
372 ctx
->skip_frame
= bytestream2_get_byte(&gbc
) - 254 + AVDISCARD_ALL
;
376 switch (ctx
->codec_id
) {
377 case AV_CODEC_ID_AC3
:
378 case AV_CODEC_ID_EAC3
:
379 av_dict_set_int(&opts
, "cons_noisegen", bytestream2_get_byte(&gbc
) & 1, 0);
380 av_dict_set_int(&opts
, "heavy_compr", bytestream2_get_byte(&gbc
) & 1, 0);
381 av_dict_set_int(&opts
, "target_level", (int)(bytestream2_get_byte(&gbc
) % 32) - 31, 0);
382 av_dict_set_int(&opts
, "dmix_mode", (int)(bytestream2_get_byte(&gbc
) % 4) - 1, 0);
387 // Keep the deprecated request_channel_layout behavior to ensure old fuzzing failures
388 // remain reproducible.
389 if (request_channel_layout
) {
390 switch (ctx
->codec_id
) {
391 case AV_CODEC_ID_AC3
:
392 case AV_CODEC_ID_EAC3
:
393 case AV_CODEC_ID_MLP
:
394 case AV_CODEC_ID_TRUEHD
:
395 case AV_CODEC_ID_DTS
:
396 if (request_channel_layout
& ~INT64_MIN
) {
397 char *downmix_layout
= av_mallocz(19);
399 error("Failed memory allocation");
400 av_strlcatf(downmix_layout
, 19, "0x%"PRIx64
, request_channel_layout
& ~INT64_MIN
);
401 av_dict_set(&opts
, "downmix", downmix_layout
, AV_DICT_DONT_STRDUP_VAL
);
403 if (ctx
->codec_id
!= AV_CODEC_ID_DTS
)
406 case AV_CODEC_ID_DOLBY_E
:
407 av_dict_set_int(&opts
, "channel_order", !!(request_channel_layout
& INT64_MIN
), 0);
412 flags64
= bytestream2_get_le64(&gbc
);
414 ctx
->debug
|= FF_DEBUG_SKIP
;
416 ctx
->debug
|= FF_DEBUG_QP
;
418 ctx
->debug
|= FF_DEBUG_MB_TYPE
;
420 if (extradata_size
< size
) {
421 ctx
->extradata
= av_mallocz(extradata_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
422 if (ctx
->extradata
) {
423 ctx
->extradata_size
= extradata_size
;
424 size
-= ctx
->extradata_size
;
425 memcpy(ctx
->extradata
, data
+ size
, ctx
->extradata_size
);
428 if (av_image_check_size(ctx
->width
, ctx
->height
, 0, ctx
))
429 ctx
->width
= ctx
->height
= 0;
432 int res
= avcodec_open2(ctx
, &c
->p
, &opts
);
434 avcodec_free_context(&ctx
);
435 av_free(parser_avctx
);
436 av_parser_close(parser
);
438 return 0; // Failure of avcodec_open2() does not imply that a issue was found
440 parser_avctx
->codec_id
= ctx
->codec_id
;
441 parser_avctx
->extradata_size
= ctx
->extradata_size
;
442 parser_avctx
->extradata
= ctx
->extradata
? av_memdup(ctx
->extradata
, ctx
->extradata_size
+ AV_INPUT_BUFFER_PADDING_SIZE
) : NULL
;
446 AVFrame
*frame
= av_frame_alloc();
447 AVPacket
*avpkt
= av_packet_alloc();
448 AVPacket
*parsepkt
= av_packet_alloc();
449 if (!frame
|| !avpkt
|| !parsepkt
)
450 error("Failed memory allocation");
452 // Read very simple container
453 while (data
< end
&& it
< maxiteration
) {
454 // Search for the TAG
455 while (data
+ sizeof(fuzz_tag
) < end
) {
456 if (data
[0] == (fuzz_tag
& 0xFF) && AV_RN64(data
) == fuzz_tag
)
460 if (data
+ sizeof(fuzz_tag
) > end
)
463 res
= av_new_packet(parsepkt
, data
- last
);
465 error("Failed memory allocation");
466 memcpy(parsepkt
->data
, last
, data
- last
);
467 parsepkt
->flags
= (keyframes
& 1) * AV_PKT_FLAG_DISCARD
+ (!!(keyframes
& 2)) * AV_PKT_FLAG_KEY
;
468 keyframes
= (keyframes
>> 2) + (keyframes
<<62);
469 data
+= sizeof(fuzz_tag
);
472 while (parsepkt
->size
> 0) {
476 int ret
= av_parser_parse2(parser
, parser_avctx
, &avpkt
->data
, &avpkt
->size
,
477 parsepkt
->data
, parsepkt
->size
,
478 parsepkt
->pts
, parsepkt
->dts
, parsepkt
->pos
);
479 if (avpkt
->data
== parsepkt
->data
) {
480 avpkt
->buf
= av_buffer_ref(parsepkt
->buf
);
482 error("Failed memory allocation");
484 if (av_packet_make_refcounted(avpkt
) < 0)
485 error("Failed memory allocation");
487 parsepkt
->data
+= ret
;
488 parsepkt
->size
-= ret
;
489 parsepkt
->pos
+= ret
;
490 avpkt
->pts
= parser
->pts
;
491 avpkt
->dts
= parser
->dts
;
492 avpkt
->pos
= parser
->pos
;
493 if ( parser
->key_frame
== 1 ||
494 (parser
->key_frame
== -1 && parser
->pict_type
== AV_PICTURE_TYPE_I
))
495 avpkt
->flags
|= AV_PKT_FLAG_KEY
;
496 avpkt
->flags
|= parsepkt
->flags
& AV_PKT_FLAG_DISCARD
;
498 av_packet_move_ref(avpkt
, parsepkt
);
501 if (!(flushpattern
& 7))
502 avcodec_flush_buffers(ctx
);
503 flushpattern
= (flushpattern
>> 3) + (flushpattern
<< 61);
505 if (ctx
->codec_type
!= AVMEDIA_TYPE_SUBTITLE
) {
506 int ret
= avcodec_send_packet(ctx
, avpkt
);
507 decode_more
= ret
>= 0;
509 ec_pixels
+= (ctx
->width
+ 32LL) * (ctx
->height
+ 32LL);
510 if (it
> 20 || ec_pixels
> 4 * ctx
->max_pixels
) {
511 ctx
->error_concealment
= 0;
512 ctx
->debug
&= ~(FF_DEBUG_SKIP
| FF_DEBUG_QP
| FF_DEBUG_MB_TYPE
);
514 if (ec_pixels
> maxpixels
)
515 goto maximums_reached
;
520 // Iterate through all data
521 while (decode_more
&& it
++ < maxiteration
) {
522 av_frame_unref(frame
);
523 int ret
= decode_handler(ctx
, frame
, &got_frame
, avpkt
);
525 ec_pixels
+= (ctx
->width
+ 32LL) * (ctx
->height
+ 32LL);
526 if (it
> 20 || ec_pixels
> 4 * ctx
->max_pixels
) {
527 ctx
->error_concealment
= 0;
528 ctx
->debug
&= ~(FF_DEBUG_SKIP
| FF_DEBUG_QP
| FF_DEBUG_MB_TYPE
);
530 if (ec_pixels
> maxpixels
)
531 goto maximums_reached
;
533 if (ctx
->codec_type
== AVMEDIA_TYPE_AUDIO
&&
534 frame
->nb_samples
== 0 && !got_frame
&&
535 (avpkt
->flags
& AV_PKT_FLAG_DISCARD
))
536 nb_samples
+= ctx
->max_samples
;
538 nb_samples
+= frame
->nb_samples
;
539 if (nb_samples
> maxsamples
)
540 goto maximums_reached
;
542 if (ret
<= 0 || ret
> avpkt
->size
)
545 if (ctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
548 decode_more
= avpkt
->size
> 0;
550 decode_more
= ret
>= 0;
552 av_packet_unref(avpkt
);
554 av_packet_unref(parsepkt
);
558 av_packet_unref(avpkt
);
560 if (ctx
->codec_type
!= AVMEDIA_TYPE_SUBTITLE
)
561 avcodec_send_packet(ctx
, NULL
);
565 av_frame_unref(frame
);
566 decode_handler(ctx
, frame
, &got_frame
, avpkt
);
568 nb_samples
+= frame
->nb_samples
;
569 if (nb_samples
> maxsamples
)
571 } while (got_frame
== 1 && it
++ < maxiteration
);
573 fprintf(stderr
, "pixels decoded: %"PRId64
", samples decoded: %"PRId64
", iterations: %d\n", ec_pixels
, nb_samples
, it
);
575 av_frame_free(&frame
);
576 avcodec_free_context(&ctx
);
577 avcodec_free_context(&parser_avctx
);
578 av_parser_close(parser
);
579 av_packet_free(&avpkt
);
580 av_packet_free(&parsepkt
);