Exposure features implemented:
authorTelle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com>
Mon, 19 Nov 2012 09:32:03 +0000 (11:32 +0200)
committerTelle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com>
Tue, 20 Nov 2012 10:52:07 +0000 (12:52 +0200)
- F number (not supported)
- Shutter speed (not supported)
- ISO
- Program (scene) mode
- Exposure value

Change-Id: I8fa74701a819f9c38d0d2549a4cc024426e4ec5a

gst-libs/atomisphal/gstv4l2mfldadvci.c
gst-libs/atomisphal/gstv4l2mfldadvci.h
gst-libs/atomisphal/mfld_cam.c
gst-libs/gst/camera/gstmfldcameracontroliface.c
gst/mfldv4l2cam/v4l2camsrc_calls.c
packaging/mfldv4l2camsrc.changes

index 3c02bbb..2aa68d3 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "gstv4l2mfldadvci.h"
 #include <linux/videodev2.h>
+#include <math.h>
 #include <sys/ioctl.h>
 #include <gst/gst.h>
 #include "ci_adv_pub.h"
@@ -512,6 +513,38 @@ lib_ae_is_flash_needed(bool *useflash)
 
 }
 
+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)
 {
@@ -559,6 +592,8 @@ 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;
index 1764979..4ae9316 100644 (file)
@@ -117,6 +117,8 @@ struct _GstV4l2MFLDAdvCI
   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);
index 5d73ca9..68db722 100644 (file)
@@ -280,6 +280,22 @@ get_scene_mode (int *scene_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;
@@ -972,7 +988,7 @@ cam_feature_set (int fd, cam_photo_feature_t feature, int value)
       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);
@@ -1037,7 +1053,7 @@ cam_feature_get (int fd, cam_photo_feature_t feature, int *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);
index 1a45816..7c8dfbf 100644 (file)
@@ -120,31 +120,59 @@ gst_camerasrc_camera_control_get_value( GstCameraSrc * camerasrc,
 }
 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,
@@ -160,18 +188,38 @@ 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,
index f8455a4..13a7f53 100644 (file)
@@ -2889,7 +2889,7 @@ gst_v4l2camsrc_update_cropping (GstMFLDV4l2CamSrc * v4l2camsrc, gint width,
  * 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,
@@ -2900,20 +2900,6 @@ static const gint gst_v4l2camsrc_scene_map_image[] = {
   -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,
@@ -3018,9 +3004,6 @@ static const gint gst_v4l2camsrc_shakerisk_map[] = {
   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.
  */
@@ -3037,21 +3020,6 @@ find_item (const gint table[], const gint item)
   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)
@@ -3165,7 +3133,7 @@ gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
   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;
@@ -3335,6 +3303,9 @@ gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
     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);
@@ -3345,7 +3316,7 @@ gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
         (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]);
index cf14f6d..fc70dc7 100644 (file)
@@ -1,3 +1,6 @@
+* 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.