内存移动
首先从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;
}