locking fixes needed for newer glib version with more strict locking rules .. no...
[gst-plugin-dreamsource.git] / src / gstdreamvideosource.h
1 /*
2  * GStreamer dreamvideosource
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_DREAMVIDEOSOURCE_H__
20 #define __GST_DREAMVIDEOSOURCE_H__
21
22 #include "gstdreamsource.h"
23 #include <gst/video/video.h>
24
25 G_BEGIN_DECLS
26
27 /* VIDEO field validity flags */
28 #define VBD_FLAG_DTS_VALID                 0x00000001
29 /* VIDEO indicator flags */
30 #define VBD_FLAG_RAP                       0x00010000
31 /* indicates a video data unit (NALU, EBDU, etc) starts at the beginning of
32    this descriptor  - if this is set, then the uiDataUnitID field is valid also */
33 #define VBD_FLAG_DATA_UNIT_START           0x00020000
34 #define VBD_FLAG_EXTENDED                  0x80000000
35
36 #define VENC_START          _IO('v', 128)
37 #define VENC_STOP           _IO('v', 129)
38 #define VENC_SET_BITRATE    _IOW('v', 130, unsigned int)
39 #define VENC_SET_RESOLUTION _IOW('v', 131, unsigned int)
40 #define VENC_SET_FRAMERATE  _IOW('v', 132, unsigned int)
41 #define VENC_SET_SOURCE     _IOW('v', 140, unsigned int)
42 #define VENC_GET_STC        _IOR('v', 141, uint32_t)
43
44 enum venc_framerate {
45         rate_custom = 0,
46         rate_25,
47         rate_30,
48         rate_50,
49         rate_60,
50 };
51
52 enum venc_videoformat {
53         fmt_custom = 0,
54         fmt_720x576,
55         fmt_1280x720,
56         fmt_1920x1080,
57 };
58
59 typedef enum venc_source {
60         GST_DREAMVIDEOSOURCE_INPUT_MODE_LIVE = 0,
61         GST_DREAMVIDEOSOURCE_INPUT_MODE_HDMI_IN,
62         GST_DREAMVIDEOSOURCE_INPUT_MODE_BACKGROUND
63 } GstDreamVideoSourceInputMode;
64
65 #define GST_TYPE_DREAMVIDEOSOURCE_INPUT_MODE (gst_dreamvideosource_input_mode_get_type ())
66
67 struct _VideoBufferDescriptor
68 {
69         CompressedBufferDescriptor stCommon;
70         uint32_t uiVideoFlags;
71         uint64_t uiDTS;         /* 33-bit DTS value (in 90 Kh or 27Mhz?) */
72         uint8_t uiDataUnitType;
73 };
74
75 struct _VideoFormatInfo {
76         gint width;
77         gint height;
78
79         gint fps_n;     /* framerate numerator */
80         gint fps_d;     /* framerate demnominator */
81
82         gint bitrate;
83 };
84
85 #define VBDSIZE         sizeof(VideoBufferDescriptor)
86 #define VBUFSIZE        (1024*16)
87 #define VMMAPSIZE       (1024*1024*6)
88
89 #define GST_TYPE_DREAMVIDEOSOURCE \
90   (gst_dreamvideosource_get_type())
91 #define GST_DREAMVIDEOSOURCE(obj) \
92   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DREAMVIDEOSOURCE,GstDreamVideoSource))
93 #define GST_DREAMVIDEOSOURCE_CLASS(klass) \
94   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DREAMVIDEOSOURCE,GstDreamVideoSourceClass))
95 #define GST_IS_DREAMVIDEOSOURCE(obj) \
96   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DREAMVIDEOSOURCE))
97 #define GST_IS_DREAMVIDEOSOURCE_CLASS(klass) \
98   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DREAMVIDEOSOURCE))
99
100 typedef struct _GstDreamVideoSource        GstDreamVideoSource;
101 typedef struct _GstDreamVideoSourceClass   GstDreamVideoSourceClass;
102
103 typedef struct _VideoFormatInfo            VideoFormatInfo;
104 typedef struct _VideoBufferDescriptor      VideoBufferDescriptor;
105
106 // #define dump 1
107 #define PROVIDE_CLOCK
108
109 struct _GstDreamVideoSource
110 {
111         GstPushSrc element;
112
113         EncoderInfo *encoder;
114
115         GstDreamVideoSourceInputMode input_mode;
116
117         VideoFormatInfo video_info;
118         GstCaps *current_caps, *new_caps;
119
120         unsigned int descriptors_available;
121         unsigned int descriptors_count;
122
123         int dumpfd;
124
125         GstElement *dreamaudiosrc;
126         gint64 dts_offset;
127
128         GMutex mutex;
129         GCond cond;
130         int control_sock[2];
131
132         gboolean flushing;
133         gboolean dts_valid;
134
135         GThread *readthread;
136         GQueue current_frames;
137         guint buffer_size;
138
139         GstClock *encoder_clock;
140 };
141
142 struct _GstDreamVideoSourceClass
143 {
144         GstPushSrcClass parent_class;
145         gint64 (*get_dts_offset) (GstDreamVideoSource *self);
146 };
147
148 GType gst_dreamvideosource_get_type (void);
149 GType gst_dreamvideosource_input_mode_get_type (void);
150 gboolean gst_dreamvideosource_plugin_init (GstPlugin * plugin);
151
152 void gst_dreamvideosource_set_input_mode (GstDreamVideoSource *self, GstDreamVideoSourceInputMode mode);
153 GstDreamVideoSourceInputMode gst_dreamvideosource_get_input_mode (GstDreamVideoSource *self);
154
155 G_END_DECLS
156
157 #endif /* __GST_DREAMVIDEOSOURCE_H__ */
158