blob: e0ea240a5bd348f2ccf1eea1b854325d2a4a8c2c [file] [log] [blame]
/*
* camtransport.h - GStreamer CAM (EN50221) transport layer
* Copyright (C) 2007 Alessandro Decina
*
* Authors:
* Alessandro Decina <alessandro@nnva.org>
*
* 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 CAM_TRANSPORT_H
#define CAM_TRANSPORT_H
#include <gst/gst.h>
#include "cam.h"
#include "camutils.h"
#define HOST_BUFFER_SIZE 1024
#define CAM_TL(obj) ((CamTL *) obj)
#define CAM_TL_CONNECTION(obj) ((CamTLConnection *) obj)
typedef struct _CamTL CamTL;
typedef struct _CamTLPrivate CamTLPrivate;
typedef struct _CamTLConnection CamTLConnection;
typedef struct _CamTLConnectionPrivate CamTLConnectionPrivate;
typedef enum
{
CAM_TL_CONNECTION_STATE_CLOSED,
CAM_TL_CONNECTION_STATE_IN_CREATION,
CAM_TL_CONNECTION_STATE_OPEN,
CAM_TL_CONNECTION_STATE_IN_DELETION
} CamTLConnectionState;
struct _CamTL
{
int fd;
guint connection_ids;
GHashTable *connections;
guint expected_tpdus;
/* buffer containing module data */
guint8 buffer [HOST_BUFFER_SIZE];
/* number of bytes written in the buffer */
guint buffer_size;
/* index pointing to the first byte of a TPDU's body */
guint8 *body;
/* length of the body part */
guint body_length;
/* callbacks */
void (*request_connection) (CamTL *tl, CamTLConnection *connection);
void (*connection_created) (CamTL *tl, CamTLConnection *connection);
void (*connection_deleted) (CamTL *tl, CamTLConnection *connection);
CamReturn (*connection_data) (CamTL *tl, CamTLConnection *connection,
guint8 *data, guint length);
/* used by the upper layer to extend this layer */
gpointer user_data;
};
struct _CamTLConnection
{
CamTL *tl;
guint8 slot;
guint id;
CamTLConnectionState state;
/* TRUE if the last status byte was 0x80, FALSE otherwise */
gboolean has_data;
/* NCAS 1.0 sometimes reports that it has data even if it doesn't. After
* MAX_EMPTY_DATA times that we don't get any data we assume that there's
* actually no data.
*/
guint empty_data;
/* timer restarted every time the connection is polled */
GTimer *last_poll;
gpointer user_data;
};
CamTL *cam_tl_new (int cam_device_fd);
void cam_tl_destroy (CamTL *tl);
CamReturn cam_tl_create_connection (CamTL *tl,
guint8 slot, CamTLConnection **connnection);
CamReturn cam_tl_connection_delete (CamTLConnection *connection);
void cam_tl_calc_buffer_size (CamTL *tl,
guint body_length, guint *buffer_size, guint *offset);
CamReturn cam_tl_connection_write (CamTLConnection *connection,
guint8 *data, guint buffer_size, guint body_length);
CamReturn cam_tl_connection_poll (CamTLConnection *connection, gboolean force);
CamReturn cam_tl_read_all (CamTL *tl, gboolean poll);
#endif /* CAM_TRANSPORT_H */