summaryrefslogtreecommitdiffstats
path: root/dec_audio.c
diff options
context:
space:
mode:
authormelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-02 22:45:39 +0000
committermelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-02 22:45:39 +0000
commit80168a072df13df22f4782735cd5a7cd72743b4f (patch)
treee65a8f83929cc0427c46307a593b8c5726e78384 /dec_audio.c
parent9996ca0ac9ffa70efd3685beabb2fa1391ecb446 (diff)
downloadmpv-80168a072df13df22f4782735cd5a7cd72743b4f.tar.bz2
mpv-80168a072df13df22f4782735cd5a7cd72743b4f.tar.xz
further work on the RoQ audio decoder
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4487 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'dec_audio.c')
-rw-r--r--dec_audio.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/dec_audio.c b/dec_audio.c
index 1f2d8b00fa..5aba84344b 100644
--- a/dec_audio.c
+++ b/dec_audio.c
@@ -20,6 +20,8 @@ extern int verbose; // defined in mplayer.c
#include "dec_audio.h"
+#include "roqav.h"
+
//==========================================================================
#include "libao2/afmt.h"
@@ -433,6 +435,13 @@ case AFM_FOX62ADPCM:
sh_audio->ds->ss_div=FOX62_ADPCM_SAMPLES_PER_BLOCK;
sh_audio->ds->ss_mul=FOX62_ADPCM_BLOCK_SIZE;
break;
+case AFM_ROQAUDIO:
+ // minsize was stored in wf->nBlockAlign by the RoQ demuxer
+ sh_audio->audio_out_minsize=sh_audio->wf->nBlockAlign;
+ sh_audio->ds->ss_div=FOX62_ADPCM_SAMPLES_PER_BLOCK;
+ sh_audio->ds->ss_mul=FOX62_ADPCM_BLOCK_SIZE;
+ sh_audio->context = roq_decode_audio_init();
+ break;
case AFM_MPEG:
// MPEG Audio:
sh_audio->audio_out_minsize=4608;
@@ -726,6 +735,11 @@ case AFM_FOX62ADPCM:
sh_audio->i_bps=FOX62_ADPCM_BLOCK_SIZE*
(sh_audio->channels*sh_audio->samplerate) / FOX62_ADPCM_SAMPLES_PER_BLOCK;
break;
+case AFM_ROQAUDIO:
+ sh_audio->channels=sh_audio->wf->nChannels;
+ sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
+ sh_audio->i_bps = (sh_audio->channels * 22050) / 2;
+ break;
case AFM_MPEG: {
// MPEG Audio:
dec_audio_sh=sh_audio; // save sh_audio for the callback:
@@ -1166,6 +1180,27 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){
(unsigned short*)buf,ibuf);
break;
}
+ case AFM_ROQAUDIO:
+ {
+ static unsigned char *ibuf = NULL;
+ unsigned char header_data[6];
+ int read_len;
+
+ if (!ibuf)
+ ibuf = (unsigned char *)malloc(sh_audio->audio_out_minsize / 2);
+
+ // figure out how much data to read
+ if (demux_read_data(sh_audio->ds, header_data, 6) != 6)
+ break; // EOF
+ read_len = (header_data[5] << 24) | (header_data[4] << 16) |
+ (header_data[3] << 8) | header_data[2];
+ read_len += 2; // 16-bit arguments
+ if (demux_read_data(sh_audio->ds, ibuf, read_len) != read_len)
+ break;
+ len = 2 * roq_decode_audio((unsigned short *)buf, ibuf,
+ read_len, sh_audio->channels, sh_audio->context);
+ break;
+ }
#ifdef USE_LIBAC3
case AFM_AC3: // AC3 decoder
//printf("{1:%d}",avi_header.idx_pos);fflush(stdout);