Originally committed as revision 8664 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -51,7 +51,7 @@ static void set_palette(AVFrame * frame, uint8_t * palette_buffer) | |||
| { | |||
| uint32_t * palette = (uint32_t *)frame->data[1]; | |||
| int a; | |||
| for(a = 0; a < VID_PALETTE_NUMCOLORS; a++) | |||
| for(a = 0; a < 256; a++) | |||
| { | |||
| palette[a] = AV_RB24(&palette_buffer[a * 3]) * 4; // multiply all colors by 4 | |||
| } | |||
| @@ -84,7 +84,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| switch(block_type = *buf++) | |||
| { | |||
| case PALETTE_BLOCK: set_palette(&vid->frame, buf); return 0; | |||
| case VIDEO_YOFFSET_DIFFERENCE_FRAME_BLOCK: | |||
| case VIDEO_YOFF_P_FRAME: | |||
| yoffset = bytestream_get_le16(&buf); | |||
| if(yoffset >= avctx->height) { return -1; } | |||
| destination += vid->frame.linesize[0] * yoffset; | |||
| @@ -99,7 +99,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| while(length > line_remaining) | |||
| { | |||
| if(rle_num_bytes < 0x80) { bytestream_get_buffer(&buf, destination, line_remaining); } | |||
| else if(block_type == VIDEO_FULL_FRAME_BLOCK) { memset(destination, buf[0], line_remaining); } | |||
| else if(block_type == VIDEO_I_FRAME) { memset(destination, buf[0], line_remaining); } | |||
| length -= line_remaining; // decrement the number of bytes to be copied | |||
| destination += line_remaining + wrap_to_next_line; // skip over extra bytes at end of frame | |||
| line_remaining = avctx->width; | |||
| @@ -108,7 +108,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| // copy any remaining bytes after / if line overflows | |||
| if(rle_num_bytes < 0x80) { bytestream_get_buffer(&buf, destination, length); } | |||
| else if(block_type == VIDEO_FULL_FRAME_BLOCK) { memset(destination, *buf++, length); } | |||
| else if(block_type == VIDEO_I_FRAME) { memset(destination, *buf++, length); } | |||
| line_remaining -= length; | |||
| destination += length; | |||
| } | |||
| @@ -1,12 +1,10 @@ | |||
| #define VID_PALETTE_NUMCOLORS 256 | |||
| enum BethsoftVidBlockType | |||
| { | |||
| PALETTE_BLOCK = 0x02, | |||
| FIRST_AUDIO_BLOCK = 0x7c, | |||
| AUDIO_BLOCK = 0x7d, | |||
| VIDEO_FULL_FRAME_BLOCK = 0x03, | |||
| VIDEO_DIFFERENCE_FRAME_BLOCK = 0x01, | |||
| VIDEO_YOFFSET_DIFFERENCE_FRAME_BLOCK = 0x04, | |||
| FINISHED_BLOCK = 0x14, | |||
| VIDEO_I_FRAME = 0x03, | |||
| VIDEO_P_FRAME = 0x01, | |||
| VIDEO_YOFF_P_FRAME = 0x04, | |||
| EOF_BLOCK = 0x14, | |||
| }; | |||
| @@ -119,7 +119,7 @@ static int read_frame(BVID_DemuxContext *vid, ByteIOContext *pb, AVPacket *pkt, | |||
| vid->video_pts += vid->bethsoft_global_delay + get_le16(pb); | |||
| // set the y offset if it exists (decoder header data should be in data section) | |||
| if(block_type == VIDEO_YOFFSET_DIFFERENCE_FRAME_BLOCK){ | |||
| if(block_type == VIDEO_YOFF_P_FRAME){ | |||
| if(get_buffer(pb, &vidbuf_start[vidbuf_nbytes], 2) != 2) | |||
| goto fail; | |||
| vidbuf_nbytes += 2; | |||
| @@ -134,7 +134,7 @@ static int read_frame(BVID_DemuxContext *vid, ByteIOContext *pb, AVPacket *pkt, | |||
| vidbuf_start[vidbuf_nbytes++] = rle_num_bytes; | |||
| if(rle_num_bytes > 0x80){ // rle sequence | |||
| if(block_type == VIDEO_FULL_FRAME_BLOCK) | |||
| if(block_type == VIDEO_I_FRAME) | |||
| vidbuf_start[vidbuf_nbytes++] = get_byte(pb); | |||
| bytes_copied += rle_num_bytes - 0x80; | |||
| } else if(rle_num_bytes){ // plain sequence | |||
| @@ -186,8 +186,8 @@ static int vid_read_packet(AVFormatContext *s, | |||
| switch(block_type){ | |||
| case PALETTE_BLOCK: | |||
| url_fseek(pb, -1, SEEK_CUR); // include block type | |||
| ret_value = av_get_packet(pb, pkt, 3 * VID_PALETTE_NUMCOLORS + 1); | |||
| if(ret_value != 3 * VID_PALETTE_NUMCOLORS + 1){ | |||
| ret_value = av_get_packet(pb, pkt, 3 * 256 + 1); | |||
| if(ret_value != 3 * 256 + 1){ | |||
| av_free_packet(pkt); | |||
| return AVERROR_IO; | |||
| } | |||
| @@ -205,13 +205,13 @@ static int vid_read_packet(AVFormatContext *s, | |||
| pkt->stream_index = 1; | |||
| return (ret_value != audio_length ? AVERROR_IO : ret_value); | |||
| case VIDEO_DIFFERENCE_FRAME_BLOCK: | |||
| case VIDEO_YOFFSET_DIFFERENCE_FRAME_BLOCK: | |||
| case VIDEO_FULL_FRAME_BLOCK: | |||
| case VIDEO_P_FRAME: | |||
| case VIDEO_YOFF_P_FRAME: | |||
| case VIDEO_I_FRAME: | |||
| return read_frame(vid, pb, pkt, block_type, s, | |||
| s->streams[0]->codec->width * s->streams[0]->codec->height); | |||
| case FINISHED_BLOCK: | |||
| case EOF_BLOCK: | |||
| if(vid->nframes != 0) | |||
| av_log(s, AV_LOG_VERBOSE, "reached terminating character but not all frames read.\n"); | |||
| vid->is_finished = 1; | |||