annotate libmpdemux/demux_real.c @ 3777:026ccd3dc489

added real demuxer
author alex
date Wed, 26 Dec 2001 22:57:51 +0000
parents
children d554b5b33d76
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
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
9 #include <stdio.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
10 #include <stdlib.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
11 #include <unistd.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
12
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
13 #include "config.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
14 #include "mp_msg.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
15 #include "help_mp.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
16
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
17 #include "stream.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
18 #include "demuxer.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
19 #include "stheader.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
20 #include "bswap.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
21
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
22 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
23
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
24 #define MAX_STREAMS 10
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
25
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
26 typedef struct {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
27 int num_of_packets;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
28 int last_a_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
29 int a_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
30 int last_v_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
31 int v_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
32 } real_priv_t;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
33
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
34 static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
35 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
36 int len, i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
37 char *q;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
38
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
39 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
40 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
41 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
42 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
43 #if 1
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
44 q = buf;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
45 for (i = 0; i < len; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
46 if (i < (buf_size - 1))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
47 *q++ = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
48 *q = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
49 #else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
50 stream_read(demuxer->stream, buf, buf_size);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
51 #endif
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
52 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
53
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
54 static void skip_str(int isbyte, demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
55 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
56 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
57
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
58 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
59 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
60 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
61 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
62
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
63 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
64
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
65 printf("skip_str: %d bytes skipped\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
66 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
67
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
68 int real_check_file(demuxer_t* demuxer){
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
69 real_priv_t *priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
70 int c;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
71
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
72 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
73
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
74 c = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
75 if (c == -256)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
76 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
77 if (c != MKTAG('.', 'R', 'M', 'F'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
78 return 0; /* bad magic */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
79
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
80 priv = malloc(sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
81 memset(priv, 0, sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
82 demuxer->priv = priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
83
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
84 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
85 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
86
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
87 // return value:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
88 // 0 = EOF or no stream found
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
89 // 1 = successfully read a packet
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
90 int demux_real_fill_buffer(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
91 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
92 real_priv_t *priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
93 demux_stream_t *ds = NULL;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
94 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
95 int timestamp;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
96 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
97 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
98
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
99 // printf("num_of_packets: %d\n", priv->num_of_packets);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
100
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
101 loop:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
102 if (priv->num_of_packets == 0)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
103 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
104 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
105 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
106 if (len == -256) /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
107 return 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
108 if (len < 12)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
109 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
110 printf("bad packet len (%d)\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
111 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
112 goto loop;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
113 // return 0; /* bad packet */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
114 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
115 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
116 timestamp = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
117
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
118 // printf("packet: len: %d, stream_id: %d, timestamp: %d\n",
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
119 // len, stream_id, timestamp);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
120
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
121 stream_skip(demuxer->stream, 1); /* reserved */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
122 stream_skip(demuxer->stream, 1); /* flags */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
123
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
124 priv->num_of_packets--;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
125 len -= 12;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
126
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
127 /* check if stream_id is audio stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
128 for (i = 0; i < priv->last_a_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
129 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
130 if (priv->a_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
131 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
132 // printf("packet is audio (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
133 ds = demuxer->audio; /* FIXME */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
134 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
135 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
136 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
137 /* check if stream_id is video stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
138 for (i = 0; i < priv->last_v_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
139 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
140 if (priv->v_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
141 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
142 // printf("packet is video (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
143 ds = demuxer->video; /* FIXME */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
144 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
145 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
146 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
147
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
148 /* id not found */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
149 if (ds == NULL)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
150 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
151 printf("unknown stream id (%d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
152 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
153 goto loop;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
154 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
155
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
156 demuxer->filepos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
157 ds_read_packet(ds, demuxer->stream, len, timestamp/90000.0f, demuxer->filepos, 0);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
158
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
159 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
160 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
161
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
162 void demux_open_real(demuxer_t* demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
163 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
164 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
165 int num_of_headers;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
166 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
167
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
168 stream_skip(demuxer->stream, 4); /* header size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
169 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
170 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
171 num_of_headers = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
172 // stream_skip(demuxer->stream, 4); /* number of headers */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
173
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
174 /* parse chunks */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
175 for (i = 1; i < num_of_headers; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
176 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
177 int chunk, chunk_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
178
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
179 chunk = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
180 chunk_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
181
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
182 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
183
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
184 if (chunk_size < 10)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
185 goto fail;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
186
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
187 printf("Chunk: %.4s (size: %d)\n",
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
188 (char *)&chunk, chunk_size);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
189
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
190 switch(chunk)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
191 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
192 case MKTAG('P', 'R', 'O', 'P'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
193 printf("Properties chunk\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
194 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
195 stream_skip(demuxer->stream, 4); /* avg bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
196 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
197 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
198 stream_skip(demuxer->stream, 4); /* nb packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
199 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
200 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
201 stream_skip(demuxer->stream, 4); /* index offset */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
202 stream_skip(demuxer->stream, 4); /* data offset */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
203 stream_skip(demuxer->stream, 2); /* nb streams */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
204 stream_skip(demuxer->stream, 2); /* flags */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
205 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
206 case MKTAG('C', 'O', 'N', 'T'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
207 printf("Broadcasting informations (title, author, copyright, comment)\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
208 skip_str(0, demuxer); /* title */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
209 skip_str(0, demuxer); /* author */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
210 skip_str(0, demuxer); /* copyright */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
211 skip_str(0, demuxer); /* comment */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
212 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
213 case MKTAG('M', 'D', 'P', 'R'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
214 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
215 /* new stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
216 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
217 int bitrate;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
218 int codec_data_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
219 int codec_pos;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
220 int v;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
221
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
222 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
223 printf("Found new stream (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
224
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
225 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
226 bitrate = stream_read_dword(demuxer->stream); /* bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
227 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
228 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
229 stream_skip(demuxer->stream, 4); /* start time */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
230 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
231 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
232
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
233 skip_str(1, demuxer); /* stream description */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
234 skip_str(1, demuxer); /* mimetype */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
235
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
236 codec_data_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
237 codec_pos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
238
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
239 v = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
240 if (v == MKTAG(0xfd, 'a', 'r', '.')) /* audio header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
241 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
242 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
243
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
244 printf("Found audio stream!\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
245 stream_skip(demuxer->stream, 4); /* version */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
246 stream_skip(demuxer->stream, 4); /* .ra4 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
247 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
248 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
249 stream_skip(demuxer->stream, 4); /* header size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
250 stream_skip(demuxer->stream, 2); /* add codec info */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
251 stream_skip(demuxer->stream, 4); /* coded frame size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
252 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
253 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
254 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
255 stream_skip(demuxer->stream, 2); /* 1 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
256 stream_skip(demuxer->stream, 2); /* coded frame size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
257 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
258
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
259 sh->samplerate = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
260 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
261 sh->channels = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
262
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
263 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
264 char buf[128];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
265
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
266 get_str(1, demuxer, buf, sizeof(buf));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
267 get_str(1, demuxer, buf, sizeof(buf));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
268
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
269 v = 0; /* not supported audio codec */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
270 if (!strcmp(buf, "dnet"))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
271 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
272 printf("Found AC3 audio\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
273 sh->format = 0x2000; /* ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
274 v = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
275 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
276 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
277 // skip_str(1, demuxer); /* desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
278 // skip_str(1, demuxer); /* desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
279
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
280 /* the audio codec name is stored in desc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
281 /* available codecs: DNET -> ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
282 // sh->format = 0x2000; /* ac3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
283
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
284 if (v)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
285 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
286 printf("Audio codec: 0x%x\n", sh->format);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
287 /* insert as stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
288 demuxer->audio->sh = sh;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
289 sh->ds = demuxer->audio;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
290 demuxer->audio->id = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
291
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
292 if (priv->last_a_stream+1 < MAX_STREAMS)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
293 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
294 priv->a_streams[priv->last_a_stream] = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
295 priv->last_a_stream++;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
296 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
297 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
298 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
299 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
300 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
301 /* video header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
302 sh_video_t *sh = new_sh_video(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
303
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
304 v = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
305 printf("video: %.4s (%x)\n", (char *)&v, v);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
306 if (v != MKTAG('V', 'I', 'D', 'O'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
307 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
308 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unsupported video codec\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
309 goto skip_this_chunk;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
310 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
311
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
312 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
313 printf("video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
314
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
315 // emulate BITMAPINFOHEADER:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
316 sh->bih = malloc(sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
317 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
318 sh->bih->biSize = 40;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
319 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
320 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
321 sh->bih->biPlanes = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
322 sh->bih->biBitCount = 24;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
323 sh->bih->biCompression = sh->format;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
324 sh->bih->biSizeImage= sh->bih->biWidth*sh->bih->biHeight*3;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
325
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
326 sh->fps = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
327 sh->frametime = 1.0f/sh->fps;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
328
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
329 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
330 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
331 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
332 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
333
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
334 /* h263 hack */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
335 v = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
336 switch (v)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
337 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
338 case 0x10000000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
339 /* sub id: 0 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
340 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
341 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
342 case 0x10003000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
343 case 0x10003001:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
344 /* sub id: 3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
345 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
346 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
347 case 0x20001000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
348 /* codec id: rv20 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
349 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
350 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
351 /* codec id: none */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
352 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
353
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
354 /* insert as stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
355 demuxer->video->sh = sh;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
356 sh->ds = demuxer->video;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
357 demuxer->video->id = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
358 if (priv->last_v_stream+1 < MAX_STREAMS)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
359 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
360 priv->v_streams[priv->last_v_stream] = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
361 priv->last_v_stream++;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
362 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
363 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
364
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
365 skip_this_chunk:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
366 /* skip codec info */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
367 v = stream_tell(demuxer->stream) - codec_pos;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
368 stream_skip(demuxer->stream, codec_data_size - v);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
369 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
370 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
371 case MKTAG('D', 'A', 'T', 'A'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
372 goto header_end;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
373 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
374 printf("Unknown chunk: %x\n", chunk);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
375 stream_skip(demuxer->stream, chunk_size - 10);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
376 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
377 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
378 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
379
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
380 header_end:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
381 priv->num_of_packets = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
382 // stream_skip(demuxer->stream, 4); /* number of packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
383 stream_skip(demuxer->stream, 4); /* next data header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
384
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
385 printf("Packets in file: %d\n", priv->num_of_packets);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
386
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
387 /* disable seeking */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
388 demuxer->seekable = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
389
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
390 fail:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
391 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
392 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
393
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
394 void demux_close_real(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
395 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
396 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
397
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
398 if (priv)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
399 free(priv);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
400
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
401 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
402 }