X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmpjpegdec.c;h=28a24184a27900b124c60fba8be01068ac2227d8;hb=f4df5039a791a56de85c64e6b9e4448a221b5c40;hp=84130ab718d37706b52cb555c6277fda007a1a14;hpb=670fd3b0ec8f81f7cb69932715562ddcd55096ec;p=ffmpeg diff --git a/libavformat/mpjpegdec.c b/libavformat/mpjpegdec.c index 84130ab718d..28a24184a27 100644 --- a/libavformat/mpjpegdec.c +++ b/libavformat/mpjpegdec.c @@ -267,7 +267,7 @@ static char* mpjpeg_get_boundary(AVIOContext* pb) while (av_isspace(*start)) start++; - if (!av_stristart(start, "boundary=", &start)) { + if (av_stristart(start, "boundary=", &start)) { end = strchr(start, ';'); if (end) len = end - start - 1; @@ -302,8 +302,9 @@ static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) boundary = mpjpeg_get_boundary(s->pb); } if (boundary != NULL) { - mpjpeg->boundary = boundary; - mpjpeg->searchstr = av_asprintf( "\r\n%s\r\n", boundary ); + mpjpeg->boundary = av_asprintf("--%s", boundary); + mpjpeg->searchstr = av_asprintf("\r\n--%s\r\n", boundary); + av_freep(&boundary); } else { mpjpeg->boundary = av_strdup("--"); mpjpeg->searchstr = av_strdup("\r\n--"); @@ -327,22 +328,18 @@ static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); } else { /* no size was given -- we read until the next boundary or end-of-file */ - int remaining = 0, len; + int len; const int read_chunk = 2048; - av_init_packet(pkt); - pkt->data = NULL; - pkt->size = 0; - pkt->pos = avio_tell(s->pb); - /* we may need to return as much as all we've read back to the buffer */ - ffio_ensure_seekback(s->pb, read_chunk); + pkt->pos = avio_tell(s->pb); - while ((ret = av_append_packet(s->pb, pkt, read_chunk - remaining)) >= 0) { + while ((ret = ffio_ensure_seekback(s->pb, read_chunk)) >= 0 && /* we may need to return as much as all we've read back to the buffer */ + (ret = av_append_packet(s->pb, pkt, read_chunk)) >= 0) { /* scan the new data */ char *start; - len = ret + remaining; + len = ret; start = pkt->data + pkt->size - len; do { if (!memcmp(start, mpjpeg->searchstr, mpjpeg->searchstr_len)) { @@ -354,14 +351,13 @@ static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) len--; start++; } while (len >= mpjpeg->searchstr_len); - remaining = len; + avio_seek(s->pb, -len, SEEK_CUR); + pkt->size -= len; } /* error or EOF occurred */ if (ret == AVERROR_EOF) { ret = pkt->size > 0 ? pkt->size : AVERROR_EOF; - } else { - av_packet_unref(pkt); } } @@ -384,7 +380,7 @@ static const AVClass mpjpeg_demuxer_class = { .version = LIBAVUTIL_VERSION_INT, }; -AVInputFormat ff_mpjpeg_demuxer = { +const AVInputFormat ff_mpjpeg_demuxer = { .name = "mpjpeg", .long_name = NULL_IF_CONFIG_SMALL("MIME multipart JPEG"), .mime_type = "multipart/x-mixed-replace",