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