android摄像头取景,Android手机后摄像头在拍照后,取景界面会闪一下(丢掉3帧)...

这篇博客详细分析了Android QCamera2 HAL层的源码修改,主要涉及帧率控制和丢帧策略。作者通过新增变量`m_dropFrame`实现了帧率控制,当条件满足时会取消缓冲区的队列,从而实现丢帧以调整帧率。这一改动对于优化摄像头性能和功耗管理具有重要意义。
摘要由CSDN通过智能技术生成

diff --git a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp

old mode 100644

new mode 100755

index aa63580..e730ab0

--- a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp

+++ b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp

@@ -966,7 +966,8 @@ QCamera2HardwareInterface::QCamera2HardwareInterface(int cameraId)

m_max_pic_width(0),

m_max_pic_height(0),

mFlashNeeded(false),

- mCaptureRotation(0)

+ mCaptureRotation(0),

+ m_dropFrame(0) //young.yang add

{

mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;

mCameraDevice.common.version = HARDWARE_DEVICE_API_VERSION(1, 0);

diff --git a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.h b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.h

old mode 100644

new mode 100755

index e892770..8f9ecb2

--- a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.h

+++ b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.h

@@ -506,6 +506,7 @@ private:

int32_t mFlash;

int32_t mRedEye;

int32_t mFlashPresence;

+ int32_t m_dropFrame; //young.yang add

};

}; // namespace qcamera

diff --git a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp

old mode 100644

new mode 100755

index 0211a92..1fe41ed

--- a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp

+++ b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp

@@ -37,6 +37,8 @@

namespace qcamera {

+int needDrop = 0;

+

/*===========================================================================

* FUNCTION : zsl_channel_cb

*

@@ -402,11 +404,18 @@ void QCamera2HardwareInterface::preview_stream_cb_routine(mm_camera_super_buf_t

if(pme->m_bPreviewStarted) {

ALOGE("[KPI Perf] %s : PROFILE_FIRST_PREVIEW_FRAME", __func__);

pme->m_bPreviewStarted = false ;

+ pme->m_dropFrame =3; //young.yang add began

}

+ if(--(pme->m_dropFrame)>0)

+ needDrop =1;

+ else

+ needDrop =0; //young.yang add end

+

// Display the buffer.

ALOGV("%p displayBuffer %d E", pme, idx);

- int dequeuedIdx = memory->displayBuffer(idx);

+ //int dequeuedIdx = memory->displayBuffer(idx);

+ int dequeuedIdx = memory->displayBuffer(idx,needDrop); //young.yang change

if (dequeuedIdx < 0 || dequeuedIdx >= memory->getCnt()) {

ALOGD("%s: Invalid dequeued buffer index %d from display",

__func__, dequeuedIdx);

diff --git a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.cpp b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.cpp

old mode 100644

new mode 100755

index 8c09e6b..a95056d

--- a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.cpp

+++ b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.cpp

@@ -1104,7 +1104,7 @@ void QCameraGrallocMemory::setWindowInfo(preview_stream_ops_t *window,

* NO_ERROR -- success

* none-zero failure code

*==========================================================================*/

-int QCameraGrallocMemory::displayBuffer(int index)

+int QCameraGrallocMemory::displayBuffer(int index,int needDrop)

{

int err = NO_ERROR;

int dequeuedIdx = BAD_INDEX;

@@ -1114,7 +1114,10 @@ int QCameraGrallocMemory::displayBuffer(int index)

return INVALID_OPERATION;

}

- err = mWindow->enqueue_buffer(mWindow, (buffer_handle_t *)mBufferHandle[index]);

+ if (needDrop) //young.yang add began

+ err = mWindow->cancel_buffer(mWindow, (buffer_handle_t *)mBufferHandle[index]);

+ else //young.yang add end

+ err = mWindow->enqueue_buffer(mWindow, (buffer_handle_t *)mBufferHandle[index]);

if(err != 0) {

ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err);

} else {

diff --git a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.h b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.h

old mode 100644

new mode 100755

index 1dee2cd..067548b

--- a/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.h

+++ b/src/LINUX/android/hardware/qcom/camera/QCamera2/HAL/QCameraMem.h

@@ -170,7 +170,9 @@ public:

// Enqueue/display buffer[index] onto the native window,

// and dequeue one buffer from it.

// Returns the buffer index of the dequeued buffer.

- int displayBuffer(int index);

+ //int displayBuffer(int index);

+ int displayBuffer(int index,int needDrop); //young.yang add

+

private:

buffer_handle_t *mBufferHandle[MM_CAMERA_MAX_NUM_FRAMES];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值