2 * Sega FILM Format (CPK) Demuxer
3 * Copyright (c) 2003 The ffmpeg Project
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Sega FILM (.cpk) file demuxer
25 * by Mike Melanson (melanson@pcisys.net)
26 * For more information regarding the Sega FILM file format, visit:
27 * http://www.pcisys.net/~melanson/codecs/
30 #include "libavutil/intreadwrite.h"
34 #define FILM_TAG MKBETAG('F', 'I', 'L', 'M')
35 #define FDSC_TAG MKBETAG('F', 'D', 'S', 'C')
36 #define STAB_TAG MKBETAG('S', 'T', 'A', 'B')
37 #define CVID_TAG MKBETAG('c', 'v', 'i', 'd')
38 #define RAW_TAG MKBETAG('r', 'a', 'w', ' ')
42 int64_t sample_offset
;
43 unsigned int sample_size
;
48 typedef struct FilmDemuxContext
{
49 int video_stream_index
;
50 int audio_stream_index
;
52 enum AVCodecID audio_type
;
53 unsigned int audio_samplerate
;
54 unsigned int audio_bits
;
55 unsigned int audio_channels
;
57 enum AVCodecID video_type
;
58 unsigned int sample_count
;
59 film_sample
*sample_table
;
60 unsigned int current_sample
;
62 unsigned int base_clock
;
65 /* buffer used for interleaving stereo PCM data */
66 unsigned char *stereo_buffer
;
67 int stereo_buffer_size
;
70 static int film_probe(AVProbeData
*p
)
72 if (AV_RB32(&p
->buf
[0]) != FILM_TAG
)
75 return AVPROBE_SCORE_MAX
;
78 static int film_read_close(AVFormatContext
*s
)
80 FilmDemuxContext
*film
= s
->priv_data
;
82 av_freep(&film
->sample_table
);
83 av_freep(&film
->stereo_buffer
);
88 static int film_read_header(AVFormatContext
*s
)
90 FilmDemuxContext
*film
= s
->priv_data
;
91 AVIOContext
*pb
= s
->pb
;
93 unsigned char scratch
[256];
95 unsigned int data_offset
;
96 unsigned int audio_frame_counter
;
98 film
->sample_table
= NULL
;
99 film
->stereo_buffer
= NULL
;
100 film
->stereo_buffer_size
= 0;
102 /* load the main FILM header */
103 if (avio_read(pb
, scratch
, 16) != 16)
105 data_offset
= AV_RB32(&scratch
[4]);
106 film
->version
= AV_RB32(&scratch
[8]);
108 /* load the FDSC chunk */
109 if (film
->version
== 0) {
110 /* special case for Lemmings .film files; 20-byte header */
111 if (avio_read(pb
, scratch
, 20) != 20)
113 /* make some assumptions about the audio parameters */
114 film
->audio_type
= AV_CODEC_ID_PCM_S8
;
115 film
->audio_samplerate
= 22050;
116 film
->audio_channels
= 1;
117 film
->audio_bits
= 8;
119 /* normal Saturn .cpk files; 32-byte header */
120 if (avio_read(pb
, scratch
, 32) != 32)
122 film
->audio_samplerate
= AV_RB16(&scratch
[24]);
123 film
->audio_channels
= scratch
[21];
124 if (!film
->audio_channels
|| film
->audio_channels
> 2) {
125 av_log(s
, AV_LOG_ERROR
,
126 "Invalid number of channels: %d\n", film
->audio_channels
);
127 return AVERROR_INVALIDDATA
;
129 film
->audio_bits
= scratch
[22];
130 if (scratch
[23] == 2)
131 film
->audio_type
= AV_CODEC_ID_ADPCM_ADX
;
132 else if (film
->audio_channels
> 0) {
133 if (film
->audio_bits
== 8)
134 film
->audio_type
= AV_CODEC_ID_PCM_S8
;
135 else if (film
->audio_bits
== 16)
136 film
->audio_type
= AV_CODEC_ID_PCM_S16BE
;
138 film
->audio_type
= AV_CODEC_ID_NONE
;
140 film
->audio_type
= AV_CODEC_ID_NONE
;
143 if (AV_RB32(&scratch
[0]) != FDSC_TAG
)
144 return AVERROR_INVALIDDATA
;
146 if (AV_RB32(&scratch
[8]) == CVID_TAG
) {
147 film
->video_type
= AV_CODEC_ID_CINEPAK
;
148 } else if (AV_RB32(&scratch
[8]) == RAW_TAG
) {
149 film
->video_type
= AV_CODEC_ID_RAWVIDEO
;
151 film
->video_type
= AV_CODEC_ID_NONE
;
154 /* initialize the decoder streams */
155 if (film
->video_type
) {
156 st
= avformat_new_stream(s
, NULL
);
158 return AVERROR(ENOMEM
);
159 film
->video_stream_index
= st
->index
;
160 st
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
161 st
->codec
->codec_id
= film
->video_type
;
162 st
->codec
->codec_tag
= 0; /* no fourcc */
163 st
->codec
->width
= AV_RB32(&scratch
[16]);
164 st
->codec
->height
= AV_RB32(&scratch
[12]);
166 if (film
->video_type
== AV_CODEC_ID_RAWVIDEO
) {
167 if (scratch
[20] == 24) {
168 st
->codec
->pix_fmt
= AV_PIX_FMT_RGB24
;
170 av_log(s
, AV_LOG_ERROR
, "raw video is using unhandled %dbpp\n", scratch
[20]);
176 if (film
->audio_type
) {
177 st
= avformat_new_stream(s
, NULL
);
179 return AVERROR(ENOMEM
);
180 film
->audio_stream_index
= st
->index
;
181 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
182 st
->codec
->codec_id
= film
->audio_type
;
183 st
->codec
->codec_tag
= 1;
184 st
->codec
->channels
= film
->audio_channels
;
185 st
->codec
->sample_rate
= film
->audio_samplerate
;
187 if (film
->audio_type
== AV_CODEC_ID_ADPCM_ADX
) {
188 st
->codec
->bits_per_coded_sample
= 18 * 8 / 32;
189 st
->codec
->block_align
= st
->codec
->channels
* 18;
190 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
192 st
->codec
->bits_per_coded_sample
= film
->audio_bits
;
193 st
->codec
->block_align
= st
->codec
->channels
*
194 st
->codec
->bits_per_coded_sample
/ 8;
197 st
->codec
->bit_rate
= st
->codec
->channels
* st
->codec
->sample_rate
*
198 st
->codec
->bits_per_coded_sample
;
201 /* load the sample table */
202 if (avio_read(pb
, scratch
, 16) != 16)
204 if (AV_RB32(&scratch
[0]) != STAB_TAG
)
205 return AVERROR_INVALIDDATA
;
206 film
->base_clock
= AV_RB32(&scratch
[8]);
207 film
->sample_count
= AV_RB32(&scratch
[12]);
208 if(film
->sample_count
>= UINT_MAX
/ sizeof(film_sample
))
210 film
->sample_table
= av_malloc(film
->sample_count
* sizeof(film_sample
));
211 if (!film
->sample_table
)
212 return AVERROR(ENOMEM
);
214 for (i
= 0; i
< s
->nb_streams
; i
++) {
216 if (st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
)
217 avpriv_set_pts_info(st
, 33, 1, film
->base_clock
);
219 avpriv_set_pts_info(st
, 64, 1, film
->audio_samplerate
);
222 audio_frame_counter
= 0;
223 for (i
= 0; i
< film
->sample_count
; i
++) {
224 /* load the next sample record and transfer it to an internal struct */
225 if (avio_read(pb
, scratch
, 16) != 16) {
229 film
->sample_table
[i
].sample_offset
=
230 data_offset
+ AV_RB32(&scratch
[0]);
231 film
->sample_table
[i
].sample_size
= AV_RB32(&scratch
[4]);
232 if (film
->sample_table
[i
].sample_size
> INT_MAX
/ 4) {
233 ret
= AVERROR_INVALIDDATA
;
236 if (AV_RB32(&scratch
[8]) == 0xFFFFFFFF) {
237 film
->sample_table
[i
].stream
= film
->audio_stream_index
;
238 film
->sample_table
[i
].pts
= audio_frame_counter
;
240 if (film
->audio_type
== AV_CODEC_ID_ADPCM_ADX
)
241 audio_frame_counter
+= (film
->sample_table
[i
].sample_size
* 32 /
242 (18 * film
->audio_channels
));
243 else if (film
->audio_type
!= AV_CODEC_ID_NONE
)
244 audio_frame_counter
+= (film
->sample_table
[i
].sample_size
/
245 (film
->audio_channels
* film
->audio_bits
/ 8));
247 film
->sample_table
[i
].stream
= film
->video_stream_index
;
248 film
->sample_table
[i
].pts
= AV_RB32(&scratch
[8]) & 0x7FFFFFFF;
249 film
->sample_table
[i
].keyframe
= (scratch
[8] & 0x80) ?
0 : 1;
253 film
->current_sample
= 0;
261 static int film_read_packet(AVFormatContext
*s
,
264 FilmDemuxContext
*film
= s
->priv_data
;
265 AVIOContext
*pb
= s
->pb
;
271 if (film
->current_sample
>= film
->sample_count
)
274 sample
= &film
->sample_table
[film
->current_sample
];
276 /* position the stream (will probably be there anyway) */
277 avio_seek(pb
, sample
->sample_offset
, SEEK_SET
);
279 /* do a special song and dance when loading FILM Cinepak chunks */
280 if ((sample
->stream
== film
->video_stream_index
) &&
281 (film
->video_type
== AV_CODEC_ID_CINEPAK
)) {
282 pkt
->pos
= avio_tell(pb
);
283 if (av_new_packet(pkt
, sample
->sample_size
))
284 return AVERROR(ENOMEM
);
285 avio_read(pb
, pkt
->data
, sample
->sample_size
);
286 } else if ((sample
->stream
== film
->audio_stream_index
) &&
287 (film
->audio_channels
== 2) &&
288 (film
->audio_type
!= AV_CODEC_ID_ADPCM_ADX
)) {
289 /* stereo PCM needs to be interleaved */
291 if (av_new_packet(pkt
, sample
->sample_size
))
292 return AVERROR(ENOMEM
);
294 /* make sure the interleave buffer is large enough */
295 if (sample
->sample_size
> film
->stereo_buffer_size
) {
296 av_free(film
->stereo_buffer
);
297 film
->stereo_buffer_size
= sample
->sample_size
;
298 film
->stereo_buffer
= av_malloc(film
->stereo_buffer_size
);
299 if (!film
->stereo_buffer
) {
300 film
->stereo_buffer_size
= 0;
301 return AVERROR(ENOMEM
);
305 pkt
->pos
= avio_tell(pb
);
306 ret
= avio_read(pb
, film
->stereo_buffer
, sample
->sample_size
);
307 if (ret
!= sample
->sample_size
)
311 right
= sample
->sample_size
/ 2;
312 for (i
= 0; i
< sample
->sample_size
; ) {
313 if (film
->audio_bits
== 8) {
314 pkt
->data
[i
++] = film
->stereo_buffer
[left
++];
315 pkt
->data
[i
++] = film
->stereo_buffer
[right
++];
317 pkt
->data
[i
++] = film
->stereo_buffer
[left
++];
318 pkt
->data
[i
++] = film
->stereo_buffer
[left
++];
319 pkt
->data
[i
++] = film
->stereo_buffer
[right
++];
320 pkt
->data
[i
++] = film
->stereo_buffer
[right
++];
324 ret
= av_get_packet(pb
, pkt
, sample
->sample_size
);
325 if (ret
!= sample
->sample_size
)
329 pkt
->stream_index
= sample
->stream
;
330 pkt
->pts
= sample
->pts
;
332 film
->current_sample
++;
337 AVInputFormat ff_segafilm_demuxer
= {
339 .long_name
= NULL_IF_CONFIG_SMALL("Sega FILM / CPK"),
340 .priv_data_size
= sizeof(FilmDemuxContext
),
341 .read_probe
= film_probe
,
342 .read_header
= film_read_header
,
343 .read_packet
= film_read_packet
,
344 .read_close
= film_read_close
,