From 8050a7955e37ddcf9f85004955db595f8b29f611 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Wed, 26 Jun 2024 09:07:29 +0200 Subject: [PATCH] avformat/mm: fix packets pts generation and add seek support Signed-off-by: Peter Ross --- libavformat/mm.c | 31 ++++++++++------------ tests/ref/fate/alg-mm | 62 +++++++++++++++++++++---------------------- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/libavformat/mm.c b/libavformat/mm.c index 07ba6ac4f5..13717b3254 100644 --- a/libavformat/mm.c +++ b/libavformat/mm.c @@ -58,10 +58,6 @@ #define MM_PALETTE_COUNT 128 #define MM_PALETTE_SIZE (MM_PALETTE_COUNT*3) -typedef struct MmDemuxContext { - unsigned int audio_pts, video_pts; -} MmDemuxContext; - static int probe(const AVProbeData *p) { int len, type, fps, w, h; @@ -88,7 +84,6 @@ static int probe(const AVProbeData *p) static int read_header(AVFormatContext *s) { - MmDemuxContext *mm = s->priv_data; AVIOContext *pb = s->pb; AVStream *st; @@ -133,30 +128,29 @@ static int read_header(AVFormatContext *s) avpriv_set_pts_info(st, 64, 1, 8000); /* 8000 hz */ } - mm->audio_pts = 0; - mm->video_pts = 0; return 0; } static int read_packet(AVFormatContext *s, AVPacket *pkt) { - MmDemuxContext *mm = s->priv_data; AVIOContext *pb = s->pb; unsigned char preamble[MM_PREAMBLE_SIZE]; unsigned int type, length; + int64_t pos = avio_tell(pb); int ret; - while(1) { + while (1) { + if (avio_feof(pb)) + return AVERROR_EOF; - if (avio_read(pb, preamble, MM_PREAMBLE_SIZE) != MM_PREAMBLE_SIZE) { + if (avio_read(pb, preamble, MM_PREAMBLE_SIZE) != MM_PREAMBLE_SIZE) return AVERROR(EIO); - } type = AV_RL16(&preamble[0]); length = AV_RL16(&preamble[2]); - switch(type) { + switch (type) { case MM_TYPE_RAW : case MM_TYPE_PALETTE : case MM_TYPE_INTER : @@ -173,9 +167,12 @@ static int read_packet(AVFormatContext *s, return AVERROR(EIO); pkt->size = length + MM_PREAMBLE_SIZE; pkt->stream_index = 0; - pkt->pts = mm->video_pts; if (type!=MM_TYPE_PALETTE) - mm->video_pts++; + pkt->duration = 1; + if (type == MM_TYPE_RAW || + type == MM_TYPE_INTRA) + pkt->flags |= AV_PKT_FLAG_KEY; + pkt->pos = pos; return 0; case MM_TYPE_AUDIO : @@ -184,8 +181,8 @@ static int read_packet(AVFormatContext *s, if ((ret = av_get_packet(s->pb, pkt, length)) < 0) return ret; pkt->stream_index = 1; - pkt->pts = mm->audio_pts; - mm->audio_pts += length; + pkt->duration = length; + pkt->pos = pos; return 0; default : @@ -200,7 +197,7 @@ static int read_packet(AVFormatContext *s, const FFInputFormat ff_mm_demuxer = { .p.name = "mm", .p.long_name = NULL_IF_CONFIG_SMALL("American Laser Games MM"), - .priv_data_size = sizeof(MmDemuxContext), + .p.flags = AVFMT_GENERIC_INDEX, .read_probe = probe, .read_header = read_header, .read_packet = read_packet, diff --git a/tests/ref/fate/alg-mm b/tests/ref/fate/alg-mm index 5788012713..17ccd8e316 100644 --- a/tests/ref/fate/alg-mm +++ b/tests/ref/fate/alg-mm @@ -3,34 +3,34 @@ #codec_id 0: rawvideo #dimensions 0: 256x160 #sar 0: 0/1 -0, 0, 0, 1, 122880, 0x4ed8123f -0, 1, 1, 1, 122880, 0xc4c35304 -0, 2, 2, 1, 122880, 0xbd3015fd -0, 3, 3, 1, 122880, 0xece5dbab -0, 4, 4, 1, 122880, 0x13249f3f -0, 5, 5, 1, 122880, 0x58f75895 -0, 6, 6, 1, 122880, 0xe6570f7d -0, 7, 7, 1, 122880, 0xcce88145 -0, 8, 8, 1, 122880, 0x796f633c -0, 9, 9, 1, 122880, 0x182c3cd3 -0, 10, 10, 1, 122880, 0x04b2513b -0, 11, 11, 1, 122880, 0x6b7e2e42 -0, 12, 12, 1, 122880, 0x2fa47070 -0, 13, 13, 1, 122880, 0x7142919e -0, 14, 14, 1, 122880, 0x8995337e -0, 15, 15, 1, 122880, 0x5146ca20 -0, 16, 16, 1, 122880, 0x9aadb491 -0, 17, 17, 1, 122880, 0x2d5b0032 -0, 18, 18, 1, 122880, 0x5c7c8314 -0, 19, 19, 1, 122880, 0x2ba8253c -0, 20, 20, 1, 122880, 0xd19d504b -0, 21, 21, 1, 122880, 0x4ff15fd1 -0, 22, 22, 1, 122880, 0x76039f9f -0, 23, 23, 1, 122880, 0xcce84d35 -0, 24, 24, 1, 122880, 0x68c5797c -0, 25, 25, 1, 122880, 0xf1da4293 -0, 26, 26, 1, 122880, 0xf5f537f3 -0, 27, 27, 1, 122880, 0x8d3ffa94 -0, 28, 28, 1, 122880, 0x3ca9b69c -0, 29, 29, 1, 122880, 0x21187f6c -0, 30, 30, 1, 122880, 0xe5136e34 +0, 1, 1, 1, 122880, 0x4ed8123f +0, 2, 2, 1, 122880, 0xc4c35304 +0, 3, 3, 1, 122880, 0xbd3015fd +0, 4, 4, 1, 122880, 0xece5dbab +0, 5, 5, 1, 122880, 0x13249f3f +0, 6, 6, 1, 122880, 0x58f75895 +0, 7, 7, 1, 122880, 0xe6570f7d +0, 8, 8, 1, 122880, 0xcce88145 +0, 9, 9, 1, 122880, 0x796f633c +0, 10, 10, 1, 122880, 0x182c3cd3 +0, 11, 11, 1, 122880, 0x04b2513b +0, 12, 12, 1, 122880, 0x6b7e2e42 +0, 13, 13, 1, 122880, 0x2fa47070 +0, 14, 14, 1, 122880, 0x7142919e +0, 15, 15, 1, 122880, 0x8995337e +0, 16, 16, 1, 122880, 0x5146ca20 +0, 17, 17, 1, 122880, 0x9aadb491 +0, 18, 18, 1, 122880, 0x2d5b0032 +0, 19, 19, 1, 122880, 0x5c7c8314 +0, 20, 20, 1, 122880, 0x2ba8253c +0, 21, 21, 1, 122880, 0xd19d504b +0, 22, 22, 1, 122880, 0x4ff15fd1 +0, 23, 23, 1, 122880, 0x76039f9f +0, 24, 24, 1, 122880, 0xcce84d35 +0, 25, 25, 1, 122880, 0x68c5797c +0, 26, 26, 1, 122880, 0xf1da4293 +0, 27, 27, 1, 122880, 0xf5f537f3 +0, 28, 28, 1, 122880, 0x8d3ffa94 +0, 29, 29, 1, 122880, 0x3ca9b69c +0, 30, 30, 1, 122880, 0x21187f6c +0, 31, 31, 1, 122880, 0xe5136e34