avformat/mm: fix packets pts generation and add seek support

Signed-off-by: Peter Ross <pross@xvid.org>
master
Paul B Mahol 6 months ago committed by Peter Ross
parent 7902702762
commit 8050a7955e
  1. 31
      libavformat/mm.c
  2. 62
      tests/ref/fate/alg-mm

@ -58,10 +58,6 @@
#define MM_PALETTE_COUNT 128 #define MM_PALETTE_COUNT 128
#define MM_PALETTE_SIZE (MM_PALETTE_COUNT*3) #define MM_PALETTE_SIZE (MM_PALETTE_COUNT*3)
typedef struct MmDemuxContext {
unsigned int audio_pts, video_pts;
} MmDemuxContext;
static int probe(const AVProbeData *p) static int probe(const AVProbeData *p)
{ {
int len, type, fps, w, h; int len, type, fps, w, h;
@ -88,7 +84,6 @@ static int probe(const AVProbeData *p)
static int read_header(AVFormatContext *s) static int read_header(AVFormatContext *s)
{ {
MmDemuxContext *mm = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
AVStream *st; AVStream *st;
@ -133,30 +128,29 @@ static int read_header(AVFormatContext *s)
avpriv_set_pts_info(st, 64, 1, 8000); /* 8000 hz */ avpriv_set_pts_info(st, 64, 1, 8000); /* 8000 hz */
} }
mm->audio_pts = 0;
mm->video_pts = 0;
return 0; return 0;
} }
static int read_packet(AVFormatContext *s, static int read_packet(AVFormatContext *s,
AVPacket *pkt) AVPacket *pkt)
{ {
MmDemuxContext *mm = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
unsigned char preamble[MM_PREAMBLE_SIZE]; unsigned char preamble[MM_PREAMBLE_SIZE];
unsigned int type, length; unsigned int type, length;
int64_t pos = avio_tell(pb);
int ret; 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); return AVERROR(EIO);
}
type = AV_RL16(&preamble[0]); type = AV_RL16(&preamble[0]);
length = AV_RL16(&preamble[2]); length = AV_RL16(&preamble[2]);
switch(type) { switch (type) {
case MM_TYPE_RAW : case MM_TYPE_RAW :
case MM_TYPE_PALETTE : case MM_TYPE_PALETTE :
case MM_TYPE_INTER : case MM_TYPE_INTER :
@ -173,9 +167,12 @@ static int read_packet(AVFormatContext *s,
return AVERROR(EIO); return AVERROR(EIO);
pkt->size = length + MM_PREAMBLE_SIZE; pkt->size = length + MM_PREAMBLE_SIZE;
pkt->stream_index = 0; pkt->stream_index = 0;
pkt->pts = mm->video_pts;
if (type!=MM_TYPE_PALETTE) 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; return 0;
case MM_TYPE_AUDIO : case MM_TYPE_AUDIO :
@ -184,8 +181,8 @@ static int read_packet(AVFormatContext *s,
if ((ret = av_get_packet(s->pb, pkt, length)) < 0) if ((ret = av_get_packet(s->pb, pkt, length)) < 0)
return ret; return ret;
pkt->stream_index = 1; pkt->stream_index = 1;
pkt->pts = mm->audio_pts; pkt->duration = length;
mm->audio_pts += length; pkt->pos = pos;
return 0; return 0;
default : default :
@ -200,7 +197,7 @@ static int read_packet(AVFormatContext *s,
const FFInputFormat ff_mm_demuxer = { const FFInputFormat ff_mm_demuxer = {
.p.name = "mm", .p.name = "mm",
.p.long_name = NULL_IF_CONFIG_SMALL("American Laser Games 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_probe = probe,
.read_header = read_header, .read_header = read_header,
.read_packet = read_packet, .read_packet = read_packet,

@ -3,34 +3,34 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x160 #dimensions 0: 256x160
#sar 0: 0/1 #sar 0: 0/1
0, 0, 0, 1, 122880, 0x4ed8123f 0, 1, 1, 1, 122880, 0x4ed8123f
0, 1, 1, 1, 122880, 0xc4c35304 0, 2, 2, 1, 122880, 0xc4c35304
0, 2, 2, 1, 122880, 0xbd3015fd 0, 3, 3, 1, 122880, 0xbd3015fd
0, 3, 3, 1, 122880, 0xece5dbab 0, 4, 4, 1, 122880, 0xece5dbab
0, 4, 4, 1, 122880, 0x13249f3f 0, 5, 5, 1, 122880, 0x13249f3f
0, 5, 5, 1, 122880, 0x58f75895 0, 6, 6, 1, 122880, 0x58f75895
0, 6, 6, 1, 122880, 0xe6570f7d 0, 7, 7, 1, 122880, 0xe6570f7d
0, 7, 7, 1, 122880, 0xcce88145 0, 8, 8, 1, 122880, 0xcce88145
0, 8, 8, 1, 122880, 0x796f633c 0, 9, 9, 1, 122880, 0x796f633c
0, 9, 9, 1, 122880, 0x182c3cd3 0, 10, 10, 1, 122880, 0x182c3cd3
0, 10, 10, 1, 122880, 0x04b2513b 0, 11, 11, 1, 122880, 0x04b2513b
0, 11, 11, 1, 122880, 0x6b7e2e42 0, 12, 12, 1, 122880, 0x6b7e2e42
0, 12, 12, 1, 122880, 0x2fa47070 0, 13, 13, 1, 122880, 0x2fa47070
0, 13, 13, 1, 122880, 0x7142919e 0, 14, 14, 1, 122880, 0x7142919e
0, 14, 14, 1, 122880, 0x8995337e 0, 15, 15, 1, 122880, 0x8995337e
0, 15, 15, 1, 122880, 0x5146ca20 0, 16, 16, 1, 122880, 0x5146ca20
0, 16, 16, 1, 122880, 0x9aadb491 0, 17, 17, 1, 122880, 0x9aadb491
0, 17, 17, 1, 122880, 0x2d5b0032 0, 18, 18, 1, 122880, 0x2d5b0032
0, 18, 18, 1, 122880, 0x5c7c8314 0, 19, 19, 1, 122880, 0x5c7c8314
0, 19, 19, 1, 122880, 0x2ba8253c 0, 20, 20, 1, 122880, 0x2ba8253c
0, 20, 20, 1, 122880, 0xd19d504b 0, 21, 21, 1, 122880, 0xd19d504b
0, 21, 21, 1, 122880, 0x4ff15fd1 0, 22, 22, 1, 122880, 0x4ff15fd1
0, 22, 22, 1, 122880, 0x76039f9f 0, 23, 23, 1, 122880, 0x76039f9f
0, 23, 23, 1, 122880, 0xcce84d35 0, 24, 24, 1, 122880, 0xcce84d35
0, 24, 24, 1, 122880, 0x68c5797c 0, 25, 25, 1, 122880, 0x68c5797c
0, 25, 25, 1, 122880, 0xf1da4293 0, 26, 26, 1, 122880, 0xf1da4293
0, 26, 26, 1, 122880, 0xf5f537f3 0, 27, 27, 1, 122880, 0xf5f537f3
0, 27, 27, 1, 122880, 0x8d3ffa94 0, 28, 28, 1, 122880, 0x8d3ffa94
0, 28, 28, 1, 122880, 0x3ca9b69c 0, 29, 29, 1, 122880, 0x3ca9b69c
0, 29, 29, 1, 122880, 0x21187f6c 0, 30, 30, 1, 122880, 0x21187f6c
0, 30, 30, 1, 122880, 0xe5136e34 0, 31, 31, 1, 122880, 0xe5136e34

Loading…
Cancel
Save