annotate idcin.c @ 1779:de2cf54eb68f libavformat

mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
author bcoudurier
date Sun, 11 Feb 2007 12:50:33 +0000
parents a782462e2497
children 1a3c9056982a
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 /*
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
2 * Id Quake II CIN File Demuxer
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 /**
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
23 * @file idcin.c
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
24 * Id Quake II CIN file demuxer by Mike Melanson (melanson@pcisys.net)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
25 * For more information about the Id CIN format, visit:
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 *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
56 * Finally, not all Id CIN creation tools agree on the resolution of the
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
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
71 #include "avformat.h"
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
72
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
73 #define HUFFMAN_TABLE_SIZE (64 * 1024)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
74 #define FRAME_PTS_INC (90000 / 14)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
75
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
76 typedef struct IdcinDemuxContext {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
77 int video_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
78 int audio_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
79 int audio_chunk_size1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
80 int audio_chunk_size2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
81
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
82 /* demux state variables */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
83 int current_audio_chunk;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
84 int next_chunk_is_video;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
85 int audio_present;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
86
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
87 int64_t pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
88
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
89 AVPaletteControl palctrl;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
90 } IdcinDemuxContext;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
91
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
92 static int idcin_probe(AVProbeData *p)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
93 {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
94 unsigned int number;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
95
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
96 /*
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
97 * This is what you could call a "probabilistic" file check: Id CIN
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
98 * 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
99 * perform sanity checks on the 5 32-bit header fields:
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
100 * width, height: greater than 0, less than or equal to 1024
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
101 * audio sample rate: greater than or equal to 8000, less than or
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
102 * equal to 48000, or 0 for no audio
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
103 * audio sample width (bytes/sample): 0 for no audio, or 1 or 2
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
104 * audio channels: 0 for no audio, or 1 or 2
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
105 */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
106
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
107 /* cannot proceed without 20 bytes */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
108 if (p->buf_size < 20)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
109 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
110
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
111 /* check the video width */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
112 number = AV_RL32(&p->buf[0]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
113 if ((number == 0) || (number > 1024))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
114 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
115
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
116 /* check the video height */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
117 number = AV_RL32(&p->buf[4]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
118 if ((number == 0) || (number > 1024))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
119 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
120
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
121 /* 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
122 number = AV_RL32(&p->buf[8]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
123 if ((number != 0) && ((number < 8000) | (number > 48000)))
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
124 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
125
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
126 /* 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
127 number = AV_RL32(&p->buf[12]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
128 if (number > 2)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
129 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
130
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
131 /* check the audio channels */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
132 number = AV_RL32(&p->buf[16]);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
133 if (number > 2)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
134 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
135
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
136 /* return half certainly since this check is a bit sketchy */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
137 return AVPROBE_SCORE_MAX / 2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
138 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
139
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
140 static int idcin_read_header(AVFormatContext *s,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
141 AVFormatParameters *ap)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
142 {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
143 ByteIOContext *pb = &s->pb;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
144 IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
145 AVStream *st;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
146 unsigned int width, height;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
147 unsigned int sample_rate, bytes_per_sample, channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
148
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
149 /* get the 5 header parameters */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
150 width = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
151 height = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
152 sample_rate = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
153 bytes_per_sample = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
154 channels = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
155
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
156 st = av_new_stream(s, 0);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
157 if (!st)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
158 return AVERROR_NOMEM;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 386
diff changeset
159 av_set_pts_info(st, 33, 1, 90000);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
160 idcin->video_stream_index = st->index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
161 st->codec->codec_type = CODEC_TYPE_VIDEO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
162 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
163 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
164 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
165 st->codec->height = height;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
166
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
167 /* 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
168 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
169 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
170 if (get_buffer(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE) !=
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
171 HUFFMAN_TABLE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
172 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
173 /* 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
174 st->codec->palctrl = &idcin->palctrl;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
175
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
176 /* if sample rate is 0, assume no audio */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
177 if (sample_rate) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
178 idcin->audio_present = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
179 st = av_new_stream(s, 0);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
180 if (!st)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
181 return AVERROR_NOMEM;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 386
diff changeset
182 av_set_pts_info(st, 33, 1, 90000);
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
183 idcin->audio_stream_index = st->index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
184 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
185 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
186 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
187 st->codec->sample_rate = sample_rate;
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->bits_per_sample = bytes_per_sample * 8;
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->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
190 st->codec->block_align = bytes_per_sample * channels;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
191 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
192 st->codec->codec_id = CODEC_ID_PCM_U8;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
193 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
194 st->codec->codec_id = CODEC_ID_PCM_S16LE;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
195
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
196 if (sample_rate % 14 != 0) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
197 idcin->audio_chunk_size1 = (sample_rate / 14) *
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
198 bytes_per_sample * channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
199 idcin->audio_chunk_size2 = (sample_rate / 14 + 1) *
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 } else {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
202 idcin->audio_chunk_size1 = idcin->audio_chunk_size2 =
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
203 (sample_rate / 14) * bytes_per_sample * channels;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
204 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
205 idcin->current_audio_chunk = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
206 } else
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
207 idcin->audio_present = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
208
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
209 idcin->next_chunk_is_video = 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
210 idcin->pts = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
211
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
212 return 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
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
215 static int idcin_read_packet(AVFormatContext *s,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
216 AVPacket *pkt)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
217 {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
218 int ret;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
219 unsigned int command;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
220 unsigned int chunk_size;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
221 IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
222 ByteIOContext *pb = &s->pb;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
223 int i;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
224 int palette_scale;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
225 unsigned char r, g, b;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
226 unsigned char palette_buffer[768];
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
227
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
228 if (url_feof(&s->pb))
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
229 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
230
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
231 if (idcin->next_chunk_is_video) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
232 command = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
233 if (command == 2) {
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
234 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
235 } else if (command == 1) {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
236 /* trigger a palette change */
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
237 idcin->palctrl.palette_changed = 1;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
238 if (get_buffer(pb, palette_buffer, 768) != 768)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
239 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
240 /* scale the palette as necessary */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
241 palette_scale = 2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
242 for (i = 0; i < 768; i++)
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
243 if (palette_buffer[i] > 63) {
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
244 palette_scale = 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
245 break;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
246 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
247
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
248 for (i = 0; i < 256; i++) {
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
249 r = palette_buffer[i * 3 ] << palette_scale;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
250 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
251 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
252 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
253 }
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
254 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
255
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
256 chunk_size = get_le32(pb);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
257 /* skip the number of decoded bytes (always equal to width * height) */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
258 url_fseek(pb, 4, SEEK_CUR);
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
259 chunk_size -= 4;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
260 ret= av_get_packet(pb, pkt, chunk_size);
775
c5077fdab490 AVPacket.pos
michael
parents: 482
diff changeset
261 if (ret != chunk_size)
c5077fdab490 AVPacket.pos
michael
parents: 482
diff changeset
262 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
263 pkt->stream_index = idcin->video_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
264 pkt->pts = idcin->pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
265 } else {
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
266 /* send out the audio chunk */
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
267 if (idcin->current_audio_chunk)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
268 chunk_size = idcin->audio_chunk_size2;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
269 else
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
270 chunk_size = idcin->audio_chunk_size1;
775
c5077fdab490 AVPacket.pos
michael
parents: 482
diff changeset
271 ret= av_get_packet(pb, pkt, chunk_size);
c5077fdab490 AVPacket.pos
michael
parents: 482
diff changeset
272 if (ret != chunk_size)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
273 return AVERROR_IO;
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
274 pkt->stream_index = idcin->audio_stream_index;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
275 pkt->pts = idcin->pts;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
276
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
277 idcin->current_audio_chunk ^= 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
278 idcin->pts += FRAME_PTS_INC;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
279 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
280
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
281 if (idcin->audio_present)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
282 idcin->next_chunk_is_video ^= 1;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
283
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
284 return ret;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
285 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
286
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
287 static int idcin_read_close(AVFormatContext *s)
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
288 {
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 274
diff changeset
289
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
290 return 0;
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
291 }
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
292
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
293 AVInputFormat idcin_demuxer = {
274
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
294 "idcin",
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
295 "Id CIN format",
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
296 sizeof(IdcinDemuxContext),
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
297 idcin_probe,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
298 idcin_read_header,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
299 idcin_read_packet,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
300 idcin_read_close,
9fa2ec3b9982 implemented Id Quake II CIN support
tmmm
parents:
diff changeset
301 };