summaryrefslogtreecommitdiffstats
path: root/dec_audio.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-15 11:50:55 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-15 11:50:55 +0000
commit7c9c86fb97c49974274ea2404c5461fe42db5472 (patch)
treefe0535a64aee23c1413683f1a997b625c79d7b9f /dec_audio.c
parent26543fef95be404da8ee8b1ef242acb6eea9cc22 (diff)
downloadmpv-7c9c86fb97c49974274ea2404c5461fe42db5472.tar.bz2
mpv-7c9c86fb97c49974274ea2404c5461fe42db5472.tar.xz
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1529 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'dec_audio.c')
-rw-r--r--dec_audio.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/dec_audio.c b/dec_audio.c
index fc90f2ea6c..07ce0d97bf 100644
--- a/dec_audio.c
+++ b/dec_audio.c
@@ -29,6 +29,8 @@ int fakemono=0;
#include "xa/xa_gsm.h"
+#include "ac3-iec958.h"
+
#ifdef USE_DIRECTSHOW
#include "loader/DirectShow/DS_AudioDec.h"
#endif
@@ -130,6 +132,11 @@ case AFM_AC3:
// Dolby AC3 audio:
sh_audio->audio_out_minsize=4*256*6;
break;
+case AFM_HWAC3:
+ // Dolby AC3 audio:
+ sh_audio->audio_out_minsize=4*256*6;
+ sh_audio->sample_format = AFMT_AC3;
+ break;
case AFM_GSM:
// MS-GSM audio codec:
sh_audio->audio_out_minsize=4*320;
@@ -219,6 +226,28 @@ case AFM_AC3: {
}
break;
}
+case AFM_HWAC3: {
+ unsigned char *buffer;
+ struct hwac3info ai;
+ int len, skipped;
+ len = ds_get_packet(sh_audio->ds, &buffer);
+ if(ac3_iec958_parse_syncinfo(buffer, len, &ai, &skipped) < 0) {
+ fprintf(stderr, "AC3 stream not valid.\n");
+ driver = 0;
+ break;
+ }
+ if(ai.samplerate != 48000) {
+ fprintf(stderr, "Only 48000 Hz streams supported.\n");
+ driver = 0;
+ break;
+ }
+ sh_audio->samplerate=ai.samplerate;
+// sh_audio->samplesize=ai.framesize;
+ sh_audio->channels=1;
+ sh_audio->i_bps=ai.bitrate*(1000/8);
+ sh_audio->ac3_frame=malloc(6144);
+ break;
+}
case AFM_ALAW: {
// aLaw audio codec:
sh_audio->channels=sh_audio->wf->nChannels;
@@ -332,6 +361,12 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){
}
//printf("{3:%d}",avi_header.idx_pos);fflush(stdout);
break;
+ case AFM_HWAC3: // AC3 through SPDIF
+ if(demux_read_data(sh_audio->ds,sh_audio->ac3_frame, 6144) != 6144)
+ break; //EOF
+ ac3_iec958_build_burst(1536, 0x1F, 1, buf, sh_audio->ac3_frame);
+ len = 6144;
+ break;
#ifdef USE_WIN32DLL
case AFM_ACM:
// len=sh_audio->audio_out_minsize; // optimal decoded fragment size
@@ -387,6 +422,7 @@ void resync_audio_stream(sh_audio_t *sh_audio){
break;
case AFM_ACM:
case AFM_DSHOW:
+ case AFM_HWAC3:
sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer
break;
}