描述:在一些复杂场景,用camera拍出来的照片在电脑上无法查看,在手机的图库中浏览时提示"无缩略图"
分析:拍一些复杂的场景时,jpeg encode出来的file大小可能超出我们预留的buffer,导致buffer中存放的数据不完整(若有做插值会更容易出现)。可以按如下方法来check对应的Log:在mtk log中的main log搜索关键字"JpgEncHal",对比Buffer Size和Jpeg encodedone的size的值,若是Buffer Size比Jpeg encode done的size要小,则会出现该问题。例如:
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHalJpgEncHal::JpgEncHal
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHalJpgEncHal::lock
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHal JpgEncHal::start -> config jpeg encoder
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHal Src Addr:0x448c7000, width/height:[1920, 2560], format:0
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHal Src Size:0x960000, 0x0, Stride f00!!
08-03 11:23:50.429 5365 5427 D JpgEncHal: JpgEncHal Dst Addr:0x432b7000, Quality:90, Buffer Size:599136, Need add SOI:0
08-03 11:23:50.592 5365 5427 D JpgEncHal: JpgEncHalJpgEncHal::jpeg encoder done
08-03 11:23:50.592 5365 5427 D CamShot/JpegCodec: [encode] Jpeg encode done, size = 659270
08-03 11:23:50.592 5365 5427 D JpgEncHal: JpgEncHalJpgEncHal::unlock
08-03 11:23:50.592 5365 5427 I MtkCam/MtkCamUtils: {CamProfile}[JpegCodec::encode] : (0-th) ===> [start-->now: 163 ms]
08-03 11:23:50.592 5365 5427 D JpgEncHal: JpgEncHalJpgEncHal::~JpgEncHal
可以从这段log看出Buffer Size:599136 < Jpeg encode done, size = 659270,因此会有问题。
解决:原理:将buffer大小适当加大,并在HAL层将jpeg quality的最大值限制在95。
方案:可申请两个patch:ALPS00842512 和ALPS00712097。
或者按下面的方法修改代码(patch的中改动和下面的修改方法一样)。
1.在文件 \mediatek\platform\mt6572\hardware\camera\core\camshot\SImager\SImager.cpp 将方法setEncodeParam(MUINT32 const & u4IsSOI, MUINT32 const & u4Quality)中的这段code
{
FUNCTION_LOG_START;
MY_LOGI("enc param (SOI, Quality) = (%d, %d)", u4IsSOI, u4Quality);
mTargetImgInfo.u4IsSOI = u4IsSOI;
mTargetImgInfo.u4Quality = u4Quality;
FUNCTION_LOG_END;
//
return MTRUE;
}
修改为
setEncodeParam(MUINT32 const & u4IsSOI, MUINT32 const & u4Quality)
{
FUNCTION_LOG_START;
MY_LOGI("enc param (SOI, Quality) = (%d, %d)", u4IsSOI, u4Quality);
mTargetImgInfo.u4IsSOI = u4IsSOI;
mTargetImgInfo.u4Quality = u4Quality>95?95:u4Quality;
MY_LOGI("enc param (SOI, Quality) = (%d, %d)", u4IsSOI, u4Quality);
FUNCTION_LOG_END;
//
return MTRUE;
}
- 在文件 \mediatek\platform\mt6572\hardware\camera\core\camshot\utils\ImageUtils.cpp 将方法queryImgBufSize(EImageFormat const eFmt, MUINT32 const u4Width, MUINT32 const u4Height)中的这段code
 
case eImgFmt_JPEG:
u4BufSize = u4Width * u4Height; // * 2 / 4; //? assume the JPEG ratio is 1/4
修改为
case eImgFmt_JPEG:
u4BufSize = u4Width * u4Height * 6 / 5;
- \mediatek\platform\mt6572\hardware\camera\core\camshot\SingleShot\SingleShot.cpp 将方法queryJpegImgBufInfo()中的这段code
 
if (0 != mRawMem.size)
修改为
if (0 != mRawMem.size && mRawMem.size>=queryImgBufSize(eImgFmt_JPEG, u4Width, u4Height))