问题描述:
打开照片模式,设置长按音量键进行连拍,概率出现拍照定屏的情况
1.Log初步分析:
//stuck on req 53, wait for buffer timeout.
CHIUSECASE: [INFO ] chxusecasemc.cpp:9270 OfflineRequestProcess() Send offline request:53, inputFrame:53,snapshotReqId:3 featureMask = 0 SnapshotMask = 2
CHIUSECASE: [ERROR ] chxadvancedcamerausecase.cpp:2795 WaitForBufferMetaRe
2.通过添加log发现,在执行FlushRDIQueue 方法前后ReadyBufferIndex发生了变化。
继续追踪log,将可疑点定位到下面的If判断条件中。
举个例子就是:有一个BufferIndex 2 已经获得了 meta/buffer ready, isBufferReady 和isMetadataReady 会被设置为 TRUE就会不满足判断条件,而BufferIndex 3 没有获得meta/buffer ready则会进入if判断。
if ((FALSE == pTargetBuffer->bufferQueue[lastReadyBufferIndex].isBufferReady) ||
(FALSE == pTargetBuffer->bufferQueue[lastReadyBufferIndex].isMetadataReady))
{
pTargetBuffer->lastReadySequenceID = INVALIDSEQUENCEID;
CHX_LOG_INFO("testlog-FlushRDIQueue 3: framenumber:%d, pipeline:%d, lastReady:%d,firstValid:%d,bufferIndex :%d",frameNumber, pipelineIndex,pTargetBuffer->lastReadySequenceID,pTargetBuffer->firstReadySequenceID,bufferIndex);
}
我们需要关心是这些BufferIndex 是在哪里赋值并使用的,通过排查代码发现:
//BufferIndex 2 是通过frameNumber%RDIBufferQueueDepth得到
bufferIndex = frameNumber % RDIBufferQueueDepth;
//而BufferIndex 3是pTargetBuffer->lastReadySequenceID % BufferQueueDepth得到
lastReadyBufferIndex = pTargetBuffer->lastReadySequenceID % BufferQueueDepth;
firstReadyBufferIndex = pTargetBuffer->firstReadySequenceID % BufferQueueDepth;
这里我们就非常明白了,由于使用了两个不同长度的BufferQueueDepth,导致BufferIndex索引错乱,从而找不到正确的buffer,通过以下修改,问题解决。
-- UINT32 lastReadyBufferIndex = pTargetBuffer->lastReadySequenceID % BufferQueueDepth;
-- UINT32 firstReadyBufferIndex = pTargetBuffer->firstReadySequenceID % BufferQueueDepth;
+ UINT32 lastReadyBufferIndex = pTargetBuffer->lastReadySequenceID % RDIBufferQueueDepth;
+ UINT32 firstReadyBufferIndex = pTargetBuffer->firstReadySequenceID % RDIBufferQueueDepth;