/* GStreamer
 *
 * Copyright (C) 2008 Nokia Corporation <multimedia@maemo.org>
 *
 * photography.h: photography interface for digital imaging
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_PHOTOGRAPHY_H__
#define __GST_PHOTOGRAPHY_H__

#ifndef GST_USE_UNSTABLE_API
#warning "The GstPhotography interface is unstable API and may change in future."
#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." 
#endif

#include <gst/gst.h>
#include <gst/interfaces/photography-prelude.h>
#include <gst/interfaces/photography-enumtypes.h>

G_BEGIN_DECLS

#define GST_TYPE_PHOTOGRAPHY \
  (gst_photography_get_type ())
#define GST_PHOTOGRAPHY(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PHOTOGRAPHY, GstPhotography))
#define GST_IS_PHOTOGRAPHY(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PHOTOGRAPHY))
#define GST_PHOTOGRAPHY_GET_INTERFACE(inst) \
  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PHOTOGRAPHY, GstPhotographyInterface))


/**
 * GST_PHOTOGRAPHY_AUTOFOCUS_DONE:
 *
 * Name of custom GstMessage that will be posted to #GstBus when autofocusing
 * is complete.
 * This message contains following fields:
 * <itemizedlist>
 * <listitem>
 *   <para>
 *   #GstPhotographyFocusStatus
 *   <classname>&quot;status&quot;</classname>:
 *   Tells if focusing succeeded or failed.
 *   </para>
 * </listitem>
 * <listitem>
 *   <para>
 *   #G_TYPE_INT
 *   <classname>&quot;focus-window-rows&quot;</classname>:
 *   Tells number of focus matrix rows.
 *   </para>
 * </listitem>
 * <listitem>
 *   <para>
 *   #G_TYPE_INT
 *   <classname>&quot;focus-window-columns&quot;</classname>:
 *   Tells number of focus matrix columns.
 *   </para>
 * </listitem>
 * <listitem>
 *   <para>
 *   #G_TYPE_INT
 *   <classname>&quot;focus-window-mask&quot;</classname>:
 *   Bitmask containing rows x columns bits which mark the focus points in the
 *   focus matrix. Lowest bit (LSB) always represents the top-left corner of the
 *   focus matrix. This field is only valid when focusing status is SUCCESS.
 *   </para>
 * </listitem>
 * </itemizedlist>
 */
#define GST_PHOTOGRAPHY_AUTOFOCUS_DONE "autofocus-done"

/**
 * GST_PHOTOGRAPHY_SHAKE_RISK:
 *
 * Name of custom GstMessage that is posted to #GstBus during autofocusing
 * process. It is posted if there is change in the risk of captured image
 * becoming "shaken" due to camera movement and too long exposure time.
 *
 * This message contains following fields:
 * <itemizedlist>
 * <listitem>
 *   <para>
 *   #GstPhotographyShakeRisk
 *   <classname>&quot;status&quot;</classname>:
 *   Tells risk level of capturing shaken image.
 *   </para>
 * </listitem>
 * </itemizedlist>
 */
#define GST_PHOTOGRAPHY_SHAKE_RISK "shake-risk"

/* Maximum white point values used in #GstPhotographySettings */
#define MAX_WHITE_POINT_VALUES 4

/* Interface property names */
#define GST_PHOTOGRAPHY_PROP_WB_MODE            "white-balance-mode"
#define GST_PHOTOGRAPHY_PROP_COLOR_TONE         "color-tone-mode"
#define GST_PHOTOGRAPHY_PROP_SCENE_MODE         "scene-mode"
#define GST_PHOTOGRAPHY_PROP_FLASH_MODE         "flash-mode"
#define GST_PHOTOGRAPHY_PROP_NOISE_REDUCTION    "noise-reduction"
#define GST_PHOTOGRAPHY_PROP_FOCUS_STATUS       "focus-status"
#define GST_PHOTOGRAPHY_PROP_CAPABILITIES       "capabilities"
#define GST_PHOTOGRAPHY_PROP_SHAKE_RISK         "shake-risk"
#define GST_PHOTOGRAPHY_PROP_EV_COMP            "ev-compensation"
#define GST_PHOTOGRAPHY_PROP_ISO_SPEED          "iso-speed"
#define GST_PHOTOGRAPHY_PROP_APERTURE           "aperture"
#define GST_PHOTOGRAPHY_PROP_EXPOSURE_TIME      "exposure-time"
#define GST_PHOTOGRAPHY_PROP_IMAGE_CAPTURE_SUPPORTED_CAPS \
                                                "image-capture-supported-caps"
