/* GStreamer
 * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
 *
 * 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_CAMERA_BIN2_H_
#define _GST_CAMERA_BIN2_H_

#include <gst/gst.h>
#include <gst/pbutils/encoding-profile.h>

G_BEGIN_DECLS

/* to keep code mergeable */
#define GstCameraBin2 GstCameraBin
#define GstCameraBin2Class GstCameraBinClass

#define GST_TYPE_CAMERA_BIN2   (gst_camera_bin2_get_type())
#define GST_CAMERA_BIN2(obj)   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAMERA_BIN2,GstCameraBin2))
#define GST_CAMERA_BIN2_CAST(obj)   ((GstCameraBin2 *) obj)
#define GST_CAMERA_BIN2_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAMERA_BIN2,GstCameraBin2Class))
#define GST_IS_CAMERA_BIN2(obj)   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERA_BIN2))
#define GST_IS_CAMERA_BIN2_CLASS(obj)   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERA_BIN2))

typedef enum
{
  /* matches GstEncFlags GST_ENC_FLAG_NO_AUDIO_CONVERSION in encodebin */
  GST_CAM_FLAG_NO_AUDIO_CONVERSION = (1 << 0),
  /* matches GstEncFlags GST_ENC_FLAG_NO_VIDEO_CONVERSION in encodebin */
  GST_CAM_FLAG_NO_VIDEO_CONVERSION = (1 << 1),
  /* maps to 'disable-converters' property in viewfinderbin */
  GST_CAM_FLAG_NO_VIEWFINDER_CONVERSION = (1 << 2),
  /* maps to GstEncFlags GST_ENC_FLAG_NO_VIDEO_CONVERSION in the image bin's
   * encodebin */
  GST_CAM_FLAG_NO_IMAGE_CONVERSION = (1 << 3)
} GstCamFlags;


typedef enum _GstCameraBinVideoState
{
  GST_CAMERA_BIN_VIDEO_IDLE=0,
  GST_CAMERA_BIN_VIDEO_STARTING=1,
  GST_CAMERA_BIN_VIDEO_RECORDING=2,
  GST_CAMERA_BIN_VIDEO_FINISHING=3
} GstCameraBinVideoState;

typedef struct _GstCameraBin2 GstCameraBin2;
typedef struct _GstCameraBin2Class GstCameraBin2Class;

struct _GstCameraBin2
{
  GstPipeline pipeline;

  GstElement *src;
  GstElement *user_src;
  gulong src_capture_notify_id;

  GstElement *video_encodebin;
  gulong video_encodebin_signal_id;
  GstElement *videosink;
  GstElement *user_video_sink;
  GstElement *videobin_capsfilter;

  GstElement *viewfinderbin;
  GstElement *viewfinderbin_queue;
  GstElement *viewfinderbin_capsfilter;

  GstElement *image_encodebin;
  gulong image_encodebin_signal_id;
  GstElement *imagesink;
  GstElement *imagebin_capsfilter;

  GstElement *video_filter;
  GstElement *image_filter;
  GstElement *viewfinder_filter;
  GstElement *audio_filter;
  GstElement *user_video_filter;
  GstElement *user_image_filter;
  GstElement *user_viewfinder_filter;
  GstElement *user_audio_filter;

  GstElement *audio_src;
  GstElement *user_audio_src;
  GstElement *audio_volume;
  GstElement *audio_capsfilter;

  gint processing_counter; /* atomic int */

  /* Index of the auto incrementing file index for captures */
  gint capture_index;

  GMutex image_capture_mutex;
  /* stores list of image locations to be pushed to the image sink
   * as file location change notifications, they are pushed before
   * each buffer capture */
  GSList *image_location_list;
  /* Store also tags and push them before each captured image */
  GSList *image_tags_list;

  /*
   * Similar to above, but used for giving names to previews
   *
   * Need to protect with a mutex as this list is used when the
   * camera-source posts a preview image. As we have no control
   * on how the camera-source will behave (we can only tell how
   * it should), the preview location list might be used in an
   * inconsistent way.
   * One example is the camera-source posting a preview image after
   * camerabin2 was put to ready, when this preview list will be
   * freed and set to NULL. Concurrent access might lead to crashes in
   * this situation. (Concurrency from the state-change freeing the
   * list and the message handling function looking at preview names)
   */
  GSList *preview_location_list;
  GMutex preview_list_mutex;

  gboolean video_profile_switch;
  gboolean image_profile_switch;

  gboolean audio_drop_eos;
  gboolean audio_send_newseg;

  GMutex video_capture_mutex;
  GCond video_state_cond;
  GstCameraBinVideoState video_state;

  /* properties */
  gint mode;
  gchar *location;
  gboolean post_previews;
  GstCaps *preview_caps;
  GstElement *preview_filter;
  GstEncodingProfile *video_profile;
  GstEncodingProfile *image_profile;
  gfloat zoom;
  gfloat max_zoom;
  GstCamFlags flags;

  gboolean elements_created;
};

struct _GstCameraBin2Class
{
  GstPipelineClass pipeline_class;

  /* Action signals */
  void (*start_capture) (GstCameraBin2 * camera);
  void (*stop_capture) (GstCameraBin2 * camera);
};

GType gst_camera_bin2_get_type (void);
gboolean gst_camera_bin2_plugin_init (GstPlugin * plugin);

G_END_DECLS

#endif
