/* GStreamer
 * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
 * Copyright (C) 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
 *
 * dataprotocol.h: Functions implementing the GStreamer Data Protocol
 *
 * 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_DATA_PROTOCOL_H__
#define __GST_DATA_PROTOCOL_H__

#include <gst/gstbuffer.h>
#include <gst/gstevent.h>
#include <gst/gstcaps.h>

G_BEGIN_DECLS

/**
 * GstDPVersion:
 * @GST_DP_VERSION_0_2: protocol version 0.2
 * @GST_DP_VERSION_1_0: protocol version 1.0
 *
 * The version of the GDP protocol being used.
 */
typedef enum {
  GST_DP_VERSION_0_2 = 1,
  GST_DP_VERSION_1_0,
} GstDPVersion;

GType gst_dp_version_get_type (void);
#define GST_TYPE_DP_VERSION (gst_dp_version_get_type ())

/**
 * GST_DP_VERSION_MAJOR:
 *
 * The major version number of the GStreamer Data Protocol.
 */
#define GST_DP_VERSION_MAJOR 0
/**
 * GST_DP_VERSION_MINOR:
 *
 * The minor version number of the GStreamer Data Protocol.
 */
#define GST_DP_VERSION_MINOR 2

/**
 * GST_DP_HEADER_LENGTH:
 *
 * The header size in bytes.
 */
#define GST_DP_HEADER_LENGTH 62

/**
 * GstDPHeaderFlag:
 * @GST_DP_HEADER_FLAG_NONE: No flag present.
 * @GST_DP_HEADER_FLAG_CRC_HEADER: a header CRC field is present.
 * @GST_DP_HEADER_FLAG_CRC_PAYLOAD: a payload CRC field is present.
 * @GST_DP_HEADER_FLAG_CRC: a CRC for header and payload is present.
 *
 * header flags for the dataprotocol.
 */
typedef enum {
  GST_DP_HEADER_FLAG_NONE        = 0,
  GST_DP_HEADER_FLAG_CRC_HEADER  = (1 << 0),
  GST_DP_HEADER_FLAG_CRC_PAYLOAD = (1 << 1),
  GST_DP_HEADER_FLAG_CRC         = (1 << 1) | (1 << 0),
} GstDPHeaderFlag;

/**
 * GstDPPayloadType:
 * @GST_DP_PAYLOAD_NONE: Invalid payload type.
 * @GST_DP_PAYLOAD_BUFFER: #GstBuffer payload packet.
 * @GST_DP_PAYLOAD_CAPS: #GstCaps payload packet.
 * @GST_DP_PAYLOAD_EVENT_NONE: First value of #GstEvent payload packets.
 *
 * The GDP payload types. a #GstEvent payload type is encoded with the
 * event type number starting from @GST_DP_PAYLOAD_EVENT_NONE.
 */
typedef enum {
  GST_DP_PAYLOAD_NONE            = 0,
  GST_DP_PAYLOAD_BUFFER,
  GST_DP_PAYLOAD_CAPS,
  GST_DP_PAYLOAD_EVENT_NONE      = 64,
} GstDPPayloadType;

typedef gboolean (*GstDPHeaderFromBufferFunction) (const GstBuffer * buffer,
                                                   GstDPHeaderFlag flags,
                                                   guint * length,
                                                   guint8 ** header);
typedef gboolean (*GstDPPacketFromCapsFunction)   (const GstCaps * caps,
                                                   GstDPHeaderFlag flags,
                                                   guint * length,
                                                   guint8 ** header,
                                                   guint8 ** payload);
typedef gboolean (*GstDPPacketFromEventFunction)  (const GstEvent * event,
                                                   GstDPHeaderFlag flags,
                                                   guint * length,
                                                   guint8 ** header,
                                                   guint8 ** payload);

/**
 * GstDPPacketizer:
 * @version: the #GstDPVersion of the protocol to be used
 * @header_from_buffer: buffer serializer function
 * @packet_from_caps: caps serializer function
 * @packet_from_event: event serializer function
 *
 * Data protocol packetizer handle.
 */
typedef struct {
  GstDPVersion version;

  GstDPHeaderFromBufferFunction header_from_buffer;
  GstDPPacketFromCapsFunction packet_from_caps;
  GstDPPacketFromEventFunction packet_from_event;

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
} GstDPPacketizer;


void            gst_dp_init                     (void);

/* packetizer */
GstDPPacketizer *
                gst_dp_packetizer_new           (GstDPVersion version);
void            gst_dp_packetizer_free          (GstDPPacketizer *packetizer);

/* crc checksum */
guint16         gst_dp_crc                      (const guint8 * buffer,
                                                 guint length);

/* payload information from header */
guint32         gst_dp_header_payload_length    (const guint8 * header);
GstDPPayloadType
                gst_dp_header_payload_type      (const guint8 * header);

/* converting to GstBuffer/GstEvent/GstCaps */
GstBuffer *     gst_dp_buffer_from_header       (guint header_length,
                                                const guint8 * header);
GstCaps *       gst_dp_caps_from_packet         (guint header_length,
                                                const guint8 * header,
                                                const guint8 * payload);
GstEvent *      gst_dp_event_from_packet        (guint header_length,
                                                const guint8 * header,
                                                const guint8 * payload);

/* validation */
gboolean        gst_dp_validate_header          (guint header_length,
                                                const guint8 * header);
gboolean        gst_dp_validate_payload         (guint header_length,
                                                const guint8 * header,
                                                const guint8 * payload);
gboolean        gst_dp_validate_packet          (guint header_length,
                                                const guint8 * header,
                                                const guint8 * payload);

G_END_DECLS

#endif /* __GST_DATA_PROTOCOL_H__ */