#define GST_PHOTOGRAPHY_PROP_IMAGE_PREVIEW_SUPPORTED_CAPS \
                                                "image-preview-supported-caps"
#define GST_PHOTOGRAPHY_PROP_FLICKER_MODE       "flicker-mode"
#define GST_PHOTOGRAPHY_PROP_FOCUS_MODE         "focus-mode"
#define GST_PHOTOGRAPHY_PROP_ZOOM               "zoom"
#define GST_PHOTOGRAPHY_PROP_COLOR_TEMPERATURE  "color-temperature"
#define GST_PHOTOGRAPHY_PROP_WHITE_POINT        "white-point"
#define GST_PHOTOGRAPHY_PROP_ANALOG_GAIN        "analog-gain"
#define GST_PHOTOGRAPHY_PROP_EXPOSURE_MODE      "exposure-mode"
#define GST_PHOTOGRAPHY_PROP_LENS_FOCUS         "lens-focus"
#define GST_PHOTOGRAPHY_PROP_MIN_EXPOSURE_TIME  "min-exposure-time"
#define GST_PHOTOGRAPHY_PROP_MAX_EXPOSURE_TIME  "max-exposure-time"

/**
 * GstPhotography:
 *
 * Opaque #GstPhotography data structure.
 */
typedef struct _GstPhotography GstPhotography;

/**
 * GstPhotographyNoiseReduction:
 * @GST_PHOTOGRAPHY_NOISE_REDUCTION_BAYER: Adaptive noise reduction on Bayer
 * format
 * @GST_PHOTOGRAPHY_NOISE_REDUCTION_YCC: reduces the noise on Y and 2-chroma
 * images.
 * @GST_PHOTOGRAPHY_NOISE_REDUCTION_TEMPORAL: Multi-frame adaptive NR,
 * provided for the video mode
 * @GST_PHOTOGRAPHY_NOISE_REDUCTION_FIXED: Fixed Pattern Noise refers to noise
 * that does not change between frames. The noise is removed from the sensor
 * image, by subtracting a previously-captured black image in memory.
 * @GST_PHOTOGRAPHY_NOISE_REDUCTION_EXTRA: Extra Noise Reduction. In the case
 * of high-ISO capturing, some noise remains after YCC NR. XNR reduces this
 * remaining noise.
 *
 * Noise Reduction features of a photography capture or filter element.
 */
typedef enum
{
  GST_PHOTOGRAPHY_NOISE_REDUCTION_BAYER    = (1 << 0),
  GST_PHOTOGRAPHY_NOISE_REDUCTION_YCC      = (1 << 1),
  GST_PHOTOGRAPHY_NOISE_REDUCTION_TEMPORAL = (1 << 2),
  GST_PHOTOGRAPHY_NOISE_REDUCTION_FIXED    = (1 << 3),
  GST_PHOTOGRAPHY_NOISE_REDUCTION_EXTRA    = (1 << 4)
} GstPhotographyNoiseReduction;

/**
 * GstPhotographyWhiteBalanceMode:
 * @GST_PHOTOGRAPHY_WB_MODE_AUTO: Choose white balance mode automatically
 * @GST_PHOTOGRAPHY_WB_MODE_DAYLIGHT: Mode for daylight conditions
 * @GST_PHOTOGRAPHY_WB_MODE_CLOUDY: Mode for cloudy conditions
 * @GST_PHOTOGRAPHY_WB_MODE_SUNSET: Mode for sunset conditions
 * @GST_PHOTOGRAPHY_WB_MODE_TUNGSTEN: Mode for tungsten lighting
 * @GST_PHOTOGRAPHY_WB_MODE_FLUORESCENT: Mode for fluorescent lighting
 * @GST_PHOTOGRAPHY_WB_MODE_MANUAL: Disable automatic white balance adjustment
 * and keep current values.
 * @GST_PHOTOGRAPHY_WB_MODE_WARM_FLUORESCENT: Mode for warm fluorescent lighting (Since: 1.2)
 * @GST_PHOTOGRAPHY_WB_MODE_SHADE: Mode for shade lighting (Since: 1.2)
 *
 * Modes for white balance control.
 */
typedef enum
{
  GST_PHOTOGRAPHY_WB_MODE_AUTO = 0,
  GST_PHOTOGRAPHY_WB_MODE_DAYLIGHT,
  GST_PHOTOGRAPHY_WB_MODE_CLOUDY,
  GST_PHOTOGRAPHY_WB_MODE_SUNSET,
  GST_PHOTOGRAPHY_WB_MODE_TUNGSTEN,
  GST_PHOTOGRAPHY_WB_MODE_FLUORESCENT,
  GST_PHOTOGRAPHY_WB_MODE_MANUAL,
  GST_PHOTOGRAPHY_WB_MODE_WARM_FLUORESCENT,
  GST_PHOTOGRAPHY_WB_MODE_SHADE
} GstPhotographyWhiteBalanceMode;

/**
 * GstPhotographyColorToneMode:
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL: No effects
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_SEPIA: Sepia
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEGATIVE: Negative
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRAYSCALE: Grayscale
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_NATURAL: Natural
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_VIVID: Vivid
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_COLORSWAP: Colorswap
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_SOLARIZE: Solarize
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_OUT_OF_FOCUS: Out of focus
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKY_BLUE: Sky blue
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRASS_GREEN: Grass green
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKIN_WHITEN: Skin whiten
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_POSTERIZE: Posterize (Since: 1.2)
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD: Whiteboard (Since: 1.2)
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD: Blackboard (Since: 1.2)
 * @GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA: Aqua (Since: 1.2)
 *
 * Modes for special color effects.
 */
typedef enum
{
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL = 0,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_SEPIA,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEGATIVE,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRAYSCALE,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_NATURAL,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_VIVID,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_COLORSWAP,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_SOLARIZE,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_OUT_OF_FOCUS,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKY_BLUE,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRASS_GREEN,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKIN_WHITEN,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_POSTERIZE,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD,
  GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA
} GstPhotographyColorToneMode;

/**
 * GstPhotographySceneMode:
 * @GST_PHOTOGRAPHY_SCENE_MODE_MANUAL: Set individual options manually
 * @GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP: Mode for close objects
 * @GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT: Mode for portraits
 * @GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE: Mode for landscapes
 * @GST_PHOTOGRAPHY_SCENE_MODE_SPORT: Mode for scene with fast motion
 * @GST_PHOTOGRAPHY_SCENE_MODE_NIGHT: Mode for night conditions
 * @GST_PHOTOGRAPHY_SCENE_MODE_AUTO: Choose scene mode automatically
 * @GST_PHOTOGRAPHY_SCENE_MODE_ACTION: Take photos of fast moving
 *     objects (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_NIGHT_PORTRAIT: Take people pictures
 *     at night (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_THEATRE: Take photos in a theater (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_BEACH: Take pictures on the beach (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_SNOW: Take pictures on the snow (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_SUNSET: Take sunset photos (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_STEADY_PHOTO: Avoid blurry pictures
 *     (for example, due to hand shake) (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_FIREWORKS: For shooting firework
 *     displays (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_PARTY: Take indoor low-light shot (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_CANDLELIGHT: Capture the naturally warm color
 *     of scenes lit by candles (Since: 1.2)
 * @GST_PHOTOGRAPHY_SCENE_MODE_BARCODE: Applications are looking for
 *     a barcode (Since: 1.2)
 *
 * Each mode contains preset #GstPhotography options in order to produce
 * good capturing result in certain scene.
 */
typedef enum
{
  GST_PHOTOGRAPHY_SCENE_MODE_MANUAL = 0,
  GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP,
  GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT,
  GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE,
  GST_PHOTOGRAPHY_SCENE_MODE_SPORT,
  GST_PHOTOGRAPHY_SCENE_MODE_NIGHT,
  GST_PHOTOGRAPHY_SCENE_MODE_AUTO,
  GST_PHOTOGRAPHY_SCENE_MODE_ACTION,
  GST_PHOTOGRAPHY_SCENE_MODE_NIGHT_PORTRAIT,
  GST_PHOTOGRAPHY_SCENE_MODE_THEATRE,
  GST_PHOTOGRAPHY_SCENE_MODE_BEACH,
  GST_PHOTOGRAPHY_SCENE_MODE_SNOW,
  GST_PHOTOGRAPHY_SCENE_MODE_SUNSET,
  GST_PHOTOGRAPHY_SCENE_MODE_STEADY_PHOTO,
  GST_PHOTOGRAPHY_SCENE_MODE_FIREWORKS,
  GST_PHOTOGRAPHY_SCENE_MODE_PARTY,
  GST_PHOTOGRAPHY_SCENE_MODE_CANDLELIGHT,
  GST_PHOTOGRAPHY_SCENE_MODE_BARCODE
} GstPhotographySceneMode;

/**
 * GstPhotographyFlashMode:
 * @GST_PHOTOGRAPHY_FLASH_MODE_AUTO: Fire flash automatically according to
 * lighting conditions.
 * @GST_PHOTOGRAPHY_FLASH_MODE_OFF: Never fire flash
 * @GST_PHOTOGRAPHY_FLASH_MODE_ON: Always fire flash
 * @GST_PHOTOGRAPHY_FLASH_MODE_FILL_IN: Fill in flash
 * @GST_PHOTOGRAPHY_FLASH_MODE_RED_EYE: Flash mode for reducing chance of
 * capturing red eyes
 *
 * Modes for flash control.
 */
typedef enum
{
  GST_PHOTOGRAPHY_FLASH_MODE_AUTO = 0,
  GST_PHOTOGRAPHY_FLASH_MODE_OFF,
  GST_PHOTOGRAPHY_FLASH_MODE_ON,
  GST_PHOTOGRAPHY_FLASH_MODE_FILL_IN,
  GST_PHOTOGRAPHY_FLASH_MODE_RED_EYE
} GstPhotographyFlashMode;

/**
 * GstPhotographyFocusStatus:
 * @GST_PHOTOGRAPHY_FOCUS_STATUS_NONE: No status available
 * @GST_PHOTOGRAPHY_FOCUS_STATUS_RUNNING: Focusing is ongoing
 * @GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL: Focusing failed
 * @GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS: Focusing succeeded
 *
 * Status of the focusing operation, used in #GST_PHOTOGRAPHY_AUTOFOCUS_DONE
 * message.
 */
typedef enum
{
  GST_PHOTOGRAPHY_FOCUS_STATUS_NONE = 0,
  GST_PHOTOGRAPHY_FOCUS_STATUS_RUNNING,
  GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL,
  GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS
} GstPhotographyFocusStatus;

/**
 * GstPhotographyCaps:
 *
 * Bitmask that indicates which #GstPhotography interface features an instance
 * supports.
 */
typedef enum
{
  GST_PHOTOGRAPHY_CAPS_NONE              = (0 << 0),
  GST_PHOTOGRAPHY_CAPS_EV_COMP           = (1 << 0),
  GST_PHOTOGRAPHY_CAPS_ISO_SPEED         = (1 << 1),
  GST_PHOTOGRAPHY_CAPS_WB_MODE           = (1 << 2),
  GST_PHOTOGRAPHY_CAPS_TONE              = (1 << 3),
  GST_PHOTOGRAPHY_CAPS_SCENE             = (1 << 4),
  GST_PHOTOGRAPHY_CAPS_FLASH             = (1 << 5),
  GST_PHOTOGRAPHY_CAPS_ZOOM              = (1 << 6),
  GST_PHOTOGRAPHY_CAPS_FOCUS             = (1 << 7),
  GST_PHOTOGRAPHY_CAPS_APERTURE          = (1 << 8),
  GST_PHOTOGRAPHY_CAPS_EXPOSURE          = (1 << 9),
  GST_PHOTOGRAPHY_CAPS_SHAKE             = (1 << 10),
  GST_PHOTOGRAPHY_CAPS_WHITE_BALANCE     = (1 << 11),
  GST_PHOTOGRAPHY_CAPS_NOISE_REDUCTION   = (1 << 12),
  GST_PHOTOGRAPHY_CAPS_FLICKER_REDUCTION = (1 << 13),
  GST_PHOTOGRAPHY_CAPS_ALL               = (~0)
} GstPhotographyCaps;

/**
 * GstPhotographyShakeRisk:
 * @GST_PHOTOGRAPHY_SHAKE_RISK_LOW: Low risk
 * @GST_PHOTOGRAPHY_SHAKE_RISK_MEDIUM: Medium risk
 * @GST_PHOTOGRAPHY_SHAKE_RISK_HIGH: High risk
 *
 * Risk level of captured image becoming "shaken" due to camera movement and
 * too long exposure time. Used in #GST_PHOTOGRAPHY_SHAKE_RISK #GstMessage.
 */
typedef enum
{
  GST_PHOTOGRAPHY_SHAKE_RISK_LOW = 0,
  GST_PHOTOGRAPHY_SHAKE_RISK_MEDIUM,
  GST_PHOTOGRAPHY_SHAKE_RISK_HIGH,
} GstPhotographyShakeRisk;

/**
 * GstPhotographyFlickerReductionMode:
 * @GST_PHOTOGRAPHY_FLICKER_REDUCTION_OFF: Disable flicker reduction
 * @GST_PHOTOGRAPHY_FLICKER_REDUCTION_50HZ: 50Hz flicker reduction
 * @GST_PHOTOGRAPHY_FLICKER_REDUCTION_60HZ: 60Hz flicker reduction
 * @GST_PHOTOGRAPHY_FLICKER_REDUCTION_AUTO: Choose mode automatically
 *
 * Reduce flicker in video caused by light source fluctuation.
 */
typedef enum
{
  GST_PHOTOGRAPHY_FLICKER_REDUCTION_OFF = 0,
  GST_PHOTOGRAPHY_FLICKER_REDUCTION_50HZ,
  GST_PHOTOGRAPHY_FLICKER_REDUCTION_60HZ,
  GST_PHOTOGRAPHY_FLICKER_REDUCTION_AUTO,
} GstPhotographyFlickerReductionMode;

/**
 * GstPhotographyFocusMode:
 * @GST_PHOTOGRAPHY_FOCUS_MODE_AUTO: Choose focus mode automatically
 * @GST_PHOTOGRAPHY_FOCUS_MODE_MACRO: Mode for focusing objects close to lens
 * @GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT: Mode for portraits
 * @GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY: Mode for landscapes and far away objects
 * @GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL: Mode for maximum depth of field, keeping
 * focus acceptable both in infinify and as close objects as possible
 * @GST_PHOTOGRAPHY_FOCUS_MODE_EXTENDED: Extended focus mode
 * @GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL: Continuous autofocus mode
 * @GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_EXTENDED: Extended continuous
 * autofocus mode
 * @GST_PHOTOGRAPHY_FOCUS_MODE_MANUAL: Disable automatic focusing
 * and keep current value. #GstPhotography:lens-focus property can
 * be used to change focus manually.
 *
 * Choose mode for focusing algorithm.
 */
typedef enum {
    GST_PHOTOGRAPHY_FOCUS_MODE_AUTO = 0,
    GST_PHOTOGRAPHY_FOCUS_MODE_MACRO,
    GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT,
    GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY,
    GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL,
    GST_PHOTOGRAPHY_FOCUS_MODE_EXTENDED,
    GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL,
    GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_EXTENDED,
    GST_PHOTOGRAPHY_FOCUS_MODE_MANUAL
} GstPhotographyFocusMode;

/**
 * GstPhotographyExposureMode:
 * @GST_PHOTOGRAPHY_EXPOSURE_MODE_AUTO: Adjust exposure automatically
 * @GST_PHOTOGRAPHY_EXPOSURE_MODE_MANUAL: Disable automatic exposure adjustment
 * and keep current values.
 *
 */
typedef enum {
    GST_PHOTOGRAPHY_EXPOSURE_MODE_AUTO = 0,
    GST_PHOTOGRAPHY_EXPOSURE_MODE_MANUAL
} GstPhotographyExposureMode;

/**
 * GstPhotographySettings:
 *
 * Structure containing all #GstPhotography settings, used to set all
 * settings in one call with @gst_photography_set_config().
 */
typedef struct
{
  GstPhotographyWhiteBalanceMode wb_mode;
  GstPhotographyColorToneMode tone_mode;
  GstPhotographySceneMode scene_mode;
  GstPhotographyFlashMode flash_mode;
  guint32 exposure_time;
  guint aperture;
  gfloat ev_compensation;
  guint iso_speed;
  gfloat zoom;
  GstPhotographyFlickerReductionMode flicker_mode;
  GstPhotographyFocusMode focus_mode;
  GstPhotographyNoiseReduction noise_reduction;
  GstPhotographyExposureMode exposure_mode;
  guint color_temperature;
  guint white_point[MAX_WHITE_POINT_VALUES];
  gfloat analog_gain;
  gfloat lens_focus;
  guint min_exposure_time;
  guint max_exposure_time;
  /* FIXME: add padding? */
} GstPhotographySettings;

