Example #1
0
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;
}
Example #2
0
File: pcm.c Project: Audioniek/apps
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;
}