bool CDVDAudioCodecPcm::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { SetDefault(); m_codecID = hints.codec; m_iSourceChannels = hints.channels; m_iSourceSampleRate = hints.samplerate; m_iSourceBitrate = 16; switch (m_codecID) { case CODEC_ID_PCM_ALAW: { for (int i = 0; i < 256; i++) table[i] = alaw2linear(i); break; } case CODEC_ID_PCM_MULAW: { for (int i = 0; i < 256; i++) table[i] = ulaw2linear(i); break; } default: { break; } } // set desired output m_iOutputChannels = m_iSourceChannels; return true; }
void UlawToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk) { m_outputAudioChunk.reset(); if(inputAudioChunk.get() == NULL) { return; } else if(inputAudioChunk->GetNumSamples() == 0) { return; } AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails(); if(SupportsInputRtpPayloadType(outputDetails.m_rtpPayloadType) == false) { return; } // Create output buffer m_outputAudioChunk.reset(new AudioChunk()); outputDetails.m_rtpPayloadType = -1; // Override details that this filter changes outputDetails.m_encoding = PcmAudio; int numSamples = inputAudioChunk->GetNumSamples(); outputDetails.m_numBytes = numSamples*2; short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails); char* inputBuffer = (char*)inputAudioChunk->m_pBuffer; for(int i=0; i<numSamples; i++) { outputBuffer[i] = (short)ulaw2linear(inputBuffer[i]); } }
static av_cold int pcm_decode_init(AVCodecContext * avctx) { PCMDecode *s = avctx->priv_data; int i; switch(avctx->codec->id) { case CODEC_ID_PCM_ALAW: for(i=0;i<256;i++) s->table[i] = alaw2linear(i); break; case CODEC_ID_PCM_MULAW: for(i=0;i<256;i++) s->table[i] = ulaw2linear(i); break; default: break; } avctx->sample_fmt = avctx->codec->sample_fmts[0]; if (avctx->sample_fmt == SAMPLE_FMT_S32) avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec->id); return 0; }
int PCMUCodec::Decode (BYTE *in,int inLen,WORD* out,int outLen) { //Comprobamos las longitudes if (outLen<inLen) return 0; //Decodificamos for (int j = 0; j< inLen ;j++) out[j]=ulaw2linear(in[j]); return inLen; }
/* Decodes one byte PCMU data to two bytes unsigned linear data */ static int vocoder_ulaw(int fd, u_char *pl, int len) { u_int16_t wbuf[2048]; int i = 0; int wlen = len * sizeof(u_int16_t); for (i = 0; i < len && (i < sizeof(wbuf) / sizeof(u_int16_t)); i++) wbuf[i] = ulaw2linear(pl[i]); if (write(fd, wbuf, wlen) < wlen) return -1; return wlen; }
//#define ECHO thread basic_receive(ushort uart, ushort udp) { uint len = 0; uchar buf[BUF_SIZE]; #ifdef ECHO int i, j = 0; uint value[5 * BUF_SIZE]; #endif /* Enable all interrupts */ enable(); while (TRUE) { /* Read from the UDP device */ len = read(udp, buf, BUF_SIZE); if (len > 0) { #ifdef ECHO /* Echo audio effect */ for (i = 0; i < len; i++) { value[j] = value[(j + BUF_SIZE) % (5 * BUF_SIZE)] * 4 / 5 + ulaw2linear(buf[i]) / 64 + 512; buf[i] = linear2ulaw((value[j] - 512) * 64); j = (j + 1) % (5 * BUF_SIZE); } #endif /* Write to the serial device */ write(uart, buf, len); } } }