Commit f320fb89 authored by Justin Ruggles's avatar Justin Ruggles

bethsoftvid: pass palette in side data instead of in a separate packet.

Update FATE reference to account for now non-existent palette packet.
This also fixes the FATE test if frame data is not initialized in
get_buffer(), so update comment in avconv accordingly.
parent f3a094f2
......@@ -449,7 +449,7 @@ static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
/* XXX this shouldn't be needed, but some tests break without this line
* those decoders are buggy and need to be fixed.
* the following tests fail:
* bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
* cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
*/
memset(buf->base[0], 128, ret);
......
......@@ -71,14 +71,23 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx,
uint8_t * dst;
uint8_t * frame_end;
int remaining = avctx->width; // number of bytes remaining on a line
const int wrap_to_next_line = vid->frame.linesize[0] - avctx->width;
int code;
int wrap_to_next_line;
int code, ret;
int yoffset;
if (avctx->reget_buffer(avctx, &vid->frame)) {
av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
return -1;
}
wrap_to_next_line = vid->frame.linesize[0] - avctx->width;
if (avpkt->side_data_elems > 0 &&
avpkt->side_data[0].type == AV_PKT_DATA_PALETTE) {
bytestream2_init(&vid->g, avpkt->side_data[0].data,
avpkt->side_data[0].size);
if ((ret = set_palette(vid)) < 0)
return ret;
}
bytestream2_init(&vid->g, avpkt->data, avpkt->size);
dst = vid->frame.data[0];
......@@ -86,7 +95,6 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx,
switch(block_type = bytestream2_get_byte(&vid->g)){
case PALETTE_BLOCK: {
int ret;
*data_size = 0;
if ((ret = set_palette(vid)) < 0) {
av_log(avctx, AV_LOG_ERROR, "error reading palette\n");
......
......@@ -32,6 +32,8 @@
#include "internal.h"
#include "libavcodec/bethsoftvideo.h"
#define BVID_PALETTE_SIZE 3 * 256
typedef struct BVID_DemuxContext
{
int nframes;
......@@ -43,6 +45,7 @@ typedef struct BVID_DemuxContext
/** video presentation time stamp.
* delay = 16 milliseconds * (global_delay + per_frame_delay) */
int video_pts;
uint8_t *palette;
int is_finished;
......@@ -163,6 +166,14 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt,
pkt->stream_index = 0; // use the video decoder, which was initialized as the first stream
pkt->pts = vid->video_pts;
/* if there is a new palette available, add it to packet side data */
if (vid->palette) {
uint8_t *pdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
BVID_PALETTE_SIZE);
memcpy(pdata, vid->palette, BVID_PALETTE_SIZE);
av_freep(&vid->palette);
}
vid->nframes--; // used to check if all the frames were read
return vidbuf_nbytes;
fail:
......@@ -185,14 +196,18 @@ static int vid_read_packet(AVFormatContext *s,
block_type = avio_r8(pb);
switch(block_type){
case PALETTE_BLOCK:
avio_seek(pb, -1, SEEK_CUR); // include block type
ret_value = av_get_packet(pb, pkt, 3 * 256 + 1);
if(ret_value != 3 * 256 + 1){
av_free_packet(pkt);
if (vid->palette) {
av_log(s, AV_LOG_WARNING, "discarding unused palette\n");
av_freep(&vid->palette);
}
vid->palette = av_malloc(BVID_PALETTE_SIZE);
if (!vid->palette)
return AVERROR(ENOMEM);
if (avio_read(pb, vid->palette, BVID_PALETTE_SIZE) != BVID_PALETTE_SIZE) {
av_freep(&vid->palette);
return AVERROR(EIO);
}
pkt->stream_index = 0;
return ret_value;
return vid_read_packet(s, pkt);
case FIRST_AUDIO_BLOCK:
avio_rl16(pb);
......@@ -222,6 +237,13 @@ static int vid_read_packet(AVFormatContext *s,
}
}
static int vid_read_close(AVFormatContext *s)
{
BVID_DemuxContext *vid = s->priv_data;
av_freep(&vid->palette);
return 0;
}
AVInputFormat ff_bethsoftvid_demuxer = {
.name = "bethsoftvid",
.long_name = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID format"),
......@@ -229,4 +251,5 @@ AVInputFormat ff_bethsoftvid_demuxer = {
.read_probe = vid_probe,
.read_header = vid_read_header,
.read_packet = vid_read_packet,
.read_close = vid_read_close,
};
#tb 0: 1/60
#tb 1: 1/11111
0, 0, 0, 1, 192000, 0x00000000
1, 0, 0, 740, 1480, 0x00000000
0, 1, 1, 1, 192000, 0x00000000
1, 740, 740, 740, 1480, 0x20a92bd4
0, 5, 5, 1, 192000, 0x01a6cf45
0, 4, 4, 1, 192000, 0x01a6cf45
1, 1480, 1480, 925, 1850, 0xa9e48a74
0, 10, 10, 1, 192000, 0xd07d57e9
0, 9, 9, 1, 192000, 0xd07d57e9
1, 2405, 2405, 740, 1480, 0x23ecd018
0, 14, 14, 1, 192000, 0x3cb1dff5
0, 13, 13, 1, 192000, 0x3cb1dff5
1, 3145, 3145, 740, 1480, 0x206bb915
0, 18, 18, 1, 192000, 0xd1aaa8fb
0, 17, 17, 1, 192000, 0xd1aaa8fb
1, 3885, 3885, 925, 1850, 0xb0e10e75
0, 23, 23, 1, 192000, 0x75f526cd
0, 22, 22, 1, 192000, 0x75f526cd
1, 4810, 4810, 740, 1480, 0x8d9baedd
0, 27, 27, 1, 192000, 0x0f673577
0, 26, 26, 1, 192000, 0x0f673577
1, 5550, 5550, 740, 1480, 0xb802aae1
0, 31, 31, 1, 192000, 0x897b6781
0, 30, 30, 1, 192000, 0x897b6781
1, 6290, 6290, 740, 1480, 0xecd7b5cc
0, 35, 35, 1, 192000, 0x81e6b7f7
0, 34, 34, 1, 192000, 0x81e6b7f7
1, 7030, 7030, 925, 1850, 0x16861355
0, 40, 40, 1, 192000, 0x1f45ce61
0, 39, 39, 1, 192000, 0x1f45ce61
1, 7955, 7955, 740, 1480, 0xa51690bd
0, 44, 44, 1, 192000, 0x5a0772a6
0, 43, 43, 1, 192000, 0x5a0772a6
1, 8695, 8695, 740, 1480, 0xdd0b90d1
0, 48, 48, 1, 192000, 0xf78732b3
0, 47, 47, 1, 192000, 0xf78732b3
1, 9435, 9435, 925, 1850, 0x3ce6e333
0, 53, 53, 1, 192000, 0x8427f9e5
0, 52, 52, 1, 192000, 0x8427f9e5
1, 10360, 10360, 740, 1480, 0xf8ce8ea3
0, 57, 57, 1, 192000, 0x40473f11
0, 56, 56, 1, 192000, 0x40473f11
1, 11100, 11100, 740, 1480, 0xda4597af
0, 61, 61, 1, 192000, 0x173ceebe
0, 60, 60, 1, 192000, 0x173ceebe
1, 11840, 11840, 740, 1480, 0x918f7cb3
0, 65, 65, 1, 192000, 0x136b9516
0, 64, 64, 1, 192000, 0x136b9516
1, 12580, 12580, 925, 1850, 0xca6edb15
0, 70, 70, 1, 192000, 0x138d11ae
0, 69, 69, 1, 192000, 0x138d11ae
1, 13505, 13505, 740, 1480, 0xba279597
0, 74, 74, 1, 192000, 0x063dbff3
0, 73, 73, 1, 192000, 0x063dbff3
1, 14245, 14245, 740, 1480, 0xc5a38a9e
0, 78, 78, 1, 192000, 0x5280852f
0, 77, 77, 1, 192000, 0x5280852f
1, 14985, 14985, 925, 1850, 0x8147eef5
0, 83, 83, 1, 192000, 0x99943a8f
0, 82, 82, 1, 192000, 0x99943a8f
1, 15910, 15910, 740, 1480, 0xce2c7cb5
0, 87, 87, 1, 192000, 0x0330a728
0, 86, 86, 1, 192000, 0x0330a728
1, 16650, 16650, 740, 1480, 0x4282819f
0, 91, 91, 1, 192000, 0x5d35467d
0, 90, 90, 1, 192000, 0x5d35467d
1, 17390, 17390, 740, 1480, 0xbdbb8da6
0, 95, 95, 1, 192000, 0xfd436343
0, 94, 94, 1, 192000, 0xfd436343
1, 18130, 18130, 925, 1850, 0xdbbeea10
0, 100, 100, 1, 192000, 0xc323fcfe
0, 99, 99, 1, 192000, 0xc323fcfe
1, 19055, 19055, 740, 1480, 0xbe6a77c2
0, 104, 104, 1, 192000, 0x2a1530a0
0, 103, 103, 1, 192000, 0x2a1530a0
1, 19795, 19795, 740, 1480, 0xa85c75b2
0, 108, 108, 1, 192000, 0xbd43bb60
0, 107, 107, 1, 192000, 0xbd43bb60
1, 20535, 20535, 925, 1850, 0xa45bde21
0, 113, 113, 1, 192000, 0xa47f5eab
0, 112, 112, 1, 192000, 0xa47f5eab
1, 21460, 21460, 740, 1480, 0x84aa7895
0, 117, 117, 1, 192000, 0xff17f5f7
0, 116, 116, 1, 192000, 0xff17f5f7
1, 22200, 22200, 740, 1480, 0x147f7d9f
0, 121, 121, 1, 192000, 0xb4140b55
0, 120, 120, 1, 192000, 0xb4140b55
1, 22940, 22940, 740, 1480, 0xc8e77b85
0, 125, 125, 1, 192000, 0xb8782cc4
0, 124, 124, 1, 192000, 0xb8782cc4
1, 23680, 23680, 925, 1850, 0x10d4d81b
0, 130, 130, 1, 192000, 0x92975b8b
0, 129, 129, 1, 192000, 0x92975b8b
1, 24605, 24605, 740, 1480, 0xb4ae8bb1
0, 134, 134, 1, 192000, 0xf42a64d6
0, 133, 133, 1, 192000, 0xf42a64d6
1, 25345, 25345, 740, 1480, 0x3ef782a5
0, 138, 138, 1, 192000, 0x2cc7077d
0, 137, 137, 1, 192000, 0x2cc7077d
1, 26085, 26085, 925, 1850, 0xdeebda14
0, 143, 143, 1, 192000, 0x00080cc8
0, 142, 142, 1, 192000, 0x00080cc8
1, 27010, 27010, 740, 1480, 0x4c7e7bbb
0, 147, 147, 1, 192000, 0x584b48f3
0, 146, 146, 1, 192000, 0x584b48f3
1, 27750, 27750, 740, 1480, 0x0e0e9198
0, 151, 151, 1, 192000, 0xd68f57da
0, 150, 150, 1, 192000, 0xd68f57da
1, 28490, 28490, 740, 1480, 0x5c1f819f
0, 155, 155, 1, 192000, 0x60158422
0, 154, 154, 1, 192000, 0x60158422
1, 29230, 29230, 925, 1850, 0x0e4cf6ff
0, 160, 160, 1, 192000, 0xd7fb89e6
0, 159, 159, 1, 192000, 0xd7fb89e6
1, 30155, 30155, 740, 1480, 0x374388a7
0, 164, 164, 1, 192000, 0x97f1c76a
0, 163, 163, 1, 192000, 0x97f1c76a
1, 30895, 30895, 740, 1480, 0xed729389
0, 168, 168, 1, 192000, 0x46c4bb9e
0, 167, 167, 1, 192000, 0x46c4bb9e
1, 31635, 31635, 925, 1850, 0xe0f1e43f
0, 173, 173, 1, 192000, 0xd32f9b66
0, 172, 172, 1, 192000, 0xd32f9b66
1, 32560, 32560, 740, 1480, 0x3b27839a
0, 177, 177, 1, 192000, 0x74f43886
0, 176, 176, 1, 192000, 0x74f43886
1, 33300, 33300, 740, 1480, 0xe6287e94
0, 181, 181, 1, 192000, 0x3c4e47df
0, 180, 180, 1, 192000, 0x3c4e47df
1, 34040, 34040, 740, 1480, 0x7e0d84b5
0, 185, 185, 1, 192000, 0xb5ac0a58
0, 184, 184, 1, 192000, 0xb5ac0a58
1, 34780, 34780, 925, 1850, 0xf08bebf7
0, 190, 190, 1, 192000, 0xcc572b31
0, 189, 189, 1, 192000, 0xcc572b31
1, 35705, 35705, 740, 1480, 0x94cf73a0
0, 194, 194, 1, 192000, 0xb1739d26
0, 193, 193, 1, 192000, 0xb1739d26
1, 36445, 36445, 740, 1480, 0xfef384ae
0, 198, 198, 1, 192000, 0x73da5473
0, 197, 197, 1, 192000, 0x73da5473
1, 37185, 37185, 925, 1850, 0x3b93e0f7
0, 203, 203, 1, 192000, 0x5f79f5bc
0, 202, 202, 1, 192000, 0x5f79f5bc
1, 38110, 38110, 740, 1480, 0x28d27bae
0, 207, 207, 1, 192000, 0x0affc0a0
0, 206, 206, 1, 192000, 0x0affc0a0
1, 38850, 38850, 740, 1480, 0x94d57da5
0, 211, 211, 1, 192000, 0x2b4d5c1c
0, 210, 210, 1, 192000, 0x2b4d5c1c
1, 39590, 39590, 740, 1480, 0xc9327db5
0, 215, 215, 1, 192000, 0x309b41bc
0, 214, 214, 1, 192000, 0x309b41bc
1, 40330, 40330, 925, 1850, 0xe781f604
0, 220, 220, 1, 192000, 0xd42b6424
0, 219, 219, 1, 192000, 0xd42b6424
1, 41255, 41255, 740, 1480, 0x752f8c5b
0, 224, 224, 1, 192000, 0x4795c948
0, 223, 223, 1, 192000, 0x4795c948
1, 41995, 41995, 740, 1480, 0x30068032
0, 228, 228, 1, 192000, 0xbc1a3a8b
0, 227, 227, 1, 192000, 0xbc1a3a8b
1, 42735, 42735, 925, 1850, 0x7895023e
0, 233, 233, 1, 192000, 0x16529c5b
0, 232, 232, 1, 192000, 0x16529c5b
1, 43660, 43660, 740, 1480, 0xa1e0a6e1
0, 237, 237, 1, 192000, 0x6b1b31ba
0, 236, 236, 1, 192000, 0x6b1b31ba
1, 44400, 44400, 740, 1480, 0x6af4b500
0, 241, 241, 1, 192000, 0x569182ce
0, 240, 240, 1, 192000, 0x569182ce
1, 45140, 45140, 740, 1480, 0xc26ea4c7
0, 245, 245, 1, 192000, 0xe6ea9866
0, 244, 244, 1, 192000, 0xe6ea9866
1, 45880, 45880, 925, 1850, 0x16a72419
0, 250, 250, 1, 192000, 0x102c6076
0, 249, 249, 1, 192000, 0x102c6076
1, 46805, 46805, 740, 1480, 0x1794aacc
0, 254, 254, 1, 192000, 0xb29f527a
0, 253, 253, 1, 192000, 0xb29f527a
1, 47545, 47545, 740, 1480, 0x2ecad8d0
0, 258, 258, 1, 192000, 0x040b4eee
0, 257, 257, 1, 192000, 0x040b4eee
1, 48285, 48285, 925, 1850, 0x2e645e07
0, 263, 263, 1, 192000, 0x92574f4a
0, 262, 262, 1, 192000, 0x92574f4a
1, 49210, 49210, 740, 1480, 0x1c54dfe7
0, 267, 267, 1, 192000, 0x1e8acdce
0, 266, 266, 1, 192000, 0x1e8acdce
1, 49950, 49950, 740, 1480, 0xbd35feec
0, 271, 271, 1, 192000, 0x1becf516
0, 270, 270, 1, 192000, 0x1becf516
1, 50690, 50690, 740, 1480, 0x419403d6
0, 275, 275, 1, 192000, 0xb62e9776
0, 274, 274, 1, 192000, 0xb62e9776
1, 51430, 51430, 925, 1850, 0x78699d2a
0, 280, 280, 1, 192000, 0xed37a08e
0, 279, 279, 1, 192000, 0xed37a08e
1, 52355, 52355, 740, 1480, 0x74ec68e0
0, 284, 284, 1, 192000, 0xc0719912
0, 283, 283, 1, 192000, 0xc0719912
1, 53095, 53095, 740, 1480, 0x76af64d9
0, 288, 288, 1, 192000, 0x24cf7a7e
0, 287, 287, 1, 192000, 0x24cf7a7e
1, 53835, 53835, 925, 1850, 0x5a303d1a
0, 293, 293, 1, 192000, 0x0307f62f
0, 292, 292, 1, 192000, 0x0307f62f
1, 54760, 54760, 537, 1074, 0x142ce7ba
0, 297, 297, 1, 192000, 0x79b7417b
0, 296, 296, 1, 192000, 0x79b7417b
1, 55297, 55297, 925, 1850, 0x7ff682f7
1, 56222, 56222, 740, 1480, 0xc33867e6
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment