use calibrated timestamps (as suggested by slomo)
[gst-plugin-dreamsource.git] / src / gstdreamsource.h
1 /*
2  * GStreamer dreamsource
3  * Copyright 2014-2015 Andreas Frisch <fraxinas@opendreambox.org>
4  *
5  * This program is licensed under the Creative Commons
6  * Attribution-NonCommercial-ShareAlike 3.0 Unported
7  * License. To view a copy of this license, visit
8  * http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to
9  * Creative Commons,559 Nathan Abbott Way,Stanford,California 94305,USA.
10  *
11  * Alternatively, this program may be distributed and executed on
12  * hardware which is licensed by Dream Property GmbH.
13  *
14  * This program is NOT free software. It is open source, you are allowed
15  * to modify it (if you keep the license), but it may not be commercially
16  * distributed other than under the conditions noted above.
17  */
18
19 #ifndef __GST_DREAMSOURCE_H__
20 #define __GST_DREAMSOURCE_H__
21
22 #include <gst/gst.h>
23 #include <gst/base/gstpushsrc.h>
24
25 #include <unistd.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <stdint.h>
29 #include <inttypes.h>
30 #include <string.h>
31 #include <errno.h>
32 #include <fcntl.h>
33 #include <sys/poll.h>
34 #include <sys/ioctl.h>
35 #include <sys/mman.h>
36 #include <sys/socket.h>
37
38 #include "gstdreamsource-marshal.h"
39
40 #define CONTROL_STOP            'S'     /* stop the select call */
41 #define CONTROL_SOCKETS(src)   src->control_sock
42 #define WRITE_SOCKET(src)      src->control_sock[1]
43 #define READ_SOCKET(src)       src->control_sock[0]
44
45 #define CLEAR_COMMAND(src)                  \
46 G_STMT_START {                              \
47   char c; ssize_t res;                      \
48   res = read(READ_SOCKET(src), &c, 1);      \
49 } G_STMT_END
50
51 #define SEND_COMMAND(src, command)          \
52 G_STMT_START {                              \
53   int G_GNUC_UNUSED _res; unsigned char c; c = command;   \
54   _res = write (WRITE_SOCKET(src), &c, 1);  \
55 } G_STMT_END
56
57 #define READ_COMMAND(src, command, res)        \
58 G_STMT_START {                                 \
59   res = read(READ_SOCKET(src), &command, 1);   \
60 } G_STMT_END
61
62 G_BEGIN_DECLS
63
64 typedef struct _CompressedBufferDescriptor CompressedBufferDescriptor;
65 typedef struct _EncoderInfo                EncoderInfo;
66
67 #define ENCTIME_TO_GSTTIME(time)           (gst_util_uint64_scale ((time), GST_USECOND, 27LL))
68 #define MPEGTIME_TO_GSTTIME(time)          (gst_util_uint64_scale ((time), GST_MSECOND/10, 9LL))
69
70 /* validity flags */
71 #define CDB_FLAG_ORIGINALPTS_VALID         0x00000001
72 #define CDB_FLAG_PTS_VALID                 0x00000002
73 #define CDB_FLAG_ESCR_VALID                0x00000004
74 #define CDB_FLAG_TICKSPERBIT_VALID         0x00000008
75 #define CDB_FLAG_SHR_VALID                 0x00000010
76 #define CDB_FLAG_STCSNAPSHOT_VALID         0x00000020
77
78 /* indicator flags */
79 #define CDB_FLAG_FRAME_START               0x00010000
80 #define CDB_FLAG_EOS                       0x00020000
81 #define CDB_FLAG_EMPTY_FRAME               0x00040000
82 #define CDB_FLAG_FRAME_END                 0x00080000
83 #define CDB_FLAG_EOC                       0x00100000
84
85 #define CDB_FLAG_METADATA                  0x40000000
86 #define CDB_FLAG_EXTENDED                  0x80000000
87
88 struct _CompressedBufferDescriptor
89 {
90         uint32_t uiFlags;
91
92         /* Timestamp Parameters */
93         uint32_t uiOriginalPTS;      /* 32-bit original PTS value (in 45 Khz or 27Mhz?) */
94         uint64_t uiPTS;              /* 33-bit PTS value (in 90 Khz) */
95         uint64_t uiSTCSnapshot;      /* 42-bit STC snapshot when frame received by the encoder (in 27Mhz) */
96
97         /* Transmission Parameters */
98         uint32_t uiESCR;             /* Expected mux transmission start time for the first bit of the data (in 27 Mhz) */
99
100         uint16_t uiTicksPerBit;
101         int16_t iSHR;
102
103         /* Buffer Parameters */
104         unsigned uiOffset;           /* REQUIRED: offset of frame data from frame buffer base address (in bytes) */
105         size_t uiLength;             /* REQUIRED: 0 if fragment is empty, e.g. for EOS entry (in bytes) */
106         unsigned uiReserved;         /* Unused field */
107 };
108
109 struct _EncoderInfo {
110         int fd;
111
112         /* descriptor space */
113         unsigned char *buffer;
114
115         /* mmapp'ed data buffer */
116         unsigned char *cdb;
117
118         guint         used_range_min;
119         guint         used_range_max;
120 };
121
122 #define ENC_GET_STC      _IOR('v', 141, uint32_t)
123
124 #define GST_TYPE_DREAMSOURCE_CLOCK \
125   (gst_dreamsource_clock_get_type())
126 #define GST_DREAMSOURCE_CLOCK(obj) \
127   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DREAMSOURCE_CLOCK,GstDreamSourceClock))
128 #define GST_DREAMSOURCE_CLOCK_CLASS(klass) \
129   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DREAMSOURCE_CLOCK,GstDreamSourceClockClass))
130 #define GST_IS_DreamSource_CLOCK(obj) \
131   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DREAMSOURCE_CLOCK))
132 #define GST_IS_DreamSource_CLOCK_CLASS(klass) \
133   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DREAMSOURCE_CLOCK))
134 #define GST_DREAMSOURCE_CLOCK_CAST(obj) \
135   ((GstDreamSourceClock*)(obj))
136
137 typedef struct _GstDreamSourceClock GstDreamSourceClock;
138 typedef struct _GstDreamSourceClockClass GstDreamSourceClockClass;
139
140 struct _GstDreamSourceClock
141 {
142         GstSystemClock clock;
143
144         uint32_t prev_stc;
145         uint32_t first_stc;
146         uint64_t stc_offset;
147         int fd;
148 };
149
150 struct _GstDreamSourceClockClass
151 {
152         GstSystemClockClass parent_class;
153 };
154
155 GType gst_dreamsource_clock_get_type (void);
156 GstClock *gst_dreamsource_clock_new (const gchar * name, int fd);
157
158 G_END_DECLS
159
160 #endif /* __GST_DREAMSOURCE_H__ */