annotate libmpdemux/demux_realaud.c @ 10053:8e84e8deb529

Changed the order of two conditionals in an "if" statement, to make the code (very slightly) more efficient in the common case.
author rsf
date Sat, 03 May 2003 06:09:36 +0000
parents d4ecf93e236a
children 41a8b2cd254c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
1 /*
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
2 Realaudio demuxer for MPlayer
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
3 (c) 2003 Roberto Togni
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
4 */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
5
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
6 #include <stdio.h>
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
7 #include <stdlib.h>
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
8 #include <unistd.h>
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
9
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
10 #include "config.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
11 #include "mp_msg.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
12 #include "help_mp.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
13
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
14 #include "stream.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
15 #include "demuxer.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
16 #include "stheader.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
17 #include "bswap.h"
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
18
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
19
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
20 #define FOURCC_DOTRA mmioFOURCC('.','r','a', 0xfd)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
21 #define FOURCC_144 mmioFOURCC('1','4','_','4')
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
22 #define FOURCC_288 mmioFOURCC('2','8','_','8')
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
23 #define FOURCC_DNET mmioFOURCC('d','n','e','t')
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
24 #define FOURCC_LPCJ mmioFOURCC('l','p','c','J')
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
25
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
26
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
27 typedef struct {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
28 unsigned short version;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
29 unsigned int dotranum;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
30 unsigned int data_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
31 unsigned short version2;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
32 unsigned int hdr_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
33 unsigned short codec_flavor;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
34 unsigned int coded_framesize;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
35 unsigned short sub_packet_h;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
36 unsigned short frame_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
37 unsigned short sub_packet_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
38 char genr[4];
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
39 } ra_priv_t;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
40
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
41
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
42
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
43 int ra_check_file(demuxer_t* demuxer)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
44 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
45 unsigned int chunk_id;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
46
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
47 chunk_id = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
48 if (chunk_id == FOURCC_DOTRA)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
49 return 1;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
50 else
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
51 return 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
52 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
53
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
54
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
55
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
56 void hexdump(char *, unsigned long);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
57
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
58 // return value:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
59 // 0 = EOF or no stream found
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
60 // 1 = successfully read a packet
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
61 int demux_ra_fill_buffer(demuxer_t *demuxer)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
62 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
63 ra_priv_t *ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
64 int len;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
65 int timestamp;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
66 int flags;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
67 demux_stream_t *ds = demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
68 sh_audio_t *sh = ds->sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
69 WAVEFORMATEX *wf = sh->wf;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
70 demux_packet_t *dp;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
71
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
72 if (demuxer->stream->eof)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
73 return 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
74
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
75 len = wf->nBlockAlign;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
76 demuxer->filepos = stream_tell(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
77
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
78 dp = new_demux_packet(len);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
79 stream_read(demuxer->stream, dp->buffer, len);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
80
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
81 if (sh->format == 0x2000) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
82 // if DNET, swap bytes, as DNET is byte-swapped AC3:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
83 char *ptr = dp->buffer;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
84 int i;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
85 for (i = 0; i < len; i += 2) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
86 const char tmp = ptr[0];
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
87 ptr[0] = ptr[1];
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
88 ptr[1] = tmp;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
89 ptr += 2;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
90 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
91 }
10035
d4ecf93e236a Remove broker reset/seek and fix ;;
rtognimp
parents: 10034
diff changeset
92 dp->pts = demuxer->filepos / ra_priv->data_size;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
93 dp->pos = demuxer->filepos;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
94 dp->flags = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
95 ds_add_packet(ds, dp);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
96
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
97 return 1;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
98 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
99
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
100
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
101
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
102 extern void print_wave_header(WAVEFORMATEX *h);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
103
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
104
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
105
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
106 void demux_open_ra(demuxer_t* demuxer)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
107 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
108 ra_priv_t* ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
109 sh_audio_t *sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
110 int i;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
111 char *buf;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
112
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
113 if ((ra_priv = (ra_priv_t *)malloc(sizeof(ra_priv_t))) == NULL) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
114 mp_msg(MSGT_DEMUX, MSGL_ERR, "[RealAudio] Can't allocate memory for private data.\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
115 return NULL;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
116 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
117 memset(ra_priv, 0, sizeof(ra_priv_t));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
118
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
119 demuxer->priv = ra_priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
120 sh = new_sh_audio(demuxer, 0);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
121 demuxer->audio->id = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
122 sh->ds=demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
123 demuxer->audio->sh = sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
124
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
125 ra_priv->version = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
126 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] File version: %d\n", ra_priv->version);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
127 if ((ra_priv->version < 3) || (ra_priv->version > 4)) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
128 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] ra version %d is not supported yet, please "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
129 "contact MPlayer developers\n", ra_priv->version);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
130 return NULL;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
131 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
132 if (ra_priv->version == 3) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
133 ra_priv->hdr_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
134 stream_skip(demuxer->stream, 10);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
135 ra_priv->data_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
136 } else {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
137 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
138 ra_priv->dotranum = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
139 ra_priv->data_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
140 ra_priv->version2 = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
141 ra_priv->hdr_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
142 ra_priv->codec_flavor = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
143 ra_priv->coded_framesize = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
144 stream_skip(demuxer->stream, 4); // data size?
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
145 stream_skip(demuxer->stream, 8);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
146 ra_priv->sub_packet_h = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
147 ra_priv->frame_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
148 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] Frame size: %d\n", ra_priv->frame_size);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
149 ra_priv->sub_packet_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
150 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] Sub packet size: %d\n", ra_priv->sub_packet_size);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
151 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
152 sh->samplerate = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
153 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
154 sh->samplesize = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
155 sh->channels = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
156 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] %d channel, %d bit, %dHz\n", sh->channels,
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
157 sh->samplesize, sh->samplerate);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
158 i = stream_read_char(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
159 *((unsigned int *)(ra_priv->genr)) = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
160 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
161 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Genr size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
162 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
163 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
164 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
165 i = stream_read_char(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
166 sh->format = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
167 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
168 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] FourCC size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
169 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
170 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
171 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
172 stream_skip(demuxer->stream, 3);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
173 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
174
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
175 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
176 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
177 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
178 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
179 demux_info_add(demuxer, "Title", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
180 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
181 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
182 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
183 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
184 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
185 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
186 demux_info_add(demuxer, "Author", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
187 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
188 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
189 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
190 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
191 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
192 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
193 demux_info_add(demuxer, "Copyright", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
194 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
195 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
196
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
197 if ((i = stream_read_char(demuxer->stream)) != 0)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
198 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Last header byte is not zero!\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
199
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
200 if (ra_priv->version == 3) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
201 stream_skip(demuxer->stream, 1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
202 i = stream_read_char(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
203 sh->format = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
204 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
205 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] FourCC size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
206 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
207 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
208 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
209 // stream_skip(demuxer->stream, 3);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
210
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
211 if (sh->format != FOURCC_LPCJ) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
212 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Version 3 with FourCC %8x, please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
213 "MPlayer developers\n", sh->format);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
214 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
215
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
216 sh->channels = 1;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
217 sh->samplesize = 16;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
218 sh->samplerate = 8000;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
219 ra_priv->frame_size = 240;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
220 sh->format = FOURCC_144;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
221 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
222
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
223 /* Fill WAVEFORMATEX */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
224 sh->wf = malloc(sizeof(WAVEFORMATEX));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
225 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
226 sh->wf->nChannels = sh->channels;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
227 sh->wf->wBitsPerSample = sh->samplesize;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
228 sh->wf->nSamplesPerSec = sh->samplerate;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
229 sh->wf->nAvgBytesPerSec = sh->samplerate*sh->samplesize/8;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
230 sh->wf->nBlockAlign = ra_priv->frame_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
231 sh->wf->cbSize = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
232 sh->wf->wFormatTag = sh->format;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
233
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
234 switch (sh->format) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
235 case FOURCC_144:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
236 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 14_4\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
237 sh->wf->cbSize = 10/*+codecdata_length*/;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
238 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
239 ((short*)(sh->wf+1))[0]=0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
240 ((short*)(sh->wf+1))[1]=240;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
241 ((short*)(sh->wf+1))[2]=0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
242 ((short*)(sh->wf+1))[3]=0x14;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
243 ((short*)(sh->wf+1))[4]=0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
244 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
245 case FOURCC_288:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
246 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 28_8\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
247 sh->wf->cbSize = 8/*+codecdata_length*/;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
248 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
249 ((short*)(sh->wf+1))[0]=0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
250 ((short*)(sh->wf+1))[1]=ra_priv->sub_packet_h;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
251 ((short*)(sh->wf+1))[2]=ra_priv->codec_flavor;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
252 ((short*)(sh->wf+1))[3]=ra_priv->coded_framesize;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
253 ((short*)(sh->wf+1))[4]=0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
254 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
255 case FOURCC_DNET:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
256 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
257 sh->format = 0x2000;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
258 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
259 default:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
260 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%d)\n", sh->format);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
261 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
262
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
263 print_wave_header(sh->wf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
264
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
265 /* disable seeking */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
266 demuxer->seekable = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
267
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
268 if(!ds_fill_buffer(demuxer->audio))
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
269 mp_msg(MSGT_DEMUXER,MSGL_INFO,"[RealAudio] No data.\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
270 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
271
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
272
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
273
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
274 void demux_close_ra(demuxer_t *demuxer)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
275 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
276 ra_priv_t* ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
277
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
278 if (ra_priv)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
279 free(ra_priv);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
280
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
281 return;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
282 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
283
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
284
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
285 #if 0
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
286 /* please upload RV10 samples WITH INDEX CHUNK */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
287 int demux_seek_ra(demuxer_t *demuxer, float rel_seek_secs, int flags)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
288 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
289 real_priv_t *priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
290 demux_stream_t *d_audio = demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
291 sh_audio_t *sh_audio = d_audio->sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
292 int aid = d_audio->id;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
293 int next_offset = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
294 int rel_seek_frames = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
295 int streams = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
296
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
297 return stream_seek(demuxer->stream, next_offset);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
298 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
299 #endif