Go to the documentation of this file.
65 static void error(
const char *err)
67 fprintf(stderr,
"%s", err);
78 error(
"Failed to find decoder");
87 if (
ret >= 0 && *got_sub_ptr)
96 *got_frame =
ret >= 0;
103 static const uint64_t
FUZZ_TAG = 0x4741542D5A5A5546ULL;
106 uint64_t maxpixels_per_frame = 4096 * 4096;
109 uint64_t maxsamples_per_frame = 256*1024*32;
112 const uint8_t *last =
data;
115 uint64_t ec_pixels = 0;
116 uint64_t nb_samples = 0;
118 int *got_picture_ptr,
121 uint64_t keyframes = 0;
122 uint64_t flushpattern = -1;
126 #ifdef FFMPEG_DECODER
127 #define DECODER_SYMBOL0(CODEC) ff_##CODEC##_decoder
128 #define DECODER_SYMBOL(CODEC) DECODER_SYMBOL0(CODEC)
129 extern AVCodec DECODER_SYMBOL(FFMPEG_DECODER);
130 codec_list[0] = &DECODER_SYMBOL(FFMPEG_DECODER);
132 #if FFMPEG_DECODER == tiff || FFMPEG_DECODER == tdsc
133 extern AVCodec DECODER_SYMBOL(mjpeg);
137 c = &DECODER_SYMBOL(FFMPEG_DECODER);
226 maxsamples_per_frame =
FFMIN(maxsamples_per_frame, maxsamples);
227 maxpixels_per_frame =
FFMIN(maxpixels_per_frame , maxpixels);
231 if (!
ctx || !parser_avctx)
232 error(
"Failed memory allocation");
234 if (
ctx->max_pixels == 0 ||
ctx->max_pixels > maxpixels_per_frame)
235 ctx->max_pixels = maxpixels_per_frame;
237 ctx->max_samples = maxsamples_per_frame;
247 ctx->width = bytestream2_get_le32(&gbc);
248 ctx->height = bytestream2_get_le32(&gbc);
250 ctx->bits_per_coded_sample = bytestream2_get_le32(&gbc);
252 flags = bytestream2_get_byte(&gbc);
270 extradata_size = bytestream2_get_le32(&gbc);
272 ctx->sample_rate = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
274 ctx->block_align = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
275 ctx->codec_tag = bytestream2_get_le32(&gbc);
281 keyframes = bytestream2_get_le64(&gbc);
282 ctx->request_channel_layout = bytestream2_get_le64(&gbc);
284 ctx->idct_algo = bytestream2_get_byte(&gbc) % 25;
285 flushpattern = bytestream2_get_le64(&gbc);
290 switch (
ctx->codec_id) {
301 flags64 = bytestream2_get_le64(&gbc);
309 if (extradata_size <
size) {
311 if (
ctx->extradata) {
312 ctx->extradata_size = extradata_size;
318 ctx->width =
ctx->height = 0;
338 if (!
frame || !avpkt || !parsepkt)
339 error(
"Failed memory allocation");
344 while (
data +
sizeof(fuzz_tag) < end) {
349 if (
data +
sizeof(fuzz_tag) > end)
354 error(
"Failed memory allocation");
355 memcpy(parsepkt->
data, last,
data - last);
357 keyframes = (keyframes >> 2) + (keyframes<<62);
358 data +=
sizeof(fuzz_tag);
361 while (parsepkt->
size > 0) {
367 parsepkt->
pts, parsepkt->
dts, parsepkt->
pos);
368 if (avpkt->
data == parsepkt->
data) {
371 error(
"Failed memory allocation");
374 error(
"Failed memory allocation");
390 if (!(flushpattern & 7))
392 flushpattern = (flushpattern >> 3) + (flushpattern << 61);
396 decode_more =
ret >= 0;
398 ec_pixels += (
ctx->width + 32LL) * (
ctx->height + 32LL);
399 if (
it > 20 || ec_pixels > 4 *
ctx->max_pixels) {
400 ctx->error_concealment = 0;
403 if (ec_pixels > maxpixels)
404 goto maximums_reached;
412 int ret = decode_handler(
ctx,
frame, &got_frame, avpkt);
414 ec_pixels += (
ctx->width + 32LL) * (
ctx->height + 32LL);
415 if (
it > 20 || ec_pixels > 4 *
ctx->max_pixels) {
416 ctx->error_concealment = 0;
419 if (ec_pixels > maxpixels)
420 goto maximums_reached;
423 frame->nb_samples == 0 && !got_frame &&
425 nb_samples +=
ctx->max_samples;
427 nb_samples +=
frame->nb_samples;
428 if (nb_samples > maxsamples)
429 goto maximums_reached;
431 if (ret <= 0 || ret > avpkt->
size)
437 decode_more = avpkt->
size > 0;
439 decode_more =
ret >= 0;
455 decode_handler(
ctx,
frame, &got_frame, avpkt);
457 nb_samples +=
frame->nb_samples;
458 if (nb_samples > maxsamples)
462 fprintf(stderr,
"pixels decoded: %"PRId64
", samples decoded: %"PRId64
", iterations: %d\n", ec_pixels, nb_samples,
it);
@ AV_CODEC_ID_TRUEMOTION2
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
void av_force_cpu_flags(int arg)
Disables cpu detection and forces the specified flags.
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
@ AV_CODEC_ID_INTERPLAY_ACM
static float sub(float src0, float src1)
#define AV_LOG_PANIC
Something went really wrong and we will crash now.
#define AV_PKT_FLAG_DISCARD
Flag is used to discard packets which are required to maintain valid decoder state but are not requir...
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
int strict_std_compliance
Allow non-standard and experimental extension.
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)
Decode a subtitle message.
const AVCodec * codec_list[]
@ AV_CODEC_ID_SCREENPRESSO
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
int key_frame
Set by parser to 1 for key frames and 0 for non-key frames.
AVCodecParserContext * av_parser_init(int codec_id)
@ AV_CODEC_ID_FFWAVESYNTH
void avsubtitle_free(AVSubtitle *sub)
Free all allocated data in the given subtitle struct.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
@ AV_CODEC_ID_DVB_SUBTITLE
int64_t bit_rate
Total stream bitrate in bit/s, 0 if not available.
static const AVCodec * AVCodecInitialize(enum AVCodecID codec_id)
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define FF_CODEC_TAGS_END
AVCodec.codec_tags termination value.
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Return decoded output data from a decoder.
@ AVDISCARD_ALL
discard all
static const uint64_t FUZZ_TAG
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
@ AV_CODEC_ID_WMALOSSLESS
@ AV_CODEC_ID_MOTIONPIXELS
#define AV_CODEC_FLAG2_FAST
Allow non spec compliant speedup tricks.
@ AV_PICTURE_TYPE_I
Intra.
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
#define AV_EF_EXPLODE
abort decoding on minor error detection
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
static void error(const char *err)
#define AV_EF_CAREFUL
consider things that violate the spec, are fast to calculate and have not been seen in the wild as er...
AVCodecID
Identify the syntax and semantics of the bitstream.
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
static int subtitle_handler(AVCodecContext *avctx, void *frame, int *got_sub_ptr, AVPacket *avpkt)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
int av_packet_make_refcounted(AVPacket *pkt)
Ensure the data described by a given packet is reference counted.
int flags
A combination of AV_PKT_FLAG values.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
Supply raw packet data as input to a decoder.
void av_log_set_level(int level)
Set the log level.
int64_t pos
Byte position of currently parsed frame in stream.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
void avcodec_flush_buffers(AVCodecContext *avctx)
Reset the internal codec state / flush internal buffers.
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static int audio_video_handler(AVCodecContext *avctx, AVFrame *frame, int *got_frame, const AVPacket *dummy)
#define AV_INPUT_BUFFER_PADDING_SIZE
const uint32_t * codec_tags
List of supported codec_tags, terminated by FF_CODEC_TAGS_END.
int debug
Flags to enable debugging.
main external API structure.
#define AV_EF_AGGRESSIVE
consider things that a sane encoder should not do as an error
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.
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.
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s it
#define AV_CODEC_FLAG2_EXPORT_MVS
Export motion vectors through frame side data.
This structure stores compressed data.
int64_t pos
byte position in stream, -1 if unknown
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define flags(name, subs,...)
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...
#define FF_SANE_NB_CHANNELS
const uint32_t maxiteration
void av_parser_close(AVCodecParserContext *s)