annotate libmpdemux/demux_film.c @ 4564:5e1221d4655e

completely reworked FILM demuxer to support both audio and video...neither of which work yet (CVID video and uncompressed audio)...but the demuxer is working well now
author melanson
date Thu, 07 Feb 2002 05:55:29 +0000
parents 63baf6de03e1
children 1504901deed8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
1 /*
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
2 FILM file parser for the MPlayer program
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
3 by Mike Melanson
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
4 */
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
5
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
6 #include <stdio.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
7 #include <stdlib.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
8 #include <unistd.h>
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
9
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
10 #include "config.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
11 #include "mp_msg.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
12 #include "help_mp.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
13
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
14 #include "stream.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
15 #include "demuxer.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
16 #include "stheader.h"
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
17
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
18 // chunk types found in a FILM file
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
19 #define CHUNK_FILM mmioFOURCC('F', 'I', 'L', 'M')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
20 #define CHUNK_FDSC mmioFOURCC('F', 'D', 'S', 'C')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
21 #define CHUNK_STAB mmioFOURCC('S', 'T', 'A', 'B')
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
22
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
23 typedef struct _film_chunk_t
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
24 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
25 off_t chunk_offset;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
26 int chunk_size;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
27
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
28 unsigned int flags1;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
29 unsigned int flags2;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
30
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
31 unsigned int video_chunk_number; // in the case of a video chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
32 unsigned int running_audio_sample_count; // for an audio chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
33 } film_chunk_t;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
34
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
35 typedef struct _film_data_t
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
36 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
37 int total_chunks;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
38 int current_chunk;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
39 int total_video_chunks;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
40 int total_audio_sample_count;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
41 film_chunk_t *chunks;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
42 } film_data_t;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
43
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
44 #if 0
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
45 void demux_seek_film(demuxer_t *demuxer,float rel_seek_secs,int flags)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
46 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
47 film_frames_t *frames = (film_frames_t *)demuxer->priv;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
48 sh_video_t *sh_video = demuxer->video->sh;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
49 int newpos=(flags&1)?0:frames->current_frame;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
50 if(flags&2){
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
51 // float 0..1
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
52 newpos+=rel_seek_secs*frames->num_frames;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
53 } else {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
54 // secs
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
55 newpos+=rel_seek_secs*sh_video->fps;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
56 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
57 if(newpos<0) newpos=0; else
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
58 if(newpos>frames->num_frames) newpos=frames->num_frames;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
59 frames->current_frame=newpos;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
60 }
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
61 #endif
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
62
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
63 // return value:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
64 // 0 = EOF or no stream found
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
65 // 1 = successfully read a packet
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
66 int demux_film_fill_buffer(demuxer_t *demuxer)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
67 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
68 sh_video_t *sh_video = demuxer->video->sh;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
69 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
70 film_chunk_t film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
71
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
72 // 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
73 if (film_data->current_chunk >= film_data->total_chunks)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
74 return 0;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
75
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
76 film_chunk = film_data->chunks[film_data->current_chunk];
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
77
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
78 // position stream and fetch chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
79 stream_seek(demuxer->stream, film_chunk.chunk_offset);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
80 if (film_chunk.flags1 == 0xFFFFFFFF)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
81 ds_read_packet(demuxer->audio, demuxer->stream, film_chunk.chunk_size,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
82 0, /* pts */
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
83 film_chunk.chunk_offset, 0);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
84 else
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
85 ds_read_packet(demuxer->video, demuxer->stream, film_chunk.chunk_size,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
86 film_chunk.video_chunk_number / sh_video->fps,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
87 film_chunk.chunk_offset, 0);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
88
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
89 film_data->current_chunk++;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
90 return 1;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
91 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
92
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
93 demuxer_t* demux_open_film(demuxer_t* demuxer)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
94 {
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
95 sh_video_t *sh_video = NULL;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
96 sh_audio_t *sh_audio = NULL;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
97 film_data_t *film_data;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
98 film_chunk_t film_chunk;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
99 int header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
100 unsigned int chunk_type;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
101 unsigned int chunk_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
102 int i;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
103 unsigned int video_format;
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
104
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
105 int largest_audio_chunk = 0;
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
106 int audio_channels;
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
107
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
108 film_data = (film_data_t *)malloc(sizeof(film_data_t));
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
109 film_data->total_chunks = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
110 film_data->current_chunk = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
111 film_data->total_video_chunks = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
112 film_data->chunks = NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
113
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
114 // go back to the beginning
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
115 stream_reset(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
116 stream_seek(demuxer->stream, 0);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
117
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
118 // read the master chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
119 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
120 // validate the chunk type
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
121 if (chunk_type != CHUNK_FILM)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
122 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
123 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not a FILM file\n");
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
124 return(NULL);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
125 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
126
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
127 // get the header size, which implicitly points past the header and
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
128 // to the start of the data
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
129 header_size = stream_read_dword(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
130 demuxer->movi_start = header_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
131 demuxer->movi_end = demuxer->stream->end_pos;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
132 header_size -= 16;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
133
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
134 // skip to where the next chunk should be
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
135 stream_skip(demuxer->stream, 8);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
136
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
137 // traverse through the header
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
138 while (header_size > 0)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
139 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
140 // fetch the chunk type and size
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
141 chunk_type = stream_read_fourcc(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
142 chunk_size = stream_read_dword(demuxer->stream);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
143 header_size -= chunk_size;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
144
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
145 switch (chunk_type)
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
146 {
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
147 case CHUNK_FDSC:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
148 mp_msg(MSGT_DECVIDEO, MSGL_V, "parsing FDSC chunk\n");
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
149 // 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
150 video_format = stream_read_fourcc(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
151 if (video_format)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
152 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
153 // create and initialize the video stream header
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
154 sh_video = new_sh_video(demuxer, 0);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
155 demuxer->video->sh = sh_video;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
156 sh_video->ds = demuxer->video;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
157
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
158 sh_video->format = video_format;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
159 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
160 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
161 sh_video->fps = stream_read_char(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
162 sh_video->frametime = 1/sh_video->fps;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
163 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
164 " FILM video: %d x %d, %f fps\n", sh_video->disp_w,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
165 sh_video->disp_h, sh_video->fps);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
166 }
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
167 else
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
168 stream_skip(demuxer->stream, 9);
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
169
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
170 // fetch the audio channels to see if there's any audio
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
171 audio_channels = stream_read_char(demuxer->stream);
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
172 if (audio_channels > 0)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
173 {
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
174 // create and initialize the audio stream header
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
175 sh_audio = new_sh_audio(demuxer, 0);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
176 demuxer->audio->sh = sh_audio;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
177 sh_audio->ds = demuxer->audio;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
178
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
179 // go through the bother of making a WAVEFORMATEX structure
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
180 sh_audio->wf = (WAVEFORMATEX *)malloc(sizeof(WAVEFORMATEX));
4226
63baf6de03e1 made a little more headway but it still doesn't work properly
melanson
parents: 4189
diff changeset
181
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
182 // uncompressed PCM format
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
183 sh_audio->wf->wFormatTag = 1;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
184 sh_audio->format = 1;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
185 sh_audio->wf->nChannels = audio_channels;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
186 sh_audio->wf->wBitsPerSample = stream_read_char(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
187 stream_skip(demuxer->stream, 1); // skip unknown byte
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
188 sh_audio->wf->nSamplesPerSec = stream_read_word(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
189 sh_audio->wf->nAvgBytesPerSec =
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
190 sh_audio->wf->nSamplesPerSec * sh_audio->wf->wBitsPerSample / 8;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
191 stream_skip(demuxer->stream, 6); // skip the rest of the unknown
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
192
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
193 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
194 " FILM audio: %d channels, %d bits, %d Hz\n",
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
195 sh_audio->wf->nChannels, 8 * sh_audio->wf->wBitsPerSample,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
196 sh_audio->wf->nSamplesPerSec);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
197 }
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
198 else
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
199 stream_skip(demuxer->stream, 10);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
200 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
201
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
202 case CHUNK_STAB:
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
203 mp_msg(MSGT_DECVIDEO, MSGL_V, "parsing STAB chunk\n");
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
204 // skip unknown dword
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
205 stream_skip(demuxer->stream, 4);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
206
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
207 // fetch the number of chunks
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
208 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
209 film_data->current_chunk = 0;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
210 mp_msg(MSGT_DECVIDEO, MSGL_V,
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
211 " STAB chunk contains %d chunks\n", film_data->total_chunks);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
212
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
213 // allocate enough entries for the chunk
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
214 film_data->chunks =
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
215 (film_chunk_t *)malloc(film_data->total_chunks * sizeof(film_chunk_t));
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
216
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
217 // build the chunk index
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
218 for (i = 0; i < film_data->total_chunks; i++)
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
219 {
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
220 film_chunk = film_data->chunks[i];
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
221 film_chunk.chunk_offset =
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
222 demuxer->movi_start + stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
223 film_chunk.chunk_size = stream_read_dword(demuxer->stream) - 8;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
224 film_chunk.flags1 = stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
225 film_chunk.flags2 = stream_read_dword(demuxer->stream);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
226 film_data->chunks[i] = film_chunk;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
227
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
228 // audio housekeeping
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
229 if ((film_chunk.flags1 == 0xFFFFFFFF) &&
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
230 (film_chunk.chunk_size > largest_audio_chunk))
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
231 largest_audio_chunk = film_chunk.chunk_size;
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
232 film_data->total_audio_sample_count +=
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
233 (chunk_size / sh_audio->wf->nChannels);
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
234
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
235 // video housekeeping
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
236 if (film_chunk.flags1 != 0xFFFFFFFF)
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
237 film_chunk.video_chunk_number =
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
238 film_data->total_video_chunks++;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
239 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
240 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
241
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
242 default:
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
243 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unrecognized FILM header chunk: %08X\n",
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
244 chunk_type);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
245 return(NULL);
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
246 break;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
247 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
248 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
249
4564
5e1221d4655e completely reworked FILM demuxer to support both audio and video...neither
melanson
parents: 4226
diff changeset
250 demuxer->priv = film_data;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
251
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
252 return demuxer;
6871d97e4261 initial support for FILM file demuxing
melanson
parents:
diff changeset
253 }