annotate libmpdemux/demux_film.c @ 36984:3f3a415d605b

Move most of TranslateFilename() back to the renderer files. Although it would be nice to share the code (which was the reason for r34263), most of it really doesn't belong to string.c.
author ib
date Thu, 27 Mar 2014 01:49:01 +0000
parents 92dd1764392a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
1 /*
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
2 * FILM file parser
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
3 * Copyright (C) 2002 Mike Melanson
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
4 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
5 * This demuxer handles FILM (a.k.a. CPK) files commonly found on Sega
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
6 * Saturn CD-ROM games. FILM files have also been found on 3DO games.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
7 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
8 * details of the FILM file format can be found at:
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
9 * http://www.pcisys.net/~melanson/codecs/
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
10 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
11 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
12 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
13 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
14 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
16 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
17 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
18 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
21 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
22 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
23 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
24 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 26758
diff changeset
26 */
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
27
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
28 #include <stdio.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
29 #include <stdlib.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
30 #include <unistd.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
31
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
32 #include "config.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
33 #include "mp_msg.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
34 #include "help_mp.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
35
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 18885
diff changeset
36 #include "stream/stream.h"
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
37 #include "demuxer.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
38 #include "stheader.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
39
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
40 // chunk types found in a FILM file
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
41 #define CHUNK_FILM mmioFOURCC('F', 'I', 'L', 'M')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
42 #define CHUNK_FDSC mmioFOURCC('F', 'D', 'S', 'C')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
43 #define CHUNK_STAB mmioFOURCC('S', 'T', 'A', 'B')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
44
25607
9d0b189ce1b2 Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents: 22605
diff changeset
45 typedef struct film_chunk_t
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
46 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
47 off_t chunk_offset;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
48 int chunk_size;
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
49 unsigned int syncinfo1;
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
50 unsigned int syncinfo2;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
51
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
52 float pts;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
53 } film_chunk_t;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
54
25607
9d0b189ce1b2 Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents: 22605
diff changeset
55 typedef struct film_data_t
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
56 {
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
57 unsigned int total_chunks;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
58 unsigned int current_chunk;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
59 film_chunk_t *chunks;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
60 unsigned int chunks_per_second;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
61 unsigned int film_version;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
62 } film_data_t;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
63
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
64 static void demux_seek_film(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags)
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
65 {
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
66 film_data_t *film_data = demuxer->priv;
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
67 int new_current_chunk=(flags&SEEK_ABSOLUTE)?0:film_data->current_chunk;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
68
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
69 if(flags&SEEK_FACTOR)
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
70 new_current_chunk += rel_seek_secs * film_data->total_chunks; // 0..1
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
71 else
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
72 new_current_chunk += rel_seek_secs * film_data->chunks_per_second; // secs
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
73
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
74
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17805
diff changeset
75 mp_msg(MSGT_DECVIDEO, MSGL_INFO,"current, total chunks = %d, %d; seek %5.3f sec, new chunk guess = %d\n",
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
76 film_data->current_chunk, film_data->total_chunks,
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
77 rel_seek_secs, new_current_chunk);
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
78
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
79 // check if the new chunk number is valid
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
80 if (new_current_chunk < 0)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
81 new_current_chunk = 0;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
82 if ((unsigned int)new_current_chunk > film_data->total_chunks)
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
83 new_current_chunk = film_data->total_chunks - 1;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
84
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
85 while (((film_data->chunks[new_current_chunk].syncinfo1 == 0xFFFFFFFF) ||
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
86 (film_data->chunks[new_current_chunk].syncinfo1 & 0x80000000)) &&
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
87 (new_current_chunk > 0))
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
88 new_current_chunk--;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
89
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
90 film_data->current_chunk = new_current_chunk;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
91
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17805
diff changeset
92 mp_msg(MSGT_DECVIDEO, MSGL_INFO," (flags = %X) actual new chunk = %d (syncinfo1 = %08X)\n",
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
93 flags, film_data->current_chunk, film_data->chunks[film_data->current_chunk].syncinfo1);
5439
bc20fe5676ff seeking fixed (variable fps videos needs to reset PTS after seeking)
arpi
parents: 5438
diff changeset
94 demuxer->video->pts=film_data->chunks[film_data->current_chunk].pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
95
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
96 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
97
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
98 // return value:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
99 // 0 = EOF or no stream found
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
100 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
101 static int demux_film_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
102 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
103 sh_video_t *sh_video = demuxer->video->sh;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
104 sh_audio_t *sh_audio = demuxer->audio->sh;
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
105 film_data_t *film_data = demuxer->priv;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
106 film_chunk_t film_chunk;
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
107 demux_packet_t* dp = NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
108
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
109 // see if the end has been reached
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
110 if (film_data->current_chunk >= film_data->total_chunks)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
111 return 0;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
112
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
113 film_chunk = film_data->chunks[film_data->current_chunk];
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
114
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
115 // position stream and fetch chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
116 stream_seek(demuxer->stream, film_chunk.chunk_offset);
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
117
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
118 // load the chunks manually (instead of using ds_read_packet()), since
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
119 // they require some adjustment
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
120 // (all ones in syncinfo1 indicates an audio chunk)
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
121 if (film_chunk.syncinfo1 == 0xFFFFFFFF)
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
122 {
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
123 int i;
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
124 if(demuxer->audio->id>=-1){ // audio not disabled
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
125 dp = new_demux_packet(film_chunk.chunk_size);
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
126 if (stream_read(demuxer->stream, dp->buffer, film_chunk.chunk_size) !=
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
127 film_chunk.chunk_size)
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
128 goto err_out;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
129 dp->pts = film_chunk.pts;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
130 dp->pos = film_chunk.chunk_offset;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
131 dp->flags = 0;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
132
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
133 // adjust the data before queuing it:
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
134 // 8-bit: signed -> unsigned
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
135 // 16-bit: big-endian -> little-endian
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
136 if (sh_audio->wf->wBitsPerSample == 8)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
137 for (i = 0; i < film_chunk.chunk_size; i++)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
138 dp->buffer[i] += 128;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
139 else
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
140 for (i = 0; i < film_chunk.chunk_size; i += 2)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
141 {
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
142 unsigned char byte_swap = dp->buffer[i];
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
143 dp->buffer[i] = dp->buffer[i + 1];
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
144 dp->buffer[i + 1] = byte_swap;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
145 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
146
15468
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
147 /* for SegaSaturn .cpk file, translate audio data if stereo */
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
148 if (sh_audio->wf->nChannels == 2) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
149 if (sh_audio->wf->wBitsPerSample == 8) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
150 unsigned char* tmp = dp->buffer;
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
151 unsigned char buf[film_chunk.chunk_size];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
152 for(i = 0; i < film_chunk.chunk_size/2; i++) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
153 buf[i*2] = tmp[i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
154 buf[i*2+1] = tmp[film_chunk.chunk_size/2+i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
155 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
156 memcpy( tmp, buf, film_chunk.chunk_size );
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
157 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
158 else {/* for 16bit */
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
159 unsigned short* tmp = dp->buffer;
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
160 unsigned short buf[film_chunk.chunk_size/2];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
161 for(i = 0; i < film_chunk.chunk_size/4; i++) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
162 buf[i*2] = tmp[i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
163 buf[i*2+1] = tmp[film_chunk.chunk_size/4+i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
164 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
165 memcpy( tmp, buf, film_chunk.chunk_size );
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
166 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
167 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
168
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
169 // append packet to DS stream
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
170 ds_add_packet(demuxer->audio, dp);
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
171 dp = NULL;
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
172 }
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
173 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
174 // if the demuxer is dealing with CVID data, deal with it a special way
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
175 else if (sh_video->format == mmioFOURCC('c', 'v', 'i', 'd'))
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
176 {
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
177 int length_fix_bytes = film_data->film_version ? 2 : 6;
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
178 int cvid_size = film_chunk.chunk_size - length_fix_bytes;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
179
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
180 // account for the fix bytes when allocating the buffer
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
181 dp = new_demux_packet(cvid_size);
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
182
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
183 // these CVID data chunks have a few extra bytes; skip them
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
184 if (stream_read(demuxer->stream, dp->buffer, 10) != 10)
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
185 goto err_out;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
186 stream_skip(demuxer->stream, length_fix_bytes);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
187
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
188 if (stream_read(demuxer->stream, dp->buffer + 10,
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
189 cvid_size - 10) != cvid_size - 10)
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
190 goto err_out;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
191
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
192 dp->pts = film_chunk.pts;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
193 dp->pos = film_chunk.chunk_offset;
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
194 dp->flags = (film_chunk.syncinfo1 & 0x80000000) ? 1 : 0;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
195
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
196 // fix the CVID chunk size
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
197 dp->buffer[1] = (cvid_size >> 16) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
198 dp->buffer[2] = (cvid_size >> 8) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
199 dp->buffer[3] = (cvid_size >> 0) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
200
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
201 // append packet to DS stream
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
202 ds_add_packet(demuxer->video, dp);
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
203 dp = NULL;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
204 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
205 else
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
206 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
207 ds_read_packet(demuxer->video, demuxer->stream, film_chunk.chunk_size,
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
208 film_chunk.pts,
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
209 film_chunk.chunk_offset, (film_chunk.syncinfo1 & 0x80000000) ? 1 : 0);
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
210 }
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
211 film_data->current_chunk++;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
212
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
213 return 1;
36532
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
214
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
215 err_out:
2398517e5bda film: Fix memory leaks in error cases.
reimar
parents: 35318
diff changeset
216 if (dp) free_demux_packet(dp);
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
217 return 0;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
218 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
219
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
220 static demuxer_t* demux_open_film(demuxer_t* demuxer)
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
221 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
222 sh_video_t *sh_video = NULL;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
223 sh_audio_t *sh_audio = NULL;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
224 film_chunk_t film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
225 int header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
226 unsigned int chunk_type;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
227 unsigned int chunk_size;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
228 unsigned int i;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
229 unsigned int video_format;
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
230 int audio_channels;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
231 int counting_chunks;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
232 unsigned int total_audio_bytes = 0;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
233
36533
80218ddb982f film: various small code improvements.
reimar
parents: 36532
diff changeset
234 film_data_t *film_data = calloc(1, sizeof(*film_data));
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
235
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
236 // go back to the beginning
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
237 stream_reset(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
238 stream_seek(demuxer->stream, 0);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
239
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
240 // read the master chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
241 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
242 // validate the chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
243 if (chunk_type != CHUNK_FILM)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
244 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
245 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not a FILM file\n");
17805
ff000b249bd9 Fix memory leak cid 176
rtognimp
parents: 17636
diff changeset
246 free(film_data);
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26299
diff changeset
247 return NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
248 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
249
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
250 // get the header size, which implicitly points past the header and
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
251 // to the start of the data
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
252 header_size = stream_read_dword(demuxer->stream);
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
253 film_data->film_version = stream_read_fourcc(demuxer->stream);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
254 demuxer->movi_start = header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
255 demuxer->movi_end = demuxer->stream->end_pos;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
256 header_size -= 16;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
257
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
258 mp_msg(MSGT_DEMUX, MSGL_HINT, "FILM version %.4s\n",
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 16175
diff changeset
259 (char *)&film_data->film_version);
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
260
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
261 // skip to where the next chunk should be
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
262 stream_skip(demuxer->stream, 4);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
263
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
264 // traverse through the header
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
265 while (header_size > 0)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
266 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
267 // fetch the chunk type and size
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
268 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
269 chunk_size = stream_read_dword(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
270 header_size -= chunk_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
271
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
272 switch (chunk_type)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
273 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
274 case CHUNK_FDSC:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
275 mp_msg(MSGT_DECVIDEO, MSGL_V, "parsing FDSC chunk\n");
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
276
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
277 // fetch the video codec fourcc to see if there's any video
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
278 video_format = stream_read_fourcc(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
279 if (video_format)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
280 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
281 // create and initialize the video stream header
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
282 sh_video = new_sh_video(demuxer, 0);
36800
f3c835ddce85 demuxers: ensure that stream ids are correctly initialized.
reimar
parents: 36533
diff changeset
283 demuxer->video->id = 0;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
284 demuxer->video->sh = sh_video;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
285
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
286 sh_video->format = video_format;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
287 sh_video->disp_h = stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
288 sh_video->disp_w = stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
289 mp_msg(MSGT_DECVIDEO, MSGL_V,
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
290 " FILM video: %d x %d\n", sh_video->disp_w,
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
291 sh_video->disp_h);
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
292 }
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
293 else
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
294 // skip height and width if no video
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
295 stream_skip(demuxer->stream, 8);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
296
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
297 if(demuxer->audio->id<-1){
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17805
diff changeset
298 mp_msg(MSGT_DECVIDEO, MSGL_INFO,"chunk size = 0x%X \n",chunk_size);
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
299 stream_skip(demuxer->stream, chunk_size-12-8);
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
300 break; // audio disabled (or no soundcard)
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
301 }
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
302
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
303 // skip over unknown byte, but only if file had non-NULL version
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
304 if (film_data->film_version)
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
305 stream_skip(demuxer->stream, 1);
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
306
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
307 // fetch the audio channels to see if there's any audio
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
308 // don't do this if the file is a quirky file with NULL version
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
309 if (film_data->film_version)
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
310 {
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
311 audio_channels = stream_read_char(demuxer->stream);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
312 if (audio_channels > 0)
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
313 {
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
314 // create and initialize the audio stream header
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 29263
diff changeset
315 sh_audio = new_sh_audio(demuxer, 0, NULL);
26299
4d56038ec730 Fix lots and lots of other demuxers broken by r26301
reimar
parents: 25883
diff changeset
316 demuxer->audio->id = 0;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
317 demuxer->audio->sh = sh_audio;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
318
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 31609
diff changeset
319 sh_audio->wf = malloc(sizeof(*sh_audio->wf));
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
320
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
321 // uncompressed PCM format
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
322 sh_audio->wf->wFormatTag = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
323 sh_audio->format = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
324 sh_audio->wf->nChannels = audio_channels;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
325 sh_audio->wf->wBitsPerSample = stream_read_char(demuxer->stream);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
326 stream_skip(demuxer->stream, 1); // skip unknown byte
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
327 sh_audio->wf->nSamplesPerSec = stream_read_word(demuxer->stream);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
328 sh_audio->wf->nAvgBytesPerSec =
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
329 sh_audio->wf->nSamplesPerSec * sh_audio->wf->wBitsPerSample
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
330 * sh_audio->wf->nChannels / 8;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
331 stream_skip(demuxer->stream, 6); // skip the rest of the unknown
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
332
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
333 mp_msg(MSGT_DECVIDEO, MSGL_V,
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
334 " FILM audio: %d channels, %d bits, %d Hz\n",
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
335 sh_audio->wf->nChannels, 8 * sh_audio->wf->wBitsPerSample,
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
336 sh_audio->wf->nSamplesPerSec);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
337 }
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
338 else
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
339 stream_skip(demuxer->stream, 10);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
340 }
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
341 else
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
342 {
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
343 // otherwise, make some assumptions about the audio
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
344
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
345 // create and initialize the audio stream header
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 29263
diff changeset
346 sh_audio = new_sh_audio(demuxer, 0, NULL);
36800
f3c835ddce85 demuxers: ensure that stream ids are correctly initialized.
reimar
parents: 36533
diff changeset
347 demuxer->audio->id = 0;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
348 demuxer->audio->sh = sh_audio;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
349
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 31609
diff changeset
350 sh_audio->wf = malloc(sizeof(*sh_audio->wf));
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
351
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
352 // uncompressed PCM format
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
353 sh_audio->wf->wFormatTag = 1;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
354 sh_audio->format = 1;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
355 sh_audio->wf->nChannels = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
356 sh_audio->wf->wBitsPerSample = 8;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
357 sh_audio->wf->nSamplesPerSec = 22050;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
358 sh_audio->wf->nAvgBytesPerSec =
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
359 sh_audio->wf->nSamplesPerSec * sh_audio->wf->wBitsPerSample
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
360 * sh_audio->wf->nChannels / 8;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
361
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
362 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
363 " FILM audio: %d channels, %d bits, %d Hz\n",
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
364 sh_audio->wf->nChannels, sh_audio->wf->wBitsPerSample,
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
365 sh_audio->wf->nSamplesPerSec);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
366 }
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
367 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
368
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
369 case CHUNK_STAB:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
370 mp_msg(MSGT_DECVIDEO, MSGL_V, "parsing STAB chunk\n");
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
371
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
372 if (sh_video)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
373 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
374 sh_video->fps = stream_read_dword(demuxer->stream);
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
375 sh_video->frametime = 1.0 / sh_video->fps;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
376 }
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
377
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
378 // fetch the number of chunks
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
379 film_data->total_chunks = stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
380 film_data->current_chunk = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
381 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
382 " STAB chunk contains %d chunks\n", film_data->total_chunks);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
383
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
384 // allocate enough entries for the chunk
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
385 film_data->chunks =
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18558
diff changeset
386 calloc(film_data->total_chunks, sizeof(film_chunk_t));
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
387
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
388 // build the chunk index
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
389 counting_chunks = 1;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
390 for (i = 0; i < film_data->total_chunks; i++)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
391 {
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
392 film_chunk = film_data->chunks[i];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
393 film_chunk.chunk_offset =
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
394 demuxer->movi_start + stream_read_dword(demuxer->stream);
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
395 film_chunk.chunk_size = stream_read_dword(demuxer->stream);
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
396 film_chunk.syncinfo1 = stream_read_dword(demuxer->stream);
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
397 film_chunk.syncinfo2 = stream_read_dword(demuxer->stream);
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
398
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
399 // count chunks for the purposes of seeking
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
400 if (counting_chunks)
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
401 {
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
402 // if we're counting chunks, always count an audio chunk
35313
2b211b058ee2 Avoid crash when parsing index for audio-only files.
reimar
parents: 35292
diff changeset
403 if (!sh_video || film_chunk.syncinfo1 == 0xFFFFFFFF)
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
404 film_data->chunks_per_second++;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
405 // if it's a video chunk, check if it's time to stop counting
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
406 else if ((film_chunk.syncinfo1 & 0x7FFFFFFF) >= sh_video->fps)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
407 counting_chunks = 0;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
408 else
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
409 film_data->chunks_per_second++;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
410 }
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
411
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
412 // precalculate PTS
35313
2b211b058ee2 Avoid crash when parsing index for audio-only files.
reimar
parents: 35292
diff changeset
413 if (!sh_video || film_chunk.syncinfo1 == 0xFFFFFFFF)
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
414 {
35318
249053c3da2b Use a more obvious condition.
reimar
parents: 35313
diff changeset
415 if(sh_audio)
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
416 film_chunk.pts =
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
417 (float)total_audio_bytes / (float)sh_audio->wf->nAvgBytesPerSec;
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
418 total_audio_bytes += film_chunk.chunk_size;
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
419 }
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
420 else
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
421 film_chunk.pts =
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
422 (film_chunk.syncinfo1 & 0x7FFFFFFF) / sh_video->fps;
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
423
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
424 film_data->chunks[i] = film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
425 }
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
426
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
427 // in some FILM files (notably '1.09'), the length of the FDSC chunk
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
428 // follows different rules
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
429 if (chunk_size == (film_data->total_chunks * 16))
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
430 header_size -= 16;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
431 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
432
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
433 default:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
434 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unrecognized FILM header chunk: %08X\n",
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
435 chunk_type);
35292
29be73f9a8ea Fix memleaks on error and remove useless "break".
reimar
parents: 32537
diff changeset
436 free(film_data->chunks);
29be73f9a8ea Fix memleaks on error and remove useless "break".
reimar
parents: 32537
diff changeset
437 free(film_data);
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26299
diff changeset
438 return NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
439 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
440 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
441
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
442 demuxer->priv = film_data;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
443
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
444 return demuxer;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
445 }
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
446
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
447 static void demux_close_film(demuxer_t* demuxer) {
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
448 film_data_t *film_data = demuxer->priv;
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
449
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
450 if(!film_data)
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
451 return;
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32105
diff changeset
452 free(film_data->chunks);
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
453 free(film_data);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
454
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
455 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
456
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
457 static int film_check_file(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
458 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
459 int signature=stream_read_fourcc(demuxer->stream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
460
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
461 // check for the FILM file magic number
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
462 if(signature==mmioFOURCC('F', 'I', 'L', 'M'))
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
463 return DEMUXER_TYPE_FILM;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
464
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
465 return 0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
466 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
467
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
468
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25607
diff changeset
469 const demuxer_desc_t demuxer_desc_film = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
470 "FILM/CPK demuxer for Sega Saturn CD-ROM games",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
471 "film",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
472 "FILM",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
473 "Mike Melanson",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
474 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
475 DEMUXER_TYPE_FILM,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
476 0, // unsafe autodetect (short signature)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
477 film_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
478 demux_film_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
479 demux_open_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
480 demux_close_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
481 demux_seek_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
482 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
483 };