static int writeData(void* _call) { WriterAVCallData_t* call = (WriterAVCallData_t*) _call; unsigned char PesHeader[PES_MAX_HEADER_SIZE]; pcm_printf(10, "\n"); if (!call) { pcm_err("call data is NULL...\n"); return 0; } pcm_printf(10, "AudioPts %lld\n", call->Pts); if (!call->data || (call->len <= 0)) { pcm_err("parsing NULL Data. ignoring...\n"); return 0; } if (call->fd < 0) { pcm_err("file pointer < 0. ignoring ...\n"); return 0; } pcmPrivateData_t* pcmPrivateData = (pcmPrivateData_t*)call->private_data; if (initialHeader) { initialHeader = 0; prepareClipPlay(pcmPrivateData->uNoOfChannels, pcmPrivateData->uSampleRate, pcmPrivateData->uBitsPerSample, pcmPrivateData->bLittleEndian); } unsigned char * buffer = call->data; unsigned int size = call->len; unsigned int n; unsigned char * injectBuffer = (unsigned char *)malloc(SubFrameLen); unsigned int pos; for(pos = 0; pos < size; ) { //printf("PCM %s - Position=%d\n", __FUNCTION__, pos); if((size - pos) < SubFrameLen) { breakBufferFillSize = size - pos; memcpy(breakBuffer, &buffer[pos], sizeof(unsigned char) * breakBufferFillSize); //printf("PCM %s - Unplayed=%d\n", __FUNCTION__, breakBufferFillSize); break; } //get first PES's worth if(breakBufferFillSize > 0) { memcpy(injectBuffer, breakBuffer, sizeof(unsigned char)*breakBufferFillSize); memcpy(&injectBuffer[breakBufferFillSize], &buffer[pos], sizeof(unsigned char)*(SubFrameLen - breakBufferFillSize)); pos += (SubFrameLen - breakBufferFillSize); breakBufferFillSize = 0; } else { memcpy(injectBuffer, &buffer[pos], sizeof(unsigned char)*SubFrameLen); pos += SubFrameLen; } struct iovec iov[3]; iov[0].iov_base = PesHeader; iov[1].iov_base = lpcm_prv; iov[1].iov_len = sizeof(lpcm_prv); iov[2].iov_base = injectBuffer; iov[2].iov_len = SubFrameLen; //write the PCM data if(pcmPrivateData->uBitsPerSample == 16) { for(n=0; n<SubFrameLen; n+=2) { unsigned char tmp; tmp=injectBuffer[n]; injectBuffer[n]=injectBuffer[n+1]; injectBuffer[n+1]=tmp; } } else { // 0 1 2 3 4 5 6 7 8 9 10 11 // A1c A1b A1a-B1c B1b B1a-A2c A2b A2a-B2c B2b B2a // to A1a A1b B1a B1b.A2a A2b B2a B2b-A1c B1c A2c B2c for(n=0; n<SubFrameLen; n+=12) { unsigned char t, *p = &injectBuffer[n]; t = p[0]; p[ 0] = p[ 2]; p[ 2] = p[ 5]; p[ 5] = p[ 7]; p[ 7] = p[11]; p[11] = p[ 9]; p[ 9] = p[ 3]; p[ 3] = p[ 4]; p[ 4] = p[ 8]; p[ 8] = t; } } //increment err... subframe count? lpcm_prv[1] = ((lpcm_prv[1]+SubFramesPerPES) & 0x1F); iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len + iov[2].iov_len, PCM_PES_START_CODE, call->Pts, 0); int len = writev(call->fd, iov, 3); if (len < 0) break; } free(injectBuffer); return size; }
static int32_t writeData(void *_call) { WriterAVCallData_t* call = (WriterAVCallData_t*) _call; unsigned char PesHeader[PES_MAX_HEADER_SIZE]; pcm_printf(10, "\n"); if (!call) { pcm_err("call data is NULL...\n"); return 0; } pcm_printf(10, "AudioPts %lld\n", call->Pts); if (!call->data || (call->len <= 0)) { pcm_err("parsing NULL Data. ignoring...\n"); return 0; } if (call->fd < 0) { pcm_err("file pointer < 0. ignoring ...\n"); return 0; } pcmPrivateData_t *pcmPrivateData = (pcmPrivateData_t*)call->private_data; if (initialHeader) { uint32_t codecID = (uint32_t)pcmPrivateData->ffmpeg_codec_id; uint8_t LE = 0; switch (codecID) { case AV_CODEC_ID_PCM_S8: case AV_CODEC_ID_PCM_U8: break; case AV_CODEC_ID_PCM_S16LE: case AV_CODEC_ID_PCM_U16LE: LE = 1; case AV_CODEC_ID_PCM_S16BE: case AV_CODEC_ID_PCM_U16BE: break; case AV_CODEC_ID_PCM_S24LE: case AV_CODEC_ID_PCM_U24LE: LE = 1; case AV_CODEC_ID_PCM_S24BE: case AV_CODEC_ID_PCM_U24BE: break; case AV_CODEC_ID_PCM_S32LE: case AV_CODEC_ID_PCM_U32LE: LE = 1; case AV_CODEC_ID_PCM_S32BE: case AV_CODEC_ID_PCM_U32BE: break; default: break; } initialHeader = 0; prepareClipPlay(pcmPrivateData->channels, pcmPrivateData->sample_rate, pcmPrivateData->bits_per_coded_sample, LE); } uint8_t *buffer = call->data; uint32_t size = call->len; uint32_t n; uint8_t *injectBuffer = malloc(SubFrameLen); uint32_t pos; for(pos = 0; pos < size; ) { //printf("PCM %s - Position=%d\n", __FUNCTION__, pos); if((size - pos) < SubFrameLen) { breakBufferFillSize = size - pos; memcpy(breakBuffer, &buffer[pos], sizeof(uint8_t) * breakBufferFillSize); //printf("PCM %s - Unplayed=%d\n", __FUNCTION__, breakBufferFillSize); break; } //get first PES's worth if(breakBufferFillSize > 0) { memcpy(injectBuffer, breakBuffer, sizeof(uint8_t)*breakBufferFillSize); memcpy(&injectBuffer[breakBufferFillSize], &buffer[pos], sizeof(unsigned char)*(SubFrameLen - breakBufferFillSize)); pos += (SubFrameLen - breakBufferFillSize); breakBufferFillSize = 0; } else { memcpy(injectBuffer, &buffer[pos], sizeof(uint8_t)*SubFrameLen); pos += SubFrameLen; } struct iovec iov[3]; iov[0].iov_base = PesHeader; iov[1].iov_base = lpcm_prv; iov[1].iov_len = sizeof(lpcm_prv); iov[2].iov_base = injectBuffer; iov[2].iov_len = SubFrameLen; //write the PCM data if(16 == pcmPrivateData->bits_per_coded_sample) { for(n=0; n<SubFrameLen; n+=2) { uint8_t tmp; tmp=injectBuffer[n]; injectBuffer[n]=injectBuffer[n+1]; injectBuffer[n+1]=tmp; } } else { // 0 1 2 3 4 5 6 7 8 9 10 11 // A1c A1b A1a-B1c B1b B1a-A2c A2b A2a-B2c B2b B2a // to A1a A1b B1a B1b.A2a A2b B2a B2b-A1c B1c A2c B2c for(n=0; n<SubFrameLen; n+=12) { unsigned char t, *p = &injectBuffer[n]; t = p[0]; p[ 0] = p[ 2]; p[ 2] = p[ 5]; p[ 5] = p[ 7]; p[ 7] = p[11]; p[11] = p[ 9]; p[ 9] = p[ 3]; p[ 3] = p[ 4]; p[ 4] = p[ 8]; p[ 8] = t; } } //increment err... subframe count? lpcm_prv[1] = ((lpcm_prv[1]+SubFramesPerPES) & 0x1F); iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len + iov[2].iov_len, PCM_PES_START_CODE, call->Pts, 0); int32_t len = call->WriteV(call->fd, iov, 3); if (len < 0) { break; } } free(injectBuffer); return size; }