• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * camtransport.h - GStreamer CAM (EN50221) transport layer
3  * Copyright (C) 2007 Alessandro Decina
4  *
5  * Authors:
6  *   Alessandro Decina <alessandro.d@gmail.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23 
24 #ifndef CAM_TRANSPORT_H
25 #define CAM_TRANSPORT_H
26 
27 #include <gst/gst.h>
28 #include "cam.h"
29 #include "camutils.h"
30 
31 #define HOST_BUFFER_SIZE 1024
32 
33 #define CAM_TL(obj) ((CamTL *) obj)
34 #define CAM_TL_CONNECTION(obj) ((CamTLConnection *) obj)
35 
36 typedef struct _CamTL CamTL;
37 typedef struct _CamTLPrivate CamTLPrivate;
38 
39 typedef struct _CamTLConnection CamTLConnection;
40 typedef struct _CamTLConnectionPrivate CamTLConnectionPrivate;
41 
42 typedef enum
43 {
44   CAM_TL_CONNECTION_STATE_CLOSED,
45   CAM_TL_CONNECTION_STATE_IN_CREATION,
46   CAM_TL_CONNECTION_STATE_OPEN,
47   CAM_TL_CONNECTION_STATE_IN_DELETION
48 } CamTLConnectionState;
49 
50 struct _CamTL
51 {
52   int fd;
53   guint connection_ids;
54 
55   GHashTable *connections;
56 
57   guint expected_tpdus;
58 
59   /* buffer containing module data */
60   guint8 buffer [HOST_BUFFER_SIZE];
61   /* number of bytes written in the buffer */
62   guint buffer_size;
63   /* index pointing to the first byte of a TPDU's body */
64   guint8 *body;
65   /* length of the body part */
66   guint body_length;
67 
68   /* callbacks */
69   void (*request_connection) (CamTL *tl, CamTLConnection *connection);
70   void (*connection_created) (CamTL *tl, CamTLConnection *connection);
71   void (*connection_deleted) (CamTL *tl, CamTLConnection *connection);
72   CamReturn (*connection_data) (CamTL *tl, CamTLConnection *connection,
73     guint8 *data, guint length);
74 
75   /* used by the upper layer to extend this layer */
76   gpointer user_data;
77 };
78 
79 struct _CamTLConnection
80 {
81   CamTL *tl;
82 
83   guint8 slot;
84   guint id;
85   CamTLConnectionState state;
86   /* TRUE if the last status byte was 0x80, FALSE otherwise */
87   gboolean has_data;
88   /* NCAS 1.0 sometimes reports that it has data even if it doesn't. After
89    * MAX_EMPTY_DATA times that we don't get any data we assume that there's
90    * actually no data.
91    */
92   guint empty_data;
93   /* timer restarted every time the connection is polled */
94   GTimer *last_poll;
95 
96   gpointer user_data;
97 };
98 
99 CamTL *cam_tl_new (int cam_device_fd);
100 void cam_tl_destroy (CamTL *tl);
101 
102 CamReturn cam_tl_create_connection (CamTL *tl,
103   guint8 slot, CamTLConnection **connnection);
104 CamReturn cam_tl_connection_delete (CamTLConnection *connection);
105 
106 void cam_tl_calc_buffer_size (CamTL *tl,
107   guint body_length, guint *buffer_size, guint *offset);
108 
109 CamReturn cam_tl_connection_write (CamTLConnection *connection,
110   guint8 *data, guint buffer_size, guint body_length);
111 
112 CamReturn cam_tl_connection_poll (CamTLConnection *connection, gboolean force);
113 CamReturn cam_tl_read_all (CamTL *tl, gboolean poll);
114 
115 #endif /* CAM_TRANSPORT_H */
116