annotate bethsoftvid.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 49c1d3b27727
children 178de7695c6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
1 /*
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
2 * Bethsoft VID format Demuxer
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
3 * Copyright (c) 2007 Nicholas Tung
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
4 *
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
6 *
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
11 *
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
16 *
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
20 */
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
21
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4201
diff changeset
23 * @file libavformat/bethsoftvid.c
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
24 * @brief Bethesda Softworks VID (.vid) file demuxer
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
25 * @author Nicholas Tung [ntung (at. ntung com] (2007-03)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
26 * @sa http://wiki.multimedia.cx/index.php?title=Bethsoft_VID
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
27 * @sa http://www.svatopluk.com/andux/docs/dfvid.html
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
28 */
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
29
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3908
diff changeset
30 #include "libavutil/intreadwrite.h"
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
31 #include "avformat.h"
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
32 #include "libavcodec/bethsoftvideo.h"
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
33
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
34 typedef struct BVID_DemuxContext
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
35 {
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
36 int nframes;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
37 /** delay value between frames, added to individual frame delay.
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
38 * custom units, which will be added to other custom units (~=16ms according
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
39 * to free, unofficial documentation) */
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
40 int bethsoft_global_delay;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
41
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
42 /** video presentation time stamp.
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
43 * delay = 16 milliseconds * (global_delay + per_frame_delay) */
1995
df6bcc29a90c code claims to use 32bit timestamp, lets make it also use that
michael
parents: 1994
diff changeset
44 int video_pts;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
45
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
46 int is_finished;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
47
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
48 } BVID_DemuxContext;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
49
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
50 static int vid_probe(AVProbeData *p)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
51 {
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
52 // little endian VID tag, file starts with "VID\0"
2001
1a3c9056982a allocate 32 extra bytes at the end of the probe buffer and remove most probe buf_size checks
michael
parents: 1999
diff changeset
53 if (AV_RL32(p->buf) != MKTAG('V', 'I', 'D', 0))
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
54 return 0;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
55
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
56 return AVPROBE_SCORE_MAX;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
57 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
58
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
59 static int vid_read_header(AVFormatContext *s,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
60 AVFormatParameters *ap)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
61 {
1994
53a26acd2cf5 remove redundant comments
michael
parents: 1993
diff changeset
62 BVID_DemuxContext *vid = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
63 ByteIOContext *pb = s->pb;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
64 AVStream *stream;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
65
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
66 /* load main header. Contents:
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
67 * bytes: 'V' 'I' 'D'
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
68 * int16s: always_512, nframes, width, height, delay, always_14
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
69 */
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
70 url_fseek(pb, 5, SEEK_CUR);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
71 vid->nframes = get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
72
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
73 stream = av_new_stream(s, 0);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
74 if (!stream)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2232
diff changeset
75 return AVERROR(ENOMEM);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
76 av_set_pts_info(stream, 32, 1, 60); // 16 ms increments, i.e. 60 fps
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 4331
diff changeset
77 stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
78 stream->codec->codec_id = CODEC_ID_BETHSOFTVID;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
79 stream->codec->width = get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
80 stream->codec->height = get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
81 stream->codec->pix_fmt = PIX_FMT_PAL8;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
82 vid->bethsoft_global_delay = get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
83 get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
84
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
85 // done with video codec, set up audio codec
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
86 stream = av_new_stream(s, 0);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
87 if (!stream)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2232
diff changeset
88 return AVERROR(ENOMEM);
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 4331
diff changeset
89 stream->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
90 stream->codec->codec_id = CODEC_ID_PCM_U8;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
91 stream->codec->channels = 1;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
92 stream->codec->sample_rate = 11025;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
93 stream->codec->bits_per_coded_sample = 8;
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
94 stream->codec->bit_rate = stream->codec->channels * stream->codec->sample_rate * stream->codec->bits_per_coded_sample;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
95
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
96 return 0;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
97 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
98
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
99 #define BUFFER_PADDING_SIZE 1000
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
100 static int read_frame(BVID_DemuxContext *vid, ByteIOContext *pb, AVPacket *pkt,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
101 uint8_t block_type, AVFormatContext *s, int npixels)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
102 {
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
103 uint8_t * vidbuf_start = NULL;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
104 int vidbuf_nbytes = 0;
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
105 int code;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
106 int bytes_copied = 0;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
107 int position;
2232
77ed2f4105b7 bethsoftvid: use correct type for size passed to av_fast_realloc()
mru
parents: 2001
diff changeset
108 unsigned int vidbuf_capacity;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
109
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
110 vidbuf_start = av_malloc(vidbuf_capacity = BUFFER_PADDING_SIZE);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
111 if(!vidbuf_start)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2232
diff changeset
112 return AVERROR(ENOMEM);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
113
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
114 // save the file position for the packet, include block type
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
115 position = url_ftell(pb) - 1;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
116
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
117 vidbuf_start[vidbuf_nbytes++] = block_type;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
118
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
119 // get the video delay (next int16), and set the presentation time
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
120 vid->video_pts += vid->bethsoft_global_delay + get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
121
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
122 // set the y offset if it exists (decoder header data should be in data section)
1996
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
123 if(block_type == VIDEO_YOFF_P_FRAME){
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
124 if(get_buffer(pb, &vidbuf_start[vidbuf_nbytes], 2) != 2)
1992
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
125 goto fail;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
126 vidbuf_nbytes += 2;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
127 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
128
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
129 do{
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
130 vidbuf_start = av_fast_realloc(vidbuf_start, &vidbuf_capacity, vidbuf_nbytes + BUFFER_PADDING_SIZE);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
131 if(!vidbuf_start)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2232
diff changeset
132 return AVERROR(ENOMEM);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
133
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
134 code = get_byte(pb);
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
135 vidbuf_start[vidbuf_nbytes++] = code;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
136
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
137 if(code >= 0x80){ // rle sequence
1996
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
138 if(block_type == VIDEO_I_FRAME)
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
139 vidbuf_start[vidbuf_nbytes++] = get_byte(pb);
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
140 } else if(code){ // plain sequence
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
141 if(get_buffer(pb, &vidbuf_start[vidbuf_nbytes], code) != code)
1992
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
142 goto fail;
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
143 vidbuf_nbytes += code;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
144 }
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
145 bytes_copied += code & 0x7F;
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
146 if(bytes_copied == npixels){ // sometimes no stop character is given, need to keep track of bytes copied
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
147 // may contain a 0 byte even if read all pixels
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
148 if(get_byte(pb))
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
149 url_fseek(pb, -1, SEEK_CUR);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
150 break;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
151 }
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
152 if(bytes_copied > npixels)
1992
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
153 goto fail;
1999
c97517791e6c s/rle_num_bytes/code/
michael
parents: 1998
diff changeset
154 } while(code);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
155
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
156 // copy data into packet
1992
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
157 if(av_new_packet(pkt, vidbuf_nbytes) < 0)
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
158 goto fail;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
159 memcpy(pkt->data, vidbuf_start, vidbuf_nbytes);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
160 av_free(vidbuf_start);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
161
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
162 pkt->pos = position;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
163 pkt->stream_index = 0; // use the video decoder, which was initialized as the first stream
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
164 pkt->pts = vid->video_pts;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
165
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
166 vid->nframes--; // used to check if all the frames were read
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
167 return vidbuf_nbytes;
1992
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
168 fail:
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
169 av_free(vidbuf_start);
c321bada49c7 memleak (seems ive missed that under the obfuscated indention)
michael
parents: 1991
diff changeset
170 return -1;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
171 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
172
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
173 static int vid_read_packet(AVFormatContext *s,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
174 AVPacket *pkt)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
175 {
1994
53a26acd2cf5 remove redundant comments
michael
parents: 1993
diff changeset
176 BVID_DemuxContext *vid = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
177 ByteIOContext *pb = s->pb;
1994
53a26acd2cf5 remove redundant comments
michael
parents: 1993
diff changeset
178 unsigned char block_type;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
179 int audio_length;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
180 int ret_value;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
181
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
182 if(vid->is_finished || url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
183 return AVERROR(EIO);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
184
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
185 block_type = get_byte(pb);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
186 switch(block_type){
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
187 case PALETTE_BLOCK:
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
188 url_fseek(pb, -1, SEEK_CUR); // include block type
1996
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
189 ret_value = av_get_packet(pb, pkt, 3 * 256 + 1);
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
190 if(ret_value != 3 * 256 + 1){
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
191 av_free_packet(pkt);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
192 return AVERROR(EIO);
1991
999e085b50eb sane indention (no more 3 statements on one line...)
michael
parents: 1989
diff changeset
193 }
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
194 pkt->stream_index = 0;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
195 return ret_value;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
196
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
197 case FIRST_AUDIO_BLOCK:
1994
53a26acd2cf5 remove redundant comments
michael
parents: 1993
diff changeset
198 get_le16(pb);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
199 // soundblaster DAC used for sample rate, as on specification page (link above)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
200 s->streams[1]->codec->sample_rate = 1000000 / (256 - get_byte(pb));
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
201 s->streams[1]->codec->bit_rate = s->streams[1]->codec->channels * s->streams[1]->codec->sample_rate * s->streams[1]->codec->bits_per_coded_sample;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
202 case AUDIO_BLOCK:
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
203 audio_length = get_le16(pb);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
204 ret_value = av_get_packet(pb, pkt, audio_length);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
205 pkt->stream_index = 1;
3278
1de87c1b6a12 Remove unnecessary parentheses from return calls.
diego
parents: 2771
diff changeset
206 return ret_value != audio_length ? AVERROR(EIO) : ret_value;
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
207
1996
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
208 case VIDEO_P_FRAME:
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
209 case VIDEO_YOFF_P_FRAME:
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
210 case VIDEO_I_FRAME:
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
211 return read_frame(vid, pb, pkt, block_type, s,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
212 s->streams[0]->codec->width * s->streams[0]->codec->height);
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
213
1996
f7a39abcff5e use shorter names for the block type enum
michael
parents: 1995
diff changeset
214 case EOF_BLOCK:
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
215 if(vid->nframes != 0)
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
216 av_log(s, AV_LOG_VERBOSE, "reached terminating character but not all frames read.\n");
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
217 vid->is_finished = 1;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
218 return AVERROR(EIO);
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
219 default:
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
220 av_log(s, AV_LOG_ERROR, "unknown block (character = %c, decimal = %d, hex = %x)!!!\n",
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
221 block_type, block_type, block_type); return -1;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
222 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
223
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
224 return 0;
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
225 }
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
226
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
227 AVInputFormat bethsoftvid_demuxer = {
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
228 "bethsoftvid",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
229 NULL_IF_CONFIG_SMALL("Bethesda Softworks VID format"),
1989
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
230 sizeof(BVID_DemuxContext),
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
231 vid_probe,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
232 vid_read_header,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
233 vid_read_packet,
2af9c2f9b44d Bethsoft VID demuxer and video decoder
diego
parents:
diff changeset
234 };