#include "gstv4l2mfldadvci.h"
#include <linux/videodev2.h>
+#include <math.h>
#include <sys/ioctl.h>
#include <gst/gst.h>
#include "ci_adv_pub.h"
}
+static ci_adv_Err
+lib_3a_AeSetManualIso(int sensitivity)
+{
+ float sv;
+ if (sensitivity <=0)
+ {
+ cam_lib_3a_dbg("error in get log2 math computation in line %d; sensitivity: %d\n", __LINE__, sensitivity);
+ return ci_adv_InvalidArgument;
+ }
+
+ sv = log10((float)sensitivity / 3.125) / log10(2.0);
+ ci_adv_err ret = ci_adv_ae_set_manual_iso(sv);
+ if(ci_adv_success != ret)
+ return ret;
+
+ cam_lib_3a_dbg(" *** manual set iso in EV: %f\n", sv);
+
+ return ci_adv_success;
+}
+
+static ci_adv_Err
+lib_3a_AeGetManualIso(int *sensitivity)
+{
+ float sv;
+ ci_adv_err ret = ci_adv_ae_get_manual_iso(&sv);
+ if(ci_adv_success != ret)
+ return ret;
+ *sensitivity = (int)(3.125 * pow(2, sv));
+
+ return ci_adv_success;
+}
+
void
lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci)
{
mfldadvci->AeGetMeteringMode = lib_3a_AeGetMeteringMode;
mfldadvci->AeGetWindow = lib_3a_Ae_Af_GetWindow;
mfldadvci->AeSetWindow = lib_3a_Ae_Af_SetWindow;
+ mfldadvci->AeSetIso = lib_3a_AeSetManualIso;
+ mfldadvci->AeGetIso = lib_3a_AeGetManualIso;
mfldadvci->AfSetMode = lib_3a_AfSetMode;
void (*AeGetMeteringMode)(ia_3a_ae_metering_mode *mode);
void (*AeSetWindow)(ia_3a_window *window);
void (*AeGetWindow)(ia_3a_window *window);
+ ci_adv_Err (*AeSetIso)(int sensitivity);
+ ci_adv_Err (*AeGetIso)(int *sensitivity);
void (*AfSetMode)(ia_3a_af_mode mode);
void (*AfGetMode)(ia_3a_af_mode *mode);
}
static cam_err_t
+set_iso_speed (int iso)
+{
+ cam_err_t ret;
+ mfld_cam_settings.iso_speed = iso;
+ ret = mfldadvci->AeSetIso(mfld_cam_settings.iso_speed);
+ return ret;
+}
+
+static cam_err_t
+get_iso_speed(int *iso)
+{
+ *iso = mfld_cam_settings.iso_speed;
+ return CAM_ERR_NONE;
+}
+
+static cam_err_t
set_flash_mode (int fd, int mode)
{
cam_err_t ret = CAM_ERR_NONE;
ret = mfldadvci->AeSetBias (bias);
break;
case CAM_EXPOSURE_ISO_VALUE:
- ret = cam_driver_set_iso_speed (fd, value);
+ ret = set_iso_speed (value);
break;
case CAM_FOCUS_MODE:
ret = set_focus_mode (value);
*value = (int) (((double) bias / 65536.0) * 10);
break;
case CAM_EXPOSURE_ISO_VALUE:
- ret = cam_driver_get_iso_speed (fd, value);
+ ret = get_iso_speed (value);
break;
case CAM_FOCUS_MODE:
ret = get_focus_mode (value);
}
gboolean
gst_camerasrc_camera_control_set_exposure( GstCameraSrc * camerasrc,
- gint type, gint value1, gint value2 )
-{
- gboolean ret = FALSE;
- GstCameraSrcClass *bclass;
- gboolean opened;
-
- GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
-
-
- bclass = GST_CAMERA_SRC_GET_CLASS (camerasrc);
- opened = bclass->is_open (camerasrc);
- g_return_val_if_fail (opened, FALSE);
-
- /* TODO finalise */
- switch( type ) {
- case GST_CAMERA_CONTROL_EXPOSURE_MODE:
- GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_EXPOSURE_MODE value:%d", value1);
- ret = bclass->set_ae_mode(camerasrc, value1);
- break;
- default:
- GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
- return FALSE;
- }
-
- return TRUE;
+ gint type, gint value1, gint value2 )
+{
+ gboolean ret = FALSE;
+ GstCameraSrcClass *bclass;
+ gboolean opened;
+ gboolean write = FALSE;
+ guint32 val;
+
+ GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
+
+ bclass = GST_CAMERA_SRC_GET_CLASS (camerasrc);
+ opened = bclass->is_open (camerasrc);
+ g_return_val_if_fail (opened, FALSE);
+
+ GST_OBJECT_LOCK (camerasrc);
+ switch( type ) {
+ case GST_CAMERA_CONTROL_F_NUMBER:
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_F_NUMBER value1:%d , value2:%d - set not supported", value1, value2);
+ break;
+ case GST_CAMERA_CONTROL_SHUTTER_SPEED:
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_SHUTTER_SPEED value1:%d , value2:%d - manual exposure not supported", value1, value2);
+ break;
+ case GST_CAMERA_CONTROL_ISO:
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_ISO value:%d", value1);
+ camerasrc->photoconf.iso_speed = value1;
+ write = TRUE;
+ break;
+ case GST_CAMERA_CONTROL_PROGRAM_MODE:
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_PROGRAM_MODE value:%d", value1);
+ camerasrc->photoconf.scene_mode = value1;
+ write = TRUE;
+ break;
+ case GST_CAMERA_CONTROL_EXPOSURE_MODE:
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_EXPOSURE_MODE value:%d", value1);
+ ret = bclass->set_ae_mode(camerasrc, value1);
+ break;
+ case GST_CAMERA_CONTROL_EXPOSURE_VALUE:
+ val = ((value1 << 16) | value2);
+ GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_EXPOSURE_VALUE value1:%d , value2:%d -> val:%d", value1, value2, val);
+ camerasrc->photoconf.exposure = val;
+ write = TRUE;
+ break;
+ default:
+ GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
+ }
+ GST_OBJECT_UNLOCK (camerasrc);
+
+ if (write && bclass->is_active (camerasrc)) {
+ ret = bclass->write_settings (camerasrc, &camerasrc->photoconf, FALSE);
+ }
+ GST_DEBUG_OBJECT (camerasrc, "%s ret:%d",__func__, ret);
+
+ return ret;
}
gboolean
gst_camerasrc_camera_control_get_exposure( GstCameraSrc* camerasrc,
opened = bclass->is_open (camerasrc);
g_return_val_if_fail (opened, FALSE);
- /* TODO finalise */
+ GST_OBJECT_LOCK (camerasrc);
switch( type ) {
- case GST_CAMERA_CONTROL_EXPOSURE_MODE:
- ret = bclass->get_ae_mode(camerasrc, value1);
- GST_DEBUG_OBJECT (camerasrc, "GST_CAMERA_CONTROL_EXPOSURE_MODE value:%d", *value1);
- break;
- default:
- GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
- return FALSE;
+ case GST_CAMERA_CONTROL_F_NUMBER:
+ *value1 = *value2 = 0;
+ break;
+ case GST_CAMERA_CONTROL_SHUTTER_SPEED:
+ *value1 = *value2 = 0;
+ break;
+ case GST_CAMERA_CONTROL_ISO:
+ *value1 = camerasrc->photoconf.iso_speed;
+ ret = TRUE;
+ break;
+ case GST_CAMERA_CONTROL_PROGRAM_MODE:
+ *value1 = camerasrc->photoconf.scene_mode;
+ ret = TRUE;
+ break;
+ case GST_CAMERA_CONTROL_EXPOSURE_MODE:
+ ret = bclass->get_ae_mode(camerasrc, value1);
+ ret = TRUE;
+ break;
+ case GST_CAMERA_CONTROL_EXPOSURE_VALUE:
+ *value1 = gst_value_get_fraction_numerator (camerasrc->photoconf.exposure);
+ *value2 = gst_value_get_fraction_denominator (camerasrc->photoconf.exposure);
+ ret = TRUE;
+ break;
+ default:
+ GST_DEBUG_OBJECT (camerasrc, "%s",__func__);
}
+ GST_OBJECT_UNLOCK (camerasrc);
- return TRUE;
+ GST_DEBUG_OBJECT (camerasrc, "%d -> value1:%d , value2:%d", type, value1, value2);
+ return ret;
}
gboolean
gst_camerasrc_camera_control_set_capture_mode( GstCameraSrc* camerasrc,
* Table value = Device/Implementation -specific setting value
*/
-static const gint gst_v4l2camsrc_scene_map_image[] = {
+static const gint gst_v4l2camsrc_scene_map[] = {
999, /* GST_PHOTOGRAPHY_SCENE_MODE_MANUAL */
CAM_GENERAL_SCENE_MODE_CLOSEUP,
CAM_GENERAL_SCENE_MODE_PORTRAIT,
-1
};
-static const gint gst_v4l2camsrc_scene_map_video[] = {
- 999, /* GST_PHOTOGRAPHY_SCENE_MODE_MANUAL */
- CAM_GENERAL_SCENE_MODE_CLOSEUP,
- CAM_GENERAL_SCENE_MODE_PORTRAIT,
- CAM_GENERAL_SCENE_MODE_LANDSCAPE,
- CAM_GENERAL_SCENE_MODE_SPORT,
- CAM_GENERAL_SCENE_MODE_NIGHT,
- CAM_GENERAL_SCENE_MODE_AUTO,
- -1
-};
-
-/* This will be assigned to point into appropriate table above */
-static const gint *gst_v4l2camsrc_scene_map = gst_v4l2camsrc_scene_map_image;
-
static const gint gst_v4l2camsrc_flash_map[] = {
CAM_LIGHT_FLASH_MODE_AUTO,
CAM_LIGHT_FLASH_MODE_OFF,
GST_PHOTOGRAPHY_SHAKE_RISK_HIGH, /* CAM_EXPOSURE_SHAKE_RISK_HIGH */
};
-/* This will be assigned to point into appropriate table above */
-static const gint *gst_v4l2camsrc_scene_map;
-
/*
* Return index of the item in the table.
*/
return 0;
}
-/*
- *
- */
-#if 0
-static void
-gst_v4l2camsrc_select_scene_map (GstCameraSrcViewfinderMode vf_mode)
-{
- if (vf_mode == GST_CAMERA_SRC_VIEWFINDER_MODE_VIDEO) {
- gst_v4l2camsrc_scene_map = gst_v4l2camsrc_scene_map_video;
- } else {
- gst_v4l2camsrc_scene_map = gst_v4l2camsrc_scene_map_image;
- }
-}
-#endif
-
gboolean
gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
GstPhotoSettings * photoconf)
photoconf->flicker_mode = find_item (gst_v4l2camsrc_flicker_map, flicker);
photoconf->ev_compensation = (gfloat) ev / 10;
- photoconf->iso_speed = gst_v4l2camsrc_libmfld_reverse_map_iso (iso);
+ photoconf->iso_speed = gst_v4l2camsrc_libmfld_map_iso (iso);
photoconf->aperture = aperture;
photoconf->exposure = exposure;
photoconf->noise_reduction = noise_reduction;
cam_feature_set (v4l2camsrc->video_fd, CAM_LIGHT_FLASH_MODE,
gst_v4l2camsrc_flash_map[photoconf->flash_mode]);
+ cam_feature_set (v4l2camsrc->video_fd, CAM_GENERAL_SCENE_MODE,
+ gst_v4l2camsrc_scene_map[photoconf->scene_mode]);
+
/* These will set exposure mode to MANUAL, is value is != 0 */
cam_feature_set (v4l2camsrc->video_fd, CAM_EXPOSURE_MANUAL_TIME,
photoconf->exposure);
(gint) (photoconf->ev_compensation * 10));
cam_feature_set (v4l2camsrc->video_fd, CAM_EXPOSURE_ISO_VALUE,
- gst_v4l2camsrc_libmfld_map_iso (photoconf->iso_speed));
+ gst_v4l2camsrc_libmfld_reverse_map_iso (photoconf->iso_speed));
cam_feature_set (v4l2camsrc->video_fd, CAM_FOCUS_MODE,
gst_v4l2camsrc_focus_map[photoconf->focus_mode]);
+* Mon Nov 19 2012 Telle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com> submit/trunk/20121119.083552@4696d92
+- Exposure features implemented:
+
* Sat Nov 17 2012 Marko Ollonen <marko.ollonen@ixonos.com> accepted/trunk/20121112.215039@ec2d54a
- Af stop when making image capture, default exposure mode changed.