annotate idcin.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 e8614dbd9b7b
children 178de7695c6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
1 /*
3428
b0936b8a0337 cosmetics: s/Id/id/ in libavformat where Id refers to id Software.
diego
parents: 3424
diff changeset
2 * id Quake II CIN File Demuxer
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
3 * Copyright (c) 2003 The ffmpeg Project
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
15 * Lesser General Public License for more details.
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
16 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
20 */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
21
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4201
diff changeset
23 * @file libavformat/idcin.c
3428
b0936b8a0337 cosmetics: s/Id/id/ in libavformat where Id refers to id Software.
diego
parents: 3424
diff changeset
24 * id Quake II CIN file demuxer by Mike Melanson (melanson@pcisys.net)
b0936b8a0337 cosmetics: s/Id/id/ in libavformat where Id refers to id Software.
diego
parents: 3424
diff changeset
25 * For more information about the id CIN format, visit:
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
26 * http://www.csse.monash.edu.au/~timf/
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
27 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
28 * CIN is a somewhat quirky and ill-defined format. Here are some notes
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
29 * for anyone trying to understand the technical details of this format:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
30 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
31 * The format has no definite file signature. This is problematic for a
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
32 * general-purpose media player that wants to automatically detect file
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
33 * types. However, a CIN file does start with 5 32-bit numbers that
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
34 * specify audio and video parameters. This demuxer gets around the lack
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
35 * of file signature by performing sanity checks on those parameters.
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
36 * Probabalistically, this is a reasonable solution since the number of
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
37 * valid combinations of the 5 parameters is a very small subset of the
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
38 * total 160-bit number space.
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
39 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
40 * Refer to the function idcin_probe() for the precise A/V parameters
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
41 * that this demuxer allows.
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
42 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
43 * Next, each audio and video frame has a duration of 1/14 sec. If the
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
44 * audio sample rate is a multiple of the common frequency 22050 Hz it will
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
45 * divide evenly by 14. However, if the sample rate is 11025 Hz:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
46 * 11025 (samples/sec) / 14 (frames/sec) = 787.5 (samples/frame)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
47 * The way the CIN stores audio in this case is by storing 787 sample
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
48 * frames in the first audio frame and 788 sample frames in the second
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
49 * audio frame. Therefore, the total number of bytes in an audio frame
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
50 * is given as:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
51 * audio frame #0: 787 * (bytes/sample) * (# channels) bytes in frame
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
52 * audio frame #1: 788 * (bytes/sample) * (# channels) bytes in frame
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
53 * audio frame #2: 787 * (bytes/sample) * (# channels) bytes in frame
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
54 * audio frame #3: 788 * (bytes/sample) * (# channels) bytes in frame
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
55 *
3428
b0936b8a0337 cosmetics: s/Id/id/ in libavformat where Id refers to id Software.
diego
parents: 3424
diff changeset
56 * Finally, not all id CIN creation tools agree on the resolution of the
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
57 * color palette, apparently. Some creation tools specify red, green, and
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
58 * blue palette components in terms of 6-bit VGA color DAC values which
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
59 * range from 0..63. Other tools specify the RGB components as full 8-bit
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
60 * values that range from 0..255. Since there are no markers in the file to
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
61 * differentiate between the two variants, this demuxer uses the following
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
62 * heuristic:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
63 * - load the 768 palette bytes from disk
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
64 * - assume that they will need to be shifted left by 2 bits to
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
65 * transform them from 6-bit values to 8-bit values
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
66 * - scan through all 768 palette bytes
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
67 * - if any bytes exceed 63, do not shift the bytes at all before
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
68 * transmitting them to the video decoder
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
69 */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
70
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3908
diff changeset
71 #include "libavutil/intreadwrite.h"
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
72 #include "avformat.h"
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
73
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
74 #define HUFFMAN_TABLE_SIZE (64 * 1024)
3098
fdcab2321805 fix the id CIN demuxer by using the pts API correctly
melanson
parents: 2771
diff changeset
75 #define IDCIN_FPS 14
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
76
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
77 typedef struct IdcinDemuxContext {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
78 int video_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
79 int audio_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
80 int audio_chunk_size1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
81 int audio_chunk_size2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
82
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
83 /* demux state variables */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
84 int current_audio_chunk;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
85 int next_chunk_is_video;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
86 int audio_present;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
87
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
88 int64_t pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
89
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
90 AVPaletteControl palctrl;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
91 } IdcinDemuxContext;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
92
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
93 static int idcin_probe(AVProbeData *p)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
94 {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
95 unsigned int number;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
96
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
97 /*
3428
b0936b8a0337 cosmetics: s/Id/id/ in libavformat where Id refers to id Software.
diego
parents: 3424
diff changeset
98 * This is what you could call a "probabilistic" file check: id CIN
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
99 * files don't have a definite file signature. In lieu of such a marker,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
100 * perform sanity checks on the 5 32-bit header fields:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
101 * width, height: greater than 0, less than or equal to 1024
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
102 * audio sample rate: greater than or equal to 8000, less than or
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
103 * equal to 48000, or 0 for no audio
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
104 * audio sample width (bytes/sample): 0 for no audio, or 1 or 2
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
105 * audio channels: 0 for no audio, or 1 or 2
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
106 */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
107
5176
36225b62e091 Check buffer size for idcin check, otherwise false positives are too likely for
reimar
parents: 4465
diff changeset
108 /* check we have enough data to do all checks, otherwise the
36225b62e091 Check buffer size for idcin check, otherwise false positives are too likely for
reimar
parents: 4465
diff changeset
109 0-padding may cause a wrong recognition */
36225b62e091 Check buffer size for idcin check, otherwise false positives are too likely for
reimar
parents: 4465
diff changeset
110 if (p->buf_size < 20)
36225b62e091 Check buffer size for idcin check, otherwise false positives are too likely for
reimar
parents: 4465
diff changeset
111 return 0;
36225b62e091 Check buffer size for idcin check, otherwise false positives are too likely for
reimar
parents: 4465
diff changeset
112
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
113 /* check the video width */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
114 number = AV_RL32(&p->buf[0]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
115 if ((number == 0) || (number > 1024))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
116 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
117
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
118 /* check the video height */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
119 number = AV_RL32(&p->buf[4]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
120 if ((number == 0) || (number > 1024))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
121 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
122
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
123 /* check the audio sample rate */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
124 number = AV_RL32(&p->buf[8]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
125 if ((number != 0) && ((number < 8000) | (number > 48000)))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
126 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
127
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
128 /* check the audio bytes/sample */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
129 number = AV_RL32(&p->buf[12]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
130 if (number > 2)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
131 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
132
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
133 /* check the audio channels */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
134 number = AV_RL32(&p->buf[16]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
135 if (number > 2)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
136 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
137
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
138 /* return half certainly since this check is a bit sketchy */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
139 return AVPROBE_SCORE_MAX / 2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
140 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
141
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
142 static int idcin_read_header(AVFormatContext *s,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
143 AVFormatParameters *ap)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
144 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
145 ByteIOContext *pb = s->pb;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
146 IdcinDemuxContext *idcin = s->priv_data;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
147 AVStream *st;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
148 unsigned int width, height;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
149 unsigned int sample_rate, bytes_per_sample, channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
150
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
151 /* get the 5 header parameters */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
152 width = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
153 height = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
154 sample_rate = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
155 bytes_per_sample = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
156 channels = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
157
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
158 st = av_new_stream(s, 0);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
159 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2006
diff changeset
160 return AVERROR(ENOMEM);
3098
fdcab2321805 fix the id CIN demuxer by using the pts API correctly
melanson
parents: 2771
diff changeset
161 av_set_pts_info(st, 33, 1, IDCIN_FPS);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
162 idcin->video_stream_index = st->index;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5685
diff changeset
163 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
164 st->codec->codec_id = CODEC_ID_IDCIN;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
165 st->codec->codec_tag = 0; /* no fourcc */
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
166 st->codec->width = width;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
167 st->codec->height = height;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
168
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
169 /* load up the Huffman tables into extradata */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
170 st->codec->extradata_size = HUFFMAN_TABLE_SIZE;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
171 st->codec->extradata = av_malloc(HUFFMAN_TABLE_SIZE);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
172 if (get_buffer(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE) !=
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
173 HUFFMAN_TABLE_SIZE)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
174 return AVERROR(EIO);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
175 /* save a reference in order to transport the palette */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
176 st->codec->palctrl = &idcin->palctrl;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
177
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
178 /* if sample rate is 0, assume no audio */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
179 if (sample_rate) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
180 idcin->audio_present = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
181 st = av_new_stream(s, 0);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
182 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2006
diff changeset
183 return AVERROR(ENOMEM);
3098
fdcab2321805 fix the id CIN demuxer by using the pts API correctly
melanson
parents: 2771
diff changeset
184 av_set_pts_info(st, 33, 1, IDCIN_FPS);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
185 idcin->audio_stream_index = st->index;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5685
diff changeset
186 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
187 st->codec->codec_tag = 1;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
188 st->codec->channels = channels;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
189 st->codec->sample_rate = sample_rate;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3484
diff changeset
190 st->codec->bits_per_coded_sample = bytes_per_sample * 8;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
191 st->codec->bit_rate = sample_rate * bytes_per_sample * 8 * channels;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
192 st->codec->block_align = bytes_per_sample * channels;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
193 if (bytes_per_sample == 1)
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
194 st->codec->codec_id = CODEC_ID_PCM_U8;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
195 else
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
196 st->codec->codec_id = CODEC_ID_PCM_S16LE;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
197
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
198 if (sample_rate % 14 != 0) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
199 idcin->audio_chunk_size1 = (sample_rate / 14) *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
200 bytes_per_sample * channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
201 idcin->audio_chunk_size2 = (sample_rate / 14 + 1) *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
202 bytes_per_sample * channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
203 } else {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
204 idcin->audio_chunk_size1 = idcin->audio_chunk_size2 =
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
205 (sample_rate / 14) * bytes_per_sample * channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
206 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
207 idcin->current_audio_chunk = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
208 } else
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
209 idcin->audio_present = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
210
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
211 idcin->next_chunk_is_video = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
212 idcin->pts = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
213
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
214 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
215 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
216
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
217 static int idcin_read_packet(AVFormatContext *s,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
218 AVPacket *pkt)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
219 {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
220 int ret;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
221 unsigned int command;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
222 unsigned int chunk_size;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
223 IdcinDemuxContext *idcin = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
224 ByteIOContext *pb = s->pb;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
225 int i;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
226 int palette_scale;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
227 unsigned char r, g, b;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
228 unsigned char palette_buffer[768];
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
229
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
230 if (url_feof(s->pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
231 return AVERROR(EIO);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
232
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
233 if (idcin->next_chunk_is_video) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
234 command = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
235 if (command == 2) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
236 return AVERROR(EIO);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
237 } else if (command == 1) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
238 /* trigger a palette change */
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
239 idcin->palctrl.palette_changed = 1;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
240 if (get_buffer(pb, palette_buffer, 768) != 768)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
241 return AVERROR(EIO);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
242 /* scale the palette as necessary */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
243 palette_scale = 2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
244 for (i = 0; i < 768; i++)
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
245 if (palette_buffer[i] > 63) {
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
246 palette_scale = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
247 break;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
248 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
249
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
250 for (i = 0; i < 256; i++) {
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
251 r = palette_buffer[i * 3 ] << palette_scale;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
252 g = palette_buffer[i * 3 + 1] << palette_scale;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
253 b = palette_buffer[i * 3 + 2] << palette_scale;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
254 idcin->palctrl.palette[i] = (r << 16) | (g << 8) | (b);
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
255 }
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
256 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
257
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
258 chunk_size = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
259 /* skip the number of decoded bytes (always equal to width * height) */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
260 url_fseek(pb, 4, SEEK_CUR);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
261 chunk_size -= 4;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
262 ret= av_get_packet(pb, pkt, chunk_size);
5685
e8614dbd9b7b Fix memory leak for truncated packets in idCin demuxer
vitor
parents: 5176
diff changeset
263 if (ret < 0)
e8614dbd9b7b Fix memory leak for truncated packets in idCin demuxer
vitor
parents: 5176
diff changeset
264 return ret;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
265 pkt->stream_index = idcin->video_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
266 pkt->pts = idcin->pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
267 } else {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
268 /* send out the audio chunk */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
269 if (idcin->current_audio_chunk)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
270 chunk_size = idcin->audio_chunk_size2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
271 else
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
272 chunk_size = idcin->audio_chunk_size1;
775
c5077fdab490 AVPacket.pos
michael
parents: 482
diff changeset
273 ret= av_get_packet(pb, pkt, chunk_size);
5685
e8614dbd9b7b Fix memory leak for truncated packets in idCin demuxer
vitor
parents: 5176
diff changeset
274 if (ret < 0)
e8614dbd9b7b Fix memory leak for truncated packets in idCin demuxer
vitor
parents: 5176
diff changeset
275 return ret;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
276 pkt->stream_index = idcin->audio_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
277 pkt->pts = idcin->pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
278
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
279 idcin->current_audio_chunk ^= 1;
3098
fdcab2321805 fix the id CIN demuxer by using the pts API correctly
melanson
parents: 2771
diff changeset
280 idcin->pts++;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
281 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
282
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
283 if (idcin->audio_present)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
284 idcin->next_chunk_is_video ^= 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
285
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
286 return ret;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
287 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
288
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
289 AVInputFormat idcin_demuxer = {
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
290 "idcin",
4465
042e9a2fdda2 Use more descriptive format long_names.
diego
parents: 4331
diff changeset
291 NULL_IF_CONFIG_SMALL("id Cinematic format"),
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
292 sizeof(IdcinDemuxContext),
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
293 idcin_probe,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
294 idcin_read_header,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
295 idcin_read_packet,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
296 };