C++内存操作

内存移动

首先从SDK读取一定字节到(camVideoBufs),然后把camVideoBufs读取到较大的中间缓冲区(Framed_databuf)直至中间buffer的长度达到或者刚超过最大(Fmaxsize)时,copy到fTo中。把超过的部分再放回到Framed_databuf的首部

void EasyCameraMediaSource::doGetNextFrame()
{
    //Framed_databuf --- 中转buffer   
    //curSize  ---- 中转buffer当前size
    //readbufsize   ---- 已经读取的buffersize
    //流程:从camVideoBufs中取出流后放循环到Framed_databuf,直至curSize>fMaxSize,
    //把fMaxSize大小的流放到fto里。剩余curSize - fMaxSize留下的尾巴再重新放到Framed_databuf头部,
    //再循环取流到Framed_databuf直至curSize>fMaxSize....

    curSize = bufsizel - readbufsize;

    if (curSize < fMaxSize)
    {
        memmove(Framed_databuf, Framed_databuf + readbufsize, curSize);
        memset(Framed_databuf + curSize, 0, readbufsize);
        readbufsize = 0;
        while (1)
        {
            //从缓冲区中获取一个H264数据帧
            unsigned int realLen = 0;
            int type, channel, fIndex = 0;
            //TODO:从缓冲区中获取数据
            unsigned char *tmp = Framed_databuf + curSize;
            int bufLen = buffers_get_data(tmp, &realLen, &((CLive555Pusher*)m_ps)->camVideoBufs, &type, &channel, &fIndex);
            if (bufLen>0)
            {
                curSize += bufLen;
                if (curSize >= fMaxSize)
                {
                    //printf("hello word hello word hello word assembleSize:%d fMaxSize:%d\n", assembleSize, fMaxSize);
                    break;
                }
            }
            else
            {
                fWatchVariable = 0;
                envir().taskScheduler().scheduleDelayedTask(10000, (TaskFunc*)sleep,this);
                envir().taskScheduler().doEventLoop(&fWatchVariable);
                continue;           
            }
        }
        bufsizel = curSize;
        fFrameSize = fMaxSize;
        memcpy(fTo, Framed_databuf, fFrameSize);
        readbufsize += fFrameSize;
    }else
    {
        fFrameSize = fMaxSize;
        memcpy(fTo, Framed_databuf + readbufsize, fFrameSize);
        readbufsize += fFrameSize;
    }

    return;
}

你可能感兴趣的:(C/C++基础知识点,buffer,内存)