bethsoftvid: synchronize video timestamps with audio sample rate

According to unofficial documentation, the video rate is locked to the audio
sample rate. This results in proper synchronization of audio and video
timestamps from the demuxer. This only works if the first audio packet occurs
before the first video packet or the audio sample rate is the default rate of
11111 Hz, both of which are true for all samples in our archive.
pull/3/merge
Justin Ruggles 13 years ago
parent 773ff823da
commit c9fdf3241a
  1. 47
      libavformat/bethsoftvid.c
  2. 141
      tests/ref/fate/bethsoft-vid

@ -40,6 +40,8 @@ typedef struct BVID_DemuxContext
{ {
int nframes; int nframes;
int sample_rate; /**< audio sample rate */ int sample_rate; /**< audio sample rate */
int width; /**< video width */
int height; /**< video height */
/** delay value between frames, added to individual frame delay. /** delay value between frames, added to individual frame delay.
* custom units, which will be added to other custom units (~=16ms according * custom units, which will be added to other custom units (~=16ms according
* to free, unofficial documentation) */ * to free, unofficial documentation) */
@ -65,7 +67,6 @@ static int vid_read_header(AVFormatContext *s)
{ {
BVID_DemuxContext *vid = s->priv_data; BVID_DemuxContext *vid = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
AVStream *stream;
/* load main header. Contents: /* load main header. Contents:
* bytes: 'V' 'I' 'D' * bytes: 'V' 'I' 'D'
@ -73,23 +74,15 @@ static int vid_read_header(AVFormatContext *s)
*/ */
avio_skip(pb, 5); avio_skip(pb, 5);
vid->nframes = avio_rl16(pb); vid->nframes = avio_rl16(pb);
vid->width = avio_rl16(pb);
stream = avformat_new_stream(s, NULL); vid->height = avio_rl16(pb);
if (!stream)
return AVERROR(ENOMEM);
vid->video_index = stream->index;
stream->start_time = 0;
avpriv_set_pts_info(stream, 32, 1, 60); // 16 ms increments, i.e. 60 fps
stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
stream->codec->codec_id = CODEC_ID_BETHSOFTVID;
stream->codec->width = avio_rl16(pb);
stream->codec->height = avio_rl16(pb);
stream->codec->pix_fmt = PIX_FMT_PAL8;
vid->bethsoft_global_delay = avio_rl16(pb); vid->bethsoft_global_delay = avio_rl16(pb);
avio_rl16(pb); avio_rl16(pb);
// wait until the first audio packet to create the audio stream // wait until the first packet to create each stream
vid->video_index = -1;
vid->audio_index = -1; vid->audio_index = -1;
vid->sample_rate = DEFAULT_SAMPLE_RATE;
s->ctx_flags |= AVFMTCTX_NOHEADER; s->ctx_flags |= AVFMTCTX_NOHEADER;
return 0; return 0;
@ -97,15 +90,34 @@ static int vid_read_header(AVFormatContext *s)
#define BUFFER_PADDING_SIZE 1000 #define BUFFER_PADDING_SIZE 1000
static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
uint8_t block_type, AVFormatContext *s, int npixels) uint8_t block_type, AVFormatContext *s)
{ {
uint8_t * vidbuf_start = NULL; uint8_t * vidbuf_start = NULL;
int vidbuf_nbytes = 0; int vidbuf_nbytes = 0;
int code; int code;
int bytes_copied = 0; int bytes_copied = 0;
int position, duration; int position, duration, npixels;
unsigned int vidbuf_capacity; unsigned int vidbuf_capacity;
int ret = 0; int ret = 0;
AVStream *st;
if (vid->video_index < 0) {
st = avformat_new_stream(s, NULL);
if (!st)
return AVERROR(ENOMEM);
vid->video_index = st->index;
if (vid->audio_index < 0) {
av_log_ask_for_sample(s, "No audio packet before first video "
"packet. Using default video time base.\n");
}
avpriv_set_pts_info(st, 64, 185, vid->sample_rate);
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
st->codec->codec_id = CODEC_ID_BETHSOFTVID;
st->codec->width = vid->width;
st->codec->height = vid->height;
}
st = s->streams[vid->video_index];
npixels = st->codec->width * st->codec->height;
vidbuf_start = av_malloc(vidbuf_capacity = BUFFER_PADDING_SIZE); vidbuf_start = av_malloc(vidbuf_capacity = BUFFER_PADDING_SIZE);
if(!vidbuf_start) if(!vidbuf_start)
@ -248,8 +260,7 @@ static int vid_read_packet(AVFormatContext *s,
case VIDEO_P_FRAME: case VIDEO_P_FRAME:
case VIDEO_YOFF_P_FRAME: case VIDEO_YOFF_P_FRAME:
case VIDEO_I_FRAME: case VIDEO_I_FRAME:
return read_frame(vid, pb, pkt, block_type, s, return read_frame(vid, pb, pkt, block_type, s);
s->streams[0]->codec->width * s->streams[0]->codec->height);
case EOF_BLOCK: case EOF_BLOCK:
if(vid->nframes != 0) if(vid->nframes != 0)

@ -1,143 +1,144 @@
#tb 0: 1/60 #tb 0: 12/553
#tb 1: 1/11111 #tb 1: 1/11111
0, 0, 0, 1, 192000, 0x00000000 0, 0, 0, 1, 192000, 0x00000000
1, 0, 0, 740, 1480, 0x00000000 1, 0, 0, 740, 1480, 0x00000000
0, 3, 3, 1, 192000, 0x01a6cf45
1, 740, 740, 740, 1480, 0x20a92bd4 1, 740, 740, 740, 1480, 0x20a92bd4
0, 4, 4, 1, 192000, 0x01a6cf45 0, 6, 6, 1, 192000, 0xd07d57e9
1, 1480, 1480, 925, 1850, 0xa9e48a74 1, 1480, 1480, 925, 1850, 0xa9e48a74
0, 8, 8, 1, 192000, 0xd07d57e9
1, 2405, 2405, 740, 1480, 0x23ecd018 1, 2405, 2405, 740, 1480, 0x23ecd018
0, 13, 13, 1, 192000, 0x3cb1dff5 0, 10, 10, 1, 192000, 0x3cb1dff5
0, 13, 13, 1, 192000, 0xd1aaa8fb
1, 3145, 3145, 740, 1480, 0x206bb915 1, 3145, 3145, 740, 1480, 0x206bb915
0, 17, 17, 1, 192000, 0xd1aaa8fb 0, 16, 16, 1, 192000, 0x75f526cd
1, 3885, 3885, 925, 1850, 0xb0e10e75 1, 3885, 3885, 925, 1850, 0xb0e10e75
0, 21, 21, 1, 192000, 0x75f526cd
1, 4810, 4810, 740, 1480, 0x8d9baedd 1, 4810, 4810, 740, 1480, 0x8d9baedd
0, 26, 26, 1, 192000, 0x0f673577 0, 20, 20, 1, 192000, 0x0f673577
0, 23, 23, 1, 192000, 0x897b6781
1, 5550, 5550, 740, 1480, 0xb802aae1 1, 5550, 5550, 740, 1480, 0xb802aae1
0, 30, 30, 1, 192000, 0x897b6781 0, 26, 26, 1, 192000, 0x81e6b7f7
1, 6290, 6290, 740, 1480, 0xecd7b5cc 1, 6290, 6290, 740, 1480, 0xecd7b5cc
0, 34, 34, 1, 192000, 0x81e6b7f7 0, 29, 29, 1, 192000, 0x1f45ce61
1, 7030, 7030, 925, 1850, 0x16861355 1, 7030, 7030, 925, 1850, 0x16861355
0, 38, 38, 1, 192000, 0x1f45ce61
1, 7955, 7955, 740, 1480, 0xa51690bd 1, 7955, 7955, 740, 1480, 0xa51690bd
0, 43, 43, 1, 192000, 0x5a0772a6 0, 33, 33, 1, 192000, 0x5a0772a6
0, 36, 36, 1, 192000, 0xf78732b3
1, 8695, 8695, 740, 1480, 0xdd0b90d1 1, 8695, 8695, 740, 1480, 0xdd0b90d1
0, 47, 47, 1, 192000, 0xf78732b3 0, 39, 39, 1, 192000, 0x8427f9e5
1, 9435, 9435, 925, 1850, 0x3ce6e333 1, 9435, 9435, 925, 1850, 0x3ce6e333
0, 51, 51, 1, 192000, 0x8427f9e5
1, 10360, 10360, 740, 1480, 0xf8ce8ea3 1, 10360, 10360, 740, 1480, 0xf8ce8ea3
0, 56, 56, 1, 192000, 0x40473f11 0, 43, 43, 1, 192000, 0x40473f11
0, 46, 46, 1, 192000, 0x173ceebe
1, 11100, 11100, 740, 1480, 0xda4597af 1, 11100, 11100, 740, 1480, 0xda4597af
0, 60, 60, 1, 192000, 0x173ceebe 0, 49, 49, 1, 192000, 0x136b9516
1, 11840, 11840, 740, 1480, 0x918f7cb3 1, 11840, 11840, 740, 1480, 0x918f7cb3
0, 64, 64, 1, 192000, 0x136b9516 0, 52, 52, 1, 192000, 0x138d11ae
1, 12580, 12580, 925, 1850, 0xca6edb15 1, 12580, 12580, 925, 1850, 0xca6edb15
0, 68, 68, 1, 192000, 0x138d11ae 0, 56, 56, 1, 192000, 0x063dbff3
1, 13505, 13505, 740, 1480, 0xba279597 1, 13505, 13505, 740, 1480, 0xba279597
0, 73, 73, 1, 192000, 0x063dbff3 0, 59, 59, 1, 192000, 0x5280852f
1, 14245, 14245, 740, 1480, 0xc5a38a9e 1, 14245, 14245, 740, 1480, 0xc5a38a9e
0, 77, 77, 1, 192000, 0x5280852f 0, 62, 62, 1, 192000, 0x99943a8f
1, 14985, 14985, 925, 1850, 0x8147eef5 1, 14985, 14985, 925, 1850, 0x8147eef5
0, 81, 81, 1, 192000, 0x99943a8f
1, 15910, 15910, 740, 1480, 0xce2c7cb5 1, 15910, 15910, 740, 1480, 0xce2c7cb5
0, 86, 86, 1, 192000, 0x0330a728 0, 66, 66, 1, 192000, 0x0330a728
0, 69, 69, 1, 192000, 0x5d35467d
1, 16650, 16650, 740, 1480, 0x4282819f 1, 16650, 16650, 740, 1480, 0x4282819f
0, 90, 90, 1, 192000, 0x5d35467d 0, 72, 72, 1, 192000, 0xfd436343
1, 17390, 17390, 740, 1480, 0xbdbb8da6 1, 17390, 17390, 740, 1480, 0xbdbb8da6
0, 94, 94, 1, 192000, 0xfd436343 0, 75, 75, 1, 192000, 0xc323fcfe
1, 18130, 18130, 925, 1850, 0xdbbeea10 1, 18130, 18130, 925, 1850, 0xdbbeea10
0, 98, 98, 1, 192000, 0xc323fcfe 0, 79, 79, 1, 192000, 0x2a1530a0
1, 19055, 19055, 740, 1480, 0xbe6a77c2 1, 19055, 19055, 740, 1480, 0xbe6a77c2
0, 103, 103, 1, 192000, 0x2a1530a0 0, 82, 82, 1, 192000, 0xbd43bb60
1, 19795, 19795, 740, 1480, 0xa85c75b2 1, 19795, 19795, 740, 1480, 0xa85c75b2
0, 107, 107, 1, 192000, 0xbd43bb60 0, 85, 85, 1, 192000, 0xa47f5eab
1, 20535, 20535, 925, 1850, 0xa45bde21 1, 20535, 20535, 925, 1850, 0xa45bde21
0, 111, 111, 1, 192000, 0xa47f5eab 0, 89, 89, 1, 192000, 0xff17f5f7
1, 21460, 21460, 740, 1480, 0x84aa7895 1, 21460, 21460, 740, 1480, 0x84aa7895
0, 116, 116, 1, 192000, 0xff17f5f7 0, 92, 92, 1, 192000, 0xb4140b55
1, 22200, 22200, 740, 1480, 0x147f7d9f 1, 22200, 22200, 740, 1480, 0x147f7d9f
0, 120, 120, 1, 192000, 0xb4140b55 0, 95, 95, 1, 192000, 0xb8782cc4
1, 22940, 22940, 740, 1480, 0xc8e77b85 1, 22940, 22940, 740, 1480, 0xc8e77b85
0, 124, 124, 1, 192000, 0xb8782cc4 0, 98, 98, 1, 192000, 0x92975b8b
1, 23680, 23680, 925, 1850, 0x10d4d81b 1, 23680, 23680, 925, 1850, 0x10d4d81b
0, 128, 128, 1, 192000, 0x92975b8b 0, 102, 102, 1, 192000, 0xf42a64d6
1, 24605, 24605, 740, 1480, 0xb4ae8bb1 1, 24605, 24605, 740, 1480, 0xb4ae8bb1
0, 133, 133, 1, 192000, 0xf42a64d6 0, 105, 105, 1, 192000, 0x2cc7077d
1, 25345, 25345, 740, 1480, 0x3ef782a5 1, 25345, 25345, 740, 1480, 0x3ef782a5
0, 137, 137, 1, 192000, 0x2cc7077d 0, 108, 108, 1, 192000, 0x00080cc8
1, 26085, 26085, 925, 1850, 0xdeebda14 1, 26085, 26085, 925, 1850, 0xdeebda14
0, 141, 141, 1, 192000, 0x00080cc8 0, 112, 112, 1, 192000, 0x584b48f3
1, 27010, 27010, 740, 1480, 0x4c7e7bbb 1, 27010, 27010, 740, 1480, 0x4c7e7bbb
0, 146, 146, 1, 192000, 0x584b48f3 0, 115, 115, 1, 192000, 0xd68f57da
1, 27750, 27750, 740, 1480, 0x0e0e9198 1, 27750, 27750, 740, 1480, 0x0e0e9198
0, 150, 150, 1, 192000, 0xd68f57da 0, 118, 118, 1, 192000, 0x60158422
1, 28490, 28490, 740, 1480, 0x5c1f819f 1, 28490, 28490, 740, 1480, 0x5c1f819f
0, 154, 154, 1, 192000, 0x60158422 0, 121, 121, 1, 192000, 0xd7fb89e6
1, 29230, 29230, 925, 1850, 0x0e4cf6ff 1, 29230, 29230, 925, 1850, 0x0e4cf6ff
0, 158, 158, 1, 192000, 0xd7fb89e6 0, 125, 125, 1, 192000, 0x97f1c76a
1, 30155, 30155, 740, 1480, 0x374388a7 1, 30155, 30155, 740, 1480, 0x374388a7
0, 163, 163, 1, 192000, 0x97f1c76a 0, 128, 128, 1, 192000, 0x46c4bb9e
1, 30895, 30895, 740, 1480, 0xed729389 1, 30895, 30895, 740, 1480, 0xed729389
0, 167, 167, 1, 192000, 0x46c4bb9e 0, 131, 131, 1, 192000, 0xd32f9b66
1, 31635, 31635, 925, 1850, 0xe0f1e43f 1, 31635, 31635, 925, 1850, 0xe0f1e43f
0, 171, 171, 1, 192000, 0xd32f9b66 0, 135, 135, 1, 192000, 0x74f43886
1, 32560, 32560, 740, 1480, 0x3b27839a 1, 32560, 32560, 740, 1480, 0x3b27839a
0, 176, 176, 1, 192000, 0x74f43886 0, 138, 138, 1, 192000, 0x3c4e47df
1, 33300, 33300, 740, 1480, 0xe6287e94 1, 33300, 33300, 740, 1480, 0xe6287e94
0, 180, 180, 1, 192000, 0x3c4e47df 0, 141, 141, 1, 192000, 0xb5ac0a58
1, 34040, 34040, 740, 1480, 0x7e0d84b5 1, 34040, 34040, 740, 1480, 0x7e0d84b5
0, 184, 184, 1, 192000, 0xb5ac0a58 0, 144, 144, 1, 192000, 0xcc572b31
1, 34780, 34780, 925, 1850, 0xf08bebf7 1, 34780, 34780, 925, 1850, 0xf08bebf7
0, 188, 188, 1, 192000, 0xcc572b31 0, 148, 148, 1, 192000, 0xb1739d26
1, 35705, 35705, 740, 1480, 0x94cf73a0 1, 35705, 35705, 740, 1480, 0x94cf73a0
0, 193, 193, 1, 192000, 0xb1739d26 0, 151, 151, 1, 192000, 0x73da5473
1, 36445, 36445, 740, 1480, 0xfef384ae 1, 36445, 36445, 740, 1480, 0xfef384ae
0, 197, 197, 1, 192000, 0x73da5473 0, 154, 154, 1, 192000, 0x5f79f5bc
1, 37185, 37185, 925, 1850, 0x3b93e0f7 1, 37185, 37185, 925, 1850, 0x3b93e0f7
0, 201, 201, 1, 192000, 0x5f79f5bc 0, 158, 158, 1, 192000, 0x0affc0a0
1, 38110, 38110, 740, 1480, 0x28d27bae 1, 38110, 38110, 740, 1480, 0x28d27bae
0, 206, 206, 1, 192000, 0x0affc0a0 0, 161, 161, 1, 192000, 0x2b4d5c1c
1, 38850, 38850, 740, 1480, 0x94d57da5 1, 38850, 38850, 740, 1480, 0x94d57da5
0, 210, 210, 1, 192000, 0x2b4d5c1c 0, 164, 164, 1, 192000, 0x309b41bc
1, 39590, 39590, 740, 1480, 0xc9327db5 1, 39590, 39590, 740, 1480, 0xc9327db5
0, 214, 214, 1, 192000, 0x309b41bc 0, 167, 167, 1, 192000, 0xd42b6424
1, 40330, 40330, 925, 1850, 0xe781f604 1, 40330, 40330, 925, 1850, 0xe781f604
0, 218, 218, 1, 192000, 0xd42b6424 0, 171, 171, 1, 192000, 0x4795c948
1, 41255, 41255, 740, 1480, 0x752f8c5b 1, 41255, 41255, 740, 1480, 0x752f8c5b
0, 223, 223, 1, 192000, 0x4795c948 0, 174, 174, 1, 192000, 0xbc1a3a8b
1, 41995, 41995, 740, 1480, 0x30068032 1, 41995, 41995, 740, 1480, 0x30068032
0, 227, 227, 1, 192000, 0xbc1a3a8b 0, 177, 177, 1, 192000, 0x16529c5b
1, 42735, 42735, 925, 1850, 0x7895023e 1, 42735, 42735, 925, 1850, 0x7895023e
0, 231, 231, 1, 192000, 0x16529c5b 0, 181, 181, 1, 192000, 0x6b1b31ba
1, 43660, 43660, 740, 1480, 0xa1e0a6e1 1, 43660, 43660, 740, 1480, 0xa1e0a6e1
0, 236, 236, 1, 192000, 0x6b1b31ba 0, 184, 184, 1, 192000, 0x569182ce
1, 44400, 44400, 740, 1480, 0x6af4b500 1, 44400, 44400, 740, 1480, 0x6af4b500
0, 240, 240, 1, 192000, 0x569182ce 0, 187, 187, 1, 192000, 0xe6ea9866
1, 45140, 45140, 740, 1480, 0xc26ea4c7 1, 45140, 45140, 740, 1480, 0xc26ea4c7
0, 244, 244, 1, 192000, 0xe6ea9866 0, 190, 190, 1, 192000, 0x102c6076
1, 45880, 45880, 925, 1850, 0x16a72419 1, 45880, 45880, 925, 1850, 0x16a72419
0, 248, 248, 1, 192000, 0x102c6076 0, 194, 194, 1, 192000, 0xb29f527a
1, 46805, 46805, 740, 1480, 0x1794aacc 1, 46805, 46805, 740, 1480, 0x1794aacc
0, 253, 253, 1, 192000, 0xb29f527a 0, 197, 197, 1, 192000, 0x040b4eee
1, 47545, 47545, 740, 1480, 0x2ecad8d0 1, 47545, 47545, 740, 1480, 0x2ecad8d0
0, 257, 257, 1, 192000, 0x040b4eee 0, 200, 200, 1, 192000, 0x92574f4a
1, 48285, 48285, 925, 1850, 0x2e645e07 1, 48285, 48285, 925, 1850, 0x2e645e07
0, 261, 261, 1, 192000, 0x92574f4a 0, 204, 204, 1, 192000, 0x1e8acdce
1, 49210, 49210, 740, 1480, 0x1c54dfe7 1, 49210, 49210, 740, 1480, 0x1c54dfe7
0, 266, 266, 1, 192000, 0x1e8acdce 0, 207, 207, 1, 192000, 0x1becf516
1, 49950, 49950, 740, 1480, 0xbd35feec 1, 49950, 49950, 740, 1480, 0xbd35feec
0, 270, 270, 1, 192000, 0x1becf516 0, 210, 210, 1, 192000, 0xb62e9776
1, 50690, 50690, 740, 1480, 0x419403d6 1, 50690, 50690, 740, 1480, 0x419403d6
0, 274, 274, 1, 192000, 0xb62e9776 0, 213, 213, 1, 192000, 0xed37a08e
1, 51430, 51430, 925, 1850, 0x78699d2a 1, 51430, 51430, 925, 1850, 0x78699d2a
0, 278, 278, 1, 192000, 0xed37a08e 0, 217, 217, 1, 192000, 0xc0719912
1, 52355, 52355, 740, 1480, 0x74ec68e0 1, 52355, 52355, 740, 1480, 0x74ec68e0
0, 283, 283, 1, 192000, 0xc0719912 0, 220, 220, 1, 192000, 0x24cf7a7e
1, 53095, 53095, 740, 1480, 0x76af64d9 1, 53095, 53095, 740, 1480, 0x76af64d9
0, 287, 287, 1, 192000, 0x24cf7a7e 0, 223, 223, 1, 192000, 0x0307f62f
1, 53835, 53835, 925, 1850, 0x5a303d1a 1, 53835, 53835, 925, 1850, 0x5a303d1a
0, 291, 291, 1, 192000, 0x0307f62f 0, 227, 227, 1, 192000, 0x79b7417b
1, 54760, 54760, 537, 1074, 0x142ce7ba 1, 54760, 54760, 537, 1074, 0x142ce7ba
0, 296, 296, 1, 192000, 0x79b7417b
1, 55297, 55297, 925, 1850, 0x7ff682f7 1, 55297, 55297, 925, 1850, 0x7ff682f7
0, 230, 230, 1, 192000, 0x468d8db4

Loading…
Cancel
Save