preview的crop问题
这个问题其实有点乌龙,因为crop是在IPEnode进行处理的,我开始一直以为是IPE进行了裁剪才导致我最后的输出有问题,最后的原因竟然是因为chi node的输出的port导致我输出到IPE的buffer的size就已经小了。
我们有个问题,后置视频美颜preview有美颜效果,video没有美颜效果。前后置的流程是一样的,前置的是正常的。经过和apk的同事沟通,一共会下发两个stream,但是前置video拿的是preview的数据进行编码的所以最后前置的preview和video是有美颜效果的。但是后置下发的两路stream,preview的那路stream只用来显示,video的那路stream用来正常的进行编码。
经过本地查看发现video的那个输出的数据是没有进行美颜的处理的,因为node代码编写的原因只可以用一个实例,所以我想的是把preview的那个数据通过IPE进行分流,然后在反回给上层,这样我的preview和video都是经过美颜处理的了。
这是preview有美颜效果video没有的数据流:
planA:video的数据流走美颜算法
planB:把预览的数据流通过IPE进行分流,然后在进行输出,这样video和preivew都是有美颜的
我把IPE加上之后,我的预览界面是被放大的,因为没有加IPE之前是不会有这种情况的。所以我一开始的时候是怀疑IPE的crop出现了问题。
于是抓取了一下crop信息,在IPE进行crop处理的是corp window,下面是一些可以参考的log信息
camxipenode.cpp:13503 GetZoomWindowCropInfo() (Pipelinename)_IPE4_cam0 ZDBG Final IPE crop Window [0, 0, 0, 0] fullin 480X270, fullout 1920X1080, frameNum 5
SetGenericPassScaleRatios() (Pipelinename)_IPE4_cam0_MainPass_NoZoomCrop_Ins0, parentNodeId=255, input w : 480, h : 270, output w : 1920, h : 1080 crop [0 0 0 0] req 7
FillUpdatePSMCrop() (Pipelinename)_IPE4_cam0, PSM IPE residual crop [0 0 1920 1080 1920 1080] applied crop [0 0 480 270 480 270] Request Id 1 disableZoom: 1 IsPreFusionTuningMode: 0 SrEnabled:0 ValidProfileWithUpscaler: 0 0xb40000794198214cValidProfileForICAWarp: 0
从这些log看crop是正常的,往IPE输出的尺寸就是不对的。我输出的尺寸就是1920 * 1080,但是我输入的尺寸就是480 * 270。从这个情况看,肯定是前面的node输出了一个小size,然后在IPE进行放大导致我预览的界面是一个被裁减过的画面。
决定node每个port输出的大小是在configure_stream阶段,FinalizeBufferProperties和setbufferinfo这两个函数,我在setbufferinfo中打印log最后追到FinalizeBufferProperties里面针对不同的portid进行输出的宽高的设置。当时定义的portid会走到1/4size的分支。后来把对应的portid进行修改就可以了。
被裁剪的问题解决了,但是在IPE内部还有很多的IQ子模块,导致对应的效果会在被叠加一次,所以,我们还要解决只让新增的IPE只有一个分流的作用不,关于效果的IQ模块在这个新加的node是不会被处理的。这个在IPEnode的配置中要配置一对应的processingType是default,对应的profileId是Scale。就是让IsScalerOnlyIPE()这个函数返回TRUE。
要这个函数成立需要在pipeline得定义文件中增加property
在这个配置中的NodePropertyName在代码中其实是没有起作用的,在代码NodePropertyId在代码中会会用到这值,在node内部的代码里面会体现出来。
这个propertyId得那些定义文件的路径是:/vendor/qcom/proprietary/chi-cdk/api/common/chi.h
把这个property加上之后在代码中会对TuningMetadata、IPETuningMetadata和DebugDataWriter进行置空的操作,就屏蔽了其他IQ模块的处理,具体原因还要深究一下。至此,问题就算正常解决了。
snapshot的crop问题
这个问题的最根本的原因就是一个meta(android.scaler.cropRegion/ANDROID_SCALER_CROP_REGION)赋值的原因导致在BPS和IPE处理的时候进行了错误的裁剪
拍照pipeline苏剧流程图:
这是我在解决问题的时候主要关注的log:
异常:
camxipenode.cpp:24269 GetZoomWindowCropInfoMeta() ZSLSnapshotYUVHAL_IPE3_cam1: request:1 stream crop : l 0 , t 0, w 1152, h 864
正常:
camxipenode.cpp:24269 GetZoomWindowCropInfoMeta() ZSLSnapshotYUVHAL_IPE3_cam1: request:1 stream crop : l 0 , t 0, w 2304, h 1728
正常:
camxbpsnode.cpp:9637 SetScaleRatios() BPS:0 crop w 2304, h 1728, fw 2304, fh 1728, iw 0, ih 0, preScaleRatio 1.000000, postScaleRatio 1.000000
异常:
camxbpsnode.cpp:9637 SetScaleRatios() BPS:0 crop w 1152, h 864, fw 2304, fh 1728, iw 0, ih 0, preScaleRatio 1.000000, postScaleRatio 0.500000
异常:
camxbpsnode.cpp:9601 SetScaleRatios() ZDBG IPE crop Window [0, 0, 2304, 1728] full size 2304X1728 active 4608X3456
正常:
camxbpsnode.cpp:9601 SetScaleRatios() ZDBG IPE crop Window [0, 0, 4608, 3456] full size 2304X1728 active 4608X3456
在BPS会现获取到ANDROID_SCALER_CROP_REGION的值进行计算,由于meta获取到的值有问题导致后面的运算不对。这个值是APK下发下来,到framework,然后在feature2把那个值跟随request更新到camx。(其中一个问题是开闪光灯拍照,不走ZSL的流程,把crop错误的值更新到了camx,导致最后拍照出现问题)。feature2那边的流程有机会在更新。