Mercurial > mplayer.hg
comparison libmpdemux/demux_realaud.c @ 21987:fed73db9ddb1
Use interleaver id to select the correct interleaver instead of guessing
it from the codec id.
Fixes gittin_13.ra
author | rtogni |
---|---|
date | Wed, 24 Jan 2007 15:05:42 +0000 |
parents | d7b2fa4c39da |
children | 4d81dbdf46b9 |
comparison
equal
deleted
inserted
replaced
21986:85d0b02f2a2d | 21987:fed73db9ddb1 |
---|---|
20 #define FOURCC_144 mmioFOURCC('1','4','_','4') | 20 #define FOURCC_144 mmioFOURCC('1','4','_','4') |
21 #define FOURCC_288 mmioFOURCC('2','8','_','8') | 21 #define FOURCC_288 mmioFOURCC('2','8','_','8') |
22 #define FOURCC_DNET mmioFOURCC('d','n','e','t') | 22 #define FOURCC_DNET mmioFOURCC('d','n','e','t') |
23 #define FOURCC_LPCJ mmioFOURCC('l','p','c','J') | 23 #define FOURCC_LPCJ mmioFOURCC('l','p','c','J') |
24 #define FOURCC_SIPR mmioFOURCC('s','i','p','r') | 24 #define FOURCC_SIPR mmioFOURCC('s','i','p','r') |
25 #define INTLID_INT4 mmioFOURCC('I','n','t','4') | |
26 #define INTLID_SIPR mmioFOURCC('s','i','p','r') | |
25 | 27 |
26 | 28 |
27 static unsigned char sipr_swaps[38][2]={ | 29 static unsigned char sipr_swaps[38][2]={ |
28 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, | 30 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, |
29 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, | 31 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, |
44 unsigned short codec_flavor; | 46 unsigned short codec_flavor; |
45 unsigned int coded_framesize; | 47 unsigned int coded_framesize; |
46 unsigned short sub_packet_h; | 48 unsigned short sub_packet_h; |
47 unsigned short frame_size; | 49 unsigned short frame_size; |
48 unsigned short sub_packet_size; | 50 unsigned short sub_packet_size; |
49 char genr[4]; | 51 unsigned intl_id; |
50 unsigned char *audio_buf; | 52 unsigned char *audio_buf; |
51 } ra_priv_t; | 53 } ra_priv_t; |
52 | 54 |
53 | 55 |
54 | 56 |
82 return 0; | 84 return 0; |
83 | 85 |
84 len = wf->nBlockAlign; | 86 len = wf->nBlockAlign; |
85 demuxer->filepos = stream_tell(demuxer->stream); | 87 demuxer->filepos = stream_tell(demuxer->stream); |
86 | 88 |
87 if ((sh->format == FOURCC_288) || (sh->format == FOURCC_SIPR)) { | 89 if ((ra_priv->intl_id == INTLID_INT4) || (ra_priv->intl_id == INTLID_SIPR)) { |
88 if (sh->format == FOURCC_SIPR) { | 90 if (ra_priv->intl_id == INTLID_SIPR) { |
89 int n; | 91 int n; |
90 int bs = ra_priv->sub_packet_h * ra_priv->frame_size * 2 / 96; // nibbles per subpacket | 92 int bs = ra_priv->sub_packet_h * ra_priv->frame_size * 2 / 96; // nibbles per subpacket |
91 stream_read(demuxer->stream, ra_priv->audio_buf, ra_priv->sub_packet_h * ra_priv->frame_size); | 93 stream_read(demuxer->stream, ra_priv->audio_buf, ra_priv->sub_packet_h * ra_priv->frame_size); |
92 // Perform reordering | 94 // Perform reordering |
93 for(n = 0; n < 38; n++) { | 95 for(n = 0; n < 38; n++) { |
197 sh->samplesize = stream_read_word(demuxer->stream); | 199 sh->samplesize = stream_read_word(demuxer->stream); |
198 sh->channels = stream_read_word(demuxer->stream); | 200 sh->channels = stream_read_word(demuxer->stream); |
199 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] %d channel, %d bit, %dHz\n", sh->channels, | 201 mp_msg(MSGT_DEMUX,MSGL_V,"[RealAudio] %d channel, %d bit, %dHz\n", sh->channels, |
200 sh->samplesize, sh->samplerate); | 202 sh->samplesize, sh->samplerate); |
201 i = stream_read_char(demuxer->stream); | 203 i = stream_read_char(demuxer->stream); |
202 ra_priv->genr[0] = stream_read_char(demuxer->stream); | 204 ra_priv->intl_id = stream_read_dword_le(demuxer->stream); |
203 ra_priv->genr[1] = stream_read_char(demuxer->stream); | |
204 ra_priv->genr[2] = stream_read_char(demuxer->stream); | |
205 ra_priv->genr[3] = stream_read_char(demuxer->stream); | |
206 if (i != 4) { | 205 if (i != 4) { |
207 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Genr size is not 4 (%d), please report to " | 206 mp_msg(MSGT_DEMUX,MSGL_WARN,"[RealAudio] Interleaver Id size is not 4 (%d), please report to " |
208 "MPlayer developers\n", i); | 207 "MPlayer developers\n", i); |
209 stream_skip(demuxer->stream, i - 4); | 208 stream_skip(demuxer->stream, i - 4); |
210 } | 209 } |
211 i = stream_read_char(demuxer->stream); | 210 i = stream_read_char(demuxer->stream); |
212 sh->format = stream_read_dword_le(demuxer->stream); | 211 sh->format = stream_read_dword_le(demuxer->stream); |