annotate libmpdemux/demux_realaud.c @ 17149:9a0a376a54b1

Move audio packets reordering from codec interface to demuxers for real files (old and new format), pass only real extradata to the codec Enable cook codec from lavc, prefer lavc codecs for 14_4 and 28_8 formats. Disable internal 28_8, it's broken now and will be removed soon
author rtognimp
date Fri, 09 Dec 2005 16:25:37 +0000
parents 9cb2b9b6a9b7
children 7dd65dccf4f5
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
14908
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
3 (c) 2003, 2005 Roberto Togni
10034
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];
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
39 char * audio_buf;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
40 } ra_priv_t;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
41
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
42
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
43
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
44 static int ra_check_file(demuxer_t* demuxer)
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
45 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
46 unsigned int chunk_id;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
47
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
48 chunk_id = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
49 if (chunk_id == FOURCC_DOTRA)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
50 return DEMUXER_TYPE_REALAUDIO;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
51 else
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
52 return 0;
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
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
57 void hexdump(char *, unsigned long);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
58
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
59 // return value:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
60 // 0 = EOF or no stream found
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
61 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
62 static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
63 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
64 ra_priv_t *ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
65 int len;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
66 int timestamp;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
67 int flags;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
68 demux_stream_t *ds = demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
69 sh_audio_t *sh = ds->sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
70 WAVEFORMATEX *wf = sh->wf;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
71 demux_packet_t *dp;
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
72 int x, y;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
73
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
74 if (demuxer->stream->eof)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
75 return 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
76
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
77 len = wf->nBlockAlign;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
78 demuxer->filepos = stream_tell(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
79
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
80 if (sh->format == FOURCC_288) {
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
81 for (y = 0; y < ra_priv->sub_packet_h; y++)
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
82 for (x = 0; x < ra_priv->sub_packet_h / 2; x++)
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
83 stream_read(demuxer->stream, ra_priv->audio_buf + x * 2 *ra_priv->frame_size +
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
84 y * ra_priv->coded_framesize, ra_priv->coded_framesize);
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
85 // Release all the audio packets
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
86 for (x = 0; x < ra_priv->sub_packet_h * ra_priv->frame_size / len; x++) {
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
87 dp = new_demux_packet(len);
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
88 memcpy(dp->buffer, ra_priv->audio_buf + x * len, len);
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
89 dp->pts = x ? 0 : demuxer->filepos / ra_priv->data_size;
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
90 dp->pos = demuxer->filepos; // all equal
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
91 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
92 ds_add_packet(ds, dp);
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
93 }
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
94 } else {
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
95 dp = new_demux_packet(len);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
96 stream_read(demuxer->stream, dp->buffer, len);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
97
10035
d4ecf93e236a Remove broker reset/seek and fix ;;
rtognimp
parents: 10034
diff changeset
98 dp->pts = demuxer->filepos / ra_priv->data_size;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
99 dp->pos = demuxer->filepos;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
100 dp->flags = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
101 ds_add_packet(ds, dp);
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
102 }
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
103
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
104 return 1;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
105 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
106
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
107
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
108
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
109 extern void print_wave_header(WAVEFORMATEX *h);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
110
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
111
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
112
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
113 static demuxer_t* demux_open_ra(demuxer_t* demuxer)
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
114 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
115 ra_priv_t* ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
116 sh_audio_t *sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
117 int i;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
118 char *buf;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
119
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
120 if ((ra_priv = (ra_priv_t *)malloc(sizeof(ra_priv_t))) == NULL) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
121 mp_msg(MSGT_DEMUX, MSGL_ERR, "[RealAudio] Can't allocate memory for private data.\n");
10232
939ff11825de Warning fixes, patch by Dominik Mierzejewski
rtognimp
parents: 10124
diff changeset
122 return 0;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
123 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
124 memset(ra_priv, 0, sizeof(ra_priv_t));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
125
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
126 demuxer->priv = ra_priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
127 sh = new_sh_audio(demuxer, 0);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
128 demuxer->audio->id = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
129 sh->ds=demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
130 demuxer->audio->sh = sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
131
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
132 ra_priv->version = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
133 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] File version: %d\n", ra_priv->version);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
134 if ((ra_priv->version < 3) || (ra_priv->version > 4)) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
135 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] ra version %d is not supported yet, please "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
136 "contact MPlayer developers\n", ra_priv->version);
10232
939ff11825de Warning fixes, patch by Dominik Mierzejewski
rtognimp
parents: 10124
diff changeset
137 return 0;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
138 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
139 if (ra_priv->version == 3) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
140 ra_priv->hdr_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
141 stream_skip(demuxer->stream, 10);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
142 ra_priv->data_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
143 } else {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
144 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
145 ra_priv->dotranum = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
146 ra_priv->data_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
147 ra_priv->version2 = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
148 ra_priv->hdr_size = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
149 ra_priv->codec_flavor = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
150 ra_priv->coded_framesize = stream_read_dword(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
151 stream_skip(demuxer->stream, 4); // data size?
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
152 stream_skip(demuxer->stream, 8);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
153 ra_priv->sub_packet_h = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
154 ra_priv->frame_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
155 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] Frame size: %d\n", ra_priv->frame_size);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
156 ra_priv->sub_packet_size = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
157 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] Sub packet size: %d\n", ra_priv->sub_packet_size);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
158 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
159 sh->samplerate = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
160 stream_skip(demuxer->stream, 2);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
161 sh->samplesize = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
162 sh->channels = stream_read_word(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
163 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] %d channel, %d bit, %dHz\n", sh->channels,
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
164 sh->samplesize, sh->samplerate);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
165 i = stream_read_char(demuxer->stream);
16322
9cb2b9b6a9b7 Sparcs do not like wild pointer typecasting (unaligned access).
reimar
parents: 16175
diff changeset
166 ra_priv->genr[0] = stream_read_char(demuxer->stream);
9cb2b9b6a9b7 Sparcs do not like wild pointer typecasting (unaligned access).
reimar
parents: 16175
diff changeset
167 ra_priv->genr[1] = stream_read_char(demuxer->stream);
9cb2b9b6a9b7 Sparcs do not like wild pointer typecasting (unaligned access).
reimar
parents: 16175
diff changeset
168 ra_priv->genr[2] = stream_read_char(demuxer->stream);
9cb2b9b6a9b7 Sparcs do not like wild pointer typecasting (unaligned access).
reimar
parents: 16175
diff changeset
169 ra_priv->genr[3] = stream_read_char(demuxer->stream);
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
170 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
171 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Genr size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
172 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
173 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
174 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
175 i = stream_read_char(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
176 sh->format = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
177 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
178 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] FourCC size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
179 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
180 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
181 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
182 stream_skip(demuxer->stream, 3);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
183 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
184
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
185 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
186 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
187 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
188 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
189 demux_info_add(demuxer, "Title", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
190 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
191 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
192 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
193 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
194 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
195 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
196 demux_info_add(demuxer, "Author", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
197 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
198 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
199 if ((i = stream_read_char(demuxer->stream)) != 0) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
200 buf = malloc(i+1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
201 stream_read(demuxer->stream, buf, i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
202 buf[i] = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
203 demux_info_add(demuxer, "Copyright", buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
204 free(buf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
205 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
206
14908
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
207 if ((i = stream_read_char(demuxer->stream)) != 0) {
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
208 buf = malloc(i+1);
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
209 stream_read(demuxer->stream, buf, i);
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
210 buf[i] = 0;
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
211 demux_info_add(demuxer, "Comment", buf);
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
212 free(buf);
82344f91104a Fix some 28.8 ra files with four text strings
rtognimp
parents: 11544
diff changeset
213 }
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
214
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
215 if (ra_priv->version == 3) {
14909
aa6715eaa28c Fix very old ra files with no fourcc
rtognimp
parents: 14908
diff changeset
216 if(ra_priv->hdr_size + 8 > stream_tell(demuxer->stream)) {
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
217 stream_skip(demuxer->stream, 1);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
218 i = stream_read_char(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
219 sh->format = stream_read_dword_le(demuxer->stream);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
220 if (i != 4) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
221 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] FourCC size is not 4 (%d), please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
222 "MPlayer developers\n", i);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
223 stream_skip(demuxer->stream, i - 4);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
224 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
225
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
226 if (sh->format != FOURCC_LPCJ) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
227 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Version 3 with FourCC %8x, please report to "
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
228 "MPlayer developers\n", sh->format);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
229 }
14909
aa6715eaa28c Fix very old ra files with no fourcc
rtognimp
parents: 14908
diff changeset
230 } else
aa6715eaa28c Fix very old ra files with no fourcc
rtognimp
parents: 14908
diff changeset
231 // If a stream does not have fourcc, let's assume it's 14.4
aa6715eaa28c Fix very old ra files with no fourcc
rtognimp
parents: 14908
diff changeset
232 sh->format = FOURCC_LPCJ;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
233
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
234 sh->channels = 1;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
235 sh->samplesize = 16;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
236 sh->samplerate = 8000;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
237 ra_priv->frame_size = 240;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
238 sh->format = FOURCC_144;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
239 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
240
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
241 /* Fill WAVEFORMATEX */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
242 sh->wf = malloc(sizeof(WAVEFORMATEX));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
243 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
244 sh->wf->nChannels = sh->channels;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
245 sh->wf->wBitsPerSample = sh->samplesize;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
246 sh->wf->nSamplesPerSec = sh->samplerate;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
247 sh->wf->nAvgBytesPerSec = sh->samplerate*sh->samplesize/8;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
248 sh->wf->nBlockAlign = ra_priv->frame_size;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
249 sh->wf->cbSize = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
250 sh->wf->wFormatTag = sh->format;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
251
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
252 switch (sh->format) {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
253 case FOURCC_144:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
254 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 14_4\n");
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
255 sh->wf->nBlockAlign = 0x14;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
256 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
257 case FOURCC_288:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
258 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 28_8\n");
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
259 sh->wf->nBlockAlign = ra_priv->coded_framesize;
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
260 ra_priv->audio_buf = malloc(ra_priv->sub_packet_h * ra_priv->frame_size);
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
261 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
262 case FOURCC_DNET:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
263 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n");
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
264 break;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
265 default:
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
266 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%d)\n", sh->format);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
267 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
268
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
269 print_wave_header(sh->wf);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
270
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
271 /* disable seeking */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
272 demuxer->seekable = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
273
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
274 if(!ds_fill_buffer(demuxer->audio))
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
275 mp_msg(MSGT_DEMUXER,MSGL_INFO,"[RealAudio] No data.\n");
10232
939ff11825de Warning fixes, patch by Dominik Mierzejewski
rtognimp
parents: 10124
diff changeset
276
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
277 return demuxer;
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
278 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
279
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
280
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
281
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
282 static void demux_close_ra(demuxer_t *demuxer)
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
283 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
284 ra_priv_t* ra_priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
285
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
286 if (ra_priv) {
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
287 if (ra_priv->audio_buf)
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
288 free (ra_priv->audio_buf);
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
289 free(ra_priv);
17149
9a0a376a54b1 Move audio packets reordering from codec interface to demuxers for real
rtognimp
parents: 16322
diff changeset
290 }
10034
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
291 return;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
292 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
293
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
294
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
295 #if 0
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
296 /* please upload RV10 samples WITH INDEX CHUNK */
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
297 int demux_seek_ra(demuxer_t *demuxer, float rel_seek_secs, int flags)
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
298 {
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
299 real_priv_t *priv = demuxer->priv;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
300 demux_stream_t *d_audio = demuxer->audio;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
301 sh_audio_t *sh_audio = d_audio->sh;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
302 int aid = d_audio->id;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
303 int next_offset = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
304 int rel_seek_frames = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
305 int streams = 0;
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
306
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
307 return stream_seek(demuxer->stream, next_offset);
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
308 }
4f434f04b5bf Realaudio support
rtognimp
parents:
diff changeset
309 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
310
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
311
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
312 demuxer_desc_t demuxer_desc_realaudio = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
313 "Realaudio demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
314 "realaudio",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
315 "REALAUDIO",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
316 "Roberto Togni",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
317 "handles old audio only .ra files",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
318 DEMUXER_TYPE_REALAUDIO,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
319 1, // safe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
320 ra_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
321 demux_ra_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
322 demux_open_ra,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
323 demux_close_ra,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
324 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
325 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 14909
diff changeset
326 };