/* GStreamer Split Muxed File Source
 * Copyright (C) 2014 Jan Schmidt <jan@centricular.com>
 *
 * 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_SPLITMUX_SRC_H__
#define __GST_SPLITMUX_SRC_H__

#include <gst/gst.h>

#include "gstsplitmuxpartreader.h"

G_BEGIN_DECLS

#define GST_TYPE_SPLITMUX_SRC \
  (gst_splitmux_src_get_type())
#define GST_SPLITMUX_SRC(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPLITMUX_SRC,GstSplitMuxSrc))
#define GST_SPLITMUX_SRC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPLITMUX_SRC,GstSplitMuxSrcClass))
#define GST_IS_SPLITMUX_SRC(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPLITMUX_SRC))
#define GST_IS_SPLITMUX_SRC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPLITMUX_SRC))

typedef struct _GstSplitMuxSrc GstSplitMuxSrc;
typedef struct _GstSplitMuxSrcClass GstSplitMuxSrcClass;

struct _GstSplitMuxSrc
{
  GstBin parent;

  GMutex lock;
  gboolean     running;

  gchar       *location;  /* OBJECT_LOCK */

  GstSplitMuxPartReader **parts;
  guint        num_parts;
  guint        cur_part;

  gboolean pads_complete;
  GMutex pads_lock;
  GList  *pads; /* pads_lock */

  GstClockTime total_duration;
  GstSegment play_segment;
  guint32 segment_seqnum;
};

struct _GstSplitMuxSrcClass
{
  GstBinClass parent_class;
};

GType splitmux_src_pad_get_type (void);
#define SPLITMUX_TYPE_SRC_PAD splitmux_src_pad_get_type()
#define SPLITMUX_SRC_PAD_CAST(p) ((SplitMuxSrcPad *)(p))
#define SPLITMUX_SRC_PAD(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),SPLITMUX_TYPE_SRC_PAD,SplitMuxSrcPad))

struct _SplitMuxSrcPad
{
  GstPad parent;

  guint cur_part;
  GstSplitMuxPartReader *reader;
  GstPad *part_pad;

  GstSegment segment;

  gboolean set_next_discont;
  gboolean clear_next_discont;

  gboolean sent_stream_start;
  gboolean sent_caps;
  gboolean sent_segment;
};

struct _SplitMuxSrcPadClass
{
  GstPadClass parent;
};

GType gst_splitmux_src_get_type (void);
gboolean register_splitmuxsrc (GstPlugin * plugin);

#define SPLITMUX_SRC_LOCK(s) g_mutex_lock(&(s)->lock)
#define SPLITMUX_SRC_UNLOCK(s) g_mutex_unlock(&(s)->lock)

#define SPLITMUX_SRC_PADS_LOCK(s) g_mutex_lock(&(s)->pads_lock)
#define SPLITMUX_SRC_PADS_UNLOCK(s) g_mutex_unlock(&(s)->pads_lock)

G_END_DECLS

#endif /* __GST_SPLITMUX_SRC_H__ */
