annotate libmpdemux/demux_real.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 2936f5445e0c
children ce6952225939
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.
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
7
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
8 $Log$
4328
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
9 Revision 1.8 2002/01/23 19:41:01 alex
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
10 fixed num_of_packets and current_packet handling, bug found by Mike Melanson
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
11
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
12 Revision 1.7 2002/01/18 11:02:52 alex
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
13 fix dnet support
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
14
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
15 Revision 1.6 2002/01/04 19:32:58 alex
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
16 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
17
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
18
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
19 Audio codecs: (supported by RealPlayer8 for Linux)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
20 ATRC - RealAudio 8 (ATRAC3) - www.minidisc.org/atrac3_article.pdf,
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
21 ACM decoder uploaded, needs some fine-tuning to work
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
22 COOK/COKR - RealAudio G2
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
23 DNET - RealAudio 3.0, really it's AC3 in swapped-byteorder
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
24 SIPR - SiproLab's audio codec, ACELP decoder working with MPlayer,
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
25 needs fine-tuning too :)
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
26
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
27 Video codecs: (supported by RealPlayer8 for Linux)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
28 RV10 - H.263 based, working with libavcodec's decoder
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
29 RV20
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
30 RV30
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
31 */
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
32
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
33 #include <stdio.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
34 #include <stdlib.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
35 #include <unistd.h>
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
36
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
37 #include "config.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
38 #include "mp_msg.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
39 #include "help_mp.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
40
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
41 #include "stream.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
42 #include "demuxer.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
43 #include "stheader.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
44 #include "bswap.h"
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
45
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
46 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
47
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
48 #define MAX_STREAMS 10
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
49
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
50 typedef struct {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
51 int timestamp;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
52 int offset;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
53 int packetno;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
54 } real_index_table_t;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
55
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
56 typedef struct {
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
57 /* for seeking */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
58 int index_chunk_offset;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
59 real_index_table_t *index_table[MAX_STREAMS];
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
60 // int *index_table[MAX_STREAMS];
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
61 int index_table_size[MAX_STREAMS];
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
62 int data_chunk_offset;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
63 int num_of_packets;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
64 int current_packet;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
65
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
66 /* stream id table */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
67 int last_a_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
68 int a_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
69 int last_v_stream;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
70 int v_streams[MAX_STREAMS];
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
71 } real_priv_t;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
72
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
73 /* originally from FFmpeg */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
74 static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
75 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
76 int len;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
77
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
78 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
79 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
80 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
81 len = stream_read_word(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
82
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
83 stream_read(demuxer->stream, buf, (len > buf_size) ? buf_size : len);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
84 if (len > buf_size)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
85 stream_skip(demuxer->stream, len-buf_size);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
86
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
87 printf("read_str: %d bytes read\n", len);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
88 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
89
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
90 static void skip_str(int isbyte, demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
91 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
92 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
93
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
94 if (isbyte)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
95 len = stream_read_char(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
96 else
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
97 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
98
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
99 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
100
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
101 printf("skip_str: %d bytes skipped\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
102 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
103
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
104 static void parse_index_chunk(demuxer_t *demuxer)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
105 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
106 real_priv_t *priv = demuxer->priv;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
107 int origpos = stream_tell(demuxer->stream);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
108 int next_header_pos = priv->index_chunk_offset;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
109 int i, entries, stream_id;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
110
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
111 read_index:
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
112 stream_seek(demuxer->stream, next_header_pos);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
113
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
114 i = stream_read_dword_le(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
115 if ((i == -256) || (i != MKTAG('I', 'N', 'D', 'X')))
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
116 {
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
117 printf("Something went wrong, no index chunk found on given address (%d)\n",
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
118 next_header_pos);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
119 goto end;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
120 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
121
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
122 printf("Reading index table from index chunk (%d)\n",
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
123 next_header_pos);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
124
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
125 i = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
126 printf("size: %d bytes\n", i);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
127
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
128 i = stream_read_word(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
129 if (i != 0)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
130 printf("Hmm, index table with unknown version (%d), please report it to MPlayer developers!\n", i);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
131
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
132 entries = stream_read_dword(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
133 printf("entries: %d\n", entries);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
134
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
135 stream_id = stream_read_word(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
136 printf("stream_id: %d\n", stream_id);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
137
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
138 next_header_pos = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
139 printf("next_header_pos: %d\n", next_header_pos);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
140 if (entries <= 0)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
141 {
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
142 if (next_header_pos)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
143 goto read_index;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
144 i = entries;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
145 goto end;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
146 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
147
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
148 priv->index_table_size[stream_id] = entries;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
149 priv->index_table[stream_id] = malloc(priv->index_table_size[stream_id] * sizeof(real_index_table_t));
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
150
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
151 for (i = 0; i < entries; i++)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
152 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
153 stream_skip(demuxer->stream, 2); /* version */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
154 priv->index_table[stream_id][i].timestamp = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
155 priv->index_table[stream_id][i].offset = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
156 priv->index_table[stream_id][i].packetno = stream_read_dword(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
157 printf("Index table: Stream#%d: entry: %d: pos: %d\n",
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
158 stream_id, i, priv->index_table[stream_id][i].offset);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
159 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
160 demuxer->seekable = 1; /* got index, we're able to seek */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
161
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
162 if (next_header_pos > 0)
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
163 goto read_index;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
164
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
165 printf("End of index tables\n");
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
166
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
167 end:
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
168 if (i == -256)
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
169 stream_reset(demuxer->stream);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
170 stream_seek(demuxer->stream, origpos);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
171 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
172
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
173 int real_check_file(demuxer_t* demuxer)
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
174 {
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
175 real_priv_t *priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
176 int c;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
177
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
178 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n");
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
179
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
180 c = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
181 if (c == -256)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
182 return 0; /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
183 if (c != MKTAG('.', 'R', 'M', 'F'))
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
184 return 0; /* bad magic */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
185
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
186 priv = malloc(sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
187 memset(priv, 0, sizeof(real_priv_t));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
188 demuxer->priv = priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
189
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
190 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
191 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
192
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
193 // return value:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
194 // 0 = EOF or no stream found
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
195 // 1 = successfully read a packet
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
196 int demux_real_fill_buffer(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
197 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
198 real_priv_t *priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
199 demux_stream_t *ds = NULL;
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
200 sh_audio_t *sh_audio = NULL;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
201 int len;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
202 int timestamp;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
203 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
204 int i;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
205 int flags;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
206
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
207 loop:
4328
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
208 /* also don't check if no num_of_packets was defined in header */
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
209 if ((priv->current_packet > priv->num_of_packets) &&
2936f5445e0c fixed num_of_packets and current_packet handling, bug found by Mike Melanson
alex
parents: 4235
diff changeset
210 (priv->num_of_packets != -10))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
211 return 0; /* EOF */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
212 stream_skip(demuxer->stream, 2); /* version */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
213 len = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
214 if (len == -256) /* EOF */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
215 return 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
216 if (len < 12)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
217 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
218 printf("bad packet len (%d)\n", len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
219 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
220 goto loop;
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 timestamp = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
224
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
225 stream_skip(demuxer->stream, 1); /* reserved */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
226 flags = stream_read_char(demuxer->stream);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
227 /* flags: */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
228 /* 0x1 - reliable */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
229 /* 0x2 - keyframe */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
230
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
231 // printf("packet#%d: pos: %d, len: %d, stream_id: %d, timestamp: %d, flags: %x\n",
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
232 // priv->current_packet, stream_tell(demuxer->stream)-12, len, stream_id, timestamp, flags);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
233
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
234 priv->current_packet++;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
235 len -= 12;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
236
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
237 /* check if stream_id is audio stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
238 for (i = 0; i < priv->last_a_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
239 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
240 if (priv->a_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
241 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
242 // printf("packet is audio (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
243 ds = demuxer->audio; /* FIXME */
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
244 sh_audio = ds->sh;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
245 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
246 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
247 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
248 /* check if stream_id is video stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
249 for (i = 0; i < priv->last_v_stream; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
250 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
251 if (priv->v_streams[i] == stream_id)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
252 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
253 // printf("packet is video (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
254 ds = demuxer->video; /* FIXME */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
255 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
256 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
257 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
258
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
259 /* id not found */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
260 if (ds == NULL)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
261 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
262 printf("unknown stream id (%d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
263 stream_skip(demuxer->stream, len);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
264 goto loop;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
265 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
266
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
267 demuxer->filepos = stream_tell(demuxer->stream);
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
268 #if 0
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
269 ds_read_packet(ds, demuxer->stream, len, timestamp/90000.0f,
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
270 demuxer->filepos, (flags & 0x2) ? 0x10 : 0);
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
271 #else
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
272 {
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
273 demux_packet_t *dp = new_demux_packet(len);
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
274
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
275 stream_read(demuxer->stream, dp->buffer, len);
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
276 /* if DNET, swap bytes! */
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
277 if (sh_audio != NULL)
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
278 if (sh_audio->format == 0x2000)
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
279 {
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
280 char *ptr = dp->buffer;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
281
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
282 for (i = 0; i < len; i += 2)
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
283 {
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
284 const char tmp = ptr[0];
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
285 ptr[0] = ptr[1];
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
286 ptr[1] = tmp;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
287 ptr += 2;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
288 }
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
289 }
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
290 dp->pts = timestamp/90000.0f;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
291 dp->pos = demuxer->filepos;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
292 dp->flags = (flags & 0x2) ? 0x10 : 0;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
293 ds_add_packet(ds, dp);
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
294 }
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
295 #endif
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
296
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
297 return 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
298 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
299
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
300 void demux_open_real(demuxer_t* demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
301 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
302 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
303 int num_of_headers;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
304 int i;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
305
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
306 stream_skip(demuxer->stream, 4); /* header size */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
307 stream_skip(demuxer->stream, 2); /* version */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
308 // stream_skip(demuxer->stream, 4);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
309 i = stream_read_dword(demuxer->stream);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
310 printf("File version: %d\n", i);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
311 num_of_headers = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
312 // stream_skip(demuxer->stream, 4); /* number of headers */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
313
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
314 /* parse chunks */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
315 for (i = 1; i < num_of_headers; i++)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
316 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
317 int chunk, chunk_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
318
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
319 chunk = stream_read_dword_le(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
320 chunk_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
321
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
322 stream_skip(demuxer->stream, 2); /* version */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
323
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
324 if (chunk_size < 10)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
325 goto fail;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
326
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
327 printf("Chunk: %.4s (size: %d)\n",
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
328 (char *)&chunk, chunk_size);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
329
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
330 switch(chunk)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
331 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
332 case MKTAG('P', 'R', 'O', 'P'):
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
333 /* Properties header */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
334
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
335 stream_skip(demuxer->stream, 4); /* max bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
336 stream_skip(demuxer->stream, 4); /* avg bitrate */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
337 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
338 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
339 stream_skip(demuxer->stream, 4); /* nb packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
340 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
341 stream_skip(demuxer->stream, 4); /* preroll */
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
342 priv->index_chunk_offset = stream_read_dword(demuxer->stream);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
343 printf("First index chunk offset: 0x%x\n", priv->index_chunk_offset);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
344 priv->data_chunk_offset = stream_read_dword(demuxer->stream)+10;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
345 printf("First data chunk offset: 0x%x\n", priv->data_chunk_offset);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
346 stream_skip(demuxer->stream, 2); /* nb streams */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
347 #if 0
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
348 stream_skip(demuxer->stream, 2); /* flags */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
349 #else
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
350 {
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
351 int flags = stream_read_word(demuxer->stream);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
352 printf("Flags (%x): ", flags);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
353 if (flags & 0x1)
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
354 printf("[save allowed] ");
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
355 if (flags & 0x2)
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
356 printf("[perfect play (more buffers)] ");
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
357 if (flags & 0x4)
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
358 printf("[live broadcast] ");
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
359 printf("\n");
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
360 }
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
361 #endif
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
362 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
363 case MKTAG('C', 'O', 'N', 'T'):
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
364 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
365 /* Content description header */
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
366 char *buf;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
367 int len;
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
368
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
369 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
370 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
371 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
372 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
373 stream_read(demuxer->stream, buf, len);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
374 demux_info_add(demuxer, "name", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
375 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
376 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
377
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
378 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
379 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
380 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
381 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
382 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
383 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
384 demux_info_add(demuxer, "author", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
385 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
386 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
387
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
388 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
389 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
390 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
391 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
392 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
393 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
394 demux_info_add(demuxer, "copyright", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
395 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
396 }
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
397
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
398 len = stream_read_word(demuxer->stream);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
399 if (len > 0)
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
400 {
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
401 buf = malloc(len+1);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
402 stream_read(demuxer->stream, buf, len);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
403 buf[len] = 0;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
404 demux_info_add(demuxer, "comment", buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
405 free(buf);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
406 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
407 break;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
408 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
409 case MKTAG('M', 'D', 'P', 'R'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
410 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
411 /* Media properties header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
412 int stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
413 int bitrate;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
414 int codec_data_size;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
415 int codec_pos;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
416 int tmp;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
417
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
418 stream_id = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
419 printf("Found new stream (id: %d)\n", stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
420
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
421 stream_skip(demuxer->stream, 4); /* max bitrate */
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
422 bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
423 stream_skip(demuxer->stream, 4); /* max packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
424 stream_skip(demuxer->stream, 4); /* avg packet size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
425 stream_skip(demuxer->stream, 4); /* start time */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
426 stream_skip(demuxer->stream, 4); /* preroll */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
427 stream_skip(demuxer->stream, 4); /* duration */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
428
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
429 skip_str(1, demuxer); /* stream description (name) */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
430 skip_str(1, demuxer); /* mimetype */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
431
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
432 /* Type specific header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
433 codec_data_size = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
434 codec_pos = stream_tell(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
435
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
436 tmp = stream_read_dword(demuxer->stream);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
437
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
438 if (tmp == MKTAG(0xfd, 'a', 'r', '.'))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
439 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
440 /* audio header */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
441 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
442 char buf[128]; /* for codec name */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
443 int frame_size;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
444 int version;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
445
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
446 printf("Found audio stream!\n");
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
447 version = stream_read_word(demuxer->stream);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
448 printf("version: %d\n", version);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
449 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
450 stream_skip(demuxer->stream, 2);
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
451 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
452 stream_skip(demuxer->stream, 4);
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
453 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
454 stream_skip(demuxer->stream, 4); /* header size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
455 stream_skip(demuxer->stream, 2); /* add codec info */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
456 stream_skip(demuxer->stream, 4); /* coded frame size */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
457 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
458 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
459 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
460 stream_skip(demuxer->stream, 2); /* 1 */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
461 // stream_skip(demuxer->stream, 2); /* coded frame size */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
462 frame_size = stream_read_word(demuxer->stream);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
463 printf("frame_size: %d\n", frame_size);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
464 stream_skip(demuxer->stream, 4);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
465
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
466 if (version == 5)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
467 stream_skip(demuxer->stream, 6);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
468
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
469 sh->samplerate = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
470 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
471 sh->channels = stream_read_word(demuxer->stream);
3877
a3c73266f81f fixed rv10 with subid=3
alex
parents: 3795
diff changeset
472 printf("samplerate: %d, channels: %d\n",
a3c73266f81f fixed rv10 with subid=3
alex
parents: 3795
diff changeset
473 sh->samplerate, sh->channels);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
474
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
475 if (version == 5)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
476 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
477 stream_skip(demuxer->stream, 4);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
478 stream_read(demuxer->stream, buf, 4);
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
479 buf[4] = 0;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
480 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
481 else
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
482 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
483 /* Desc #1 */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
484 skip_str(1, demuxer);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
485 /* Desc #2 */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
486 get_str(1, demuxer, buf, sizeof(buf));
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
487 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
488
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
489 /* Emulate WAVEFORMATEX struct: */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
490 sh->wf = malloc(sizeof(WAVEFORMATEX));
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
491 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
492 sh->wf->nChannels = sh->channels;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
493 sh->wf->wBitsPerSample = 16;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
494 sh->wf->nSamplesPerSec = sh->samplerate;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
495 sh->wf->nAvgBytesPerSec = bitrate;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
496 sh->wf->nBlockAlign = frame_size;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
497 sh->wf->cbSize = 0;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
498
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
499 tmp = 1; /* supported audio codec */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
500 switch (MKTAG(buf[0], buf[1], buf[2], buf[3]))
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
501 {
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
502 case MKTAG('d', 'n', 'e', 't'):
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
503 printf("Audio: DNET -> AC3\n");
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
504 sh->format = 0x2000;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
505 break;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
506 case MKTAG('s', 'i', 'p', 'r'):
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
507 printf("Audio: SiproLab's ACELP.net\n");
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
508 sh->format = 0x130;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
509 /* for buggy directshow loader */
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
510 sh->wf = realloc(sh->wf, 18+4);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
511 sh->wf->wBitsPerSample = 0;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
512 sh->wf->nAvgBytesPerSec = 1055;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
513 sh->wf->nBlockAlign = 19;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
514 // sh->wf->nBlockAlign = frame_size / 288;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
515 sh->wf->cbSize = 4;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
516 buf[0] = 30;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
517 buf[1] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
518 buf[2] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
519 buf[3] = 0;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
520 memcpy((sh->wf+18), (char *)&buf[0], 4);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
521 // sh->wf[sizeof(WAVEFORMATEX)+1] = 30;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
522 // sh->wf[sizeof(WAVEFORMATEX)+2] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
523 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
524 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
525 break;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
526 case MKTAG('c', 'o', 'o', 'k'):
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
527 printf("Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n");
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
528 tmp = 0;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
529 break;
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
530 case MKTAG('a', 't', 'r', 'c'):
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
531 printf("Audio: Sony ATRAC3 (RealAudio 8?) (unsupported)\n");
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
532 sh->format = 0x270;
4235
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
533
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
534 sh->wf->nAvgBytesPerSec = 8268;
c6a61c091222 fix dnet support
alex
parents: 3985
diff changeset
535 sh->wf->nBlockAlign = 192;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
536 break;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
537 default:
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
538 printf("Audio: Unknown (%s)\n", buf);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
539 tmp = 0;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
540 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
541 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
542
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
543 sh->wf->wFormatTag = sh->format;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
544
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
545 print_wave_header(sh->wf);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
546
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
547 if (tmp)
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
548 {
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
549 /* insert as stream */
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
550 demuxer->audio->sh = sh;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
551 sh->ds = demuxer->audio;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
552 demuxer->audio->id = stream_id;
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
553
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
554 if (priv->last_a_stream+1 < MAX_STREAMS)
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
555 {
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
556 priv->a_streams[priv->last_a_stream] = stream_id;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
557 priv->last_a_stream++;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
558 }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
559 }
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
560 else
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
561 free(sh->wf);
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
562 // break;
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
563 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
564 else
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
565 // case MKTAG('V', 'I', 'D', 'O'):
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
566 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
567 /* video header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
568 sh_video_t *sh = new_sh_video(demuxer, stream_id);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
569
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
570 tmp = stream_read_dword_le(demuxer->stream);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
571 printf("video: %.4s (%x)\n", (char *)&tmp, tmp);
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
572 if (tmp != MKTAG('V', 'I', 'D', 'O'))
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
573 {
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
574 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not audio/video stream or unsupported!\n");
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
575 goto skip_this_chunk;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
576 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
577
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
578 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
579 printf("video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
580
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
581 /* emulate BITMAPINFOHEADER */
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
582 sh->bih = malloc(sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
583 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER));
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
584 sh->bih->biSize = 40;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
585 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
586 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
587 sh->bih->biPlanes = 1;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
588 sh->bih->biBitCount = 24;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
589 sh->bih->biCompression = sh->format;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
590 sh->bih->biSizeImage= sh->bih->biWidth*sh->bih->biHeight*3;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
591
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
592 sh->fps = stream_read_word(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
593 sh->frametime = 1.0f/sh->fps;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
594
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
595 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
596 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
597 stream_skip(demuxer->stream, 4);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
598 stream_skip(demuxer->stream, 2);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
599
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
600 /* h263 hack */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
601 tmp = stream_read_dword(demuxer->stream);
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
602 printf("H.263 ID: %x\n", tmp);
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
603 switch (tmp)
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
604 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
605 case 0x10000000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
606 /* sub id: 0 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
607 /* codec id: rv10 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
608 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
609 case 0x10003000:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
610 case 0x10003001:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
611 /* sub id: 3 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
612 /* codec id: rv10 */
3877
a3c73266f81f fixed rv10 with subid=3
alex
parents: 3795
diff changeset
613 sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3');
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
614 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
615 case 0x20001000:
3788
d554b5b33d76 improved audio codec detection
alex
parents: 3777
diff changeset
616 case 0x20100001:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
617 /* codec id: rv20 */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
618 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
619 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
620 /* codec id: none */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
621 printf("unknown id: %x\n", tmp);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
622 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
623
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
624 /* insert as stream */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
625 demuxer->video->sh = sh;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
626 sh->ds = demuxer->video;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
627 demuxer->video->id = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
628 if (priv->last_v_stream+1 < MAX_STREAMS)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
629 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
630 priv->v_streams[priv->last_v_stream] = stream_id;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
631 priv->last_v_stream++;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
632 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
633 }
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
634 // break;
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
635 // default:
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
636 skip_this_chunk:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
637 /* skip codec info */
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
638 tmp = stream_tell(demuxer->stream) - codec_pos;
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
639 stream_skip(demuxer->stream, codec_data_size - tmp);
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
640 break;
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
641 // }
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
642 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
643 case MKTAG('D', 'A', 'T', 'A'):
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
644 goto header_end;
3795
15745f11e717 fixed audio detection code and improved ;)
alex
parents: 3788
diff changeset
645 case MKTAG('I', 'N', 'D', 'X'):
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
646 default:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
647 printf("Unknown chunk: %x\n", chunk);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
648 stream_skip(demuxer->stream, chunk_size - 10);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
649 break;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
650 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
651 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
652
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
653 header_end:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
654 priv->num_of_packets = stream_read_dword(demuxer->stream);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
655 // stream_skip(demuxer->stream, 4); /* number of packets */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
656 stream_skip(demuxer->stream, 4); /* next data header */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
657
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
658 printf("Packets in file: %d\n", priv->num_of_packets);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
659
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
660 if (priv->num_of_packets == 0)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
661 priv->num_of_packets = -10;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
662
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
663 /* disable seeking */
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
664 demuxer->seekable = 0;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
665
3985
701d18898835 updated/extended some parts, based on RMFF (also initial ATRAC3 hackings and notes)
alex
parents: 3882
diff changeset
666 if (priv->index_chunk_offset && ((index_mode == 1) || (index_mode == 2)))
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
667 parse_index_chunk(demuxer);
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
668
3777
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
669 fail:
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
670 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
671 }
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
672
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
673 void demux_close_real(demuxer_t *demuxer)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
674 {
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
675 real_priv_t* priv = demuxer->priv;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
676
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
677 if (priv)
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
678 free(priv);
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
679
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
680 return;
026ccd3dc489 added real demuxer
alex
parents:
diff changeset
681 }
3882
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
682
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
683 #if 0
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
684 /* will complete it later - please upload RV10 samples WITH INDEX CHUNK */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
685 int demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, int flags)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
686 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
687 real_priv_t *priv = demuxer->priv;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
688 demux_stream_t *d_audio = demuxer->audio;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
689 demux_stream_t *d_video = demuxer->video;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
690 sh_audio_t *sh_audio = d_audio->sh;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
691 sh_video_t *sh_video = d_video->sh;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
692 int rel_seek_frames = sh->fps*rel_seek_secs;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
693 int video_chunk_pos = d_video->pos;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
694 int stream_id = 0;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
695
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
696 #if 0
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
697 if (flags & 1)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
698 /* seek absolute */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
699 video_chunk_pos = 0;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
700
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
701 if (flags & 2)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
702 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
703 int total = sh_video->video.dwLength;
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
704
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
705 rel_seek_frames
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
706 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
707 #endif
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
708
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
709 if (rel_seek_frames > 0)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
710 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
711 /* seek forward */
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
712 for (i = 0; i < index_table_size[stream_id]; i++)
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
713 {
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
714 if (index_table[stream_id][i]
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
715 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
716 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
717 }
c5cefeb78c40 added read_index_chunk, fixed audio_header parser for version5
alex
parents: 3877
diff changeset
718 #endif