目前需要尝试不使用android的camera架构来做一个录像和预览的功能。思路是利用libstagefrigt来调用OMX实现录像功能。在实做中发现自己写的私有MediaSource有个BUG,这里记录下。
这个私有MediaSource可以正常录像,但是最后一帧会crash:
status_t RecordSource::read(MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
status_t err = mGroup.acquire_buffer(buffer);
if (err != OK) {
return err;
}
if (mRecordNum == mMaxNumFrames) {
return ERROR_END_OF_STREAM;
}
这么做的问题是在mGroup已经申请了MediaBuffer,这样会调用addRef, 而只有read函数返回正常才会在OMXCodec::drainInputBuffer里去release这个buffer。
而像这里的写法,read返回的是一个err status, 这会导致buffer已经申请但是没有释放,在没有释放的时候又要去结束这段record,自然就有问题。 Android在MediaBuffer的
管理上运用了引用计数,会在析构这个MediaBuffer的时候运用CHECK_EQ来检查是否这个计数已经为零,既是否所有被申请的buffer已经被使用完成并释放。
这个错误耽误了进度两个多小时,在此记录,引以为戒。