annotate libmpdemux/demux_real.c @ 3788:d554b5b33d76

improved audio codec detection
author alex
date Thu, 27 Dec 2001 10:15:13 +0000
parents 026ccd3dc489
children 15745f11e717
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
1 /*
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
2 Real parser & demuxer
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
3
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
4 (C) Alex Beregszaszi <alex@naxine.org>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
5
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
6 Based on FFmpeg's libav/rm.c.
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
7 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
8
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
9 /*
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
10 Some codecs for Real (from Mike Melanson):
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
11
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
12 RV10: As has been mentioned, H.263-based; not an unreasonable guess
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
13 RV20: RealVideo 2.0, nothing known
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
14 RV30: RealVideo 3.0,nothing known, but I don't believe I've ever seen any
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
15 media encoded with it
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
16 DNET: apparently one of their original audio codecs, to be used with music
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
17 SIPR: SiprNet, based on ACELP, and is great for compressing voice
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
18 COKR(?): Cooker, the fabled G2 audio codec
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
19 */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
20
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
21 #include <stdio.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
22 #include <stdlib.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
23 #include <unistd.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
24
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
25 #include "config.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
26 #include "mp_msg.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
27 #include "help_mp.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
28
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
29 #include "stream.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
30 #include "demuxer.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
31 #include "stheader.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
32 #include "bswap.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
33
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
34 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
35
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
36 #define MAX_STREAMS 10
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
37
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
38 typedef struct {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
39 int num_of_packets;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
40 int last_a_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
41 int a_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
42 int last_v_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
43 int v_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
44 } real_priv_t;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
45
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
46 static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
47 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
48 int len, i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
49 char *q;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
50
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
51 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
52 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
53 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
54 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
55 #if 1
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
56 q = buf;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
57 for (i = 0; i < len; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
58 if (i < (buf_size - 1))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
59 *q++ = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
60 *q = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
61 #else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
62 stream_read(demuxer->stream, buf, buf_size);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
63 #endif
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
64 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
65
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
66 static void skip_str(int isbyte, demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
67 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
68 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
69
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
70 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
71 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
72 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
73 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
74
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
75 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
76
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
77 printf("skip_str: %d bytes skipped\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
78 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
79
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
80 int real_check_file(demuxer_t* demuxer){
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
81 real_priv_t *priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
82 int c;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
83
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
84 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
85
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
86 c = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
87 if (c == -256)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
88 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
89 if (c != MKTAG('.', 'R', 'M', 'F'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
90 return 0; /* bad magic */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
91
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
92 priv = malloc(sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
93 memset(priv, 0, sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
94 demuxer->priv = priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
95
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
96 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
97 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
98
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
99 // return value:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
100 // 0 = EOF or no stream found
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
101 // 1 = successfully read a packet
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
102 int demux_real_fill_buffer(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
103 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
104 real_priv_t *priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
105 demux_stream_t *ds = NULL;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
106 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
107 int timestamp;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
108 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
109 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
110
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
111 // printf("num_of_packets: %d\n", priv->num_of_packets);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
112
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
113 loop:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
114 if (priv->num_of_packets == 0)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
115 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
116 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
117 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
118 if (len == -256) /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
119 return 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
120 if (len < 12)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
121 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
122 printf("bad packet len (%d)\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
123 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
124 goto loop;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
125 // return 0; /* bad packet */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
126 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
127 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
128 timestamp = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
129
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
130 // printf("packet: len: %d, stream_id: %d, timestamp: %d\n",
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
131 // len, stream_id, timestamp);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
132
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
133 stream_skip(demuxer->stream, 1); /* reserved */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
134 stream_skip(demuxer->stream, 1); /* flags */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
135
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
136 priv->num_of_packets--;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
137 len -= 12;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
138
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
139 /* check if stream_id is audio stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
140 for (i = 0; i < priv->last_a_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
141 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
142 if (priv->a_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
143 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
144 // printf("packet is audio (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
145 ds = demuxer->audio; /* FIXME */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
146 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
147 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
148 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
149 /* check if stream_id is video stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
150 for (i = 0; i < priv->last_v_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
151 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
152 if (priv->v_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
153 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
154 // printf("packet is video (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
155 ds = demuxer->video; /* FIXME */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
156 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
157 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
158 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
159
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
160 /* id not found */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
161 if (ds == NULL)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
162 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
163 printf("unknown stream id (%d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
164 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
165 goto loop;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
166 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
167
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
168 demuxer->filepos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
169 ds_read_packet(ds, demuxer->stream, len, timestamp/90000.0f, demuxer->filepos, 0);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
170
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
171 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
172 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
173
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
174 void demux_open_real(demuxer_t* demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
175 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
176 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
177 int num_of_headers;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
178 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
179
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
180 stream_skip(demuxer->stream, 4); /* header size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
181 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
182 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
183 num_of_headers = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
184 // stream_skip(demuxer->stream, 4); /* number of headers */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
185
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
186 /* parse chunks */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
187 for (i = 1; i < num_of_headers; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
188 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
189 int chunk, chunk_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
190
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
191 chunk = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
192 chunk_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
193
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
194 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
195
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
196 if (chunk_size < 10)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
197 goto fail;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
198
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
199 printf("Chunk: %.4s (size: %d)\n",
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
200 (char *)&chunk, chunk_size);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
201
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
202 switch(chunk)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
203 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
204 case MKTAG('P', 'R', 'O', 'P'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
205 printf("Properties chunk\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
206 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
207 stream_skip(demuxer->stream, 4); /* avg bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
208 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
209 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
210 stream_skip(demuxer->stream, 4); /* nb packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
211 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
212 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
213 stream_skip(demuxer->stream, 4); /* index offset */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
214 stream_skip(demuxer->stream, 4); /* data offset */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
215 stream_skip(demuxer->stream, 2); /* nb streams */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
216 stream_skip(demuxer->stream, 2); /* flags */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
217 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
218 case MKTAG('C', 'O', 'N', 'T'):
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
219 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
220 char *buf;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
221 int len;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
222
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
223 printf("Broadcasting informations (title, author, copyright, comment)\n");
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
224
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
225 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
226 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
227 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
228 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
229 stream_read(demuxer->stream, buf, len);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
230 demux_info_add(demuxer, "name", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
231 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
232 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
233
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
234 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
235 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
236 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
237 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
238 stream_read(demuxer->stream, buf, len);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
239 demux_info_add(demuxer, "author", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
240 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
241 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
242
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
243 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
244 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
245 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
246 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
247 stream_read(demuxer->stream, buf, len);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
248 demux_info_add(demuxer, "copyright", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
249 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
250 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
251
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
252 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
253 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
254 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
255 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
256 stream_read(demuxer->stream, buf, len);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
257 demux_info_add(demuxer, "comment", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
258 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
259 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
260
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
261 // skip_str(0, demuxer); /* title */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
262 // skip_str(0, demuxer); /* author */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
263 // skip_str(0, demuxer); /* copyright */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
264 // skip_str(0, demuxer); /* comment */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
265 break;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
266 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
267 case MKTAG('M', 'D', 'P', 'R'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
268 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
269 /* new stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
270 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
271 int bitrate;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
272 int codec_data_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
273 int codec_pos;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
274 int v;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
275
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
276 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
277 printf("Found new stream (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
278
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
279 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
280 bitrate = stream_read_dword(demuxer->stream); /* bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
281 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
282 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
283 stream_skip(demuxer->stream, 4); /* start time */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
284 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
285 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
286
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
287 skip_str(1, demuxer); /* stream description */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
288 skip_str(1, demuxer); /* mimetype */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
289
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
290 codec_data_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
291 codec_pos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
292
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
293 v = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
294 if (v == MKTAG(0xfd, 'a', 'r', '.')) /* audio header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
295 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
296 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
297
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
298 printf("Found audio stream!\n");
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
299 // printf("pos: %x\n", stream_tell(demuxer->stream));
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
300 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
301 stream_skip(demuxer->stream, 2);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
302 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
303 stream_skip(demuxer->stream, 4);
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
304 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
305 stream_skip(demuxer->stream, 4); /* header size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
306 stream_skip(demuxer->stream, 2); /* add codec info */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
307 stream_skip(demuxer->stream, 4); /* coded frame size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
308 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
309 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
310 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
311 stream_skip(demuxer->stream, 2); /* 1 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
312 stream_skip(demuxer->stream, 2); /* coded frame size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
313 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
314
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
315 sh->samplerate = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
316 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
317 sh->channels = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
318
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
319 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
320 char buf[128];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
321
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
322 skip_str(1, demuxer);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
323 // get_str(1, demuxer, buf, sizeof(buf));
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
324 get_str(1, demuxer, buf, sizeof(buf));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
325
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
326 v = 0; /* not supported audio codec */
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
327 if (strstr(buf, "dnet"))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
328 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
329 printf("Found AC3 audio\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
330 sh->format = 0x2000; /* ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
331 v = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
332 }
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
333 if (strstr(buf, "sipr"))
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
334 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
335 printf("Found SiproLab's ACELP\n");
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
336 sh->format = 0x130;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
337 v = 1;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
338 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
339 if (strstr(buf, "cook"))
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
340 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
341 printf("Found Real's GeneralCooker (unsupported)\n");
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
342 v = 0;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
343 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
344 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
345 // skip_str(1, demuxer); /* desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
346 // skip_str(1, demuxer); /* desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
347
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
348 /* the audio codec name is stored in desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
349 /* available codecs: DNET -> ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
350 // sh->format = 0x2000; /* ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
351
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
352 if (v)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
353 {
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
354
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
355 /* Emulate WAVEFORMATEX struct: */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
356 sh->wf = malloc(sizeof(WAVEFORMATEX));
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
357 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
358 sh->wf->wFormatTag = sh->format;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
359 sh->wf->nChannels = sh->channels;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
360 sh->wf->wBitsPerSample = 16;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
361 sh->wf->nSamplesPerSec = sh->samplerate;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
362 sh->wf->nAvgBytesPerSec = bitrate;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
363 sh->wf->nBlockAlign = 19; /* 19 for acelp, pff */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
364 sh->wf->cbSize = 0;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
365
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
366 /* insert as stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
367 demuxer->audio->sh = sh;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
368 sh->ds = demuxer->audio;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
369 demuxer->audio->id = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
370
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
371 if (priv->last_a_stream+1 < MAX_STREAMS)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
372 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
373 priv->a_streams[priv->last_a_stream] = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
374 priv->last_a_stream++;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
375 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
376 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
377 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
378 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
379 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
380 /* video header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
381 sh_video_t *sh = new_sh_video(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
382
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
383 v = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
384 printf("video: %.4s (%x)\n", (char *)&v, v);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
385 if (v != MKTAG('V', 'I', 'D', 'O'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
386 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
387 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unsupported video codec\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
388 goto skip_this_chunk;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
389 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
390
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
391 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
392 printf("video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
393
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
394 // emulate BITMAPINFOHEADER:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
395 sh->bih = malloc(sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
396 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
397 sh->bih->biSize = 40;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
398 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
399 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
400 sh->bih->biPlanes = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
401 sh->bih->biBitCount = 24;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
402 sh->bih->biCompression = sh->format;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
403 sh->bih->biSizeImage= sh->bih->biWidth*sh->bih->biHeight*3;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
404
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
405 sh->fps = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
406 sh->frametime = 1.0f/sh->fps;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
407
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
408 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
409 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
410 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
411 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
412
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
413 /* h263 hack */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
414 v = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
415 switch (v)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
416 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
417 case 0x10000000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
418 /* sub id: 0 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
419 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
420 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
421 case 0x10003000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
422 case 0x10003001:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
423 /* sub id: 3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
424 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
425 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
426 case 0x20001000:
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
427 case 0x20100001:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
428 /* codec id: rv20 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
429 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
430 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
431 /* codec id: none */
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
432 printf("unknown id: %x\n", v);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
433 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
434
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
435 /* insert as stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
436 demuxer->video->sh = sh;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
437 sh->ds = demuxer->video;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
438 demuxer->video->id = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
439 if (priv->last_v_stream+1 < MAX_STREAMS)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
440 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
441 priv->v_streams[priv->last_v_stream] = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
442 priv->last_v_stream++;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
443 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
444 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
445
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
446 skip_this_chunk:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
447 /* skip codec info */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
448 v = stream_tell(demuxer->stream) - codec_pos;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
449 stream_skip(demuxer->stream, codec_data_size - v);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
450 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
451 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
452 case MKTAG('D', 'A', 'T', 'A'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
453 goto header_end;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
454 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
455 printf("Unknown chunk: %x\n", chunk);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
456 stream_skip(demuxer->stream, chunk_size - 10);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
457 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
458 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
459 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
460
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
461 header_end:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
462 priv->num_of_packets = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
463 // stream_skip(demuxer->stream, 4); /* number of packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
464 stream_skip(demuxer->stream, 4); /* next data header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
465
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
466 printf("Packets in file: %d\n", priv->num_of_packets);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
467
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
468 /* disable seeking */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
469 demuxer->seekable = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
470
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
471 fail:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
472 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
473 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
474
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
475 void demux_close_real(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
476 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
477 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
478
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
479 if (priv)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
480 free(priv);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
481
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
482 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
483 }