2023年12月30日发(作者:)
goto query_failed;}gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));if (!gCamCapability[cameraId]) {ALOGE("%s: out of memory", __func__);goto query_failed;}memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),sizeof(cam_capability_t));//copy the preview sizes and video sizes lists because they//might be changed latercopyList(gCamCapability[cameraId]->preview_sizes_tbl, savedSizes[cameraId].all_preview_sizes,gCamCapability[cameraId]->preview_sizes_tbl_cnt);savedSizes[cameraId].all_preview_sizes_cnt = gCamCapability[cameraId]->preview_sizes_tbl_cnt;copyList(gCamCapability[cameraId]->video_sizes_tbl, savedSizes[cameraId].all_video_sizes,gCamCapability[cameraId]->video_sizes_tbl_cnt);savedSizes[cameraId].all_video_sizes_cnt = gCamCapability[cameraId]->video_sizes_tbl_cnt;rc = NO_ERROR;query_failed:cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,CAM_MAPPING_BUF_TYPE_CAPABILITY);……}1、设置ION共享内存:vim hardware/qcom/camera/QCamera2/HAL/ QCameraHeapMemory::allocateallocate(uint8_t count, size_t size){traceLogAllocStart(size, count, "HeapMemsize");unsigned int heap_mask = 0x1 << ION_IOMMU_HEAP_ID;
int rc = allocalloc(count, size, heap_mask); //主要填充mMemInfo //主要填充mMemInfoif (rc < 0)return rc;for (int i = 0; i < count; i ++) {void *vaddr vaddr = mmapmmap(NULL, //映射共享内存mMemInfo[i].size,PROT_READ | PROT_WRITE,MAP_SHARED,mMemInfo[i].fd, 0);if (vaddr == MAP_FAILED) {for (int j = i-1; j >= 0; j --) {munmap(mPtr[j], mMemInfo[j].size);mPtr[j] = NULL;deallocOneBuffer(mMemInfo[j]);}return NO_MEMORY;} elsemPtr[i] = vaddr;}if (rc == 0) mBufferCount = count;traceLogAllocEnd((size * count));return OK;}int QCameraMemory::allocalloc(int count, size_t size, unsigned int heap_id){……sint new_bufCnt = mBufferCount + count;traceLogAllocStart(size, count, "Memsize");
……for (int i = mBufferCount; i < new_bufCnt; i ++) {if ( NULL == mMemoryPool ) {CDBG_HIGH("%s : No memory pool available and So allocate new buffer", __func__);rc = allocOneBufferallocOneBuffer(mMemInfo[i], heap_id, size, m_bCached);if (rc < 0) {ALOGE("%s: AllocateIonMemory failed", __func__);for (int j = i-1; j >= 0; j--)deallocOneBuffer(mMemInfo[j]);break;}} else {rc = mMemoryPool->allocateBuffer(mMemInfo[i],heap_id,size,m_bCached,mStreamType);if (rc < 0) {ALOGE("%s: Memory pool allocation failed", __func__);for (int j = i-1; j >= 0; j--)mMemoryPool->releaseBuffer(mMemInfo[j],mStreamType);break;}}}traceLogAllocEnd (size * (size_t)count);return rc;}
int QCameraMemory::allocOneBufferallocOneBuffer(QCameraMemInfo &memInfo,unsigned int heap_id, size_t size, bool cached){int rc = OK;struct ion_handle_data handle_data;struct ion_allocation_data alloc;struct ion_fd_data ion_info_fd;int main_ion_fd = 0; main_ion_fd main_ion_fd = openopen("/dev/ion", O_RDONLY);if (main_ion_fd < 0) {ALOGE("Ion dev open failed: %sn", strerror(errno));goto ION_OPEN_FAILED;}memset(&alloc, 0, sizeof(alloc));memset(&ion_info_fd, 0, sizeof(ion_info_fd));/* MM-MC-ModifyIonFdInitFlow-00+ */ = size;/* to make it page size aligned */ = ( + 4095U) & (~4095U); = 4096;if (cached) { = ION_FLAG_CACHED;}_id_mask = heap_id;rc = ioctlioctl(main_ion_fd, ION_IOC_ALLOC, &alloc);if (rc < 0) {ALOGE("ION allocation failed: %sn", strerror(errno));goto ION_ALLOC_FAILED;}//memset(&ion_info_fd, 0, sizeof(ion_info_fd));/* MM-MC-ModifyIonFdInitFlow-00- */
size_t size){int32_t rc = -1;mm_camera_obj_t * my_obj = NULL;pthread_mutex_lock(&g_intf_lock);my_obj = mm_camera_util_get_camera_by_handler(camera_handle);if(my_obj) {pthread_mutex_lock(&my_obj->cam_lock);pthread_mutex_unlock(&g_intf_lock);rc = mm_camera_map_bufmm_camera_map_buf(my_obj, buf_type, fd, size);} else {pthread_mutex_unlock(&g_intf_lock);}return rc;}vim hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_32_t mm_camera_map_bufmm_camera_map_buf(mm_camera_obj_t *my_obj,uint8_t buf_type,int fd,size_t size){int32_t rc = 0;cam_sock_packet_t packet;memset(&packet, 0, sizeof(cam_sock_packet_t));_type = CAM_MAPPING_TYPE_FD_MAPPING;_ = buf_type;_ = fd;_ = size;rc = mm_camera_util_sendmsgmm_camera_util_sendmsg(my_obj,
&packet,sizeof(cam_sock_packet_t),fd);pthread_mutex_unlock(&my_obj->cam_lock);return rc;}int32_t mm_camera_util_sendmsgmm_camera_util_sendmsg(mm_camera_obj_t *my_obj,void *msg,size_t buf_size,int sendfd){int32_t rc = -1;uint32_t status;/* need to lock msg_lock, since sendmsg until reposonse back is deemed as one operation*/pthread_mutex_lock(&my_obj->msg_lock);if(mm_camera_socket_sendmsgmm_camera_socket_sendmsg(my_obj->ds_fd, msg, buf_size, sendfd) > 0) {/* wait for event that mapping/unmapping is done */mm_camera_util_wait_for_event(my_obj, CAM_EVENT_TYPE_MAP_UNMAP_DONE, &status);if (MSM_CAMERA_STATUS_SUCCESS == status) {rc = 0;}}pthread_mutex_unlock(&my_obj->msg_lock);return rc;}vim hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_ mm_camera_socket_sendmsgmm_camera_socket_sendmsg(int fd, //socket fdvoid *msg,
size_t buf_size,int sendfd){struct msghdr msgh;struct iovec iov[1];struct cmsghdr * cmsghp = NULL;char control[CMSG_SPACE(sizeof(int))];if (msg == NULL) {CDBG("%s: msg is NULL", __func__);return -1;}memset(&msgh, 0, sizeof(msgh));_name = NULL;_namelen = 0;iov[0].iov_base = msg;iov[0].iov_len = buf_size;_iov = iov;_iovlen = 1;CDBG("%s: iov_len=%llu", __func__,(unsigned long long int)iov[0].iov_len);_control = NULL;_controllen = 0;/* if sendfd is valid, we need to pass it through control msg */if( sendfd > 0) {_control = control;_controllen = sizeof(control);cmsghp = CMSG_FIRSTHDR(&msgh);if (cmsghp != NULL) {CDBG("%s: Got ctrl msg pointer", __func__);
cmsghp->cmsg_level = SOL_SOCKET;cmsghp->cmsg_type = SCM_RIGHTS;cmsghp->cmsg_len = CMSG_LEN(sizeof(int));*((int *)CMSG_DATA(cmsghp)) = sendfd;CDBG("%s: cmsg data=%d", __func__, *((int *) CMSG_DATA(cmsghp)));} else {CDBG("%s: ctrl msg NULL", __func__);return -1;}}return sendmsgsendmsg(fd, &(msgh), 0);//socket发送数据到vendor通知映射共享内存//socket发送数据到vendor通知映射共享内存}refer: ION机制介绍


发布评论