Mercurial > mplayer.hg
annotate libmpdemux/demux_film.c @ 26234:f0788169e503
Ignore if we fail to get disc key, fixes playback of one of my DVDs which
claims to be scrambled but actually is not, and always allows to
fallback to cached keys.
author | reimar |
---|---|
date | Fri, 21 Mar 2008 12:31:47 +0000 |
parents | baf32110d3fc |
children | 4d56038ec730 |
rev | line source |
---|---|
4189 | 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 | 11 */ |
12 | |
13 #include <stdio.h> | |
14 #include <stdlib.h> | |
15 #include <unistd.h> | |
16 | |
17 #include "config.h" | |
18 #include "mp_msg.h" | |
19 #include "help_mp.h" | |
20 | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
18885
diff
changeset
|
21 #include "stream/stream.h" |
4189 | 22 #include "demuxer.h" |
23 #include "stheader.h" | |
24 | |
25 // chunk types found in a FILM file | |
26 #define CHUNK_FILM mmioFOURCC('F', 'I', 'L', 'M') | |
27 #define CHUNK_FDSC mmioFOURCC('F', 'D', 'S', 'C') | |
28 #define CHUNK_STAB mmioFOURCC('S', 'T', 'A', 'B') | |
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 | 34 unsigned int syncinfo1; |
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 | 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 | 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 | 81 } |
82 | |
83 // return value: | |
84 // 0 = EOF or no stream found | |
85 // 1 = successfully read a packet | |
16175 | 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 | 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 | 97 |
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 | 100 return 0; |
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 | 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 | 109 // (all ones in syncinfo1 indicates an audio chunk) |
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 | 135 /* for SegaSaturn .cpk file, translate audio data if stereo */ |
136 if (sh_audio->wf->nChannels == 2) { | |
137 if (sh_audio->wf->wBitsPerSample == 8) { | |
138 unsigned char* tmp = dp->buffer; | |
139 unsigned char buf[film_chunk.chunk_size]; | |
140 for(i = 0; i < film_chunk.chunk_size/2; i++) { | |
141 buf[i*2] = tmp[i]; | |
142 buf[i*2+1] = tmp[film_chunk.chunk_size/2+i]; | |
143 } | |
144 memcpy( tmp, buf, film_chunk.chunk_size ); | |
145 } | |
146 else {/* for 16bit */ | |
147 unsigned short* tmp = dp->buffer; | |
148 unsigned short buf[film_chunk.chunk_size/2]; | |
149 for(i = 0; i < film_chunk.chunk_size/4; i++) { | |
150 buf[i*2] = tmp[i]; | |
151 buf[i*2+1] = tmp[film_chunk.chunk_size/4+i]; | |
152 } | |
153 memcpy( tmp, buf, film_chunk.chunk_size ); | |
154 } | |
155 } | |
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 | 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 | 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 | 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 | 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 | 206 return 1; |
207 } | |
208 | |
16175 | 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 | 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 | 215 int header_size; |
216 unsigned int chunk_type; | |
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 | 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 | 229 |
230 // go back to the beginning | |
231 stream_reset(demuxer->stream); | |
232 stream_seek(demuxer->stream, 0); | |
233 | |
234 // read the master chunk type | |
235 chunk_type = stream_read_fourcc(demuxer->stream); | |
236 // validate the chunk type | |
237 if (chunk_type != CHUNK_FILM) | |
238 { | |
239 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not a FILM file\n"); | |
17805 | 240 free(film_data); |
4189 | 241 return(NULL); |
242 } | |
243 | |
244 // get the header size, which implicitly points past the header and | |
245 // to the start of the data | |
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 | 248 demuxer->movi_start = header_size; |
249 demuxer->movi_end = demuxer->stream->end_pos; | |
250 header_size -= 16; | |
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 | 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 | 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 | 257 |
258 // traverse through the header | |
259 while (header_size > 0) | |
260 { | |
261 // fetch the chunk type and size | |
262 chunk_type = stream_read_fourcc(demuxer->stream); | |
263 chunk_size = stream_read_dword(demuxer->stream); | |
264 header_size -= chunk_size; | |
265 | |
266 switch (chunk_type) | |
267 { | |
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 | 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 | 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 | 361 break; |
362 | |
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 | 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 | 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 | 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 | 380 calloc(film_data->total_chunks, sizeof(film_chunk_t)); |
4189 | 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 | 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 | 390 film_chunk.syncinfo1 = stream_read_dword(demuxer->stream); |
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 | 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 | 425 break; |
426 | |
427 default: | |
428 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unrecognized FILM header chunk: %08X\n", | |
429 chunk_type); | |
430 return(NULL); | |
431 break; | |
432 } | |
433 } | |
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 | 436 |
437 return demuxer; | |
438 } | |
5810 | 439 |
16175 | 440 static void demux_close_film(demuxer_t* demuxer) { |
5810 | 441 film_data_t *film_data = demuxer->priv; |
442 | |
443 if(!film_data) | |
444 return; | |
445 if(film_data->chunks) | |
446 free(film_data->chunks); | |
447 free(film_data); | |
448 | |
449 } | |
16175 | 450 |
451 static int film_check_file(demuxer_t* demuxer) | |
452 { | |
453 int signature=stream_read_fourcc(demuxer->stream); | |
454 | |
455 // check for the FILM file magic number | |
456 if(signature==mmioFOURCC('F', 'I', 'L', 'M')) | |
457 return DEMUXER_TYPE_FILM; | |
458 | |
459 return 0; | |
460 } | |
461 | |
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 | 464 "FILM/CPK demuxer for Sega Saturn CD-ROM games", |
465 "film", | |
466 "FILM", | |
467 "Mike Melanson", | |
468 "", | |
469 DEMUXER_TYPE_FILM, | |
470 0, // unsafe autodetect (short signature) | |
471 film_check_file, | |
472 demux_film_fill_buffer, | |
473 demux_open_film, | |
474 demux_close_film, | |
475 demux_seek_film, | |
476 NULL | |
477 }; |