/**
 * GstPhotographyCapturePrepared:
 * @data: user data that has been given, when registering the callback
 * @configured_caps: #GstCaps defining the configured capture format.
 *     Ownership of these caps stays in the element.
 *
 * This callback will be called when the element has finished preparations
 * and is ready for image capture. The next buffer that element produces
 * will be of @configured_caps format, so this callback allows the application
 * to e.g. reconfigure capsfilters in pipeline if any.
 */
typedef void (*GstPhotographyCapturePrepared) (gpointer data, const GstCaps *configured_caps);

/**
 * GstPhotographyInterface:
 * @parent: parent interface type.
 * @get_ev_compensation: vmethod to get ev exposure compensation value
 * @get_iso_speed: vmethod to get iso speed (light sensitivity) value
 * @get_aperture: vmethod to get aperture value
 * @get_exposure: vmethod to get exposure time value
 * @get_white_balance_mode: vmethod to get white balance mode value
 * @get_color_tone_mode: vmethod to get color tone mode value
 * @get_scene_mode: vmethod to get scene mode value
 * @get_flash_mode: vmethod to get flash mode value
 * @get_noise_reduction: vmethod to get noise reduction mode value
 * @get_zoom: vmethod to get zoom factor value
 * @set_ev_compensation: vmethod to set ev exposure compensation value
 * @set_iso_speed: vmethod to set iso speed (light sensitivity) value
 * @set_aperture: vmethod to set aperture value
 * @set_exposure: vmethod to set exposure time value
 * @set_white_balance_mode: vmethod to set white balance mode value
 * @set_color_tone_mode: vmethod to set color tone mode value
 * @set_scene_mode: vmethod to set scene mode value
 * @set_flash_mode: vmethod to set flash mode value
 * @set_noise_reduction: vmethod to set noise reduction mode value
 * @set_zoom: vmethod to set zoom factor value
 * @get_capabilities: vmethod to get supported capabilities of the interface
 * @prepare_for_capture: vmethod to tell the element to prepare for capturing
 * @set_autofocus: vmethod to set autofocus on/off
 * @set_config: vmethod to set all configuration parameters at once
 * @get_config: vmethod to get all configuration parameters at once
 * @get_image_capture_supported_caps: vmethod to get caps describing supported image capture formats
 *
 * #GstPhotographyInterface interface.
 */
typedef struct _GstPhotographyInterface
{
  GTypeInterface parent;

  /* virtual functions */
  gboolean (*get_ev_compensation)    (GstPhotography * photo, gfloat * ev_comp);
  gboolean (*get_iso_speed)          (GstPhotography * photo, guint * iso_speed);
  gboolean (*get_aperture)           (GstPhotography * photo, guint * aperture);
  gboolean (*get_exposure)           (GstPhotography * photo, guint32 * exposure);
  gboolean (*get_white_balance_mode) (GstPhotography * photo, GstPhotographyWhiteBalanceMode * wb_mode);
  gboolean (*get_color_tone_mode)    (GstPhotography * photo, GstPhotographyColorToneMode * tone_mode);
  gboolean (*get_scene_mode)         (GstPhotography * photo, GstPhotographySceneMode * scene_mode);
  gboolean (*get_flash_mode)         (GstPhotography * photo, GstPhotographyFlashMode * flash_mode);
  gboolean (*get_zoom)               (GstPhotography * photo, gfloat * zoom);
  gboolean (*get_flicker_mode)       (GstPhotography * photo, GstPhotographyFlickerReductionMode * flicker_mode);
  gboolean (*get_focus_mode)         (GstPhotography * photo, GstPhotographyFocusMode * focus_mode);

  gboolean (*set_ev_compensation)    (GstPhotography * photo, gfloat ev_comp);
  gboolean (*set_iso_speed)          (GstPhotography * photo, guint iso_speed);
  gboolean (*set_aperture)           (GstPhotography * photo, guint aperture);
  gboolean (*set_exposure)           (GstPhotography * photo, guint32 exposure);
  gboolean (*set_white_balance_mode) (GstPhotography * photo, GstPhotographyWhiteBalanceMode wb_mode);
  gboolean (*set_color_tone_mode)    (GstPhotography * photo, GstPhotographyColorToneMode tone_mode);
  gboolean (*set_scene_mode)         (GstPhotography * photo, GstPhotographySceneMode scene_mode);
  gboolean (*set_flash_mode)         (GstPhotography * photo, GstPhotographyFlashMode flash_mode);
  gboolean (*set_zoom)               (GstPhotography * photo, gfloat zoom);
  gboolean (*set_flicker_mode)       (GstPhotography * photo, GstPhotographyFlickerReductionMode flicker_mode);
  gboolean (*set_focus_mode)         (GstPhotography * photo, GstPhotographyFocusMode focus_mode);

  GstPhotographyCaps (*get_capabilities) (GstPhotography * photo);

  gboolean (*prepare_for_capture)    (GstPhotography * photo, GstPhotographyCapturePrepared func, GstCaps *capture_caps, gpointer user_data);

  void     (*set_autofocus)          (GstPhotography * photo, gboolean on);

  gboolean (*set_config)             (GstPhotography * photo, GstPhotographySettings * config);
  gboolean (*get_config)             (GstPhotography * photo, GstPhotographySettings * config);

  gboolean (*get_noise_reduction)    (GstPhotography * photo, GstPhotographyNoiseReduction * noise_reduction);
  gboolean (*set_noise_reduction)    (GstPhotography * photo, GstPhotographyNoiseReduction noise_reduction);

  /* FIXME: remove padding, not needed for interfaces */
  /*< private > */
  gpointer _gst_reserved[GST_PADDING];
} GstPhotographyInterface;

