# HG changeset patch # User arpi # Date 1030736977 0 # Node ID 33c38a0c20e825c5f11aa221a72350d6f185cb1b # Parent 772f853f32a132684ca6c8bc5f7b5a42fc965cc0 renamed to match driver family name diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_a52.c --- a/libmpcodecs/ad_a52.c Fri Aug 30 19:40:24 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -#include -#include -#include - -#include "config.h" -#include "mp_msg.h" -#include "help_mp.h" - -#include "ad_internal.h" - -#include "cpudetect.h" - -#include "../liba52/a52.h" -#include "../liba52/mm_accel.h" - -static sample_t * a52_samples; -static a52_state_t a52_state; -static uint32_t a52_flags=0; - -#include "bswap.h" - -static ad_info_t info = -{ - "AC3-liba52", - "liba52", - AFM_A52, - "Nick Kurshev", - "Michel LESPINASSE", - "" -}; - -LIBAD_EXTERN(liba52) - -extern int audio_output_channels; - -int a52_fillbuff(sh_audio_t *sh_audio){ -int length=0; -int flags=0; -int sample_rate=0; -int bit_rate=0; - - sh_audio->a_in_buffer_len=0; - /* sync frame:*/ -while(1){ - while(sh_audio->a_in_buffer_len<7){ - int c=demux_getc(sh_audio->ds); - if(c<0) return -1; /* EOF*/ - sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; - } - length = a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); - if(length>=7 && length<=3840) break; /* we're done.*/ - /* bad file => resync*/ - memcpy(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,6); - --sh_audio->a_in_buffer_len; -} - mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"a52: len=%d flags=0x%X %d Hz %d bit/s\n",length,flags,sample_rate,bit_rate); - sh_audio->samplerate=sample_rate; - sh_audio->i_bps=bit_rate/8; - demux_read_data(sh_audio->ds,sh_audio->a_in_buffer+7,length-7); - - if(crc16_block(sh_audio->a_in_buffer+2,length-2)!=0) - mp_msg(MSGT_DECAUDIO,MSGL_STATUS,"a52: CRC check failed! \n"); - - return length; -} - -/* returns: number of available channels*/ -static int a52_printinfo(sh_audio_t *sh_audio){ -int flags, sample_rate, bit_rate; -char* mode="unknown"; -int channels=0; - a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); - switch(flags&A52_CHANNEL_MASK){ - case A52_CHANNEL: mode="channel"; channels=2; break; - case A52_MONO: mode="mono"; channels=1; break; - case A52_STEREO: mode="stereo"; channels=2; break; - case A52_3F: mode="3f";channels=3;break; - case A52_2F1R: mode="2f+1r";channels=3;break; - case A52_3F1R: mode="3f+1r";channels=4;break; - case A52_2F2R: mode="2f+2r";channels=4;break; - case A52_3F2R: mode="3f+2r";channels=5;break; - case A52_CHANNEL1: mode="channel1"; channels=2; break; - case A52_CHANNEL2: mode="channel2"; channels=2; break; - case A52_DOLBY: mode="dolby"; channels=2; break; - } - mp_msg(MSGT_DECAUDIO,MSGL_INFO,"AC3: %d.%d (%s%s) %d Hz %3.1f kbit/s\n", - channels, (flags&A52_LFE)?1:0, - mode, (flags&A52_LFE)?"+lfe":"", - sample_rate, bit_rate*0.001f); - return (flags&A52_LFE) ? (channels+1) : channels; -} - - -static int preinit(sh_audio_t *sh) -{ - /* Dolby AC3 audio: */ - /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ - sh->audio_out_minsize=audio_output_channels*2*256*6; - sh->audio_in_minsize=3840; - return 1; -} - -static int init(sh_audio_t *sh_audio) -{ - uint32_t a52_accel=0; - sample_t level=1, bias=384; - int flags=0; - /* Dolby AC3 audio:*/ - if(gCpuCaps.hasSSE) a52_accel|=MM_ACCEL_X86_SSE; - if(gCpuCaps.hasMMX) a52_accel|=MM_ACCEL_X86_MMX; - if(gCpuCaps.hasMMX2) a52_accel|=MM_ACCEL_X86_MMXEXT; - if(gCpuCaps.has3DNow) a52_accel|=MM_ACCEL_X86_3DNOW; - if(gCpuCaps.has3DNowExt) a52_accel|=MM_ACCEL_X86_3DNOWEXT; - a52_samples=a52_init (a52_accel); - if (a52_samples == NULL) { - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n"); - return 0; - } - if(a52_fillbuff(sh_audio)<0){ - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n"); - return 0; - } - /* 'a52 cannot upmix' hotfix:*/ - a52_printinfo(sh_audio); - sh_audio->channels=audio_output_channels; -while(sh_audio->channels>0){ - switch(sh_audio->channels){ - case 1: a52_flags=A52_MONO; break; -/* case 2: a52_flags=A52_STEREO; break;*/ - case 2: a52_flags=A52_DOLBY; break; -/* case 3: a52_flags=A52_3F; break;*/ - case 3: a52_flags=A52_2F1R; break; - case 4: a52_flags=A52_2F2R; break; /* 2+2*/ - case 5: a52_flags=A52_3F2R; break; - case 6: a52_flags=A52_3F2R|A52_LFE; break; /* 5.1*/ - } - /* test:*/ - flags=a52_flags|A52_ADJUST_LEVEL; - mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags before a52_frame: 0x%X\n",flags); - if (a52_frame (&a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: error decoding frame -> nosound\n"); - return 0; - } - mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags after a52_frame: 0x%X\n",flags); - /* frame decoded, let's init resampler:*/ - if(a52_resample_init(a52_accel,flags,sh_audio->channels)) break; - --sh_audio->channels; /* try to decrease no. of channels*/ -} - if(sh_audio->channels<=0){ - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: no resampler. try different channel setup!\n"); - return 0; - } - return 1; -} - -static void uninit(sh_audio_t *sh) -{ -} - -static int control(sh_audio_t *sh,int cmd,void* arg, ...) -{ - switch(cmd) - { - case ADCTRL_SKIP_FRAME: - a52_fillbuff(sh); break; // skip AC3 frame - return CONTROL_TRUE; - } - return CONTROL_UNKNOWN; -} - -static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) -{ - sample_t level=1, bias=384; - int flags=a52_flags|A52_ADJUST_LEVEL; - int i,len=-1; - if(!sh_audio->a_in_buffer_len) - if(a52_fillbuff(sh_audio)<0) return len; /* EOF */ - sh_audio->a_in_buffer_len=0; - if (a52_frame (&a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n"); - return len; - } - len=0; - for (i = 0; i < 6; i++) { - if (a52_block (&a52_state, a52_samples)){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error at resampling\n"); - break; - } - len+=2*a52_resample(a52_samples,(int16_t *)&buf[len]); - } - return len; -} diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_liba52.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/ad_liba52.c Fri Aug 30 19:49:37 2002 +0000 @@ -0,0 +1,192 @@ +#include +#include +#include + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +#include "ad_internal.h" + +#include "cpudetect.h" + +#include "../liba52/a52.h" +#include "../liba52/mm_accel.h" + +static sample_t * a52_samples; +static a52_state_t a52_state; +static uint32_t a52_flags=0; + +#include "bswap.h" + +static ad_info_t info = +{ + "AC3-liba52", + "liba52", + AFM_A52, + "Nick Kurshev", + "Michel LESPINASSE", + "" +}; + +LIBAD_EXTERN(liba52) + +extern int audio_output_channels; + +int a52_fillbuff(sh_audio_t *sh_audio){ +int length=0; +int flags=0; +int sample_rate=0; +int bit_rate=0; + + sh_audio->a_in_buffer_len=0; + /* sync frame:*/ +while(1){ + while(sh_audio->a_in_buffer_len<7){ + int c=demux_getc(sh_audio->ds); + if(c<0) return -1; /* EOF*/ + sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; + } + length = a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); + if(length>=7 && length<=3840) break; /* we're done.*/ + /* bad file => resync*/ + memcpy(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,6); + --sh_audio->a_in_buffer_len; +} + mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"a52: len=%d flags=0x%X %d Hz %d bit/s\n",length,flags,sample_rate,bit_rate); + sh_audio->samplerate=sample_rate; + sh_audio->i_bps=bit_rate/8; + demux_read_data(sh_audio->ds,sh_audio->a_in_buffer+7,length-7); + + if(crc16_block(sh_audio->a_in_buffer+2,length-2)!=0) + mp_msg(MSGT_DECAUDIO,MSGL_STATUS,"a52: CRC check failed! \n"); + + return length; +} + +/* returns: number of available channels*/ +static int a52_printinfo(sh_audio_t *sh_audio){ +int flags, sample_rate, bit_rate; +char* mode="unknown"; +int channels=0; + a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); + switch(flags&A52_CHANNEL_MASK){ + case A52_CHANNEL: mode="channel"; channels=2; break; + case A52_MONO: mode="mono"; channels=1; break; + case A52_STEREO: mode="stereo"; channels=2; break; + case A52_3F: mode="3f";channels=3;break; + case A52_2F1R: mode="2f+1r";channels=3;break; + case A52_3F1R: mode="3f+1r";channels=4;break; + case A52_2F2R: mode="2f+2r";channels=4;break; + case A52_3F2R: mode="3f+2r";channels=5;break; + case A52_CHANNEL1: mode="channel1"; channels=2; break; + case A52_CHANNEL2: mode="channel2"; channels=2; break; + case A52_DOLBY: mode="dolby"; channels=2; break; + } + mp_msg(MSGT_DECAUDIO,MSGL_INFO,"AC3: %d.%d (%s%s) %d Hz %3.1f kbit/s\n", + channels, (flags&A52_LFE)?1:0, + mode, (flags&A52_LFE)?"+lfe":"", + sample_rate, bit_rate*0.001f); + return (flags&A52_LFE) ? (channels+1) : channels; +} + + +static int preinit(sh_audio_t *sh) +{ + /* Dolby AC3 audio: */ + /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ + sh->audio_out_minsize=audio_output_channels*2*256*6; + sh->audio_in_minsize=3840; + return 1; +} + +static int init(sh_audio_t *sh_audio) +{ + uint32_t a52_accel=0; + sample_t level=1, bias=384; + int flags=0; + /* Dolby AC3 audio:*/ + if(gCpuCaps.hasSSE) a52_accel|=MM_ACCEL_X86_SSE; + if(gCpuCaps.hasMMX) a52_accel|=MM_ACCEL_X86_MMX; + if(gCpuCaps.hasMMX2) a52_accel|=MM_ACCEL_X86_MMXEXT; + if(gCpuCaps.has3DNow) a52_accel|=MM_ACCEL_X86_3DNOW; + if(gCpuCaps.has3DNowExt) a52_accel|=MM_ACCEL_X86_3DNOWEXT; + a52_samples=a52_init (a52_accel); + if (a52_samples == NULL) { + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n"); + return 0; + } + if(a52_fillbuff(sh_audio)<0){ + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n"); + return 0; + } + /* 'a52 cannot upmix' hotfix:*/ + a52_printinfo(sh_audio); + sh_audio->channels=audio_output_channels; +while(sh_audio->channels>0){ + switch(sh_audio->channels){ + case 1: a52_flags=A52_MONO; break; +/* case 2: a52_flags=A52_STEREO; break;*/ + case 2: a52_flags=A52_DOLBY; break; +/* case 3: a52_flags=A52_3F; break;*/ + case 3: a52_flags=A52_2F1R; break; + case 4: a52_flags=A52_2F2R; break; /* 2+2*/ + case 5: a52_flags=A52_3F2R; break; + case 6: a52_flags=A52_3F2R|A52_LFE; break; /* 5.1*/ + } + /* test:*/ + flags=a52_flags|A52_ADJUST_LEVEL; + mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags before a52_frame: 0x%X\n",flags); + if (a52_frame (&a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: error decoding frame -> nosound\n"); + return 0; + } + mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags after a52_frame: 0x%X\n",flags); + /* frame decoded, let's init resampler:*/ + if(a52_resample_init(a52_accel,flags,sh_audio->channels)) break; + --sh_audio->channels; /* try to decrease no. of channels*/ +} + if(sh_audio->channels<=0){ + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: no resampler. try different channel setup!\n"); + return 0; + } + return 1; +} + +static void uninit(sh_audio_t *sh) +{ +} + +static int control(sh_audio_t *sh,int cmd,void* arg, ...) +{ + switch(cmd) + { + case ADCTRL_SKIP_FRAME: + a52_fillbuff(sh); break; // skip AC3 frame + return CONTROL_TRUE; + } + return CONTROL_UNKNOWN; +} + +static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) +{ + sample_t level=1, bias=384; + int flags=a52_flags|A52_ADJUST_LEVEL; + int i,len=-1; + if(!sh_audio->a_in_buffer_len) + if(a52_fillbuff(sh_audio)<0) return len; /* EOF */ + sh_audio->a_in_buffer_len=0; + if (a52_frame (&a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n"); + return len; + } + len=0; + for (i = 0; i < 6; i++) { + if (a52_block (&a52_state, a52_samples)){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error at resampling\n"); + break; + } + len+=2*a52_resample(a52_samples,(int16_t *)&buf[len]); + } + return len; +} diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_libvorbis.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/ad_libvorbis.c Fri Aug 30 19:49:37 2002 +0000 @@ -0,0 +1,189 @@ + +#include +#include +#include + +#include "config.h" +#include "ad_internal.h" + +#ifdef HAVE_OGGVORBIS + +static ad_info_t info = +{ + "Ogg/Vorbis audio decoder", + "libvorbis", + AFM_VORBIS, + "Felix Buenemann, A'rpi", + "libvorbis", + "buggy" +}; + +LIBAD_EXTERN(vorbis) + +#include + +// This struct is also defined in demux_ogg.c => common header ? +typedef struct ov_struct_st { + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the bitstream user comments */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ +} ov_struct_t; + +static int preinit(sh_audio_t *sh) +{ + sh->audio_out_minsize=1024*4; // 1024 samples/frame + return 1; +} + +static int init(sh_audio_t *sh) +{ + ogg_packet op; + vorbis_comment vc; + struct ov_struct_st *ov; +#define ERROR() { \ + vorbis_comment_clear(&vc); \ + vorbis_info_clear(&ov->vi); \ + free(ov); \ + return 0; \ + } + /// Init the decoder with the 3 header packets + ov = (struct ov_struct_st*)malloc(sizeof(struct ov_struct_st)); + vorbis_info_init(&ov->vi); + vorbis_comment_init(&vc); + op.bytes = ds_get_packet(sh->ds,&op.packet); + op.b_o_s = 1; + /// Header + if(vorbis_synthesis_headerin(&ov->vi,&vc,&op) <0) { + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"OggVorbis: initial (identification) header broken!\n"); + ERROR(); + } + op.bytes = ds_get_packet(sh->ds,&op.packet); + op.b_o_s = 0; + /// Comments + if(vorbis_synthesis_headerin(&ov->vi,&vc,&op) <0) { + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"OggVorbis: comment header broken!\n"); + ERROR(); + } + op.bytes = ds_get_packet(sh->ds,&op.packet); + //// Codebook + if(vorbis_synthesis_headerin(&ov->vi,&vc,&op)<0) { + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"OggVorbis: codebook header broken!\n"); + ERROR(); + } else { /// Print the infos + char **ptr=vc.user_comments; + while(*ptr){ + mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbisComment: %s\n",*ptr); + ++ptr; + } + mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Bitstream is %d channel, %dHz, %dbit/s %cBR\n",(int)ov->vi.channels,(int)ov->vi.rate,(int)ov->vi.bitrate_nominal, + (ov->vi.bitrate_lower!=ov->vi.bitrate_nominal)||(ov->vi.bitrate_upper!=ov->vi.bitrate_nominal)?'V':'C'); + mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Encoded by: %s\n",vc.vendor); + } + vorbis_comment_clear(&vc); + +// printf("lower=%d upper=%d \n",(int)ov->vi.bitrate_lower,(int)ov->vi.bitrate_upper); + + // Setup the decoder + sh->channels=ov->vi.channels; + sh->samplerate=ov->vi.rate; + // assume 128kbit if bitrate not specified in the header + sh->i_bps=((ov->vi.bitrate_nominal>0) ? ov->vi.bitrate_nominal : 128000)/8; + sh->context = ov; + + /// Finish the decoder init + vorbis_synthesis_init(&ov->vd,&ov->vi); + vorbis_block_init(&ov->vd,&ov->vb); + mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Init OK!\n"); + + return 1; +} + +static void uninit(sh_audio_t *sh) +{ + struct ov_struct_st *ov = sh->context; + vorbis_block_clear(&ov->vb); + vorbis_info_clear(&ov->vi); + free(ov); +} + +static int control(sh_audio_t *sh,int cmd,void* arg, ...) +{ + switch(cmd) + { +#if 0 + case ADCTRL_RESYNC_STREAM: + return CONTROL_TRUE; + case ADCTRL_SKIP_FRAME: + return CONTROL_TRUE; +#endif + } + return CONTROL_UNKNOWN; +} + +static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen) +{ + int len = 0; + int samples; + float **pcm; + ogg_packet op; + struct ov_struct_st *ov = sh->context; + op.b_o_s = op.e_o_s = 0; + while(len < minlen) { + op.bytes = ds_get_packet(sh->ds,&op.packet); + if(!op.packet) + break; + if(vorbis_synthesis(&ov->vb,&op)==0) /* test for success! */ + vorbis_synthesis_blockin(&ov->vd,&ov->vb); + while((samples=vorbis_synthesis_pcmout(&ov->vd,&pcm))>0){ + int i,j; + int clipflag=0; + int convsize=(maxlen-len)/(2*ov->vi.channels); // max size! + int bout=(samplesvi.channels;i++){ + ogg_int16_t *convbuffer=(ogg_int16_t *)(&buf[len]); + ogg_int16_t *ptr=convbuffer+i; + float *mono=pcm[i]; + for(j=0;j32767){ + val=32767; + clipflag=1; + } + if(val<-32768){ + val=-32768; + clipflag=1; + } + *ptr=val; + ptr+=ov->vi.channels; + } + } + + if(clipflag) + mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"Clipping in frame %ld\n",(long)(ov->vd.sequence)); + len+=2*ov->vi.channels*bout; + mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"\n[decoded: %d / %d ]\n",bout,samples); + vorbis_synthesis_read(&ov->vd,bout); /* tell libvorbis how + many samples we + actually consumed */ + } + } + + + + return len; +} + +#endif /* !HAVE_OGGVORBIS */ + diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_real.c --- a/libmpcodecs/ad_real.c Fri Aug 30 19:40:24 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,251 +0,0 @@ - -#include -#include -#include - -#include "config.h" - -#ifdef USE_REALCODECS - -#include -#include - -#include "ad_internal.h" - -static ad_info_t info = { - "RealAudio decoder", - "real", - AFM_REAL, - "A'rpi", - "Florian Schneider", - "binary real audio codecs" -}; - -LIBAD_EXTERN(real) - -static void *handle=NULL; - -void *__builtin_new(unsigned long size) { - return malloc(size); -} - -#if defined(__FreeBSD__) || defined(__NetBSD__) -void *__ctype_b=NULL; -#endif - -static unsigned long (*raCloseCodec)(unsigned long); -static unsigned long (*raDecode)(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long); -static unsigned long (*raFlush)(unsigned long,unsigned long,unsigned long); -static unsigned long (*raFreeDecoder)(unsigned long); -static unsigned long (*raGetFlavorProperty)(unsigned long,unsigned long,unsigned long,unsigned long); -//static unsigned long (*raGetNumberOfFlavors2)(void); -static unsigned long (*raInitDecoder)(unsigned long,unsigned long); -static unsigned long (*raOpenCodec2)(unsigned long); -static unsigned long (*raSetFlavor)(unsigned long,unsigned long); -//static void (*raSetDLLAccessPath)(unsigned long); -static void (*raSetPwd)(char*,char*); - -typedef struct { - int samplerate; - short bits; - short channels; - int unk1; - int unk2; - int packetsize; - int unk3; - void* unk4; -} ra_init_t; - -static int preinit(sh_audio_t *sh){ - // let's check if the driver is available, return 0 if not. - // (you should do that if you use external lib(s) which is optional) - unsigned int result; - int len; - void* prop; - char path[4096]; - sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll); - handle = dlopen (path, RTLD_LAZY); - if(!handle){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot open dll: %s\n",dlerror()); - return 0; - } - - raCloseCodec = dlsym(handle, "RACloseCodec"); - raDecode = dlsym(handle, "RADecode"); - raFlush = dlsym(handle, "RAFlush"); - raFreeDecoder = dlsym(handle, "RAFreeDecoder"); - raGetFlavorProperty = dlsym(handle, "RAGetFlavorProperty"); - raOpenCodec2 = dlsym(handle, "RAOpenCodec2"); - raInitDecoder = dlsym(handle, "RAInitDecoder"); - raSetFlavor = dlsym(handle, "RASetFlavor"); -// raSetDLLAccessPath = dlsym(handle, "SetDLLAccessPath"); - raSetPwd = dlsym(handle, "RASetPwd"); // optional, used by SIPR - - if(!raCloseCodec || !raDecode || !raFlush || !raFreeDecoder || - !raGetFlavorProperty || !raOpenCodec2 || !raSetFlavor || - /*!raSetDLLAccessPath ||*/ !raInitDecoder){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot resolve symbols - incompatible dll\n"); - return 0; - } - - result=raOpenCodec2(&sh->context); - if(result){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder open failed, error code: 0x%X\n",result); - return 0; - } - - sh->samplerate=sh->wf->nSamplesPerSec; - sh->samplesize=sh->wf->wBitsPerSample/8; - sh->channels=sh->wf->nChannels; - - { unsigned char temp2[16]={1,0,0,3,4,0,0,0x14,0,0,0,0,0,1,0,3}; - // note: temp2[] come from audio stream extra header (last 16 of the total 24 bytes) - ra_init_t init_data={ - 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 - }; - result=raInitDecoder(sh->context,&init_data); - if(result){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder init failed, error code: 0x%X\n",result); - return 0; - } - } - - if(raSetPwd){ - // used by 'SIPR' - raSetPwd(sh->context,"Ardubancel Quazanga"); // set password... lol. - } - - result=raSetFlavor(sh->context,((short*)(sh->wf+1))[2]); - if(result){ - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder flavor setup failed, error code: 0x%X\n",result); - return 0; - } - - prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0,&len); - mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio codec: [%d] %s\n",((short*)(sh->wf+1))[2],prop); - - prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],1,&len); - sh->i_bps=((*((int*)prop))+4)/8; - mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio bitrate: %5.3f kbit/s (%d bps) \n",(*((int*)prop))*0.001f,sh->i_bps); - -// prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0x13,&len); -// mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Samples/block?: %d \n",(*((int*)prop))); - - sh->audio_out_minsize=128000; // no idea how to get... :( - sh->audio_in_minsize=((short*)(sh->wf+1))[1]*sh->wf->nBlockAlign; - - return 1; // return values: 1=OK 0=ERROR -} - -static int init(sh_audio_t *sh_audio){ - // initialize the decoder, set tables etc... - - // you can store HANDLE or private struct pointer at sh->context - // you can access WAVEFORMATEX header at sh->wf - - // set sample format/rate parameters if you didn't do it in preinit() yet. - - return 1; // return values: 1=OK 0=ERROR -} - -static void uninit(sh_audio_t *sh){ - // uninit the decoder etc... - // again: you don't have to free() a_in_buffer here! it's done by the core. -} - -static unsigned char sipr_swaps[38][2]={ - {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, - {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, - {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56}, - {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83}, - {77,80} }; - -static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen){ - int result; - int len=-1; - int sps=((short*)(sh->wf+1))[0]; - int w=sh->wf->nBlockAlign; // 5 - int h=((short*)(sh->wf+1))[1]; - -// printf("bs=%d sps=%d w=%d h=%d \n",sh->wf->nBlockAlign,sps,w,h); - -#if 1 - if(sh->a_in_buffer_len<=0){ - // fill the buffer! - if(!sps){ - // 'sipr' way - int j,n; - int bs=h*w*2/96; // nibbles per subpacket - unsigned char *p=sh->a_in_buffer; - demux_read_data(sh->ds, p, h*w); - for(n=0;n<38;n++){ - int i=bs*sipr_swaps[n][0]; - int o=bs*sipr_swaps[n][1]; - // swap nibbles of block 'i' with 'o' TODO: optimize - for(j=0;j>1)]>>4) : (p[(i>>1)]&15); - int y=(o&1) ? (p[(o>>1)]>>4) : (p[(o>>1)]&15); - if(o&1) p[(o>>1)]=(p[(o>>1)]&0x0F)|(x<<4); - else p[(o>>1)]=(p[(o>>1)]&0xF0)|x; - if(i&1) p[(i>>1)]=(p[(i>>1)]&0x0F)|(y<<4); - else p[(i>>1)]=(p[(i>>1)]&0xF0)|y; - ++i;++o; - } - } - sh->a_in_buffer_size= - sh->a_in_buffer_len=w*h; - } else { - // 'cook' way - int x,y; - w/=sps; - for(y=0;yds, sh->a_in_buffer+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps); - } - sh->a_in_buffer_size= - sh->a_in_buffer_len=w*h*sps; - } - } - -#else - if(sh->a_in_buffer_len<=0){ - // fill the buffer! - demux_read_data(sh->ds, sh->a_in_buffer, sh->wf->nBlockAlign); - sh->a_in_buffer_size= - sh->a_in_buffer_len=sh->wf->nBlockAlign; - } -#endif - - result=raDecode(sh->context, sh->a_in_buffer+sh->a_in_buffer_size-sh->a_in_buffer_len, sh->wf->nBlockAlign, - buf, &len, -1); - sh->a_in_buffer_len-=sh->wf->nBlockAlign; - -// printf("radecode: %d bytes, res=0x%X \n",len,result); - - return len; // return value: number of _bytes_ written to output buffer, - // or -1 for EOF (or uncorrectable error) -} - -static int control(sh_audio_t *sh,int cmd,void* arg, ...){ - // various optional functions you MAY implement: - switch(cmd){ - case ADCTRL_RESYNC_STREAM: - // it is called once after seeking, to resync. - // Note: sh_audio->a_in_buffer_len=0; is done _before_ this call! - return CONTROL_TRUE; - case ADCTRL_SKIP_FRAME: - // it is called to skip (jump over) small amount (1/10 sec or 1 frame) - // of audio data - used to sync audio to video after seeking - // if you don't return CONTROL_TRUE, it will defaults to: - // ds_fill_buffer(sh_audio->ds); // skip 1 demux packet - return CONTROL_TRUE; - } - return CONTROL_UNKNOWN; -} - -#endif diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_realaud.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/ad_realaud.c Fri Aug 30 19:49:37 2002 +0000 @@ -0,0 +1,251 @@ + +#include +#include +#include + +#include "config.h" + +#ifdef USE_REALCODECS + +#include +#include + +#include "ad_internal.h" + +static ad_info_t info = { + "RealAudio decoder", + "real", + AFM_REAL, + "A'rpi", + "Florian Schneider", + "binary real audio codecs" +}; + +LIBAD_EXTERN(real) + +static void *handle=NULL; + +void *__builtin_new(unsigned long size) { + return malloc(size); +} + +#if defined(__FreeBSD__) || defined(__NetBSD__) +void *__ctype_b=NULL; +#endif + +static unsigned long (*raCloseCodec)(unsigned long); +static unsigned long (*raDecode)(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long); +static unsigned long (*raFlush)(unsigned long,unsigned long,unsigned long); +static unsigned long (*raFreeDecoder)(unsigned long); +static unsigned long (*raGetFlavorProperty)(unsigned long,unsigned long,unsigned long,unsigned long); +//static unsigned long (*raGetNumberOfFlavors2)(void); +static unsigned long (*raInitDecoder)(unsigned long,unsigned long); +static unsigned long (*raOpenCodec2)(unsigned long); +static unsigned long (*raSetFlavor)(unsigned long,unsigned long); +//static void (*raSetDLLAccessPath)(unsigned long); +static void (*raSetPwd)(char*,char*); + +typedef struct { + int samplerate; + short bits; + short channels; + int unk1; + int unk2; + int packetsize; + int unk3; + void* unk4; +} ra_init_t; + +static int preinit(sh_audio_t *sh){ + // let's check if the driver is available, return 0 if not. + // (you should do that if you use external lib(s) which is optional) + unsigned int result; + int len; + void* prop; + char path[4096]; + sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll); + handle = dlopen (path, RTLD_LAZY); + if(!handle){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot open dll: %s\n",dlerror()); + return 0; + } + + raCloseCodec = dlsym(handle, "RACloseCodec"); + raDecode = dlsym(handle, "RADecode"); + raFlush = dlsym(handle, "RAFlush"); + raFreeDecoder = dlsym(handle, "RAFreeDecoder"); + raGetFlavorProperty = dlsym(handle, "RAGetFlavorProperty"); + raOpenCodec2 = dlsym(handle, "RAOpenCodec2"); + raInitDecoder = dlsym(handle, "RAInitDecoder"); + raSetFlavor = dlsym(handle, "RASetFlavor"); +// raSetDLLAccessPath = dlsym(handle, "SetDLLAccessPath"); + raSetPwd = dlsym(handle, "RASetPwd"); // optional, used by SIPR + + if(!raCloseCodec || !raDecode || !raFlush || !raFreeDecoder || + !raGetFlavorProperty || !raOpenCodec2 || !raSetFlavor || + /*!raSetDLLAccessPath ||*/ !raInitDecoder){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot resolve symbols - incompatible dll\n"); + return 0; + } + + result=raOpenCodec2(&sh->context); + if(result){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder open failed, error code: 0x%X\n",result); + return 0; + } + + sh->samplerate=sh->wf->nSamplesPerSec; + sh->samplesize=sh->wf->wBitsPerSample/8; + sh->channels=sh->wf->nChannels; + + { unsigned char temp2[16]={1,0,0,3,4,0,0,0x14,0,0,0,0,0,1,0,3}; + // note: temp2[] come from audio stream extra header (last 16 of the total 24 bytes) + ra_init_t init_data={ + 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 + }; + result=raInitDecoder(sh->context,&init_data); + if(result){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder init failed, error code: 0x%X\n",result); + return 0; + } + } + + if(raSetPwd){ + // used by 'SIPR' + raSetPwd(sh->context,"Ardubancel Quazanga"); // set password... lol. + } + + result=raSetFlavor(sh->context,((short*)(sh->wf+1))[2]); + if(result){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder flavor setup failed, error code: 0x%X\n",result); + return 0; + } + + prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0,&len); + mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio codec: [%d] %s\n",((short*)(sh->wf+1))[2],prop); + + prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],1,&len); + sh->i_bps=((*((int*)prop))+4)/8; + mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio bitrate: %5.3f kbit/s (%d bps) \n",(*((int*)prop))*0.001f,sh->i_bps); + +// prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0x13,&len); +// mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Samples/block?: %d \n",(*((int*)prop))); + + sh->audio_out_minsize=128000; // no idea how to get... :( + sh->audio_in_minsize=((short*)(sh->wf+1))[1]*sh->wf->nBlockAlign; + + return 1; // return values: 1=OK 0=ERROR +} + +static int init(sh_audio_t *sh_audio){ + // initialize the decoder, set tables etc... + + // you can store HANDLE or private struct pointer at sh->context + // you can access WAVEFORMATEX header at sh->wf + + // set sample format/rate parameters if you didn't do it in preinit() yet. + + return 1; // return values: 1=OK 0=ERROR +} + +static void uninit(sh_audio_t *sh){ + // uninit the decoder etc... + // again: you don't have to free() a_in_buffer here! it's done by the core. +} + +static unsigned char sipr_swaps[38][2]={ + {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, + {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, + {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56}, + {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83}, + {77,80} }; + +static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen){ + int result; + int len=-1; + int sps=((short*)(sh->wf+1))[0]; + int w=sh->wf->nBlockAlign; // 5 + int h=((short*)(sh->wf+1))[1]; + +// printf("bs=%d sps=%d w=%d h=%d \n",sh->wf->nBlockAlign,sps,w,h); + +#if 1 + if(sh->a_in_buffer_len<=0){ + // fill the buffer! + if(!sps){ + // 'sipr' way + int j,n; + int bs=h*w*2/96; // nibbles per subpacket + unsigned char *p=sh->a_in_buffer; + demux_read_data(sh->ds, p, h*w); + for(n=0;n<38;n++){ + int i=bs*sipr_swaps[n][0]; + int o=bs*sipr_swaps[n][1]; + // swap nibbles of block 'i' with 'o' TODO: optimize + for(j=0;j>1)]>>4) : (p[(i>>1)]&15); + int y=(o&1) ? (p[(o>>1)]>>4) : (p[(o>>1)]&15); + if(o&1) p[(o>>1)]=(p[(o>>1)]&0x0F)|(x<<4); + else p[(o>>1)]=(p[(o>>1)]&0xF0)|x; + if(i&1) p[(i>>1)]=(p[(i>>1)]&0x0F)|(y<<4); + else p[(i>>1)]=(p[(i>>1)]&0xF0)|y; + ++i;++o; + } + } + sh->a_in_buffer_size= + sh->a_in_buffer_len=w*h; + } else { + // 'cook' way + int x,y; + w/=sps; + for(y=0;yds, sh->a_in_buffer+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps); + } + sh->a_in_buffer_size= + sh->a_in_buffer_len=w*h*sps; + } + } + +#else + if(sh->a_in_buffer_len<=0){ + // fill the buffer! + demux_read_data(sh->ds, sh->a_in_buffer, sh->wf->nBlockAlign); + sh->a_in_buffer_size= + sh->a_in_buffer_len=sh->wf->nBlockAlign; + } +#endif + + result=raDecode(sh->context, sh->a_in_buffer+sh->a_in_buffer_size-sh->a_in_buffer_len, sh->wf->nBlockAlign, + buf, &len, -1); + sh->a_in_buffer_len-=sh->wf->nBlockAlign; + +// printf("radecode: %d bytes, res=0x%X \n",len,result); + + return len; // return value: number of _bytes_ written to output buffer, + // or -1 for EOF (or uncorrectable error) +} + +static int control(sh_audio_t *sh,int cmd,void* arg, ...){ + // various optional functions you MAY implement: + switch(cmd){ + case ADCTRL_RESYNC_STREAM: + // it is called once after seeking, to resync. + // Note: sh_audio->a_in_buffer_len=0; is done _before_ this call! + return CONTROL_TRUE; + case ADCTRL_SKIP_FRAME: + // it is called to skip (jump over) small amount (1/10 sec or 1 frame) + // of audio data - used to sync audio to video after seeking + // if you don't return CONTROL_TRUE, it will defaults to: + // ds_fill_buffer(sh_audio->ds); // skip 1 demux packet + return CONTROL_TRUE; + } + return CONTROL_UNKNOWN; +} + +#endif diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/ad_vorbis.c --- a/libmpcodecs/ad_vorbis.c Fri Aug 30 19:40:24 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ - -#include -#include -#include - -#include "config.h" -#include "ad_internal.h" - -#ifdef HAVE_OGGVORBIS - -static ad_info_t info = -{ - "Ogg/Vorbis audio decoder", - "libvorbis", - AFM_VORBIS, - "Felix Buenemann, A'rpi", - "libvorbis", - "buggy" -}; - -LIBAD_EXTERN(vorbis) - -#include - -// This struct is also defined in demux_ogg.c => common header ? -typedef struct ov_struct_st { - vorbis_info vi; /* struct that stores all the static vorbis bitstream - settings */ - vorbis_comment vc; /* struct that stores all the bitstream user comments */ - vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ - vorbis_block vb; /* local working space for packet->PCM decode */ -} ov_struct_t; - -static int preinit(sh_audio_t *sh) -{ - sh->audio_out_minsize=1024*4; // 1024 samples/frame - return 1; -} - -static int init(sh_audio_t *sh) -{ - ogg_packet op; - vorbis_comment vc; - struct ov_struct_st *ov; -#define ERROR() { \ - vorbis_comment_clear(&vc); \ - vorbis_info_clear(&ov->vi); \ - free(ov); \ - return 0; \ - } - /// Init the decoder with the 3 header packets - ov = (struct ov_struct_st*)malloc(sizeof(struct ov_struct_st)); - vorbis_info_init(&ov->vi); - vorbis_comment_init(&vc); - op.bytes = ds_get_packet(sh->ds,&op.packet); - op.b_o_s = 1; - /// Header - if(vorbis_synthesis_headerin(&ov->vi,&vc,&op) <0) { - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"OggVorbis: initial (identification) header broken!\n"); - ERROR(); - } - op.bytes = ds_get_packet(sh->ds,&op.packet); - op.b_o_s = 0; - /// Comments - if(vorbis_synthesis_headerin(&ov->vi,&vc,&op) <0) { - mp_msg(MSGT_DECAUDIO,MSGL_ERR,"OggVorbis: comment header broken!\n"); - ERROR(); - } - op.bytes = ds_get_packet(sh->ds,&op.packet); - //// Codebook - if(vorbis_synthesis_headerin(&ov->vi,&vc,&op)<0) { - mp_msg(MSGT_DECAUDIO,MSGL_WARN,"OggVorbis: codebook header broken!\n"); - ERROR(); - } else { /// Print the infos - char **ptr=vc.user_comments; - while(*ptr){ - mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbisComment: %s\n",*ptr); - ++ptr; - } - mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Bitstream is %d channel, %dHz, %dbit/s %cBR\n",(int)ov->vi.channels,(int)ov->vi.rate,(int)ov->vi.bitrate_nominal, - (ov->vi.bitrate_lower!=ov->vi.bitrate_nominal)||(ov->vi.bitrate_upper!=ov->vi.bitrate_nominal)?'V':'C'); - mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Encoded by: %s\n",vc.vendor); - } - vorbis_comment_clear(&vc); - -// printf("lower=%d upper=%d \n",(int)ov->vi.bitrate_lower,(int)ov->vi.bitrate_upper); - - // Setup the decoder - sh->channels=ov->vi.channels; - sh->samplerate=ov->vi.rate; - // assume 128kbit if bitrate not specified in the header - sh->i_bps=((ov->vi.bitrate_nominal>0) ? ov->vi.bitrate_nominal : 128000)/8; - sh->context = ov; - - /// Finish the decoder init - vorbis_synthesis_init(&ov->vd,&ov->vi); - vorbis_block_init(&ov->vd,&ov->vb); - mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Init OK!\n"); - - return 1; -} - -static void uninit(sh_audio_t *sh) -{ - struct ov_struct_st *ov = sh->context; - vorbis_block_clear(&ov->vb); - vorbis_info_clear(&ov->vi); - free(ov); -} - -static int control(sh_audio_t *sh,int cmd,void* arg, ...) -{ - switch(cmd) - { -#if 0 - case ADCTRL_RESYNC_STREAM: - return CONTROL_TRUE; - case ADCTRL_SKIP_FRAME: - return CONTROL_TRUE; -#endif - } - return CONTROL_UNKNOWN; -} - -static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen) -{ - int len = 0; - int samples; - float **pcm; - ogg_packet op; - struct ov_struct_st *ov = sh->context; - op.b_o_s = op.e_o_s = 0; - while(len < minlen) { - op.bytes = ds_get_packet(sh->ds,&op.packet); - if(!op.packet) - break; - if(vorbis_synthesis(&ov->vb,&op)==0) /* test for success! */ - vorbis_synthesis_blockin(&ov->vd,&ov->vb); - while((samples=vorbis_synthesis_pcmout(&ov->vd,&pcm))>0){ - int i,j; - int clipflag=0; - int convsize=(maxlen-len)/(2*ov->vi.channels); // max size! - int bout=(samplesvi.channels;i++){ - ogg_int16_t *convbuffer=(ogg_int16_t *)(&buf[len]); - ogg_int16_t *ptr=convbuffer+i; - float *mono=pcm[i]; - for(j=0;j32767){ - val=32767; - clipflag=1; - } - if(val<-32768){ - val=-32768; - clipflag=1; - } - *ptr=val; - ptr+=ov->vi.channels; - } - } - - if(clipflag) - mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"Clipping in frame %ld\n",(long)(ov->vd.sequence)); - len+=2*ov->vi.channels*bout; - mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"\n[decoded: %d / %d ]\n",bout,samples); - vorbis_synthesis_read(&ov->vd,bout); /* tell libvorbis how - many samples we - actually consumed */ - } - } - - - - return len; -} - -#endif /* !HAVE_OGGVORBIS */ - diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/vd_real.c --- a/libmpcodecs/vd_real.c Fri Aug 30 19:40:24 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,224 +0,0 @@ -#include -#include - -#include "config.h" -#ifdef USE_REALCODECS - -#include - -#include "mp_msg.h" -#include "help_mp.h" - -#include "vd_internal.h" - -static vd_info_t info = { - "RealVideo decoder", - "real", - VFM_REAL, - "Florian Schneider & A'rpi", - "using original closed source codecs for Linux", - "binary real video codecs" -}; - -LIBVD_EXTERN(real) - - -unsigned long (*rvyuv_custom_message)(unsigned long,unsigned long); -unsigned long (*rvyuv_free)(unsigned long); -unsigned long (*rvyuv_hive_message)(unsigned long,unsigned long); -unsigned long (*rvyuv_init)(unsigned long,unsigned long); -unsigned long (*rvyuv_transform)(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long); - -void *rv_handle=NULL; - -void *__builtin_vec_new(unsigned long size) { - return malloc(size); -} - -void __builtin_vec_delete(void *mem) { - free(mem); -} - -void __pure_virtual(void) { - printf("FATAL: __pure_virtual() called!\n"); -// exit(1); -} - -#if defined(__FreeBSD__) || defined(__NetBSD__) -void ___brk_addr(void) {exit(0);} -char **__environ={NULL}; -#undef stderr -FILE *stderr=NULL; -#endif - -// to set/get/query special features/parameters -static int control(sh_video_t *sh,int cmd,void* arg,...){ -// switch(cmd){ -// case VDCTRL_QUERY_MAX_PP_LEVEL: -// return 9; -// case VDCTRL_SET_PP_LEVEL: -// vfw_set_postproc(sh,10*(*((int*)arg))); -// return CONTROL_OK; -// } - return CONTROL_UNKNOWN; -} - -/* exits program when failure */ -int load_syms_linux(char *path) { - void *handle; - char *error; - - mp_msg(MSGT_DECVIDEO,MSGL_INFO, "opening shared obj '%s'\n", path); - rv_handle = dlopen (path, RTLD_LAZY); - handle=rv_handle; - if (!handle) { - mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error: %s\n",dlerror()); - return 0; - } - - rvyuv_custom_message = dlsym(handle, "RV20toYUV420CustomMessage"); - rvyuv_free = dlsym(handle, "RV20toYUV420Free"); - rvyuv_hive_message = dlsym(handle, "RV20toYUV420HiveMessage"); - rvyuv_init = dlsym(handle, "RV20toYUV420Init"); - rvyuv_transform = dlsym(handle, "RV20toYUV420Transform"); - - if(rvyuv_custom_message && - rvyuv_free && - rvyuv_hive_message && - rvyuv_init && - rvyuv_transform) return 1; - - mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error resolving symbols! (version incompatibility?)\n"); - return 0; -} - -#ifdef USE_WIN32DLL - -#include "../loader/ldt_keeper.h" -void* LoadLibraryA(char* name); -void* GetProcAddress(void* handle,char* func); - -int load_syms_windows(char *path) { - void *handle; - Setup_LDT_Keeper(); - rv_handle = handle = LoadLibraryA(path); - mp_msg(MSGT_DECVIDEO,MSGL_V,"win32 real codec handle=%p \n",handle); - - rvyuv_custom_message = GetProcAddress(handle, "RV20toYUV420CustomMessage"); - rvyuv_free = GetProcAddress(handle, "RV20toYUV420Free"); - rvyuv_hive_message = GetProcAddress(handle, "RV20toYUV420HiveMessage"); - rvyuv_init = GetProcAddress(handle, "RV20toYUV420Init"); - rvyuv_transform = GetProcAddress(handle, "RV20toYUV420Transform"); - - if(rvyuv_custom_message && - rvyuv_free && - rvyuv_hive_message && - rvyuv_init && - rvyuv_transform) return 1; - return 0; // error -} -#endif - -/* we need exact positions */ -struct rv_init_t { - short unk1; - short w; - short h; - short unk3; - int unk2; - int subformat; - int unk5; - int format; -} rv_init_t; - -// init driver -static int init(sh_video_t *sh){ - //unsigned int out_fmt; - char path[4096]; - int result; - // we export codec id and sub-id from demuxer in bitmapinfohdr: - unsigned int* extrahdr=(unsigned int*)(sh->bih+1); - struct rv_init_t init_data={ - 11, sh->disp_w, sh->disp_h,0,0,extrahdr[0], - 1,extrahdr[1]}; // rv30 - - mp_msg(MSGT_DECVIDEO,MSGL_V,"realvideo codec id: 0x%08X sub-id: 0x%08X\n",extrahdr[1],extrahdr[0]); - - sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll); - - /* first try to load linux dlls, if failed and we're supporting win32 dlls, - then try to load the windows ones */ - if(!load_syms_linux(path)) -#ifdef USE_WIN32DLL - if (!load_syms_windows(path)) -#endif - { - mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingDLLcodec,sh->codec->dll); - mp_msg(MSGT_DECVIDEO,MSGL_HINT,"You need to copy the contents from the RealPlayer codecs directory\n"); - mp_msg(MSGT_DECVIDEO,MSGL_HINT,"into " REALCODEC_PATH "/ !\n"); - return 0; - } - // only I420 supported - if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420)) return 0; - // init codec: - sh->context=NULL; - result=(*rvyuv_init)(&init_data, &sh->context); - if (result){ - mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Couldn't open RealVideo codec, error code: 0x%X \n",result); - return 0; - } - // setup rv30 codec (codec sub-type and image dimensions): - if(extrahdr[1]>=0x20200002){ - unsigned long cmsg24[4]={sh->disp_w,sh->disp_h,sh->disp_w,sh->disp_h}; - unsigned long cmsg_data[3]={0x24,1+((extrahdr[0]>>16)&7),&cmsg24}; - (*rvyuv_custom_message)(cmsg_data,sh->context); - } - mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: RealVideo codec init OK!\n"); - return 1; -} - -// uninit driver -static void uninit(sh_video_t *sh){ - if(rv_handle) dlclose(rv_handle); - rv_handle=NULL; -} - -// copypaste from demux_real.c - it should match to get it working! -typedef struct dp_hdr_s { - uint32_t chunks; // number of chunks - uint32_t timestamp; // timestamp from packet header - uint32_t len; // length of actual data - uint32_t chunktab; // offset to chunk offset array -} dp_hdr_t; - -// decode a frame -static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ - mp_image_t* mpi; - unsigned long result; - dp_hdr_t* dp_hdr=(dp_hdr_t*)data; - unsigned char* dp_data=((unsigned char*)data)+sizeof(dp_hdr_t); - uint32_t* extra=(uint32_t*)(((char*)data)+dp_hdr->chunktab); - - unsigned long transform_out[5]; - unsigned long transform_in[6]={ - dp_hdr->len, // length of the packet (sub-packets appended) - 0, // unknown, seems to be unused - dp_hdr->chunks, // number of sub-packets - 1 - extra, // table of sub-packet offsets - 0, // unknown, seems to be unused - dp_hdr->timestamp,// timestamp (the integer value from the stream) - }; - - if(len<=0 || flags&2) return NULL; // skipped frame || hardframedrop - - mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, 0 /*MP_IMGFLAG_ACCEPT_STRIDE*/, - sh->disp_w, sh->disp_h); - if(!mpi) return NULL; - - result=(*rvyuv_transform)(dp_data, mpi->planes[0], transform_in, - transform_out, sh->context); - - return (result?NULL:mpi); -} - -#endif diff -r 772f853f32a1 -r 33c38a0c20e8 libmpcodecs/vd_realvid.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/vd_realvid.c Fri Aug 30 19:49:37 2002 +0000 @@ -0,0 +1,224 @@ +#include +#include + +#include "config.h" +#ifdef USE_REALCODECS + +#include + +#include "mp_msg.h" +#include "help_mp.h" + +#include "vd_internal.h" + +static vd_info_t info = { + "RealVideo decoder", + "real", + VFM_REAL, + "Florian Schneider & A'rpi", + "using original closed source codecs for Linux", + "binary real video codecs" +}; + +LIBVD_EXTERN(real) + + +unsigned long (*rvyuv_custom_message)(unsigned long,unsigned long); +unsigned long (*rvyuv_free)(unsigned long); +unsigned long (*rvyuv_hive_message)(unsigned long,unsigned long); +unsigned long (*rvyuv_init)(unsigned long,unsigned long); +unsigned long (*rvyuv_transform)(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long); + +void *rv_handle=NULL; + +void *__builtin_vec_new(unsigned long size) { + return malloc(size); +} + +void __builtin_vec_delete(void *mem) { + free(mem); +} + +void __pure_virtual(void) { + printf("FATAL: __pure_virtual() called!\n"); +// exit(1); +} + +#if defined(__FreeBSD__) || defined(__NetBSD__) +void ___brk_addr(void) {exit(0);} +char **__environ={NULL}; +#undef stderr +FILE *stderr=NULL; +#endif + +// to set/get/query special features/parameters +static int control(sh_video_t *sh,int cmd,void* arg,...){ +// switch(cmd){ +// case VDCTRL_QUERY_MAX_PP_LEVEL: +// return 9; +// case VDCTRL_SET_PP_LEVEL: +// vfw_set_postproc(sh,10*(*((int*)arg))); +// return CONTROL_OK; +// } + return CONTROL_UNKNOWN; +} + +/* exits program when failure */ +int load_syms_linux(char *path) { + void *handle; + char *error; + + mp_msg(MSGT_DECVIDEO,MSGL_INFO, "opening shared obj '%s'\n", path); + rv_handle = dlopen (path, RTLD_LAZY); + handle=rv_handle; + if (!handle) { + mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error: %s\n",dlerror()); + return 0; + } + + rvyuv_custom_message = dlsym(handle, "RV20toYUV420CustomMessage"); + rvyuv_free = dlsym(handle, "RV20toYUV420Free"); + rvyuv_hive_message = dlsym(handle, "RV20toYUV420HiveMessage"); + rvyuv_init = dlsym(handle, "RV20toYUV420Init"); + rvyuv_transform = dlsym(handle, "RV20toYUV420Transform"); + + if(rvyuv_custom_message && + rvyuv_free && + rvyuv_hive_message && + rvyuv_init && + rvyuv_transform) return 1; + + mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error resolving symbols! (version incompatibility?)\n"); + return 0; +} + +#ifdef USE_WIN32DLL + +#include "../loader/ldt_keeper.h" +void* LoadLibraryA(char* name); +void* GetProcAddress(void* handle,char* func); + +int load_syms_windows(char *path) { + void *handle; + Setup_LDT_Keeper(); + rv_handle = handle = LoadLibraryA(path); + mp_msg(MSGT_DECVIDEO,MSGL_V,"win32 real codec handle=%p \n",handle); + + rvyuv_custom_message = GetProcAddress(handle, "RV20toYUV420CustomMessage"); + rvyuv_free = GetProcAddress(handle, "RV20toYUV420Free"); + rvyuv_hive_message = GetProcAddress(handle, "RV20toYUV420HiveMessage"); + rvyuv_init = GetProcAddress(handle, "RV20toYUV420Init"); + rvyuv_transform = GetProcAddress(handle, "RV20toYUV420Transform"); + + if(rvyuv_custom_message && + rvyuv_free && + rvyuv_hive_message && + rvyuv_init && + rvyuv_transform) return 1; + return 0; // error +} +#endif + +/* we need exact positions */ +struct rv_init_t { + short unk1; + short w; + short h; + short unk3; + int unk2; + int subformat; + int unk5; + int format; +} rv_init_t; + +// init driver +static int init(sh_video_t *sh){ + //unsigned int out_fmt; + char path[4096]; + int result; + // we export codec id and sub-id from demuxer in bitmapinfohdr: + unsigned int* extrahdr=(unsigned int*)(sh->bih+1); + struct rv_init_t init_data={ + 11, sh->disp_w, sh->disp_h,0,0,extrahdr[0], + 1,extrahdr[1]}; // rv30 + + mp_msg(MSGT_DECVIDEO,MSGL_V,"realvideo codec id: 0x%08X sub-id: 0x%08X\n",extrahdr[1],extrahdr[0]); + + sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll); + + /* first try to load linux dlls, if failed and we're supporting win32 dlls, + then try to load the windows ones */ + if(!load_syms_linux(path)) +#ifdef USE_WIN32DLL + if (!load_syms_windows(path)) +#endif + { + mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingDLLcodec,sh->codec->dll); + mp_msg(MSGT_DECVIDEO,MSGL_HINT,"You need to copy the contents from the RealPlayer codecs directory\n"); + mp_msg(MSGT_DECVIDEO,MSGL_HINT,"into " REALCODEC_PATH "/ !\n"); + return 0; + } + // only I420 supported + if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420)) return 0; + // init codec: + sh->context=NULL; + result=(*rvyuv_init)(&init_data, &sh->context); + if (result){ + mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Couldn't open RealVideo codec, error code: 0x%X \n",result); + return 0; + } + // setup rv30 codec (codec sub-type and image dimensions): + if(extrahdr[1]>=0x20200002){ + unsigned long cmsg24[4]={sh->disp_w,sh->disp_h,sh->disp_w,sh->disp_h}; + unsigned long cmsg_data[3]={0x24,1+((extrahdr[0]>>16)&7),&cmsg24}; + (*rvyuv_custom_message)(cmsg_data,sh->context); + } + mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: RealVideo codec init OK!\n"); + return 1; +} + +// uninit driver +static void uninit(sh_video_t *sh){ + if(rv_handle) dlclose(rv_handle); + rv_handle=NULL; +} + +// copypaste from demux_real.c - it should match to get it working! +typedef struct dp_hdr_s { + uint32_t chunks; // number of chunks + uint32_t timestamp; // timestamp from packet header + uint32_t len; // length of actual data + uint32_t chunktab; // offset to chunk offset array +} dp_hdr_t; + +// decode a frame +static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ + mp_image_t* mpi; + unsigned long result; + dp_hdr_t* dp_hdr=(dp_hdr_t*)data; + unsigned char* dp_data=((unsigned char*)data)+sizeof(dp_hdr_t); + uint32_t* extra=(uint32_t*)(((char*)data)+dp_hdr->chunktab); + + unsigned long transform_out[5]; + unsigned long transform_in[6]={ + dp_hdr->len, // length of the packet (sub-packets appended) + 0, // unknown, seems to be unused + dp_hdr->chunks, // number of sub-packets - 1 + extra, // table of sub-packet offsets + 0, // unknown, seems to be unused + dp_hdr->timestamp,// timestamp (the integer value from the stream) + }; + + if(len<=0 || flags&2) return NULL; // skipped frame || hardframedrop + + mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, 0 /*MP_IMGFLAG_ACCEPT_STRIDE*/, + sh->disp_w, sh->disp_h); + if(!mpi) return NULL; + + result=(*rvyuv_transform)(dp_data, mpi->planes[0], transform_in, + transform_out, sh->context); + + return (result?NULL:mpi); +} + +#endif