int camera_get_trim_rect(struct img_rect *src_trim_rect, uint32_t zoom_level, struct img_size *dst_size) { uint32_t trim_width; uint32_t trim_height; uint32_t zoom_step_w = 0, zoom_step_h = 0; if (NULL == src_trim_rect || NULL == dst_size) { CMR_LOGE("0x%x, 0x%x", (uint32_t)src_trim_rect, (uint32_t)dst_size); return -CAMERA_INVALID_PARM; } trim_width = src_trim_rect->width; trim_height = src_trim_rect->height; if (0 == dst_size->width || 0 == dst_size->height) { CMR_LOGE("0x%x, 0x%x", dst_size->width, dst_size->height); return -CAMERA_INVALID_PARM; } if (dst_size->width * src_trim_rect->height < dst_size->height * src_trim_rect->width) { trim_width = dst_size->width * src_trim_rect->height / dst_size->height; } else { trim_height = dst_size->height * src_trim_rect->width / dst_size->width; } zoom_step_w = ZOOM_STEP(trim_width); zoom_step_w &= ~1; zoom_step_w *= zoom_level; zoom_step_h = ZOOM_STEP(trim_height); zoom_step_h &= ~1; zoom_step_h *= zoom_level; trim_width = trim_width - zoom_step_w; trim_height = trim_height - zoom_step_h; src_trim_rect->start_x += (src_trim_rect->width - trim_width) >> 1; src_trim_rect->start_y += (src_trim_rect->height - trim_height) >> 1; src_trim_rect->start_x = CAMERA_WIDTH(src_trim_rect->start_x); src_trim_rect->start_y = CAMERA_HEIGHT(src_trim_rect->start_y); src_trim_rect->width = CAMERA_WIDTH(trim_width); src_trim_rect->height = CAMERA_HEIGHT(trim_height); CMR_LOGI("zoom_level %d, trim rect, %d %d %d %d", zoom_level, src_trim_rect->start_x, src_trim_rect->start_y, src_trim_rect->width, src_trim_rect->height); return CAMERA_SUCCESS; }
cmr_int camera_get_trim_rect2(struct img_rect *src_trim_rect, float zoom_ratio, float dst_ratio, cmr_u32 sensor_w, cmr_u32 sensor_h, cmr_u8 rot)//for hal2.0 calculate crop again { cmr_u32 trim_width; cmr_u32 trim_height; float minOutputRatio; float zoom_width, zoom_height, sensor_ratio; if (NULL == src_trim_rect) { CMR_LOGE("param error"); return -CMR_CAMERA_INVALID_PARAM; } else if (src_trim_rect->width == 0 || src_trim_rect->height == 0) { CMR_LOGE("0x%lx w %d h %d", (cmr_uint)src_trim_rect, src_trim_rect->width, src_trim_rect->height); return -CMR_CAMERA_INVALID_PARAM; } minOutputRatio = dst_ratio; sensor_ratio = (float)sensor_w / (float)sensor_h; if (rot != IMG_ANGLE_0 && rot != IMG_ANGLE_180) { minOutputRatio = 1 / minOutputRatio; } if (minOutputRatio > sensor_ratio) { zoom_width = (float)sensor_w / zoom_ratio; zoom_height = zoom_width / minOutputRatio; } else { zoom_height = (float)sensor_h / zoom_ratio; zoom_width = zoom_height * minOutputRatio; } trim_width = (cmr_u32)zoom_width; trim_height = (cmr_u32)zoom_height; CMR_LOGI("sensor_ratio %f, minOutputRatio %f, zoom_ratio %f", sensor_ratio, minOutputRatio, zoom_ratio); CMR_LOGI("trim_width %d, trim_height %d", trim_width, trim_height); src_trim_rect->start_x += (src_trim_rect->width - trim_width) >> 1; src_trim_rect->start_y += (src_trim_rect->height - trim_height) >> 1; src_trim_rect->start_x = CAMERA_WIDTH(src_trim_rect->start_x); src_trim_rect->start_y = CAMERA_HEIGHT(src_trim_rect->start_y); src_trim_rect->width = CAMERA_WIDTH(trim_width); src_trim_rect->height = CAMERA_HEIGHT(trim_height); CMR_LOGI("zoom_level %f trim rect %d %d %d %d", zoom_ratio, src_trim_rect->start_x, src_trim_rect->start_y, src_trim_rect->width, src_trim_rect->height); return CMR_CAMERA_SUCCESS; }
cmr_int camera_get_trim_rect(struct img_rect *src_trim_rect, cmr_uint zoom_level, struct img_size *dst_size) { cmr_int ret = CMR_CAMERA_SUCCESS; cmr_uint trim_width = 0, trim_height = 0; cmr_uint zoom_step_w = 0, zoom_step_h = 0; if (!src_trim_rect || !dst_size) { CMR_LOGE("0x%lx 0x%lx", (cmr_uint)src_trim_rect, (cmr_uint)dst_size); ret = -CMR_CAMERA_INVALID_PARAM; goto exit; } trim_width = src_trim_rect->width; trim_height = src_trim_rect->height; if (0 == dst_size->width || 0 == dst_size->height) { CMR_LOGE("0x%x 0x%x", dst_size->width, dst_size->height); ret = -CMR_CAMERA_INVALID_PARAM; goto exit; } if (dst_size->width * src_trim_rect->height < dst_size->height * src_trim_rect->width) { trim_width = dst_size->width * src_trim_rect->height / dst_size->height; } else { trim_height = dst_size->height * src_trim_rect->width / dst_size->width; } zoom_step_w = ZOOM_STEP(trim_width); zoom_step_w &= ~1; zoom_step_w *= zoom_level; zoom_step_h = ZOOM_STEP(trim_height); zoom_step_h &= ~1; zoom_step_h *= zoom_level; trim_width = trim_width - zoom_step_w; trim_height = trim_height - zoom_step_h; src_trim_rect->start_x += (src_trim_rect->width - trim_width) >> 1; src_trim_rect->start_y += (src_trim_rect->height - trim_height) >> 1; src_trim_rect->start_x = CAMERA_WIDTH(src_trim_rect->start_x); src_trim_rect->start_y = CAMERA_HEIGHT(src_trim_rect->start_y); src_trim_rect->width = CAMERA_WIDTH(trim_width); src_trim_rect->height = CAMERA_HEIGHT(trim_height); CMR_LOGI("zoom_level %ld trim rect %d %d %d %d", zoom_level, src_trim_rect->start_x, src_trim_rect->start_y, src_trim_rect->width, src_trim_rect->height); exit: return ret; }
int camera_get_trim_rect2(struct img_rect *src_trim_rect, float zoomRatio, float dstRatio,uint32_t SensorW, uint32_t SensorH, uint8_t Rot)//for hal2.0 calculate crop again { uint32_t trim_width; uint32_t trim_height; float minOutputRatio; float zoomWidth,zoomHeight,SensorRatio; if (NULL == src_trim_rect) { CMR_LOGE("NULL"); return -CAMERA_INVALID_PARM; } else if (src_trim_rect->width == 0 || src_trim_rect->height == 0) { CMR_LOGE("0x%x w=%d h=%d", (uint32_t)src_trim_rect,src_trim_rect->width,src_trim_rect->height); return -CAMERA_INVALID_PARM; } minOutputRatio = dstRatio; SensorRatio = (float)SensorW /SensorH; if (Rot != IMG_ROT_0) { minOutputRatio = 1 / minOutputRatio; } if (minOutputRatio > SensorRatio) { zoomWidth = SensorW / zoomRatio; zoomHeight = zoomWidth / minOutputRatio; } else { zoomHeight = SensorH / zoomRatio; zoomWidth = zoomHeight * minOutputRatio; } trim_width = zoomWidth; trim_height = zoomHeight; src_trim_rect->start_x += (src_trim_rect->width - trim_width) >> 1; src_trim_rect->start_y += (src_trim_rect->height - trim_height) >> 1; src_trim_rect->start_x = CAMERA_WIDTH(src_trim_rect->start_x); src_trim_rect->start_y = CAMERA_HEIGHT(src_trim_rect->start_y); src_trim_rect->width = CAMERA_WIDTH(trim_width); src_trim_rect->height = CAMERA_HEIGHT(trim_height); CMR_LOGI("zoom_level %f, trim rect, %d %d %d %d", zoomRatio, src_trim_rect->start_x, src_trim_rect->start_y, src_trim_rect->width, src_trim_rect->height); return CAMERA_SUCCESS; }