X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fyuv4mpegdec.c;h=146533c4cc23b0f7cd43c6a48eb4025487b47509;hb=bd96c54fe4819b3ca9a975e2083d67f4443c559b;hp=855fadbb31a3f9a25b58c5c85fbd848389f4ad80;hpb=ace96d2e693d804a0ed16aebc1b1027cfff2c527;p=ffmpeg diff --git a/libavformat/yuv4mpegdec.c b/libavformat/yuv4mpegdec.c index 855fadbb31a..146533c4cc2 100644 --- a/libavformat/yuv4mpegdec.c +++ b/libavformat/yuv4mpegdec.c @@ -26,7 +26,7 @@ #include "yuv4mpeg.h" /* Header size increased to allow room for optional flags */ -#define MAX_YUV4_HEADER 80 +#define MAX_YUV4_HEADER 96 #define MAX_FRAME_HEADER 80 static int yuv4_read_header(AVFormatContext *s) @@ -53,10 +53,14 @@ static int yuv4_read_header(AVFormatContext *s) break; } } - if (i == MAX_YUV4_HEADER) - return -1; - if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC))) - return -1; + if (i == MAX_YUV4_HEADER) { + av_log(s, AV_LOG_ERROR, "Header too large.\n"); + return AVERROR(EINVAL); + } + if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC))) { + av_log(s, AV_LOG_ERROR, "Invalid magic number for yuv4mpeg.\n"); + return AVERROR(EINVAL); + } header_end = &header[i + 1]; // Include space for (tokstart = &header[strlen(Y4M_MAGIC) + 1]; @@ -120,9 +124,7 @@ static int yuv4_read_header(AVFormatContext *s) } else if (strncmp("422", tokstart, 3) == 0) { pix_fmt = AV_PIX_FMT_YUV422P; } else if (strncmp("444alpha", tokstart, 8) == 0 ) { - av_log(s, AV_LOG_ERROR, "Cannot handle 4:4:4:4 " - "YUV4MPEG stream.\n"); - return -1; + pix_fmt = AV_PIX_FMT_YUVA444P; } else if (strncmp("444", tokstart, 3) == 0) { pix_fmt = AV_PIX_FMT_YUV444P; } else if (strncmp("mono16", tokstart, 6) == 0) { @@ -138,7 +140,7 @@ static int yuv4_read_header(AVFormatContext *s) } else { av_log(s, AV_LOG_ERROR, "YUV4MPEG stream contains an unknown " "pixel format.\n"); - return -1; + return AVERROR_INVALIDDATA; } while (tokstart < header_end && *tokstart != 0x20) tokstart++; @@ -236,7 +238,7 @@ static int yuv4_read_header(AVFormatContext *s) if (width == -1 || height == -1) { av_log(s, AV_LOG_ERROR, "YUV4MPEG has invalid header.\n"); - return -1; + return AVERROR_INVALIDDATA; } if (pix_fmt == AV_PIX_FMT_NONE) { @@ -310,7 +312,6 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; else if (ret != s->packet_size - Y4M_FRAME_MAGIC_LEN) { - av_packet_unref(pkt); return s->pb->eof_reached ? AVERROR_EOF : AVERROR(EIO); } pkt->stream_index = 0; @@ -326,6 +327,8 @@ static int yuv4_read_seek(AVFormatContext *s, int stream_index, if (flags & AVSEEK_FLAG_BACKWARD) pts = FFMAX(0, pts - 1); + if (pts < 0) + return -1; pos = pts * s->packet_size; if (avio_seek(s->pb, pos + s->internal->data_offset, SEEK_SET) < 0) @@ -333,7 +336,7 @@ static int yuv4_read_seek(AVFormatContext *s, int stream_index, return 0; } -static int yuv4_probe(AVProbeData *pd) +static int yuv4_probe(const AVProbeData *pd) { /* check file header */ if (strncmp(pd->buf, Y4M_MAGIC, sizeof(Y4M_MAGIC) - 1) == 0) @@ -342,7 +345,7 @@ static int yuv4_probe(AVProbeData *pd) return 0; } -AVInputFormat ff_yuv4mpegpipe_demuxer = { +const AVInputFormat ff_yuv4mpegpipe_demuxer = { .name = "yuv4mpegpipe", .long_name = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"), .read_probe = yuv4_probe,