GST_PHOTOGRAPHY_API
GType gst_photography_get_type (void);

/* virtual class function wrappers */

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_ev_compensation (GstPhotography * photo,
                                              gfloat * ev_comp);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_iso_speed       (GstPhotography * photo,
                                              guint * iso_speed);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_aperture        (GstPhotography * photo,
                                              guint * aperture);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_exposure        (GstPhotography * photo,
                                              guint32 * exposure);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_white_balance_mode (GstPhotography * photo,
                                                 GstPhotographyWhiteBalanceMode * wb_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_color_tone_mode (GstPhotography * photo,
                                              GstPhotographyColorToneMode * tone_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_scene_mode      (GstPhotography * photo,
                                              GstPhotographySceneMode * scene_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_flash_mode      (GstPhotography * photo,
                                              GstPhotographyFlashMode * flash_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_noise_reduction (GstPhotography * photo,
                                              GstPhotographyNoiseReduction * noise_reduction);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_zoom            (GstPhotography * photo, gfloat * zoom);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_flicker_mode    (GstPhotography * photo,
                                              GstPhotographyFlickerReductionMode * mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_focus_mode      (GstPhotography * photo,
                                              GstPhotographyFocusMode * mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_ev_compensation (GstPhotography * photo,
                                              gfloat ev_comp);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_iso_speed       (GstPhotography * photo,
                                              guint iso_speed);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_aperture        (GstPhotography * photo, guint aperture);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_exposure        (GstPhotography * photo, guint exposure);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_white_balance_mode (GstPhotography * photo,
                                                 GstPhotographyWhiteBalanceMode wb_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_color_tone_mode (GstPhotography * photo,
                                              GstPhotographyColorToneMode tone_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_scene_mode      (GstPhotography * photo,
                                              GstPhotographySceneMode scene_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_flash_mode      (GstPhotography * photo,
                                              GstPhotographyFlashMode flash_mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_noise_reduction (GstPhotography * photo,
                                              GstPhotographyNoiseReduction noise_reduction);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_zoom            (GstPhotography * photo, gfloat zoom);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_flicker_mode    (GstPhotography * photo,
                                              GstPhotographyFlickerReductionMode mode);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_focus_mode      (GstPhotography * photo,
                                              GstPhotographyFocusMode mode);

GST_PHOTOGRAPHY_API
GstPhotographyCaps gst_photography_get_capabilities (GstPhotography * photo);

GST_PHOTOGRAPHY_API
gboolean gst_photography_prepare_for_capture (GstPhotography * photo,
                                              GstPhotographyCapturePrepared func,
                                              GstCaps *capture_caps,
                                              gpointer user_data);

GST_PHOTOGRAPHY_API
gboolean gst_photography_set_config    (GstPhotography         * photo,
                                        GstPhotographySettings * config);

GST_PHOTOGRAPHY_API
gboolean gst_photography_get_config    (GstPhotography         * photo,
                                        GstPhotographySettings * config);

GST_PHOTOGRAPHY_API
void     gst_photography_set_autofocus (GstPhotography * photo, gboolean on);

G_END_DECLS

#endif /* __GST_PHOTOGRAPHY_H__ */
