idcin.c
Go to the documentation of this file.
1 /*
2  * id Quake II CIN File Demuxer
3  * Copyright (c) 2003 The ffmpeg Project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * id Quake II CIN file demuxer by Mike Melanson (melanson@pcisys.net)
25  * For more information about the id CIN format, visit:
26  * http://www.csse.monash.edu.au/~timf/
27  *
28  * CIN is a somewhat quirky and ill-defined format. Here are some notes
29  * for anyone trying to understand the technical details of this format:
30  *
31  * The format has no definite file signature. This is problematic for a
32  * general-purpose media player that wants to automatically detect file
33  * types. However, a CIN file does start with 5 32-bit numbers that
34  * specify audio and video parameters. This demuxer gets around the lack
35  * of file signature by performing sanity checks on those parameters.
36  * Probabalistically, this is a reasonable solution since the number of
37  * valid combinations of the 5 parameters is a very small subset of the
38  * total 160-bit number space.
39  *
40  * Refer to the function idcin_probe() for the precise A/V parameters
41  * that this demuxer allows.
42  *
43  * Next, each audio and video frame has a duration of 1/14 sec. If the
44  * audio sample rate is a multiple of the common frequency 22050 Hz it will
45  * divide evenly by 14. However, if the sample rate is 11025 Hz:
46  * 11025 (samples/sec) / 14 (frames/sec) = 787.5 (samples/frame)
47  * The way the CIN stores audio in this case is by storing 787 sample
48  * frames in the first audio frame and 788 sample frames in the second
49  * audio frame. Therefore, the total number of bytes in an audio frame
50  * is given as:
51  * audio frame #0: 787 * (bytes/sample) * (# channels) bytes in frame
52  * audio frame #1: 788 * (bytes/sample) * (# channels) bytes in frame
53  * audio frame #2: 787 * (bytes/sample) * (# channels) bytes in frame
54  * audio frame #3: 788 * (bytes/sample) * (# channels) bytes in frame
55  *
56  * Finally, not all id CIN creation tools agree on the resolution of the
57  * color palette, apparently. Some creation tools specify red, green, and
58  * blue palette components in terms of 6-bit VGA color DAC values which
59  * range from 0..63. Other tools specify the RGB components as full 8-bit
60  * values that range from 0..255. Since there are no markers in the file to
61  * differentiate between the two variants, this demuxer uses the following
62  * heuristic:
63  * - load the 768 palette bytes from disk
64  * - assume that they will need to be shifted left by 2 bits to
65  * transform them from 6-bit values to 8-bit values
66  * - scan through all 768 palette bytes
67  * - if any bytes exceed 63, do not shift the bytes at all before
68  * transmitting them to the video decoder
69  */
70 
72 #include "libavutil/imgutils.h"
73 #include "libavutil/intreadwrite.h"
74 #include "avformat.h"
75 #include "internal.h"
76 
77 #define HUFFMAN_TABLE_SIZE (64 * 1024)
78 #define IDCIN_FPS 14
79 
80 typedef struct IdcinDemuxContext {
86 
87  /* demux state variables */
91  int64_t first_pkt_pos;
93 
94 static int idcin_probe(AVProbeData *p)
95 {
96  unsigned int number;
97 
98  /*
99  * This is what you could call a "probabilistic" file check: id CIN
100  * files don't have a definite file signature. In lieu of such a marker,
101  * perform sanity checks on the 5 32-bit header fields:
102  * width, height: greater than 0, less than or equal to 1024
103  * audio sample rate: greater than or equal to 8000, less than or
104  * equal to 48000, or 0 for no audio
105  * audio sample width (bytes/sample): 0 for no audio, or 1 or 2
106  * audio channels: 0 for no audio, or 1 or 2
107  */
108 
109  /* check we have enough data to do all checks, otherwise the
110  0-padding may cause a wrong recognition */
111  if (p->buf_size < 20)
112  return 0;
113 
114  /* check the video width */
115  number = AV_RL32(&p->buf[0]);
116  if ((number == 0) || (number > 1024))
117  return 0;
118 
119  /* check the video height */
120  number = AV_RL32(&p->buf[4]);
121  if ((number == 0) || (number > 1024))
122  return 0;
123 
124  /* check the audio sample rate */
125  number = AV_RL32(&p->buf[8]);
126  if ((number != 0) && ((number < 8000) | (number > 48000)))
127  return 0;
128 
129  /* check the audio bytes/sample */
130  number = AV_RL32(&p->buf[12]);
131  if (number > 2)
132  return 0;
133 
134  /* check the audio channels */
135  number = AV_RL32(&p->buf[16]);
136  if (number > 2)
137  return 0;
138 
139  /* return half certainly since this check is a bit sketchy */
140  return AVPROBE_SCORE_MAX / 2;
141 }
142 
144 {
145  AVIOContext *pb = s->pb;
146  IdcinDemuxContext *idcin = s->priv_data;
147  AVStream *st;
148  unsigned int width, height;
149  unsigned int sample_rate, bytes_per_sample, channels;
150  int ret;
151 
152  /* get the 5 header parameters */
153  width = avio_rl32(pb);
154  height = avio_rl32(pb);
155  sample_rate = avio_rl32(pb);
156  bytes_per_sample = avio_rl32(pb);
157  channels = avio_rl32(pb);
158 
159  if (s->pb->eof_reached) {
160  av_log(s, AV_LOG_ERROR, "incomplete header\n");
161  return s->pb->error ? s->pb->error : AVERROR_EOF;
162  }
163 
164  if (av_image_check_size(width, height, 0, s) < 0)
165  return AVERROR_INVALIDDATA;
166  if (sample_rate > 0) {
167  if (sample_rate < 14 || sample_rate > INT_MAX) {
168  av_log(s, AV_LOG_ERROR, "invalid sample rate: %u\n", sample_rate);
169  return AVERROR_INVALIDDATA;
170  }
171  if (bytes_per_sample < 1 || bytes_per_sample > 2) {
172  av_log(s, AV_LOG_ERROR, "invalid bytes per sample: %u\n",
173  bytes_per_sample);
174  return AVERROR_INVALIDDATA;
175  }
176  if (channels < 1 || channels > 2) {
177  av_log(s, AV_LOG_ERROR, "invalid channels: %u\n", channels);
178  return AVERROR_INVALIDDATA;
179  }
180  idcin->audio_present = 1;
181  } else {
182  /* if sample rate is 0, assume no audio */
183  idcin->audio_present = 0;
184  }
185 
186  st = avformat_new_stream(s, NULL);
187  if (!st)
188  return AVERROR(ENOMEM);
189  avpriv_set_pts_info(st, 33, 1, IDCIN_FPS);
190  st->start_time = 0;
191  idcin->video_stream_index = st->index;
194  st->codec->codec_tag = 0; /* no fourcc */
195  st->codec->width = width;
196  st->codec->height = height;
197 
198  /* load up the Huffman tables into extradata */
201  ret = avio_read(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE);
202  if (ret < 0) {
203  return ret;
204  } else if (ret != HUFFMAN_TABLE_SIZE) {
205  av_log(s, AV_LOG_ERROR, "incomplete header\n");
206  return AVERROR(EIO);
207  }
208 
209  if (idcin->audio_present) {
210  idcin->audio_present = 1;
211  st = avformat_new_stream(s, NULL);
212  if (!st)
213  return AVERROR(ENOMEM);
214  avpriv_set_pts_info(st, 63, 1, sample_rate);
215  st->start_time = 0;
216  idcin->audio_stream_index = st->index;
218  st->codec->codec_tag = 1;
219  st->codec->channels = channels;
220  st->codec->channel_layout = channels > 1 ? AV_CH_LAYOUT_STEREO :
223  st->codec->bits_per_coded_sample = bytes_per_sample * 8;
224  st->codec->bit_rate = sample_rate * bytes_per_sample * 8 * channels;
225  st->codec->block_align = idcin->block_align = bytes_per_sample * channels;
226  if (bytes_per_sample == 1)
228  else
230 
231  if (sample_rate % 14 != 0) {
232  idcin->audio_chunk_size1 = (sample_rate / 14) *
233  bytes_per_sample * channels;
234  idcin->audio_chunk_size2 = (sample_rate / 14 + 1) *
235  bytes_per_sample * channels;
236  } else {
237  idcin->audio_chunk_size1 = idcin->audio_chunk_size2 =
238  (sample_rate / 14) * bytes_per_sample * channels;
239  }
240  idcin->current_audio_chunk = 0;
241  }
242 
243  idcin->next_chunk_is_video = 1;
244  idcin->first_pkt_pos = avio_tell(s->pb);
245 
246  return 0;
247 }
248 
250  AVPacket *pkt)
251 {
252  int ret;
253  unsigned int command;
254  unsigned int chunk_size;
255  IdcinDemuxContext *idcin = s->priv_data;
256  AVIOContext *pb = s->pb;
257  int i;
258  int palette_scale;
259  unsigned char r, g, b;
260  unsigned char palette_buffer[768];
261  uint32_t palette[256];
262 
263  if (url_feof(s->pb))
264  return s->pb->error ? s->pb->error : AVERROR_EOF;
265 
266  if (idcin->next_chunk_is_video) {
267  command = avio_rl32(pb);
268  if (command == 2) {
269  return AVERROR(EIO);
270  } else if (command == 1) {
271  /* trigger a palette change */
272  ret = avio_read(pb, palette_buffer, 768);
273  if (ret < 0) {
274  return ret;
275  } else if (ret != 768) {
276  av_log(s, AV_LOG_ERROR, "incomplete packet\n");
277  return AVERROR(EIO);
278  }
279  /* scale the palette as necessary */
280  palette_scale = 2;
281  for (i = 0; i < 768; i++)
282  if (palette_buffer[i] > 63) {
283  palette_scale = 0;
284  break;
285  }
286 
287  for (i = 0; i < 256; i++) {
288  r = palette_buffer[i * 3 ] << palette_scale;
289  g = palette_buffer[i * 3 + 1] << palette_scale;
290  b = palette_buffer[i * 3 + 2] << palette_scale;
291  palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | (b);
292  if (palette_scale == 2)
293  palette[i] |= palette[i] >> 6 & 0x30303;
294  }
295  }
296 
297  if (s->pb->eof_reached) {
298  av_log(s, AV_LOG_ERROR, "incomplete packet\n");
299  return s->pb->error ? s->pb->error : AVERROR_EOF;
300  }
301  chunk_size = avio_rl32(pb);
302  if (chunk_size < 4 || chunk_size > INT_MAX - 4) {
303  av_log(s, AV_LOG_ERROR, "invalid chunk size: %u\n", chunk_size);
304  return AVERROR_INVALIDDATA;
305  }
306  /* skip the number of decoded bytes (always equal to width * height) */
307  avio_skip(pb, 4);
308  if (chunk_size < 4)
309  return AVERROR_INVALIDDATA;
310  chunk_size -= 4;
311  ret= av_get_packet(pb, pkt, chunk_size);
312  if (ret < 0)
313  return ret;
314  else if (ret != chunk_size) {
315  av_log(s, AV_LOG_ERROR, "incomplete packet\n");
316  av_free_packet(pkt);
317  return AVERROR(EIO);
318  }
319  if (command == 1) {
320  uint8_t *pal;
321 
324  if (!pal) {
325  av_free_packet(pkt);
326  return AVERROR(ENOMEM);
327  }
328  memcpy(pal, palette, AVPALETTE_SIZE);
329  pkt->flags |= AV_PKT_FLAG_KEY;
330  }
331  pkt->stream_index = idcin->video_stream_index;
332  pkt->duration = 1;
333  } else {
334  /* send out the audio chunk */
335  if (idcin->current_audio_chunk)
336  chunk_size = idcin->audio_chunk_size2;
337  else
338  chunk_size = idcin->audio_chunk_size1;
339  ret= av_get_packet(pb, pkt, chunk_size);
340  if (ret < 0)
341  return ret;
342  pkt->stream_index = idcin->audio_stream_index;
343  pkt->duration = chunk_size / idcin->block_align;
344 
345  idcin->current_audio_chunk ^= 1;
346  }
347 
348  if (idcin->audio_present)
349  idcin->next_chunk_is_video ^= 1;
350 
351  return 0;
352 }
353 
354 static int idcin_read_seek(AVFormatContext *s, int stream_index,
355  int64_t timestamp, int flags)
356 {
357  IdcinDemuxContext *idcin = s->priv_data;
358 
359  if (idcin->first_pkt_pos > 0) {
360  int ret = avio_seek(s->pb, idcin->first_pkt_pos, SEEK_SET);
361  if (ret < 0)
362  return ret;
363  ff_update_cur_dts(s, s->streams[idcin->video_stream_index], 0);
364  idcin->next_chunk_is_video = 1;
365  idcin->current_audio_chunk = 0;
366  return 0;
367  }
368  return -1;
369 }
370 
372  .name = "idcin",
373  .long_name = NULL_IF_CONFIG_SMALL("id Cinematic"),
374  .priv_data_size = sizeof(IdcinDemuxContext),
380 };
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:242
static int idcin_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: idcin.c:354
misc image utilities
#define HUFFMAN_TABLE_SIZE
Definition: idcin.c:77
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
int index
stream index in AVFormatContext
Definition: avformat.h:644
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
int audio_present
Definition: idcin.c:90
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
#define AV_CH_LAYOUT_STEREO
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
Format I/O context.
Definition: avformat.h:944
void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
Update cur_dts of all streams based on the given timestamp and AVStream.
uint8_t
#define AVPALETTE_SIZE
Definition: pixfmt.h:33
static AVPacket pkt
Definition: demuxing.c:56
#define b
Definition: input.c:42
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
Definition: avformat.h:992
#define AVERROR_EOF
End of file.
Definition: error.h:55
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define U(x)
int current_audio_chunk
Definition: idcin.c:88
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:579
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * r
Definition: vf_curves.c:94
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int audio_chunk_size2
Definition: idcin.c:84
static int idcin_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: idcin.c:249
int64_t first_pkt_pos
Definition: idcin.c:91
int flags
A combination of AV_PKT_FLAG values.
uint64_t channel_layout
Audio channel layout.
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:337
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
static int idcin_probe(AVProbeData *p)
Definition: idcin.c:94
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:231
FFT buffer for g
Definition: stft_peak.m:17
int bit_rate
the average bitrate
audio channel layout utility functions
int video_stream_index
Definition: idcin.c:81
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
int width
picture width / height.
int block_align
Definition: idcin.c:85
#define AV_RL32
int audio_stream_index
Definition: idcin.c:82
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
struct IdcinDemuxContext IdcinDemuxContext
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
sample_rate
enum AVMediaType codec_type
#define IDCIN_FPS
Definition: idcin.c:78
enum AVCodecID codec_id
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Definition: vf_drawtext.c:596
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
synthesis window for stochastic i
int audio_chunk_size1
Definition: idcin.c:83
int error
contains the error code or 0 if no error happened
Definition: avio.h:102
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static int flags
Definition: cpu.c:23
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
int palette
Definition: v4l.c:61
Main libavformat public API header.
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
Definition: avformat.h:689
#define AVFMT_NO_BYTE_SEEK
Format does not allow seeking by bytes.
Definition: avformat.h:360
int eof_reached
true if eof reached
Definition: avio.h:96
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
static int idcin_read_header(AVFormatContext *s)
Definition: idcin.c:143
int next_chunk_is_video
Definition: idcin.c:89
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
AVInputFormat ff_idcin_demuxer
Definition: idcin.c:371
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:264
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.