关于在三方挂载的plugin下去做输出buffer是输入buffer size 的4倍关系的相应修改

实现在在三方挂载点的的buffer的大小都是输入和输出成对出现,大小相同;
一版都是negotiate时将对应的输出输出的格式和大小都已经固定下来;
sel.mIBufferFull
.setRequired(MTRUE)
.addAcceptedFormat(eImgFmt_NV21)
.addAcceptedSize(eImgSize_Full);这个size是对应的sensor size
sel.mOBufferFull
.setRequired(MTRUE)
sel.mOBufferFull.addAcceptedSize(eImgSize_Full);同上,这里输出输出的格式都是一定的
并且在目前的MTK的关于outbuffer的size并没有客制化的现成的流程;输入的size 是有客制化流程的;
在pipelinePlugintype.h文件中的对应的多帧拍照plugin下的selection结构体中的bufferselection 可以看到:
struct Selection {
FIELDS(
(MUINT8) mRequestIndex, // 请求索引值
(MUINT8) mRequestCount, //多帧的帧数
(BufferSelection) mIBufferFull, //输入size
(BufferSelection) mIBufferSpecified, //输入size
(BufferSelection) mIBufferResized, //输入size
(BufferSelection) mIBufferLCS, //输入size
(BufferSelection) mOBufferFull, //输出size
(BufferSelection) mOBufferThumbnail,//输出的缩略图
可以看出输入有有多种size的支持而输出只有mOBufferFull这一种size;
那对此的输出的客制化如何实现呢,MTK给出的一个具体的实现方案;
修改点主要涉及到以下三个部分(主要针对多帧的修改单帧的对比修改即可)
1、在自己所挂载的plugin下的out buffer有如下修改;
sel.mOBufferFull
.setRequired(MTRUE)
.addAcceptedFormat(eImgFmt_NV12)
.addAcceptedSize(eImgSize_Specified)
.setSpecifiedSize(MSize(xxx, xxx));
虽输出并没有和输入有一样的客制化支持 ,可以直接在mOBufferFull中去addAcceptedSize(eImgSize_Specified),并设置具体的size .setSpecifiedSize(MSize(xxx(宽), xxx(高)))
2.在对应的multiframeNode.cpp 里面的的offer接口中具体关于selection中关于outbuffer添加可以支持的s的size:eImgSize_Specified。具体如下:
sel.mOBufferFull
.addSupportSize(eImgSize_Full);
.addSupportSize(eImgSize_Specified)
3.在multiframeNode.cpp 中的evaluate(NodeID_T nodeId, CaptureFeatureInferenceData& rInfer)接口中关于 full size output做相应的修改具体如下;
if (isValid && rSel.mOBufferFull.getRequired()) {
if (rSel.mOBufferFull.isValid()) {
auto& dst_0 = rDstData.editItemAt(rDstData.add());
dst_0.mSizeId = rSel.mOBufferFull.getSizes()[0];
dst_0.addSupportFormats(rSel.mOBufferFull.getFormats());
if ((dst_0.getFormat() & eImgFmt_RAW_START) == eImgFmt_RAW_START) {
dst_0.mSize = rInfer.getSize(TID_MAN_FULL_RAW);
dst_0.mTypeId = TID_MAN_FULL_RAW;
} else {
if (dst_0.mSizeId == SID_SPECIFIED)
dst_0.mSize = rSel. mOBufferFull.getSpecifiedSize();
else

dst_0.mSize = rInfer.getSize(TID_MAN_FULL_YUV);

                dst_0.mTypeId = TID_MAN_FULL_YUV;
            }
        } else
            isValid = MFALSE;

}
上面的这个判断就是针对客制化的输出的buffer size的获取方式 其实在这个evaluate()函数接口的上半部分关于输入的buffer的相应设置,这个类似模仿输入关于buffer size获取的方式;

以上是针对这个多帧算法的挂载点输入输出的buffer不一致的情况的修改;另外关于客制化输出的宽高是输入的4倍,即输入宽X2* 输入高X2,但是实际上为了代码的可读性性与普遍性我们需要将输入的eImgSize_Full 这个值的宽高获取出来,然后各自2,但实际上eImgSize_Full 是一个枚举类型并没法直接去get它的size,通过定位最终可以从对应的negotiate中的参数Selection& sel中可以直接获取,有相应的接口获取sensor szie ;
具体获取是mSensorSize= sel.mState.mSensorSize;这里可以获取到对应的size;然后对宽高各自
2即可;
sel.mOBufferFull.addAcceptedSize(eImgSize_Specified).setSpecifiedSize(MSize((sel.mState.mSensorSize.w2),(sel.mState.mSensorSize.h2)) );

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值