Mercurial > mplayer.hg
view libmpcodecs/ad_pcm.c @ 10560:11826d9f90c7
this patch fixes
1) some bugs introduced in the tuner autodetection and in the channel-parsing functions,
3) retries reading when the mplayer/mencoder don't read fast enough (sooner it exited)
but especially
4) makes the stream compliant with the new, modular stream api (the one
currently in CVS is not and is totally unreachable).
[and maybe more, next time please include cvslog in patch! -- A'rpi]
patch by Nico <nsabbi@libero.it>
author | arpi |
---|---|
date | Mon, 11 Aug 2003 00:02:46 +0000 |
parents | 2759150cc687 |
children | 1548a38cab3f |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "config.h" #include "ad_internal.h" static ad_info_t info = { "Uncompressed PCM audio decoder", "pcm", "Nick Kurshev", "A'rpi", "" }; LIBAD_EXTERN(pcm) static int init(sh_audio_t *sh_audio) { WAVEFORMATEX *h=sh_audio->wf; sh_audio->i_bps=h->nAvgBytesPerSec; sh_audio->channels=h->nChannels; sh_audio->samplerate=h->nSamplesPerSec; sh_audio->samplesize=(h->wBitsPerSample+7)/8; switch(sh_audio->format){ /* hardware formats: */ case 0x6: sh_audio->sample_format=AFMT_A_LAW;break; case 0x7: sh_audio->sample_format=AFMT_MU_LAW;break; case 0x11: sh_audio->sample_format=AFMT_IMA_ADPCM;break; case 0x50: sh_audio->sample_format=AFMT_MPEG;break; /* case 0x2000: sh_audio->sample_format=AFMT_AC3; */ case 0x736F7774: // 'twos' case 0x74776F73: // 'swot' if(sh_audio->samplesize==1) sh_audio->sample_format=AFMT_S8; break; default: if(sh_audio->samplesize!=2) sh_audio->sample_format=AFMT_U8; } return 1; } static int preinit(sh_audio_t *sh) { sh->audio_out_minsize=2048; return 1; } static void uninit(sh_audio_t *sh) { } static int control(sh_audio_t *sh,int cmd,void* arg, ...) { int skip; switch(cmd) { case ADCTRL_SKIP_FRAME: skip=sh->i_bps/16; skip=skip&(~3); demux_read_data(sh->ds,NULL,skip); return CONTROL_TRUE; } return CONTROL_UNKNOWN; } static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) { int len=sh_audio->channels*sh_audio->samplesize-1; len=(minlen+len)&(~len); // sample align len=demux_read_data(sh_audio->ds,buf,len); #ifdef WORDS_BIGENDIAN if(sh_audio->format!=0x736F7774){ #else if(sh_audio->format==0x736F7774){ // "twos" is swapped byteorder #endif int j; for(j=0;j<len;j+=2){ char x=buf[j]; buf[j]=buf[j+1]; buf[j+1]=x; } } return len; }