From 2dd245f0ddf0aea2a644f561a9fc366dc05288a3 Mon Sep 17 00:00:00 2001 From: arpi Date: Mon, 4 Nov 2002 00:23:53 +0000 Subject: [PATCH] - realaudio ATRC (sony atrac3) codec support - fixed passing of codecdata from demuxer to codec patch by Fabian Franz git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8095 b3059339-0415-0410-9bf9-f77b7e298cf2 --- etc/codecs.conf | 7 +++++ libmpcodecs/ad_realaud.c | 6 ++--- libmpdemux/demux_real.c | 58 +++++++++++++++++++++++++++++++--------- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/etc/codecs.conf b/etc/codecs.conf index ce7d4daed3..e9291c0966 100644 --- a/etc/codecs.conf +++ b/etc/codecs.conf @@ -1197,6 +1197,13 @@ audiocodec rasipr driver realaud dll "sipr.so.6.0" +audiocodec raatrc + info "RealAudio ATRAC3" + status working + format 0x63727461 ; "atrc" + driver realaud + dll "atrc.so.6.0" + audiocodec imaadpcm info "IMA ADPCM" status working diff --git a/libmpcodecs/ad_realaud.c b/libmpcodecs/ad_realaud.c index 6036e4f760..6c70f89d0c 100644 --- a/libmpcodecs/ad_realaud.c +++ b/libmpcodecs/ad_realaud.c @@ -112,9 +112,9 @@ static int preinit(sh_audio_t *sh){ sh->wf->nSamplesPerSec,sh->wf->wBitsPerSample,sh->wf->nChannels, 100, // ??? ((short*)(sh->wf+1))[0], // subpacket size - sh->wf->nBlockAlign, - 16, // ?? - ((char*)(sh->wf+1))+6+8 + ((short*)(sh->wf+1))[3], // coded frame size + ((short*)(sh->wf+1))[4], // codec data length + ((char*)(sh->wf+1))+10 // extras }; result=raInitDecoder(sh->context,&init_data); if(result){ diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c index 70cbef719c..8881a1670c 100644 --- a/libmpdemux/demux_real.c +++ b/libmpdemux/demux_real.c @@ -8,6 +8,11 @@ TODO: fix the whole syncing mechanism $Log$ + Revision 1.30 2002/11/04 00:23:53 arpi + - realaudio ATRC (sony atrac3) codec support + - fixed passing of codecdata from demuxer to codec + patch by Fabian Franz + Revision 1.29 2002/11/01 17:46:43 arpi verbose can be negative @@ -902,6 +907,8 @@ void demux_open_real(demuxer_t* demuxer) int sub_packet_h; int version; int flavor; + int coded_frame_size; + int codecdata_length; mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); version = stream_read_word(demuxer->stream); @@ -913,7 +920,8 @@ void demux_open_real(demuxer_t* demuxer) stream_skip(demuxer->stream, 2); /* version (4 or 5) */ stream_skip(demuxer->stream, 4); // header size == 0x4E flavor = stream_read_word(demuxer->stream);/* codec flavor id */ - stream_skip(demuxer->stream, 4); /* coded frame size */ + coded_frame_size = stream_read_dword(demuxer->stream);/* needed by codec */ + //stream_skip(demuxer->stream, 4); /* coded frame size */ stream_skip(demuxer->stream, 4); // big number stream_skip(demuxer->stream, 4); // bigger number stream_skip(demuxer->stream, 4); // 2 || -''- @@ -961,6 +969,23 @@ void demux_open_real(demuxer_t* demuxer) sh->wf->cbSize = 0; sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]); + switch (sh->format){ + case MKTAG('d', 'n', 'e', 't'): + mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET (AC3 with low-bitrate extension)\n"); + break; + case MKTAG('s', 'i', 'p', 'r'): + mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n"); + break; + case MKTAG('c', 'o', 'o', 'k'): + mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); + break; + case MKTAG('a', 't', 'r', 'c'): + mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); + break; + default: + mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf); + } + switch (sh->format) { case MKTAG('d', 'n', 'e', 't'): @@ -969,7 +994,6 @@ void demux_open_real(demuxer_t* demuxer) break; case MKTAG('s', 'i', 'p', 'r'): #if 0 - mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n"); sh->format = 0x130; /* for buggy directshow loader */ sh->wf->cbSize = 4; @@ -989,26 +1013,34 @@ void demux_open_real(demuxer_t* demuxer) // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; break; #endif - case MKTAG('c', 'o', 'o', 'k'): - mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); - sh->wf->cbSize = 4+2+24; - sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); - ((short*)(sh->wf+1))[0]=sub_packet_size; - ((short*)(sh->wf+1))[1]=sub_packet_h; - ((short*)(sh->wf+1))[2]=flavor; - stream_read(demuxer->stream, ((char*)(sh->wf+1))+6, 24); // extras - break; case MKTAG('a', 't', 'r', 'c'): - mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); +#if 0 sh->format = 0x270; /* 14 bytes extra header needed ! */ sh->wf->cbSize = 14; sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); - sh->wf->nAvgBytesPerSec = 16537; // 8268 sh->wf->nBlockAlign = 384; // 192 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */ break; +#endif + case MKTAG('c', 'o', 'o', 'k'): + // realaudio codec plugins - common: +// sh->wf->cbSize = 4+2+24; + stream_skip(demuxer->stream,3); // Skip 3 unknown bytes + if (version==5) + stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte + codecdata_length=stream_read_dword(demuxer->stream); + sh->wf->cbSize = 10+codecdata_length; + sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); + ((short*)(sh->wf+1))[0]=sub_packet_size; + ((short*)(sh->wf+1))[1]=sub_packet_h; + ((short*)(sh->wf+1))[2]=flavor; + ((short*)(sh->wf+1))[3]=coded_frame_size; + ((short*)(sh->wf+1))[4]=codecdata_length; +// stream_read(demuxer->stream, ((char*)(sh->wf+1))+6, 24); // extras + stream_read(demuxer->stream, ((char*)(sh->wf+1))+10, codecdata_length); // extras + break; default: mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf); }