annotate libmpdemux/demux_film.c @ 26096:e6a565ec1a3b

New S3 VIDIX driver. Provides support for S3 Trio and S3 Virge chipsets. This deprecates the old Savage driver that worked with latest chips only. (synchronized with vidix.sf.net r326 and r327)
author ben
date Fri, 29 Feb 2008 20:01:28 +0000
parents baf32110d3fc
children 4d56038ec730
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 /*
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
2 FILM file parser for the MPlayer program
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
3 by Mike Melanson
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
4
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
5 This demuxer handles FILM (a.k.a. CPK) files commonly found on
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
6 Sega Saturn CD-ROM games. FILM files have also been found on 3DO
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
7 games.
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
8
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
9 Details of the FILM file format can be found at:
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
10 http://www.pcisys.net/~melanson/codecs/
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
11 */
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
12
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
13 #include <stdio.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
14 #include <stdlib.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
15 #include <unistd.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
16
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
17 #include "config.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
18 #include "mp_msg.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
19 #include "help_mp.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
20
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 18885
diff changeset
21 #include "stream/stream.h"
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
22 #include "demuxer.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
23 #include "stheader.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
24
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
25 // chunk types found in a FILM file
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
26 #define CHUNK_FILM mmioFOURCC('F', 'I', 'L', 'M')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
27 #define CHUNK_FDSC mmioFOURCC('F', 'D', 'S', 'C')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
28 #define CHUNK_STAB mmioFOURCC('S', 'T', 'A', 'B')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
29
25607
9d0b189ce1b2 Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents: 22605
diff changeset
30 typedef struct film_chunk_t
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
31 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
32 off_t chunk_offset;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
33 int chunk_size;
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
34 unsigned int syncinfo1;
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
35 unsigned int syncinfo2;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
36
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
37 float pts;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
38 } film_chunk_t;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
39
25607
9d0b189ce1b2 Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents: 22605
diff changeset
40 typedef struct film_data_t
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
41 {
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
42 unsigned int total_chunks;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
43 unsigned int current_chunk;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
44 film_chunk_t *chunks;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
45 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
46 unsigned int film_version;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
47 } film_data_t;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
48
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
49 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
50 {
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
51 film_data_t *film_data = (film_data_t *)demuxer->priv;
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
52 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
53
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
54 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
55 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
56 else
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
57 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
58
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
59
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
60 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
61 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
62 rel_seek_secs, new_current_chunk);
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
63
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
64 // 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
65 if (new_current_chunk < 0)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
66 new_current_chunk = 0;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
67 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
68 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
69
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
70 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
71 (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
72 (new_current_chunk > 0))
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
73 new_current_chunk--;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
74
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
75 film_data->current_chunk = new_current_chunk;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
76
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
77 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
78 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
79 demuxer->video->pts=film_data->chunks[film_data->current_chunk].pts;
bc20fe5676ff seeking fixed (variable fps videos needs to reset PTS after seeking)
arpi
parents: 5438
diff changeset
80
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
81 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
82
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
83 // return value:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
84 // 0 = EOF or no stream found
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
85 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
86 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
87 {
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
88 int i;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
89 unsigned char byte_swap;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
90 int cvid_size;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
91 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
92 sh_audio_t *sh_audio = demuxer->audio->sh;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
93 film_data_t *film_data = (film_data_t *)demuxer->priv;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
94 film_chunk_t film_chunk;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
95 int length_fix_bytes;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
96 demux_packet_t* dp;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
97
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
98 // 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
99 if (film_data->current_chunk >= film_data->total_chunks)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
100 return 0;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
101
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
102 film_chunk = film_data->chunks[film_data->current_chunk];
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
103
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
104 // position stream and fetch chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
105 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
106
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
107 // 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
108 // they require some adjustment
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
109 // (all ones in syncinfo1 indicates an audio chunk)
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
110 if (film_chunk.syncinfo1 == 0xFFFFFFFF)
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
111 {
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
112 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
113 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
114 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
115 film_chunk.chunk_size)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
116 return 0;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
117 dp->pts = film_chunk.pts;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
118 dp->pos = film_chunk.chunk_offset;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
119 dp->flags = 0;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
120
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
121 // adjust the data before queuing it:
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
122 // 8-bit: signed -> unsigned
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
123 // 16-bit: big-endian -> little-endian
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
124 if (sh_audio->wf->wBitsPerSample == 8)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
125 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
126 dp->buffer[i] += 128;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
127 else
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
128 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
129 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
130 byte_swap = dp->buffer[i];
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
131 dp->buffer[i] = dp->buffer[i + 1];
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
132 dp->buffer[i + 1] = byte_swap;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
133 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
134
15468
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
135 /* for SegaSaturn .cpk file, translate audio data if stereo */
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
136 if (sh_audio->wf->nChannels == 2) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
137 if (sh_audio->wf->wBitsPerSample == 8) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
138 unsigned char* tmp = dp->buffer;
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
139 unsigned char buf[film_chunk.chunk_size];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
140 for(i = 0; i < film_chunk.chunk_size/2; i++) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
141 buf[i*2] = tmp[i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
142 buf[i*2+1] = tmp[film_chunk.chunk_size/2+i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
143 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
144 memcpy( tmp, buf, film_chunk.chunk_size );
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
145 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
146 else {/* for 16bit */
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
147 unsigned short* tmp = dp->buffer;
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
148 unsigned short buf[film_chunk.chunk_size/2];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
149 for(i = 0; i < film_chunk.chunk_size/4; i++) {
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
150 buf[i*2] = tmp[i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
151 buf[i*2+1] = tmp[film_chunk.chunk_size/4+i];
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
152 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
153 memcpy( tmp, buf, film_chunk.chunk_size );
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
154 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
155 }
bef6d46722ef Fix for stereo files
rtognimp
parents: 5810
diff changeset
156
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
157 // append packet to DS stream
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
158 ds_add_packet(demuxer->audio, dp);
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
159 }
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
160 }
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
161 else
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
162 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
163 // if the demuxer is dealing with CVID data, deal with it a special way
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
164 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
165 {
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
166 if (film_data->film_version)
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
167 length_fix_bytes = 2;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
168 else
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
169 length_fix_bytes = 6;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
170
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
171 // account for the fix bytes when allocating the buffer
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
172 dp = new_demux_packet(film_chunk.chunk_size - length_fix_bytes);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
173
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
174 // 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
175 if (stream_read(demuxer->stream, dp->buffer, 10) != 10)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
176 return 0;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
177 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
178
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
179 if (stream_read(demuxer->stream, dp->buffer + 10,
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
180 film_chunk.chunk_size - (10 + length_fix_bytes)) !=
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
181 (film_chunk.chunk_size - (10 + length_fix_bytes)))
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
182 return 0;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
183
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
184 dp->pts = film_chunk.pts;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
185 dp->pos = film_chunk.chunk_offset;
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
186 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
187
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
188 // fix the CVID chunk size
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
189 cvid_size = film_chunk.chunk_size - length_fix_bytes;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
190 dp->buffer[1] = (cvid_size >> 16) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
191 dp->buffer[2] = (cvid_size >> 8) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
192 dp->buffer[3] = (cvid_size >> 0) & 0xFF;
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
193
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
194 // append packet to DS stream
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
195 ds_add_packet(demuxer->video, dp);
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
196 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
197 else
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
198 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
199 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
200 film_chunk.pts,
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
201 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
202 }
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
203 }
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
204 film_data->current_chunk++;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
205
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
206 return 1;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
207 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
208
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
209 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
210 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
211 sh_video_t *sh_video = NULL;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
212 sh_audio_t *sh_audio = NULL;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
213 film_data_t *film_data;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
214 film_chunk_t film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
215 int header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
216 unsigned int chunk_type;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
217 unsigned int chunk_size;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
218 unsigned int i;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
219 unsigned int video_format;
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
220 int audio_channels;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
221 int counting_chunks;
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
222 unsigned int total_audio_bytes = 0;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
223
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18558
diff changeset
224 film_data = malloc(sizeof(film_data_t));
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
225 film_data->total_chunks = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
226 film_data->current_chunk = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
227 film_data->chunks = NULL;
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
228 film_data->chunks_per_second = 0;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
229
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
230 // go back to the beginning
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
231 stream_reset(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
232 stream_seek(demuxer->stream, 0);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
233
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
234 // read the master chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
235 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
236 // validate the chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
237 if (chunk_type != CHUNK_FILM)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
238 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
239 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not a FILM file\n");
17805
ff000b249bd9 Fix memory leak cid 176
rtognimp
parents: 17636
diff changeset
240 free(film_data);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
241 return(NULL);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
242 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
243
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
244 // get the header size, which implicitly points past the header and
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
245 // to the start of the data
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
246 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
247 film_data->film_version = stream_read_fourcc(demuxer->stream);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
248 demuxer->movi_start = header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
249 demuxer->movi_end = demuxer->stream->end_pos;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
250 header_size -= 16;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
251
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
252 mp_msg(MSGT_DEMUX, MSGL_HINT, "FILM version %.4s\n",
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 16175
diff changeset
253 (char *)&film_data->film_version);
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
254
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
255 // 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
256 stream_skip(demuxer->stream, 4);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
257
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
258 // traverse through the header
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
259 while (header_size > 0)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
260 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
261 // fetch the chunk type and size
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
262 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
263 chunk_size = stream_read_dword(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
264 header_size -= chunk_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
265
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
266 switch (chunk_type)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
267 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
268 case CHUNK_FDSC:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
269 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
270
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
271 // 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
272 video_format = stream_read_fourcc(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
273 if (video_format)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
274 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
275 // create and initialize the video stream header
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
276 sh_video = new_sh_video(demuxer, 0);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
277 demuxer->video->sh = sh_video;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
278 sh_video->ds = demuxer->video;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
279
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
280 sh_video->format = video_format;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
281 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
282 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
283 mp_msg(MSGT_DECVIDEO, MSGL_V,
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
284 " 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
285 sh_video->disp_h);
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
286 }
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
287 else
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
288 // 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
289 stream_skip(demuxer->stream, 8);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
290
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
291 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
292 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
293 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
294 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
295 }
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
296
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
297 // 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
298 if (film_data->film_version)
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
299 stream_skip(demuxer->stream, 1);
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
300
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
301 // 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
302 // 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
303 if (film_data->film_version)
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
304 {
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
305 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
306 if (audio_channels > 0)
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
307 {
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
308 // create and initialize the audio stream header
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
309 sh_audio = new_sh_audio(demuxer, 0);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
310 demuxer->audio->sh = sh_audio;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
311 sh_audio->ds = demuxer->audio;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
312
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18558
diff changeset
313 sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
314
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
315 // uncompressed PCM format
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
316 sh_audio->wf->wFormatTag = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
317 sh_audio->format = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
318 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
319 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
320 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
321 sh_audio->wf->nSamplesPerSec = stream_read_word(demuxer->stream);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
322 sh_audio->wf->nAvgBytesPerSec =
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
323 sh_audio->wf->nSamplesPerSec * sh_audio->wf->wBitsPerSample
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
324 * sh_audio->wf->nChannels / 8;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
325 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
326
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
327 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
328 " FILM audio: %d channels, %d bits, %d Hz\n",
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
329 sh_audio->wf->nChannels, 8 * sh_audio->wf->wBitsPerSample,
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
330 sh_audio->wf->nSamplesPerSec);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
331 }
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
332 else
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
333 stream_skip(demuxer->stream, 10);
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
334 }
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
335 else
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
336 {
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
337 // 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
338
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
339 // create and initialize the audio stream header
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
340 sh_audio = new_sh_audio(demuxer, 0);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
341 demuxer->audio->sh = sh_audio;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
342 sh_audio->ds = demuxer->audio;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
343
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18558
diff changeset
344 sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
345
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
346 // uncompressed PCM format
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
347 sh_audio->wf->wFormatTag = 1;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
348 sh_audio->format = 1;
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
349 sh_audio->wf->nChannels = 1;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
350 sh_audio->wf->wBitsPerSample = 8;
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
351 sh_audio->wf->nSamplesPerSec = 22050;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
352 sh_audio->wf->nAvgBytesPerSec =
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
353 sh_audio->wf->nSamplesPerSec * sh_audio->wf->wBitsPerSample
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
354 * sh_audio->wf->nChannels / 8;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
355
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
356 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
357 " FILM audio: %d channels, %d bits, %d Hz\n",
5413
2a449fba2049 fixed to be able to handle extra-quirky .film files on Lemmings 3DO
melanson
parents: 5181
diff changeset
358 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
359 sh_audio->wf->nSamplesPerSec);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
360 }
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
361 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
362
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
363 case CHUNK_STAB:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
364 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
365
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
366 if (sh_video)
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
367 {
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
368 sh_video->fps = stream_read_dword(demuxer->stream);
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
369 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
370 }
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
371
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
372 // fetch the number of chunks
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
373 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
374 film_data->current_chunk = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
375 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
376 " STAB chunk contains %d chunks\n", film_data->total_chunks);
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 // allocate enough entries for the chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
379 film_data->chunks =
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18558
diff changeset
380 calloc(film_data->total_chunks, sizeof(film_chunk_t));
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
381
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
382 // build the chunk index
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
383 counting_chunks = 1;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
384 for (i = 0; i < film_data->total_chunks; i++)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
385 {
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
386 film_chunk = film_data->chunks[i];
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
387 film_chunk.chunk_offset =
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
388 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
389 film_chunk.chunk_size = stream_read_dword(demuxer->stream);
5143
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
390 film_chunk.syncinfo1 = stream_read_dword(demuxer->stream);
3958674b696b added proper PTS support for FILM demuxer
melanson
parents: 4628
diff changeset
391 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
392
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
393 // 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
394 if (counting_chunks)
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
395 {
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
396 // if we're counting chunks, always count an audio chunk
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
397 if (film_chunk.syncinfo1 == 0xFFFFFFFF)
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
398 film_data->chunks_per_second++;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
399 // 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
400 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
401 counting_chunks = 0;
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
402 else
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
403 film_data->chunks_per_second++;
4628
1504901deed8 Fixed FILM demuxer so that it now plays (my) FILM files
melanson
parents: 4564
diff changeset
404 }
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
405
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
406 // precalculate PTS
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
407 if (film_chunk.syncinfo1 == 0xFFFFFFFF)
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
408 {
5438
607d437c1d9d fixed new_chunk calculation at seeking (seeking not work yet) and added -nosound support
arpi
parents: 5413
diff changeset
409 if(demuxer->audio->id>=-1)
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
410 film_chunk.pts =
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
411 (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
412 total_audio_bytes += film_chunk.chunk_size;
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
413 }
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
414 else
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
415 film_chunk.pts =
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
416 (film_chunk.syncinfo1 & 0x7FFFFFFF) / sh_video->fps;
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
417
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
418 film_data->chunks[i] = film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
419 }
5157
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
420
5181
81ef0f0b285f added PTS for audio, but seeking still doesn't work
melanson
parents: 5157
diff changeset
421 // 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
422 // follows different rules
f67b321e1eda FILM demuxer is leaner, meaner, and cleaner, also with proper bailout on
melanson
parents: 5143
diff changeset
423 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
424 header_size -= 16;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
425 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
426
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
427 default:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
428 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unrecognized FILM header chunk: %08X\n",
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
429 chunk_type);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
430 return(NULL);
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 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
434
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
435 demuxer->priv = film_data;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
436
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
437 return demuxer;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
438 }
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
439
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
440 static void demux_close_film(demuxer_t* demuxer) {
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
441 film_data_t *film_data = demuxer->priv;
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
442
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
443 if(!film_data)
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
444 return;
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
445 if(film_data->chunks)
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
446 free(film_data->chunks);
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
447 free(film_data);
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
448
8a357300d0ec Added demuxer uninit
albeu
parents: 5439
diff changeset
449 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
450
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
451 static int film_check_file(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
452 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
453 int signature=stream_read_fourcc(demuxer->stream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
454
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
455 // check for the FILM file magic number
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
456 if(signature==mmioFOURCC('F', 'I', 'L', 'M'))
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
457 return DEMUXER_TYPE_FILM;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
458
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
459 return 0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
460 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
461
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
462
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25607
diff changeset
463 const demuxer_desc_t demuxer_desc_film = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
464 "FILM/CPK demuxer for Sega Saturn CD-ROM games",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
465 "film",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
466 "FILM",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
467 "Mike Melanson",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
468 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
469 DEMUXER_TYPE_FILM,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
470 0, // unsafe autodetect (short signature)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
471 film_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
472 demux_film_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
473 demux_open_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
474 demux_close_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
475 demux_seek_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
476 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 15468
diff changeset
477 };