1.MtkCam/devicemgr
vendor\mediatek\proprietary\hardware\mtkcam\module_hal\devicemgr\CamDeviceManagerBase.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\devicemgr\CamDeviceManagerImp.cpp
1.1-CamDeviceManagerBase.cpp
1.2-CamDeviceManagerBase.enumDevice.cpp
1.3-CamDeviceManagerBase.openDevice.cpp
1.4-CamDeviceManagerBase.platform.cpp
1.5-CamDeviceManagerImp.cpp
2.MtkCam/Cam1DeviceFactory
vendor\mediatek\proprietary\hardware\mtkcam\v1\device\Cam1DeviceFactory.cpp
2.1-Cam1DeviceFactory.cpp
3.MtkCam/Cam1Device
vendor\mediatek\proprietary\hardware\mtkcam\v1\device\Cam1Device.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\device\DefaultCam1Device.cpp StereoCam1Device.cpp
3.1-Cam1Device.cpp
3.2-Cam1DeviceBase.cpp
3.3-Cam1DeviceBase.dump.cpp
3.4-DefaultCam1Device.cpp
3.5-StereoCam1Device.cpp
4.MtkCam/HalSensorList
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\custom\custom.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\HalSensorList.cpp
4.1-custom.cpp
4.2-HalSensorList.buildStaticInfo.cpp
4.3-HalSensorList.cpp
4.4-HalSensorList.enumList.cpp
4.5-HalSensorList.getInfo.cpp
4.6-HalSensorList.openList.cpp
5.MtkCam/HalSensor
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\HalSensor.control.cpp
5.1-HalSensor.cpp
5.2-HalSensor.control.cpp
6.MtkCam/Utils/Profile | MtkCam/Utils/Property | MtkCam/Utils | MtkCam/Utils/CamMgr
vendor\mediatek\proprietary\hardware\mtkcam\utils\Profile.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Property.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Format.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Misc.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hwutils\CamManager.cpp
6.1-Profile.cpp
6.2-Property.cpp
6.3-Format.cpp
6.4-Misc.cpp
6.5-CamManager.cpp
7.MtkCam/ParamsManager
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\paramsmgr\feature\custom\custom.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\paramsmgr\inc\Local.h
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\common\paramsmgr\params\MyUtils.h
7.1-custom.cpp
7.2-Local.h
7.3-MyUtils.h
8.MtkCam/CamClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\CamClient.cpp
8.1-CamClient.cpp
9.MtkCam/CamClient/FDClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD\FDBufMgr.cpp FDClient.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD
9.1-FDBufMgr.cpp
9.2-FDClient.cpp
9.3-FDClient.BufOps.cpp
9.4-FDClient.Scenario.cpp
9.5-FDClient.Thread.cpp
10.MtkCam/CamClient/OTClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\OT\OTBufMgr.cpp OTClient.cpp
10.1-OTBufMgr.cpp
10.2-OTClient.cpp
10.3-OTClient.BufOps.cpp
10.4-OTClient.Scenario.cpp
10.5-OTClient.Thread.cpp
11.MtkCam/CamClient/PREFEATUREBASE
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\PreviewFeatureBase.cpp
11.1-PreviewFeature.Thread.cpp
11.2-PreviewFeatureBase.cpp
11.3-PreviewFeatureClient.BufOps.cpp
12.MtkCam/CamClient/PanoramaClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\Panorama\PanoramaClient.cpp
12.1-PanoramaClient.cpp
12.2-PanoramaClient.Scenario.cpp
13.MtkCam/CamClient/MotionTrackClient
13.1-vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\MotionTrack\MotionTrackClient13.2-MotionTrackClient.Scenario.cpp
14.MtkCam/CamClient/MAVClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\MAV\MAVClient.cpp
14.1-MotionTrackClient.cpp
14.2-MotionTrackClient.Scenario.cpp
15.MtkCam/DisplayClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\DisplayClient\DisplayClient.cpp
15.1-DisplayClient.cpp
15.2-DisplayClient.BufOps.cpp
15.3-DisplayClient.dump.cpp
15.4-DisplayClient.Stream.cpp
15.5-DisplayThread.cpp
15.6-StreamImgBuf.cpp
16.MtkCam/ExtImgProc
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\ExtImgProc\ExtImgProcImp.cpp
16.1-ExtImgProcImp.cpp
17.MtkCam/CamAdapter
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\BaseCamAdapter.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkDefault\CaptureCmdQueThread.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkEng\CaptureCmdQueThread.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkStereo\CaptureCmdQueThread.cpp
17.1-BaseCamAdapter.cpp
17.2-BaseCamAdapter.Instance.cpp
17.3-CaptureCmdQueThread.cpp(MtkDefault)
17.4-CaptureCmdQueThread.cpp(MtkEng)
17.5-CaptureCmdQueThread.cpp(MtkStereo)
17.6-MtkDefaultCamAdapter.cpp
17.7-MtkDefaultCamAdapter.3A.cpp(MtkDefault)
17.8-MtkDefaultCamAdapter.Capture.cpp(MtkDefault)
17.9-MtkDefaultCamAdapter.CaptureCallback.cpp(MtkDefault)
17.10-MtkDefaultCamAdapter.Preview.cpp
17.11-MtkDefaultCamAdapter.Record.cpp
17.12-MtkDefaultCamParameter.cpp
17.13-MtkEngCamAdapter.3A.cpp (MtkEng)
17.14-MtkEngCamAdapter.Capture.cpp (MtkEng)
17.15-MtkEngCamAdapter.CaptureCallback.cpp (MtkEng)
17.16-MtkEngCamAdapter.cpp (MtkEng)
17.17-MtkEngCamAdapter.dump.cpp (MtkEng)
17.18-MtkEngCamAdapter.Preview.cpp (MtkEng)
17.19-MtkEngCamAdapter.Record.cpp (MtkEng)
17.20-MtkEngCamParameter.cpp (MtkEng)
17.21-MtkStereoCamAdapter.3A.cpp(Stereo)
17.22-MtkStereoCamAdapter.Capture.cpp
17.23-MtkStereoCamAdapter.CaptureCallback.cpp
17.24-MtkStereoCamAdapter.cpp
17.25-MtkStereoCamAdapter.Preview.cpp
17.26-MtkStereoCamAdapter.Record.cpp
17.27-MtkStereoCamParameter.cpp
17.28-State.cpp (MtkDefault)
17.29-State.cpp (MtkEng)
17.30-State.cpp (MtkStereo)
17.31-StateManager.cpp (MtkDefault)
17.32-StateManager.cpp (MtkEng)
17.33-StateManager.cpp (MtkStereo)
17.33-ZipImageCallbackThread.cpp (MtkDefault)
17.34-ZipImageCallbackThread.cpp (MtkEng)
17.35-ZipImageCallbackThread.cpp (MtkStereo)
18.MtkCam/PrvCB
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewCallback\ImgBufManager.cpp
18.1-ImgBufManager.cpp
18.2-PreviewClient.BufOps.cpp
18.3-PreviewClient.cpp
18.4-PreviewClient.dump.cpp
18.5-PreviewClient.Thread.cpp
19.MtkCam/RecordClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\Record\RecordClient.cpp
19.1-RecBufManager.cpp
19.2-RecordClient.BufOps.cpp
19.3-RecordClient.cpp
19.4-RecordClient.Platform.cpp
19.5-RecordClient.Thread.cpp
20.MtkCam/DisplayClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\DisplayClient\DisplayClient.cpp
20.1-DisplayClient.cpp
20.2-DisplayClient.BufOps.cpp
20.3-DisplayClient.dump.cpp
20.4-DisplayClient.Stream.cpp
20.5-DisplayThread.cpp
20.6-StreamImgBuf.cpp
21.MtkCam/CBMgr
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\CapBuf\CapBufMgr.cpp
21.1-CapBufMgr.cpp
22.MtkCam/DBHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\DefaultBufHandler.cpp EngBufHandler.cpp
22.1-DefaultBufHandler.cpp
22.2-EngBufHandler.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\DefaultCtrlNode.cpp
23.1-DefaultCtrlNode.cpp
23.2-DefaultCtrlNode.Eng.cpp
24.MtkCam/TM
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\ThermalMonitor
24.1-ThermalMonitor.cpp
25.MtkCam/CpuCtrl
vendor\mediatek\proprietary\hardware\mtkcam\utils\CpuCtrl
25.1-CpuCtrl.cpp
26.MtkCam/P2Node
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v3\hwnode\P2Node.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\pass2node.capture.cpp
26.1-P2Node.cpp
26.2-pass2node.capture.cpp
26.3-pass2node.common.cpp
26.4-pass2node.feature.cpp
26.5-pass2node.preview.cpp
27.MtkCam/CamNG
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\ICamGraphNode.cpp
27.1-ICamGraphNode.cpp
28.MtkCam/P1Node
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\pass1node.cpp
28.1-pass1node.cpp
pass1node.cpp
29.MtkCam/ISC
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\IspSyncControl.cpp
29.1-IspSyncControl.cpp
30.MtkCam/FeaturePipe
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\FeaturePipe\FeaturePipe.cpp
30.1-FeaturePipe.cpp
30.2-FeaturePipe.Nodes.cpp
31.MtkCam/RBSSNode
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\RecBufSnapshotlNode.cpp
31.1-RecBufSnapshotlNode.cpp
32.MtkCam/BaseHeap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\BaseImageBufferHeap.cpp
32.1-BaseImageBufferHeap.cpp
33.MtkCam/IonHeap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\IonImageBufferHeap.cpp
33.1-IonImageBufferHeap.cpp
34.MtkCam/ImgBuf
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\BaseImageBuffer.cpp
34.1-BaseImageBuffer.cpp
35.MtkCam/Cam1Heap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\ImageBufferHeap.cpp
35.1-ImageBufferHeap.cpp
36.MtkCam/FeaturePipeDataHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\FeaturePipe
36.1-FeaturePipe.DataHandler.cpp
37.MtkCam/AllocBufHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\AllocBufHandler.cpp
37.1-AllocBufHandler.cpp
38.MtkCam/AsdClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD\Asd\AsdClient.cpp
38.1-AsdClient.cpp
39.MtkCam/Shot
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\Scenario\Shot\BestContinuousShot
39.1-BestContinuousShot.cpp
40.MtkCam/BSS
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\MfllShot\BestShotSelection.cpp
40.1-BestShotSelection.cpp
41.MtkCam/BShotCtrl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\BurstShot\BShotCtrlNode.cpp
41.1-BShotCtrlNode.cpp
42.MtkCam/BShot
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\BurstShot\BurstShot.cpp
42.1-BurstShot.cpp
43.MtkCam/MtkCamUtils | MtkCam/CamShotUtils
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamDevMetaInfo.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\common\camutils\platform\CamFormat.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamFormatTransform.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamMisc.cpp CamProfile.cpp CamProperty.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\CamShotUtils.cpp (MtkCam/CamShotUtils)
43.1-CamDevMetaInfo.cpp
43.2-CamFormat.cpp
43.3-CamFormatTransform.cpp
43.4-CamMisc.cpp
43.5-CamProfile.cpp
43.6-CamProperty.cpp
43.7-CamShotUtils.cpp(MtkCam/CamShotUtils)
44.MtkCam/ITNode
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\ImgTransformNode.cpp
44.1-ImgTransformNode.cpp
45.MtkCam/JpegCodec
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\iopipe\SImager\JpegCodec\odec.cpp
45.1-odec.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\JpegEncNode.cpp
46.1-JpegEncNode.cpp
vendor\mediatek\proprietary\hardware\mtkcam\module_hal\devicemgr\CamDeviceManagerBase.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\devicemgr\CamDeviceManagerImp.cpp
1.1-CamDeviceManagerBase.cpp
1.2-CamDeviceManagerBase.enumDevice.cpp
1.3-CamDeviceManagerBase.openDevice.cpp
1.4-CamDeviceManagerBase.platform.cpp
1.5-CamDeviceManagerImp.cpp
1.A
Log分析:
MtkCam/devicemgr: [getDeviceInfo] deviceId:0 device_version:0x100 facing:0 orientation:90
源码:
1.A1 Log对应代码
CamDeviceManagerBase.cpp getDeviceInfo(int const deviceId, camera_info& rInfo)
{
sp<EnumInfo> pEnumInfo = mEnumMap.valueFor(deviceId); // 通过deviceId(0 或者 1)传给mEnumMap 得到 EnumInfo ,这个对象含有Camera数据
rInfo.device_version= pEnumInfo->uDeviceVersion;
rInfo.facing = pEnumInfo->iFacing;
rInfo.orientation = pEnumInfo->iWantedOrientation;
rInfo.static_camera_characteristics = pEnumInfo->pMetadata;
MY_LOGD("deviceId:%d device_version:0x%x facing:%d orientation:%d", deviceId, rInfo.device_version, rInfo.facing, rInfo.orientation);
}
typedef android::DefaultKeyedVector<int32_t, android::sp<EnumInfo> > EnumInfoMap_t;
EnumInfoMap_t mEnumMap【DefaultKeyedVector<int32_t, android::sp<EnumInfo> >】;
class EnumInfo : public android::RefBase
{
public:
uint32_t uDeviceVersion; // Device Version 设备号(CAMERA_DEVICE_API_VERSION_X_X)
camera_metadata const* pMetadata; // Device Metadata.设备信息
int32_t iFacing; // Device Facing Direction. 0后置摄像头 1前置摄像头
int32_t iWantedOrientation; // Device Wanted Orientation.预览界面的朝向 0 90 180 270
int32_t iSetupOrientation; // Device Setup Orientation. 初始化朝向
public: ~EnumInfo(); EnumInfo();
};
typedef uint32_t metadata_uptrdiff_t;
typedef uint32_t metadata_size_t;
struct camera_metadata { // 里面的数据 全都是 uint32_t类型
metadata_size_t size;
uint32_t version;
uint32_t flags;
metadata_size_t entry_count;
metadata_size_t entry_capacity;
metadata_uptrdiff_t entries_start; // Offset from camera_metadata
metadata_size_t data_count;
metadata_size_t data_capacity;
metadata_uptrdiff_t data_start; // Offset from camera_metadata
uint8_t reserved[];
};
1.A2 mEnumMap里面的 EnumInfo 数据来源
int32_t CamDeviceManagerImp:: enumDeviceLocked() // 为 EnumInfoMap_t mEnumMap 添加了数据
{
status_t status = OK;
int32_t i4DeviceNum = 0;
mEnumMap.clear();
IHalSensorList*const pHalSensorList = IHalSensorList::get(); // 获得 IHalSensorList 对象
size_t const sensorNum = pHalSensorList->searchSensors(); // 从 IHalSensorList 获得 Sensor传感器的数量
mEnumMap.setCapacity(sensorNum+1); // 设置Map能填充 sensorNum+1 个数据Item 因为传感器编号从0开始?
for (size_t i = 0; i < sensorNum; i++) // 遍历 填充 mEnumMap
{
int32_t const deviceId = i;
sp<EnumInfo> pInfo = new EnumInfo;
mEnumMap.add(deviceId, pInfo); // 填充mEnumMap 接下来填充 pInfo 对应的数据
sp<IMetadataProvider> pMetadataProvider = IMetadataProvider::create(deviceId);
NSMetadataProviderManager::add(deviceId, pMetadataProvider.get());// 获得对应deviceid的元数据信息 用于填充EnumInfo
pInfo->uDeviceVersion = pMetadataProvider->getDeviceVersion(); // 填充DeviceVersion
pInfo->iFacing = (pMetadataProvider->getDeviceFacing() == MTK_LENS_FACING_FRONT) ? CAMERA_FACING_FRONT: CAMERA_FACING_BACK;
pInfo->iWantedOrientation = pMetadataProvider->getDeviceWantedOrientation();
pInfo->iSetupOrientation = pMetadataProvider->getDeviceSetupOrientation();
i4DeviceNum++;
}
}
1.A3 IMetadataProvider 里面 MetadataProvider 的数据来源
sp<IMetadataProvider> pMetadataProvider = IMetadataProvider::create(deviceId);
NSMetadataProviderManager::add(deviceId, pMetadataProvider.get()); 对应
camera_metadata* mpStaticCharacteristics;
IMetadata mpHALMetadata;
IMetadataProvider* IMetadataProvider::create(int32_t const i4OpenId)
{
MetadataProvider* p = new MetadataProvider(i4OpenId);
p->onCreate();
IMetadataTagSet mtagInfo;
setTagInfo(mtagInfo); // 根据 IMetadataTagSet 获得 IMetadataConverter 用于解析? 定义了宏 _IMP_TAGCONVERT_ 使用宏填充数据
sp<IMetadataConverter> pMetadataConverter = IMetadataConverter::createInstance(mtagInfo);
// 使用 IMetadataConverter 初始化 camera_metadata 和 IMetadata
status = constructStaticMetadata(pMetadataConverter, mpStaticCharacteristics, mpHALMetadata);
}
//entryFor 传递了一个 MTK_SENSOR_INFO_FACING 返回了一个集合 获得它的第一个值,并明确了这个值的类型
// 其中 D:\Coding\vendor\mediatek\proprietary\hardware\include\mtkcam\metadata\client\TagMap.h 定义了 MTK_SENSOR_INFO_FACING 使用了宏
#define ADD_ALL_MEMBERS \ ## 在 setTagInfo 使用了这个宏 添加数据到 IMetadataTagSet
_IMP_TAGCONVERT_( ANDROID_LENS_FACING, MTK_SENSOR_INFO_FACING)\
static
bool MetadataProvider::setTagInfo(IMetadataTagSet &rtagInfo)
{
#define _IMP_SECTION_INFO_(...)
#undef _IMP_TAG_INFO_
#define _IMP_TAG_INFO_(_tag_, _type_, _name_) \
rtagInfo.addTag(_tag_, _name_, Type2TypeEnum<_type_>::typeEnum); // 定义了宏 那么在mtk_metadata_tag_info.inl一定引用了宏
#include <mtkcam/metadata/client/mtk_metadata_tag_info.inl>
#undef _IMP_TAG_INFO_
#undef _IMP_TAGCONVERT_
#define _IMP_TAGCONVERT_(_android_tag_, _mtk_tag_) \
rtagInfo.addTagMap(_android_tag_, _mtk_tag_);
#if (PLATFORM_SDK_VERSION >= 21)
ADD_ALL_MEMBERS; // 调用 TagMap.h 定义的宏 由于已经定义了 _IMP_TAGCONVERT_ 所以执行 rtagInfo.addTagMap 方法
#endif
#undef _IMP_TAGCONVERT_
return MTRUE;
}
int MetadataProvider::getDeviceFacing() const
{
return mpHALMetadata.entryFor(MTK_SENSOR_INFO_FACING).itemAt(0, Type2Type< MUINT8 >());
}
uint32_t MetadataProvider::getDeviceVersion() const
{
return mpHALMetadata.entryFor(MTK_HAL_VERSION).itemAt(0, Type2Type< MINT32 >());
}
1.A4 <mtkcam/metadata/client/mtk_metadata_tag_info.inl> 文件包含的东西
定义了宏 _IMP_SECTION_INFO_
#define _IMP_SECTION_INFO_(_section_, _name_) \
template <> struct MetadataSectionInfo<_section_> { \
enum \
{ \
SECTION_START = _section_##_START, \
SECTION_END = _section_##_END, \
}; \
};
使用了宏 _IMP_SECTION_INFO_
_IMP_SECTION_INFO_(MTK_SENSOR, "mtk.sensor")
_IMP_SECTION_INFO_(MTK_SENSOR_INFO, "mtk.sensor.info")
_IMP_SECTION_INFO_(MTK_HAL_INFO, "mtk.hal.info")
就是定义了对于各个 MetadataSectionInfo<?>的结构体 比如第一个 _IMP_SECTION_INFO_(MTK_SENSOR, "mtk.sensor") 得到
struct MetadataSectionInfo<MTK_SENSOR> {
enum { SECTION_START = MTK_SENSOR_START, SECTION_END = MTK_SENSOR_END, };
};
_IMP_TAG_INFO_( MTK_SENSOR_INFO_ORIENTATION, MINT32, "orientation")
_IMP_TAG_INFO_( MTK_SENSOR_INFO_FACING, MUINT8, "facing")
_IMP_TAG_INFO_( MTK_SENSOR_INFO_FRAME_RATE, MINT32, "frameRate")
在 MetadataProvider::setTagInfo方法中使用了宏
#define _IMP_TAG_INFO_(_tag_, _type_, _name_) rtagInfo.addTag(_tag_, _name_, Type2TypeEnum<_type_>::typeEnum);
那么 _IMP_TAG_INFO_( MTK_SENSOR_INFO_ORIENTATION, MINT32, "orientation")
就是 IMetadataTagSet rtagInfo.addTag(MTK_SENSOR_INFO_ORIENTATION,MINT32,"orientation");
DefaultKeyedVector<MUINT32, sp<TagInfo> > mTagInfoMap;
IMetadataTagSet::addTag(MUINT32 tag, char const* name, MINT32 typeEnum)
{
mTagInfoMap.add(tag, new TagInfo(tag, name, typeEnum));
}
class TagInfo : public virtual RefBase
{
public:
MUINT32 mTag; String8 mName; MINT32 mTypeEnum;
TagInfo(MUINT32 const tag,char const* name,MINT32 const typeEnum): mTag(tag), mName(name), mTypeEnum(typeEnum){}
MUINT32 tag() const { return mTag; }
char const* name() const { return mName.string(); }
MINT32 typeEnum() const { return mTypeEnum; }
};
1.A5 方法 IMetadataProvider::constructStaticMetadata 解析
status_t MetadataProvider::
constructStaticMetadata(sp<IMetadataConverter> pConverter, camera_metadata*& rpDstMetadata, IMetadata& mtkMetadata)
{
IMetadata sensorMetadata = IHalSensorList::get()->queryStaticInfo(mInfo.getDeviceId()); // 从IHalSensorList 获得 IMetadata
for (size_t i = 0; i < sensorMetadata.count(); i++)
{
IMetadata::Tag_t mTag = sensorMetadata.entryAt(i).tag();
mtkMetadata.update(mTag, sensorMetadata.entryAt(i)); // 往参数 IMetadata mtkMetadata 添加数据
}
pConverter->convert(mtkMetadata, rpDstMetadata); 调用参数pConverter 的方法继续对 IMetadata 和 camera_metadata 处理
}
NSCam::ICamDeviceManager* mpDeviceManager; // 【"MtkCam/devicemgr"】 device manager
与CameraService往下调用的顺序
DefaultCam1Device 应该是通过 Cam1Device 的形式提供给外部使用
Cam1DeviceBase.h { 与上层的关系
NSCam::ICamDeviceManager* mpDeviceManager; // 【"MtkCam/devicemgr"】 device manager.
}
【1】 CameraService.cpp
{
camera_module_t *mModule = NULL;
//camera_device_t *mDevice = NULL; 不包含 camera_device_t
class Client : public BnCamera, public BasicClient // Client内部类接口 是具体的做事的类 它的实现类是CameraClirnt
{
virtual status_t startPreview() = 0;
virtual status_t startRecording() = 0;
}
void CameraService::onFirstRef()
{ // CameraHardwareInterface 包含 camera_device_t
CameraHardwareInterface* mHardware = new CameraHardwareInterface(camera_device_name);
mHardware->initialize(&mModule->common);
}
}
【2】CameraClient
class CameraClient : public CameraService::Client
// CameraClient 是 CameraService内部类 Client的实现 他能调用到CameraService的资源
{
sp<CameraHardwareInterface> mHardware; // 含有CameraHardwareInterface的实现类
CameraClient(){ // 构造器中就 创建了 CameraHardwareInterface 的实例
char camera_device_name[10];
mHardware = new CameraHardwareInterface(camera_device_name); // 对应 CameraHal.cpp
res = mHardware->initialize(&module->common);
}
mHardware->getParameters();
mHardware->takePicture();
mHardware->sendCommand();
mHardware->setParameters(p);
}
【3】 CameraHardwareInterface.h
class CameraHardwareInterface : public virtual RefBase {
camera_device_t *mDevice;
status_t initialize(hw_module_t *module)
{ // 调用了 CameraService传来的camera_module_t 初始化了 camera_device_t
// 然后都是对外提供 mDevice->ops->methodXXX 例如:mDevice->ops->auto_focus mDevice->ops->take_picture
cameraModule->open_legacy(module, mName.string(),CAMERA_DEVICE_API_VERSION_1_0,(hw_device_t **)&mDevice);
}
status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) // 通过mDevice 执行具体操作
{
if (mDevice->ops->send_command) return mDevice->ops->send_command(mDevice, cmd, arg1, arg2);
return INVALID_OPERATION;
}
}
【4】CameraHal_Module.cpp Hal层为上层提供的接口 CameraHardwareInterface 中的
mDevice->ops->auto_focus mDevice->ops->take_picture .... 都调用到这里
static struct hw_module_methods_t camera_module_methods = {
.open = camera_device_open
};
int camera_device_open(const hw_module_t* module, const char* name,hw_device_t** device)
{
ti_camera_device_t* camera_device = NULL;
camera_device_ops_t* camera_ops = NULL;
// 定义了结构体 ti_camera_device_t 里面的 camera_device_ops_t 方法集合 和当前的方法一一映射
camera_ops->auto_focus = camera_auto_focus;
camera_ops->cancel_auto_focus = camera_cancel_auto_focus;
// 定义了 CameraHardwareInterface 对应的mDevice->ops->take_picture 对应的本地方法
camera_ops->take_picture = camera_take_picture;
camera_ops->cancel_picture = camera_cancel_picture;
camera_ops->start_preview = camera_start_preview;
camera_ops->stop_preview = camera_stop_preview;
camera_ops->start_recording = camera_start_recording;
camera_ops->stop_recording = camera_stop_recording;
camera = new android::CameraHal(cameraid); // 创建CameraHal
gCameraHals[cameraid] = camera;
}
static android::CameraHal* gCameraHals[MAX_CAMERAS_SUPPORTED];
int camera_take_picture(struct camera_device * device)
{
int rv = -EINVAL;
ti_camera_device_t* ti_dev = NULL;
if(!device) return rv;
ti_dev = (ti_camera_device_t*) device;
rv = gCameraHals[ti_dev->cameraid]->takePicture(); // gCameraHals[ti_dev->cameraid] 返回的是一个CameraHal
return rv;
}
【5】
CameraHal.h (hardware\ti\omap4xxx\camera\inc):
//This class implements the interface methods defined in CameraHardwareInterface
// 这个类 实现了在 CameraHardwareInterface.h 文件中定义的方法接口
// CameraHal.cpp This file maps the Camera Hardware Interface to V4L2.
class CameraHal{ // CameraHal实现了CameraHardwareInterface接口被CameraClient 使用到 它是通过实现V4L2接口方式与驱动交互
CameraAdapter *mCameraAdapter; //主要通过 CameraAdapter的sendCommand方法与驱动交互?
sp<AppCallbackNotifier> mAppCallbackNotifier;
sp<DisplayAdapter> mDisplayAdapter;
sp<MemoryManager> mMemoryManager;
sp<IMemoryHeap> mPictureHeap;
void* mCameraAdapterHandle;
CameraParameters mParameters;
Camera **mCameras; // 一个Camera数组?
// 同硬件打交道 使用 mCameraAdapter 方法
ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
}
搜索日志:
CameraHal.h (omap4-aah\camera\inc):This class implements the interface methods defined in CameraHardwareInterface
CameraHal.h (omap4xxx\camera\inc):This class implements the interface methods defined in CameraHardwareInterface
CameraHal.cpp (hardware\ti\omap4-aah\camera):* This file maps the Camera Hardware Interface to V4L2.
CameraHal.cpp (hardware\ti\omap4xxx\camera):* This file maps the Camera Hardware Interface to V4L2.
CameraHal_Module.cpp (hardware\ti\omap4-aah\camera):* This file maps the Camera Hardware Interface to V4L2.
CameraHal_Module.cpp (hardware\ti\omap4xxx\camera):* This file maps the Camera Hardware Interface to V4L2.
General3A_Settings.h (hardware\ti\omap4-aah\camera\inc):* This file maps the Camera Hardware Interface to OMX.
General3A_Settings.h (hardware\ti\omap4xxx\camera\inc):* This file maps the Camera Hardware Interface to OMX.
OMXCameraAdapter.cpp (hardware\ti\omap4-aah\camera\OMXCameraAdapter):This file maps the Camera Hardware Interface to OMX.
OMXCameraAdapter.cpp (hardware\ti\omap4xxx\camera\OMXCameraAdapter):This file maps the Camera Hardware Interface to OMX.
【6】CameraAdapter (CameraHal.h)
class CameraAdapter: public FrameNotifier, public virtual RefBase
{
enum AdapterActiveStates {INTIALIZED_ACTIVE =1<<0,PREVIEW_ACTIVE=1<< 2,CAPTURE_ACTIVE =1<<4,VIDEO_ACTIVE =1<<8}
enum CameraCommands{CAMERA_START_PREVIEW=0,CAMERA_START_VIDEO=2,CAMERA_START_IMAGE_CAPTURE=4}
enum AdapterState {VIDEO_STATE = VIDEO_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,} // 各个位AdapterActiveStates的集合
CameraAdapter* mCameraAdapter = CameraAdapter_Factory(sensor_index); // 创建CameraAdapter
}
CameraAdapter 有两个实现 一个通过 V4L2 方式 一种通过 OMX 方式 与驱动交互 // 因为有参数 所以这里是 OMXCameraAdapter
搜索日志:
OMXCameraAdapter.cpp (OMXCameraAdapter):extern "C" CameraAdapter* CameraAdapter_Factory(size_t sensor_index)
V4LCameraAdapter.cpp (V4LCameraAdapter):extern "C" CameraAdapter* CameraAdapter_Factory()
class BaseCameraAdapter.cpp : public CameraAdapter // BaseCameraAdapter 实现了大多数 CameraAdapter中定义的虚函数
{
//BaseCameraAdapter.cpp中存在空的方法 需要子类去实现这些方法
//-----------------Stub implementation of the interface ------------------------------
status_t BaseCameraAdapter::takePicture()
{ status_t ret = NO_ERROR;LOG_FUNCTION_NAME;LOG_FUNCTION_NAME_EXIT;return ret; } // 空函数
status_t BaseCameraAdapter::stopImageCapture()
{status_t ret = NO_ERROR;LOG_FUNCTION_NAME;LOG_FUNCTION_NAME_EXIT;return ret;} // 空函数
status_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3)
{ //▲ 此函数在BaseCameraAdapter.cpp 实现了 子类OMXCameraAdapter不会去实现 在这个方法中 回去根据CameraCommands }
//▲ 去调用在 BaseCameraAdapter 为空 而在子类OMXCameraAdapter 实现的方法
}
class OMXCameraAdapter : public BaseCameraAdapter // OMXCameraAdapter 继承 BaseCameraAdapter
{ // 定义了很多接口相关的成员
#define MIN_JPEG_QUALITY 1
#define MAX_JPEG_QUALITY 100
#define EXP_BRACKET_RANGE 10
#define FOCUS_DIST_SIZE 100
#define FOCUS_DIST_BUFFER_SIZE 500
//Parent class method implementation //OMXCameraAdapter.h 需要实现覆盖父类的对应方法
virtual status_t takePicture();
virtual status_t stopImageCapture();
virtual status_t startBracketing(int range);
virtual status_t stopBracketing();
virtual status_t autoFocus();
virtual status_t cancelAutoFocus();
virtual status_t startSmoothZoom(int targetIdx);
virtual status_t stopSmoothZoom();
virtual status_t startVideoCapture();
virtual status_t stopVideoCapture();
virtual status_t startPreview();
virtual status_t stopPreview();
virtual status_t useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable);
virtual status_t fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType);
virtual status_t getFrameSize(size_t &width, size_t &height);
virtual status_t getPictureBufferSize(size_t &length, size_t bufferCount);
virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount);
virtual status_t startFaceDetection();
virtual status_t stopFaceDetection();
virtual status_t switchToExecuting();
virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt);
//OMXCameraAdapter 含有一个继承Thread的处理消息的线程类
class CommandHandler : public Thread {CommandHandler(OMXCameraAdapter* ca){}}
//OMXCameraAdapter 含有一个继承Thread的处理回调的线程类
class OMXCallbackHandler : public Thread {OMXCallbackHandler(OMXCameraAdapter* ca){}}
CameraParameters mParameters;
}
OMXCameraAdapter.cpp
status_t OMXCameraAdapter::takePicture()
{
msg.command = CommandHandler::CAMERA_START_IMAGE_CAPTURE; // 发CAMERA_START_IMAGE_CAPTURE消息给消息线程
msg.arg1 = mErrorNotifier;
ret = mCommandHandler->put(&msg);
}
bool OMXCameraAdapter::CommandHandler::Handler()
{
volatile int forever = 1;
while ( forever ){
switch ( msg.command ) {
case CommandHandler::CAMERA_START_IMAGE_CAPTURE:
{
// 分文件OMXCapture.cpp的 OMXCameraAdapter 的startImageCapture 本地mCameraAdapter没有实现
stat = mCameraAdapter【OMXCameraAdapter】->startImageCapture();
break;
}
}
}
OMXCapture.cpp // 调用OMX 含有的专有的函数
status_t OMXCameraAdapter::startImageCapture()
{
ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,(OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
OMX_ALL,OMX_TI_IndexConfigShutterCallback,mStartCaptureSem);
eError = OMX_FillThisBuffer(mCameraAdapterParameters.mHandleComp,(OMX_BUFFERHEADERTYPE*)capData->mBufferHeader[index]);
eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,OMX_IndexConfigCapturing,&bOMX);
setExtraData(false, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance);
}
--------------------------------------------------------------------------------------
【7】CameraHardwareInterface.h 中的cameraModule 对应不同的模块
D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
【4】D:\Coding\hardware\ti\omap4xxx\camera\CameraHal_Module.cpp
CameraHAL.cpp CameraHAL.h (hardware\libhardware\modules\camera):
注意这里与上面的 【5】CameraHal.h (hardware\ti\omap4xxx\camera\inc): 不是同一个文件
如果【3】CameraHardwareInterface.h 中函数 cameraModule 对应的成员是
camera_module_t *cameraModule = reinterpret_cast<camera_module_t *>(module);
该cameraModule
cameraModule->open_legacy(module, mName.string(),CAMERA_DEVICE_API_VERSION_1_0,(hw_device_t **)&mDevice);
执行的open_legacy 将会是不一样的结果
▲1如果指向 D:\Coding\hardware\ti\omap4xxx\camera\CameraHal_Module.cpp 那么就从【4】往下
CameraHal_Module.cpp::open_legacy
▲2如果指向 D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
module.h::open_legacy
那么就可以从新在这里往下走了 最终在 CamDeviceManagerBase的 sp<ICamDevice> pDevice = NULL; 就被初始化了
D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
static hw_module_methods_t* get_module_methods()
{
static hw_module_methods_t _methods ={open: open_device}; // 指定了open方法为本地的open_device 方法
return &_methods;
}
// 指定了 模块open_legacy 方法对应本地的 open_legacy 方法
static camera_module get_camera_module() {camera_module module = {open_legacy : open_legacy,};
▲ module.h 中 open_device 和 open_legacy 都是调用 NSCam::getCamDeviceManager()->open
D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
static int open_device(hw_module_t const* module, const char* name, hw_device_t** device)
{
return NSCam::getCamDeviceManager()->open(device, module, name);
}
D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
static int
open_legacy(const struct hw_module_t* module,const char* id,uint32_t halVersion,struct hw_device_t** device)
{
return NSCam::getCamDeviceManager()->open(device, module, id, halVersion);
}
status_t
CamDeviceManagerBase::open(hw_device_t** device,hw_module_t const* module,char const* name,uint32_t device_version){
openDeviceLocked(device, module, i4OpenId, device_version);
}
status_t
CamDeviceManagerBase::openDeviceLocked(hw_device_t** device,hw_module_t const* module,
int32_t const i4OpenId,uint32_t device_version){
sp<ICamDevice> pDevice = NULL; //在
pDevice = pPlatform->createCam1Device(s8ClientAppMode.string(), i4DebugOpenID);
}
IPlatform.cpp
virtual ICamDevice* createCam1Device(char const*szClientAppMode, int32_t consti4OpenId) = 0;
PlatformEntry.Cam1Device.cpp
ICamDevice* PlatformEntry:: createCam1Device(char const*zClientAppMode, int32_t const i4OpenId)
{return ::createCam1Device(String8(szClientAppMode), i4OpenId);}
Cam1DeviceFactory.cpp
NSCam::Cam1Device* createCam1Device(String8 const s8ClientAppMode, int32_t const i4OpenId){
String8 const s8LibPath = String8::format("libcam.device1.so");
void *handle = ::dlopen(s8LibPath.string(), RTLD_GLOBAL);
NSCam::Cam1Device* pdev = NULL;
String8 const s8CamDeviceInstFactory = String8::format("createCam1Device_Default"); // 在DefaultCam1Device.cpp 实现
void* pCreateInstance = ::dlsym(handle, s8CamDeviceInstFactory.string());
pdev = reinterpret_cast<NSCam::Cam1Device* (*)
(String8 const&, int32_t const)>(pCreateInstance)(s8ClientAppMode, i4OpenId); // 通过dlsym拿到函数句柄 然后调用
}
【8】CameraHardwareInterface.h 中的cameraModule 对应 D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
那么 怎么调用
camera_device_t *mDevice;
mDevice->ops->start_preview(mDevice);
mDevice->ops->start_recording(mDevice);
mDevice->ops->send_command(mDevice, cmd, arg1, arg2);
mDevice->ops->set_parameters(mDevice,params.flatten().string());
在 Cam1Device.cpp 中存在一个用宏定义的camera_device_ops
猜测在CameraHardwareInterface中调用的mDevice->ops->start_preview send_command set_parameters 就是调用到这里
Cam1Device.cpp static mtk_camera_device_ops const
gCameraDevOps =
{
#define OPS(name) name: camera_##name
{
OPS(set_preview_window), = set_preview_window: camera_set_preview_window
OPS(set_callbacks),
OPS(enable_msg_type),
OPS(disable_msg_type),
OPS(msg_type_enabled),
OPS(start_preview),
OPS(stop_preview),
OPS(preview_enabled),
OPS(store_meta_data_in_buffers),
OPS(start_recording),
OPS(stop_recording),
OPS(recording_enabled),
OPS(release_recording_frame),
OPS(auto_focus),
OPS(cancel_auto_focus),
OPS(take_picture),
OPS(cancel_picture),
OPS(set_parameters),
OPS(get_parameters),
OPS(put_parameters),
OPS(send_command),
OPS(release),
OPS(dump)
},
OPS(mtk_set_callbacks),
#undef OPS
};
Cam1Device.cpp static int camera_take_picture(struct camera_device * device)
{
int err = -EINVAL;
// 这个Cam1Device 对应的是 DefaultCam1Device Cam1DeviceBase 真正完成功能的类
Cam1Device*const pDev = Cam1Device::getDevice(device);
if ( pDev )
{ err = pDev->takePicture();}
return err;
}
status_t Cam1DeviceBase::takePicture()
{
mpCamClient->takePicture();
mpCamAdapter->sendCommand(CAMERA_CMD_ENABLE_RAW16_CALLBACK, 1, 0);
status = mpCamAdapter->takePicture();
}
Cam1DeviceBase.h // 对应CameraHal 也存在这里个类
NSCam::ICamDeviceManager* mpDeviceManager; // 【"MtkCam/devicemgr"】 device manager.
sp<IParamsManager> mpParamsMgr;
sp<ICamAdapter> mpCamAdapter;
sp<ICamClient> mpCamClient;
sp<IDisplayClient> mpDisplayClient;
Vector<sp<ICamClient> > vmpCamClient;
在 Cam1DeviceBase.cpp 的构造器中
mpCamAdapter = ICamAdapter::createInstance(mDevName, mi4OpenId, mpParamsMgr);
mpDisplayClient = IDisplayClient::createInstance();
mpCamClient = ICamClient::createInstance(mpParamsMgr);
mpParamsMgr(IParamsManager::createInstance(rDevName, i4OpenId))
// 只有 mpDeviceManager 是通过外部设置进来的
void Cam1DeviceBase::setDeviceManager(ICamDeviceManager* manager){mpDeviceManager = manager;}
status_tCamDeviceManagerBase::openDeviceLocked(
hw_device_t** device,hw_module_t const* module,
int32_t const i4OpenId,uint32_t device_version
){
pDevice【sp<ICamDevice>】->setDeviceManager(this); // 在 open方法中设置了这个值ICamDeviceManager 到Cam1DeviceBase
}
===========================================================================
class Cam1DeviceBase.h{
NSCam::ICamDeviceManager* mpDeviceManager; // 【"MtkCam/devicemgr"】
}
DefaultCam1Device 继承方法梳理
【实现】-----标识该方法在该文件被具体化实现出来
【#-】 标识的是该文件被实例具体化的文件位置 一般出现在.h 文件中
//DefaultCam1Device 继承 Cam1DeviceBase 又定义了虚函数
class DefaultCam1Device.h【4】 : public Cam1DeviceBase
{
CamManager* pCamMgr;
【3】sp<IParamsManager> mpParamsMgr; //这几个类被用来与Hal_Sensor交互?
【3】sp<ICamAdapter> mpCamAdapter;
【3】sp<ICamClient> mpCamClient;
【3】sp<IDisplayClient> mpDisplayClient;
【3】NSCam::ICamDeviceManager* mpDeviceManager;
【4.1#-DefaultCam1Device.cpp】virtual bool onUninit();
【4.2#-DefaultCam1Device.cpp】virtual bool onStartPreview();
【4.3#-DefaultCam1Device.cpp】virtual void onStopPreview();
【4.4#-DefaultCam1Device.cpp】virtual bool powerOnSensor();
【4.5#-DefaultCam1Device.cpp】static void* doThreadInit(void* arg);
【4.6#-DefaultCam1Device.cpp】virtual bool waitThreadInitDone();
【2.18#-Cam1DeviceBase.cpp #-DefaultCam1Device.cpp 】virtual status_t setParameters(const char* params);
【3.1#-Cam1DeviceBase.h #-DefaultCam1Device.h 】virtual int32_t queryDisplayBufCount() const { return 6; }
}
class DefaultCam1Device.cpp【4】 : public Cam1DeviceBase
{
【4.1实现】virtual bool onUninit();
【4.2实现】virtual bool onStartPreview();
【4.3实现】virtual void onStopPreview();
【4.4实现】virtual bool powerOnSensor(){pHalSensorList->createSensor(USER_NAME,getOpenId()).powerOn();}
【4.5实现】static void* doThreadInit(void* arg);
【4.6实现】virtual bool waitThreadInitDone();
【2.18#-Cam1DeviceBase.cpp 实现】virtual status_t setParameters(const char* params);
}
//Cam1DeviceBase 继承了Cam1Device的接口 实现了一部分 自己又定义了一些虚函数
class Cam1DeviceBase.h【3】 : public NSCam::Cam1Device, protected ICam1DeviceCallback
{
NSCam::ICamDeviceManager* mpDeviceManager; // 【"MtkCam/devicemgr"】
void Cam1DeviceBase::setDeviceManager(ICamDeviceManager* manager)
{
mpDeviceManager = manager;
}
【3.1#-Cam1DeviceBase.h】
virtual int32_t queryDisplayBufCount() const { return 3; } // 如果没有在cpp实现那么就用这里的实现
【3.2#-Cam1DeviceBase.cpp】virtual bool queryPreviewSize(int32_t& ri4Width, int32_t& ri4Height);
【3.3#-Cam1DeviceBase.cpp】virtual bool initCameraAdapter();
【3.4#-Cam1DeviceBase.cpp】virtual status_t initDisplayClient(preview_stream_ops* window);
【3.5#-Cam1DeviceBase.cpp】virtual status_t enableDisplayClient();
【3.6#-Cam1DeviceBase.cpp】virtual void disableDisplayClient();
【3.7#-Cam1DeviceBase.cpp】virtual bool onInit();
【3.8#-Cam1DeviceBase.cpp】virtual bool onUninit();
【3.9#-Cam1DeviceBase.h 实现】virtual bool onStartPreview() { return true; }
【3.10#-Cam1DeviceBase.h 实现】virtual void onStopPreview() {}
【3.11#-Cam1DeviceBase.cpp】virtual void onCam1Device_NotifyCb(int32_t const msgType,intptr_t const ext1);
【2.2#-Cam1DeviceBase.cpp】virtual status_t closeDevice();
【2.3#-Cam1DeviceBase.cpp】virtual status_t initialize();
【2.4#-Cam1DeviceBase.cpp】virtual void uninitialize();
【2.5#-Cam1DeviceBase.cpp】virtual void setCallbacks(
camera_notify_callback notify_cb,
camera_data_callback data_cb,
camera_data_timestamp_callback data_cb_timestamp,
camera_request_memory get_memory,
void *user
);
【2.6#-Cam1DeviceBase.cpp】virtual void setCallbacks(
mtk_camera_metadata_callback metadata_cb,
void *user);
【2.7#-Cam1DeviceBase.cpp】virtual void enableMsgType(int32_t msgType);
【2.8#-Cam1DeviceBase.cpp】virtual void disableMsgType(int32_t msgType);
【2.9#-Cam1DeviceBase.cpp】virtual bool msgTypeEnabled(int32_t msgType);
【2.10#-Cam1DeviceBase.cpp】virtual status_t setPreviewWindow(preview_stream_ops* window);
【2.11#-Cam1DeviceBase.cpp】virtual status_t startPreview();
【2.12#-Cam1DeviceBase.cpp】 virtual void stopPreview();
【2.13#-Cam1DeviceBase.cpp】virtual bool previewEnabled();
【2.14#-Cam1DeviceBase.cpp】virtual status_t startRecording();
【2.15#-Cam1DeviceBase.cpp】virtual void stopRecording();
【2.16#-Cam1DeviceBase.cpp】virtual status_t takePicture();
【2.17#-Cam1DeviceBase.cpp】virtual status_t cancelPicture();
【2.18#-Cam1DeviceBase.cpp】virtual status_t setParameters(const char* params);
【2.19#-Cam1DeviceBase.cpp】virtual char* getParameters();
【2.20#-Cam1DeviceBase.cpp】virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
【1.6实现】virtual char const* getDevName() const { return mDevName.string(); }
【1.1实现】virtual int32_t getOpenId() const { return mi4OpenId; }
【1.5实现】virtual void setDeviceManager(NSCam::ICamDeviceManager* manager);
}
class Cam1DeviceBase.cpp【3】 : public NSCam::Cam1Device, protected ICam1DeviceCallback
{
【3.2#实现】virtual bool queryPreviewSize(int32_t& ri4Width, int32_t& ri4Height);
【3.3#实现】virtual bool initCameraAdapter();
【3.4#实现】virtual status_t initDisplayClient(preview_stream_ops* window);
【3.5#实现】virtual status_t enableDisplayClient();
【3.6#实现】virtual void disableDisplayClient();
【3.7#-实现】virtual bool onInit();
【3.8#-实现】virtual bool onUninit();
【3.9#-实现 Cam1DeviceBase.h】virtual bool onStartPreview() { return true; }
【3.10#-实现 Cam1DeviceBase.h】virtual void onStopPreview() {}
【3.11#-实现】virtual void onCam1Device_NotifyCb(int32_t const msgType,intptr_t const ext1);
【2.2#-实现】virtual status_t closeDevice();
【2.3#-实现】virtual status_t initialize();
【2.4#-实现】virtual void uninitialize();
【2.5#-实现】virtual void setCallbacks(
camera_notify_callback notify_cb,
camera_data_callback data_cb,
camera_data_timestamp_callback data_cb_timestamp,
camera_request_memory get_memory,
void *user
);
【2.6#-实现】virtual void setCallbacks(
mtk_camera_metadata_callback metadata_cb,
void *user);
【2.7#-实现】virtual void enableMsgType(int32_t msgType);
【2.8#-实现】virtual void disableMsgType(int32_t msgType);
【2.9#-实现】virtual bool msgTypeEnabled(int32_t msgType);
【2.10#-实现】virtual status_t setPreviewWindow(preview_stream_ops* window);
【2.11#-实现】virtual status_t startPreview();
【2.12#-实现】 virtual void stopPreview();
【2.13#-实现】virtual bool previewEnabled();
【2.14#-实现】virtual status_t startRecording();
【2.15#-实现】virtual void stopRecording();
【2.16#-实现】virtual status_t takePicture();
【2.17#-实现】virtual status_t cancelPicture();
【2.18#-实现】virtual status_t setParameters(const char* params);
【2.19#-实现】virtual char* getParameters();
【2.20#-实现】virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
}
class Cam1Device.h【2】 : public ICamDevice // Cam1Device 继承 ICamDevice虚函数 自己又添加了一些 纯虚函数
{
static inline Cam1Device* getDevice(camera_device* device) // 对外通过 camera_device 得到实现功能的 Cam1Device
{return (NULL == device)? NULL: (Cam1Device*)((device)->priv);}
static inline Cam1Device* getDevice(hw_device_t* device)
{return getDevice((camera_device*)device);}
virtual ~Cam1Device() {}
Cam1Device();
【2.1#-Cam1Device.h】virtual void onLastStrongRef(const void* id);
【2.2#-Cam1DeviceBase.cpp】virtual status_t closeDevice();
【2.3#-Cam1DeviceBase.cpp】virtual status_t initialize();
【2.4#-Cam1DeviceBase.cpp】virtual void uninitialize();
【2.5#-Cam1DeviceBase.cpp】virtual void setCallbacks(
camera_notify_callback notify_cb,
camera_data_callback data_cb,
camera_data_timestamp_callback data_cb_timestamp,
camera_request_memory get_memory,
void *user
);
【2.6#-Cam1DeviceBase.cpp】virtual void setCallbacks(
mtk_camera_metadata_callback metadata_cb,
void *user);
【2.7#-Cam1DeviceBase.cpp】virtual void enableMsgType(int32_t msgType);
【2.8#-Cam1DeviceBase.cpp】virtual void disableMsgType(int32_t msgType);
【2.9#-Cam1DeviceBase.cpp】virtual bool msgTypeEnabled(int32_t msgType);
【2.10#-Cam1DeviceBase.cpp】virtual status_t setPreviewWindow(preview_stream_ops* window);
【2.11#-Cam1DeviceBase.cpp】virtual status_t startPreview();
【2.12#-Cam1DeviceBase.cpp】 virtual void stopPreview();
【2.13#-Cam1DeviceBase.cpp】virtual bool previewEnabled();
【2.14#-Cam1DeviceBase.cpp】virtual status_t startRecording();
【2.15#-Cam1DeviceBase.cpp】virtual void stopRecording();
【2.16#-Cam1DeviceBase.cpp】virtual status_t takePicture();
【2.17#-Cam1DeviceBase.cpp】virtual status_t cancelPicture();
【2.18#-Cam1DeviceBase.cpp】virtual status_t setParameters(const char* params);
【2.19#-Cam1DeviceBase.cpp】virtual char* getParameters();
【2.20#-Cam1DeviceBase.cpp】virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
▲ 在 Cam1Device.cpp 中定义了 一些静态方法 调用通过静态方法调用实现功能的那个类的对应方法
【1.2实现】virtual hw_device_t const* get_hw_device() const { return &mDevice.common; }
【1.3实现】virtual void set_hw_module(hw_module_t const* module)
{ mDevice.common.module = const_cast<hw_module_t*>(module);}
【1.4实现】virtual void set_module_callbacks(camera_module_callbacks_t const* callbacks)
{mpModuleCallbacks = callbacks;}
}
class Cam1Device.cpp【2】 : public ICamDevice
{
【2.1实现】 void onLastStrongRef(const void* id);
▲ 在 Cam1Device.cpp 中定义了 一些静态方法 通过静态 static 方法调用实现功能的那个类的对应方法
static int camera_send_command(struct camera_device * device,int32_t cmd, int32_t arg1, int32_t arg2)
{
int err = -EINVAL;
Cam1Device*const pDev = Cam1Device::getDevice(device);
if ( pDev ){err = pDev->sendCommand(cmd, arg1, arg2); }
return err;
}
对应调用 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
static int camera_set_parameters(struct camera_device * device, const char *params)
{
int err = -EINVAL;
Cam1Device*const pDev = Cam1Device::getDevice(device);
if ( pDev ) {err = pDev->setParameters(params);}
return err;
}
对应调用 virtual status_t setParameters(const char* params) = 0;
}
class ICamDevice.h【1】 : public virtual android::RefBase // 定义了一些纯虚函数
{
【1.1#-Cam1DeviceBase.h】virtual int32_t getOpenId() const = 0;
【1.2#-Cam1Device.h】virtual hw_device_t const* get_hw_device() const = 0;
【1.3#-Cam1Device.h】virtual void set_hw_module(hw_module_t const* module)= 0;
【1.4#-Cam1Device.h】virtual void set_module_callbacks(camera_module_callbacks_t const*callbacks) = 0;
【1.5#-Cam1DeviceBase.h】virtual void setDeviceManager(ICamDeviceManager* manager) = 0;
【1.6#-Cam1DeviceBase.h】virtual char const* getDevName() const = 0;
}
CamDeviceManagerBase.cpp 中的Cam1Device pDevice 方法 和 HardwareInterface 一一映射
一.CameraHardwareInterface.h
cameraModule->open_legacy(module, mName.string(),CAMERA_DEVICE_API_VERSION_1_0,(hw_device_t **)&mDevice);
二.D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\module_hal\module\module.h
open_legacy(const struct hw_module_t* module,const char* id,uint32_t halVersion,struct hw_device_t** device)
{
return NSCam::getCamDeviceManager()【ICamDeviceManager CamDeviceManagerBase】
->open(device, module, id, halVersion);
}
三.CamDeviceManagerImp.cpp
namespace{
CamDeviceManagerImp gCamDeviceManager; // 在CamDeviceManagerImp 构造器空完成了初始化
}
namespace NSCam {
ICamDeviceManager* getCamDeviceManager()
{
return &gCamDeviceManager;
}
}
四.CamDeviceManagerBase.cpp
status_t
CamDeviceManagerBase::open(hw_device_t** device,hw_module_t const* module,char const* name,uint32_t device_version){
openDeviceLocked(device, module, i4OpenId, device_version);
}
CamDeviceManagerBase.cpp 中的pDevice 方法 和 HardwareInterface 一一映射
status_t CamDeviceManagerBase.openDevice.cpp::
openDeviceLocked(hw_device_t** device,hw_module_t const* module,int32_t const i4OpenId,uint32_t device_version)
{
IPlatform*const pPlatform = getPlatform();
pDevice = pPlatform->createCam1Device(s8ClientAppMode.string(), i4DebugOpenID);
pDevice->setDeviceManager(this)【CamDeviceManagerImp】;
}
五.IPlatform.cpp
virtual ICamDevice* createCam1Device(char const*szClientAppMode, int32_t consti4OpenId) = 0;
PlatformEntry.Cam1Device.cpp
ICamDevice* PlatformEntry:: createCam1Device(char const*zClientAppMode, int32_t const i4OpenId)
{return ::createCam1Device(String8(szClientAppMode), i4OpenId);}
六.
Cam1DeviceFactory.cpp
NSCam::Cam1Device* createCam1Device(String8 const s8ClientAppMode, int32_t const i4OpenId){
String8 const s8LibPath = String8::format("libcam.device1.so");
void *handle = ::dlopen(s8LibPath.string(), RTLD_GLOBAL);
NSCam::Cam1Device* pdev = NULL;
String8 const s8CamDeviceInstFactory = String8::format("createCam1Device_Default"); // 在DefaultCam1Device.cpp 实现
void* pCreateInstance = ::dlsym(handle, s8CamDeviceInstFactory.string());
pdev = reinterpret_cast<NSCam::Cam1Device* (*)
(String8 const&, int32_t const)>(pCreateInstance)(s8ClientAppMode, i4OpenId); // 通过dlsym拿到函数句柄 然后调用
}
2.MtkCam/Cam1DeviceFactory
vendor\mediatek\proprietary\hardware\mtkcam\v1\device\Cam1DeviceFactory.cpp
2.1-Cam1DeviceFactory.cpp
3.MtkCam/Cam1Device
vendor\mediatek\proprietary\hardware\mtkcam\v1\device\Cam1Device.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\device\DefaultCam1Device.cpp StereoCam1Device.cpp
3.1-Cam1Device.cpp
3.2-Cam1DeviceBase.cpp
3.3-Cam1DeviceBase.dump.cpp
3.4-DefaultCam1Device.cpp
3.5-StereoCam1Device.cpp
4.MtkCam/HalSensorList
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\custom\custom.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\HalSensorList.cpp
4.1-custom.cpp
4.2-HalSensorList.buildStaticInfo.cpp
4.3-HalSensorList.cpp
4.4-HalSensorList.enumList.cpp
4.5-HalSensorList.getInfo.cpp
4.6-HalSensorList.openList.cpp
5.MtkCam/HalSensor
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hal\sensor\HalSensor.control.cpp
5.1-HalSensor.cpp
5.2-HalSensor.control.cpp
6.MtkCam/Utils/Profile | MtkCam/Utils/Property | MtkCam/Utils | MtkCam/Utils/CamMgr
vendor\mediatek\proprietary\hardware\mtkcam\utils\Profile.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Property.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Format.cpp
vendor\mediatek\proprietary\hardware\mtkcam\utils\Misc.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\hwutils\CamManager.cpp
6.1-Profile.cpp
6.2-Property.cpp
6.3-Format.cpp
6.4-Misc.cpp
6.5-CamManager.cpp
7.MtkCam/ParamsManager
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\paramsmgr\feature\custom\custom.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\paramsmgr\inc\Local.h
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\common\paramsmgr\params\MyUtils.h
7.1-custom.cpp
7.2-Local.h
7.3-MyUtils.h
8.MtkCam/CamClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\CamClient.cpp
8.1-CamClient.cpp
9.MtkCam/CamClient/FDClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD\FDBufMgr.cpp FDClient.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD
9.1-FDBufMgr.cpp
9.2-FDClient.cpp
9.3-FDClient.BufOps.cpp
9.4-FDClient.Scenario.cpp
9.5-FDClient.Thread.cpp
10.MtkCam/CamClient/OTClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\OT\OTBufMgr.cpp OTClient.cpp
10.1-OTBufMgr.cpp
10.2-OTClient.cpp
10.3-OTClient.BufOps.cpp
10.4-OTClient.Scenario.cpp
10.5-OTClient.Thread.cpp
11.MtkCam/CamClient/PREFEATUREBASE
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\PreviewFeatureBase.cpp
11.1-PreviewFeature.Thread.cpp
11.2-PreviewFeatureBase.cpp
11.3-PreviewFeatureClient.BufOps.cpp
12.MtkCam/CamClient/PanoramaClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\Panorama\PanoramaClient.cpp
12.1-PanoramaClient.cpp
12.2-PanoramaClient.Scenario.cpp
13.MtkCam/CamClient/MotionTrackClient
13.1-vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\MotionTrack\MotionTrackClient13.2-MotionTrackClient.Scenario.cpp
14.MtkCam/CamClient/MAVClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewFeature\MAV\MAVClient.cpp
14.1-MotionTrackClient.cpp
14.2-MotionTrackClient.Scenario.cpp
15.MtkCam/DisplayClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\DisplayClient\DisplayClient.cpp
15.1-DisplayClient.cpp
15.2-DisplayClient.BufOps.cpp
15.3-DisplayClient.dump.cpp
15.4-DisplayClient.Stream.cpp
15.5-DisplayThread.cpp
15.6-StreamImgBuf.cpp
16.MtkCam/ExtImgProc
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\ExtImgProc\ExtImgProcImp.cpp
16.1-ExtImgProcImp.cpp
17.MtkCam/CamAdapter
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\BaseCamAdapter.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkDefault\CaptureCmdQueThread.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkEng\CaptureCmdQueThread.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\MtkStereo\CaptureCmdQueThread.cpp
17.1-BaseCamAdapter.cpp
17.2-BaseCamAdapter.Instance.cpp
17.3-CaptureCmdQueThread.cpp(MtkDefault)
17.4-CaptureCmdQueThread.cpp(MtkEng)
17.5-CaptureCmdQueThread.cpp(MtkStereo)
17.6-MtkDefaultCamAdapter.cpp
17.7-MtkDefaultCamAdapter.3A.cpp(MtkDefault)
17.8-MtkDefaultCamAdapter.Capture.cpp(MtkDefault)
17.9-MtkDefaultCamAdapter.CaptureCallback.cpp(MtkDefault)
17.10-MtkDefaultCamAdapter.Preview.cpp
17.11-MtkDefaultCamAdapter.Record.cpp
17.12-MtkDefaultCamParameter.cpp
17.13-MtkEngCamAdapter.3A.cpp (MtkEng)
17.14-MtkEngCamAdapter.Capture.cpp (MtkEng)
17.15-MtkEngCamAdapter.CaptureCallback.cpp (MtkEng)
17.16-MtkEngCamAdapter.cpp (MtkEng)
17.17-MtkEngCamAdapter.dump.cpp (MtkEng)
17.18-MtkEngCamAdapter.Preview.cpp (MtkEng)
17.19-MtkEngCamAdapter.Record.cpp (MtkEng)
17.20-MtkEngCamParameter.cpp (MtkEng)
17.21-MtkStereoCamAdapter.3A.cpp(Stereo)
17.22-MtkStereoCamAdapter.Capture.cpp
17.23-MtkStereoCamAdapter.CaptureCallback.cpp
17.24-MtkStereoCamAdapter.cpp
17.25-MtkStereoCamAdapter.Preview.cpp
17.26-MtkStereoCamAdapter.Record.cpp
17.27-MtkStereoCamParameter.cpp
17.28-State.cpp (MtkDefault)
17.29-State.cpp (MtkEng)
17.30-State.cpp (MtkStereo)
17.31-StateManager.cpp (MtkDefault)
17.32-StateManager.cpp (MtkEng)
17.33-StateManager.cpp (MtkStereo)
17.33-ZipImageCallbackThread.cpp (MtkDefault)
17.34-ZipImageCallbackThread.cpp (MtkEng)
17.35-ZipImageCallbackThread.cpp (MtkStereo)
拍照模式 (全景 全焦 美肤 水印 等等的功能位置)
CameraService.onFirstRef---->CameraHardwareInterface.initialize------>CameraDeviceBase.cpp(ICamAdapter)
----> 1.CameraAdapter(BaseCamAdapter)【 CamAdapter.IShot ▲】 --->
class BaseCamAdapter : public ICamAdapter{}
NSMtkDefaultCamAdapter.h
class CamAdapter : public BaseCamAdapter, public IStateHandler
, public ICaptureCmdQueThreadHandler, public IShotCallback{}
-------------------------------------------------------------------------------------
namespace NSMtkDefaultCamAdapter { // 命名空间为 NSMtkDefaultCamAdapter 的 CamAdapter
class CamAdapter : public BaseCamAdapter
, public IStateHandler
, public ICaptureCmdQueThreadHandler
, public IShotCallback
{}
/** Send command to camera driver.*/ 该函数是和驱动交互的?
virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
sp<IShot> mpShot; // 含有一个拍照模式的接口
}
IShot::
IShot(sp<ImpShot> pImpShot): mpImpShot(pImpShot) // 构造参数 sp<ImpShot> 是实际实现功能的类 这是代理模式
{
}
-------------------------------------------------------------------------------------
1.
bool
CamAdapter::
updateShotInstance()
{
uint32_t const u4ShotMode = mpDefaultCtrlNode->getShotMode();
MY_LOGD("ShotMode(%d)",u4ShotMode);
return createShotInstance(mpShot, u4ShotMode, getOpenId(), getParamsManager());
}
2.
ShotFactory.cpp
//createShotInstance 由继承 NSMtkDefaultCamAdapter.CamAdapter 的类去实现
bool
createShotInstance(sp<IShot>&rpShot,uint32_t const u4ShotMode,int32_t const i4OpenId,sp<IParamsManager>pParamsMgr);
{
rpShot = createInstance_FrontPanoramaShot("FrontPanoramaShot", u4ShotMode, i4OpenId, pParamsMgr);
}
3.
FrontPanoramaShot.cpp
sp<IShot> createInstance_FrontPanoramaShot(char const*const pszShotName,
uint32_t const u4ShotMode,int32_t const i4OpenId,sp<IParamsManager> pParamsMgr
){
pImpShot = new FrontPanoramaShot(pszShotName, u4ShotMode, i4OpenId, pParamsMgr);
pImpShot->onCreate();
return new IShot(pImpShot);
}
4.
FrontPanoramaShot::
FrontPanoramaShot(char const*const pszShotName,
uint32_t const u4ShotMode,int32_t const i4OpenId,
sp<IParamsManager> pParamsMgr)
: ImpShot(pszShotName, u4ShotMode, i4OpenId) //ImpShot 是IShot的实现类, FrontPanoramaShot 继承 ImpShot
{
mParamsMgr = pParamsMgr;
mHalDocSFaceBeauty = HALDocSFaceBeauty_COOP::getInstance()->getHalDocSFaceBeautyInterface();
//mHalFrontPanorama 【sp<HALFrontPanoramaInterface>▲】 它能调用到第三方库的方法 释放通过 mHalFrontPanorama = 0;
mHalFrontPanorama = HALFrontPanorama_COOP::getInstance()->getHalFrontPanoramaInterface();
m_bDocSFBeautyPrcInit = false;
}
#include "HALFrontPanoramaInterface.h"
#include "HALFrontPanoramaInterface.cpp"
D:\Coding\vendor\mediatek\proprietary\hardware\mtkcam\v1\common\xxxx\hal_xxcoop_stub\HALFrontPanorama_COOP.cpp
class HALFrontPanorama_COOP : public virtual RefBase
{
private:
static HALFrontPanorama_COOP* mInstance; // C语言静态属性
void* g_libcamera_front_panorama; // 用于拿到so文件的句柄
sp<HALFrontPanoramaInterface> gHALFrontPanoramaInstance;
public:
static HALFrontPanorama_COOP* getInstance() // C语言静态方法
{
if(!mInstance){mInstance = new HALFrontPanorama_COOP(); // 创建成员 }
return mInstance;
}
sp<HALFrontPanoramaInterface> getHalFrontPanoramaInterface(){return gHALFrontPanoramaInstance;}; // 成员方法
}
HALFrontPanorama_COOP::HALFrontPanorama_COOP()
{
ALOGD("%s E",__func__); // 在构造器中拿到了文件句柄
g_libcamera_front_panorama = ::dlopen("libcamera_xxa_front_panorama.so", RTLD_NOW);
spHALFrontPanoramaInterface fp = (spHALFrontPanoramaInterface) // 调用这个函数的openFrontPanaramaUtil 得到一个函数句柄
::dlsym(g_libcamera_front_panorama, "openFrontPanaramaUtil");
// 调用函数句柄 返回了一个sp<HALFrontPanoramaInterface> 到此 FrontPanorama 前置全景 创建完成 还需初始化
gHALFrontPanoramaInstance = (*fp)();
}
-------------------------------------------------------------------------------------
bool
FrontPanoramaShot::
onCreate()
{
// IImageBufferAllocator* mpIImageBufAllocator;
mpIImageBufAllocator = IImageBufferAllocator::getInstance(); // 获得图片缓存管理 能创建 能释放
}
mHalFrontPanorama 调用的地方
MBOOL FrontPanoramaShot:: handleYUVData(IImageBuffer* puBuf, MUINT32 const u4Size){
// 调用第三方 so库中的 processyuvframe 完成对 IImageBuffer 这个图像数据的缓存 返回值为NV21排列的特殊字符数组
unsigned char* pNV12 = mHalFrontPanorama->processyuvframe((char*)puBuf->getBufVA(0), mShotParam.mi4PictureWidth, mShotParam.mi4PictureHeight);
mpShotCallback->onCB_RawImage(
0,mShotParam.mi4PictureWidth*mShotParam.mi4PictureHeight*3/2,
reinterpret_cast<uint8_t const*>(pNV12)); // 传递出去 处理好的数据
free(pNV12); // 把当前已经传递完成的临时 字符串char*数组 释放 就此完成了数据的第三方处理
return MTRUE;
}
问题1: IImageBuffer* puBuf 中的数据到底从哪来
问题2: mpShotCallback->onCB_RawImage 回调把数据传到哪里
问题3: 哪里调用到该函数 FrontPanoramaShot::handleYUVData 猜测应该是CamAdapter的IShot会到调用到
问题3:
3.1 调用 handleYUVData 的地方
MBOOL FrontPanoramaShot :: fgCamShotDataCb(MVOID* user, NSCamShot::CamShotDataInfo const msg)
{
pFrontPanoramaShot->handleYUVData((
IImageBuffer*)msg.pBuffer,(msg.pBuffer->getBufSizeInBytes(0)+msg.pBuffer->getBufSizeInBytes(1))
);
}
3.2 设置 fgCamShotDataCb 回调的地方
bool FrontPanoramaShot::onCmd_capture()
{
NSCamShot::ICamShot *pSingleShot = NSCamShot::ISmartShot::createInstance(
static_cast<EShotMode>(mu4ShotMode), "FrontPanoramaShot", getOpenId(),
mShotParam.mu4MultiFrameBlending, &isMfbShot);
【NSCamShot::ICamShot *】 pSingleShot->setCallbacks(fgCamShotNotifyCb, fgCamShotDataCb, this);
pSingleShot->sendCommand( NSCamShot::ECamShot_CMD_SET_NRTYPE, nrtype, 0, 0 ); // 把nrtype 设置到 SingleShot
pSingleShot->startOne(rSensorParam);
pSingleShot->uninit();
pSingleShot->destroyInstance();
}
↑
|
MVOID
CamShotImp::
setCallbacks(CamShotNotifyCallback_t notify_cb, CamShotDataCallback_t data_cb, MVOID* user)
{
mpCbUser = user;
mNotifyCb = notify_cb;
【CamShotDataCallback_t】 mDataCb = data_cb;
}
↑
|
MBOOL
CamShotImp::
onDataCallback(CamShotDataInfo const& msg) const
{
MBOOL ret = MTRUE;
if ( mDataCb )
{
mDataCb(mpCbUser, msg); // 回调函数 调用到 FrontPanoramaShot.fgCamShotDataCb
ret = MTRUE;
}
return ret;
}
↑
|
MBOOL
CamShotImp::
handleDataCallback(MINT32 const i4Msg, MUINTPTR const ext1, MUINTPTR const ext2, IImageBuffer* pImgBuf)
{
MBOOL ret = MTRUE;
if (isDataMsgEnabled(i4Msg))
{
CamShotDataInfo rCbDataInfo(i4Msg, ext1, ext2, pImgBuf );
ret = onDataCallback(rCbDataInfo);
}
return ret;
}
↑
|
MBOOL
SingleShot::fgNodeDataCallback(MVOID* user, NodeDataInfo const msg)
{
pSingleShot->handleDataCallback(data,msg.ext1,msg.ext2,msg.pBuffer);
}
↑
|
MBOOL
SingleShot::createNodes(MUINT32 const NodeDataSet, MUINT32 const NodeCbSet, IImageBuffer const *pImgBuffer)
{
mpCallback = ShotCallbackNode::createInstance(MFALSE);
mpCallback【ShotCallbackNode*】->setCallbacks(fgNodeNotifyCallback, fgNodeDataCallback, this);
}
↑
|
MVOID
ShotCallbackNodeImpl::
setCallbacks(NodeNotifyCallback_t notify_cb, NodeDataCallback_t data_cb, MVOID* user)
{
mpUser = user;
mNotifyCb = notify_cb;
mDataCb = data_cb;
}
↑
|
MVOID
ShotCallbackNodeImpl::
handleDataCallback(MUINT32 const msg, MUINTPTR const ext1, MUINTPTR const ext2, IImageBuffer* const pImgBuf) const
{
NodeDataInfo datainfo(msg, ext1, ext2, pImgBuf);
mDataCb(mpUser, datainfo);
}
↑
|
MBOOL
ShotCallbackNodeImpl::
processCallback(){
handleDataCallback( ENode_DATA_MSG_JPS, 0, 0, (IImageBuffer*)(todo.buf));
list<pictureCallback>::iterator pPicCB = mlPending.begin();
do{ \
if(item->muFlag == 0){ \
cblist.erase(item); \
} \
}while(0)
}
↑
|
MBOOL
ShotCallbackNodeImpl::
threadLoopUpdate()
{
FUNC_START;
while( processCallback() )
{ MY_LOGD("process another"); };
FUNC_END;
return MTRUE;
}
MBOOL
SingleShot::
createNodes(MUINT32 const NodeDataSet, MUINT32 const NodeCbSet, IImageBuffer const *pImgBuffer)
{
mpCallback->setCallbacks(fgNodeNotifyCallback, fgNodeDataCallback, this);
}
18.MtkCam/PrvCB
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\PreviewCallback\ImgBufManager.cpp
18.1-ImgBufManager.cpp
18.2-PreviewClient.BufOps.cpp
18.3-PreviewClient.cpp
18.4-PreviewClient.dump.cpp
18.5-PreviewClient.Thread.cpp
19.MtkCam/RecordClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\CamClient\Record\RecordClient.cpp
19.1-RecBufManager.cpp
19.2-RecordClient.BufOps.cpp
19.3-RecordClient.cpp
19.4-RecordClient.Platform.cpp
19.5-RecordClient.Thread.cpp
20.MtkCam/DisplayClient
vendor\mediatek\proprietary\hardware\mtkcam\v1\client\DisplayClient\DisplayClient.cpp
20.1-DisplayClient.cpp
20.2-DisplayClient.BufOps.cpp
20.3-DisplayClient.dump.cpp
20.4-DisplayClient.Stream.cpp
20.5-DisplayThread.cpp
20.6-StreamImgBuf.cpp
21.MtkCam/CBMgr
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\CapBuf\CapBufMgr.cpp
21.1-CapBufMgr.cpp
22.MtkCam/DBHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\DefaultBufHandler.cpp EngBufHandler.cpp
22.1-DefaultBufHandler.cpp
22.2-EngBufHandler.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\DefaultCtrlNode.cpp
23.1-DefaultCtrlNode.cpp
23.2-DefaultCtrlNode.Eng.cpp
24.MtkCam/TM
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\ThermalMonitor
24.1-ThermalMonitor.cpp
25.MtkCam/CpuCtrl
vendor\mediatek\proprietary\hardware\mtkcam\utils\CpuCtrl
25.1-CpuCtrl.cpp
26.MtkCam/P2Node
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v3\hwnode\P2Node.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\pass2node.capture.cpp
26.1-P2Node.cpp
26.2-pass2node.capture.cpp
26.3-pass2node.common.cpp
26.4-pass2node.feature.cpp
26.5-pass2node.preview.cpp
27.MtkCam/CamNG
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\ICamGraphNode.cpp
27.1-ICamGraphNode.cpp
28.MtkCam/P1Node
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\pass1node.cpp
28.1-pass1node.cpp
pass1node.cpp
29.MtkCam/ISC
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\IspSyncControl.cpp
29.1-IspSyncControl.cpp
30.MtkCam/FeaturePipe
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\FeaturePipe\FeaturePipe.cpp
30.1-FeaturePipe.cpp
30.2-FeaturePipe.Nodes.cpp
31.MtkCam/RBSSNode
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\CamNode\RecBufSnapshotlNode.cpp
31.1-RecBufSnapshotlNode.cpp
32.MtkCam/BaseHeap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\BaseImageBufferHeap.cpp
32.1-BaseImageBufferHeap.cpp
33.MtkCam/IonHeap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\IonImageBufferHeap.cpp
33.1-IonImageBufferHeap.cpp
34.MtkCam/ImgBuf
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\BaseImageBuffer.cpp
34.1-BaseImageBuffer.cpp
35.MtkCam/Cam1Heap
vendor\mediatek\proprietary\hardware\mtkcam\utils\ImageBuffer\ImageBufferHeap.cpp
35.1-ImageBufferHeap.cpp
36.MtkCam/FeaturePipeDataHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\FeaturePipe
36.1-FeaturePipe.DataHandler.cpp
37.MtkCam/AllocBufHdl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\AllocBufHandler.cpp
37.1-AllocBufHandler.cpp
38.MtkCam/AsdClient
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\client\CamClient\FD\Asd\AsdClient.cpp
38.1-AsdClient.cpp
39.MtkCam/Shot
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\adapter\Scenario\Shot\BestContinuousShot
39.1-BestContinuousShot.cpp
40.MtkCam/BSS
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\MfllShot\BestShotSelection.cpp
40.1-BestShotSelection.cpp
41.MtkCam/BShotCtrl
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\BurstShot\BShotCtrlNode.cpp
41.1-BShotCtrlNode.cpp
42.MtkCam/BShot
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\BurstShot\BurstShot.cpp
42.1-BurstShot.cpp
43.MtkCam/MtkCamUtils | MtkCam/CamShotUtils
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamDevMetaInfo.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\v1\common\camutils\platform\CamFormat.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamFormatTransform.cpp
vendor\mediatek\proprietary\hardware\mtkcam\v1\common\camutils\CamMisc.cpp CamProfile.cpp CamProperty.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camshot\CamShotUtils.cpp (MtkCam/CamShotUtils)
43.1-CamDevMetaInfo.cpp
43.2-CamFormat.cpp
43.3-CamFormatTransform.cpp
43.4-CamMisc.cpp
43.5-CamProfile.cpp
43.6-CamProperty.cpp
43.7-CamShotUtils.cpp(MtkCam/CamShotUtils)
44.MtkCam/ITNode
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\ImgTransformNode.cpp
44.1-ImgTransformNode.cpp
45.MtkCam/JpegCodec
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\iopipe\SImager\JpegCodec\odec.cpp
45.1-odec.cpp
vendor\mediatek\proprietary\platform\mt6735\hardware\mtkcam\D1\core\camnode\JpegEncNode.cpp
46.1-JpegEncNode.cpp