implement input-mode property to switch between live, hdmi-in and background encoding
[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
43 enum venc_framerate {
44         rate_custom = 0,
45         rate_25,
46         rate_30,
47         rate_50,
48         rate_60,
49 };
50
51 enum venc_videoformat {
52         fmt_custom = 0,
53         fmt_720x576,
54         fmt_1280x720,
55         fmt_1920x1080,
56 };
57
58 typedef enum venc_source {
59         GST_DREAMVIDEOSOURCE_INPUT_MODE_LIVE = 0,
60         GST_DREAMVIDEOSOURCE_INPUT_MODE_HDMI_IN,
61         GST_DREAMVIDEOSOURCE_INPUT_MODE_BACKGROUND
62 } GstDreamVideoSourceInputMode;
63
64 #define GST_TYPE_DREAMVIDEOSOURCE_INPUT_MODE (gst_dreamvideosource_input_mode_get_type ())
65
66 struct _VideoBufferDescriptor
67 {
68         CompressedBufferDescriptor stCommon;
69         uint32_t uiVideoFlags;
70         uint64_t uiDTS;         /* 33-bit DTS value (in 90 Kh or 27Mhz?) */
71         uint8_t uiDataUnitType;
72 };
73
74 struct _VideoFormatInfo {
75         gint width;
76         gint height;
77
78         gint fps_n;     /* framerate numerator */
79         gint fps_d;     /* framerate demnominator */
80
81         gint bitrate;
82 };
83
84 #define VBDSIZE         sizeof(VideoBufferDescriptor)
85 #define VBUFSIZE        (1024*16)
86 #define VMMAPSIZE       (1024*1024*6)
87
88 #define GST_TYPE_DREAMVIDEOSOURCE \
89   (gst_dreamvideosource_get_type())
90 #define GST_DREAMVIDEOSOURCE(obj) \
91   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DREAMVIDEOSOURCE,GstDreamVideoSource))
92 #define GST_DREAMVIDEOSOURCE_CLASS(klass) \
93   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DREAMVIDEOSOURCE,GstDreamVideoSourceClass))
94 #define GST_IS_DREAMVIDEOSOURCE(obj) \
95   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DREAMVIDEOSOURCE))
96 #define GST_IS_DREAMVIDEOSOURCE_CLASS(klass) \
97   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DREAMVIDEOSOURCE))
98
99 typedef struct _GstDreamVideoSource        GstDreamVideoSource;
100 typedef struct _GstDreamVideoSourceClass   GstDreamVideoSourceClass;
101
102 typedef struct _VideoFormatInfo            VideoFormatInfo;
103 typedef struct _VideoBufferDescriptor      VideoBufferDescriptor;
104
105 // #define dump 1
106
107 struct _GstDreamVideoSource
108 {
109         GstPushSrc element;
110
111         EncoderInfo *encoder;
112
113         GstDreamVideoSourceInputMode input_mode;
114
115         VideoFormatInfo video_info;
116         GstCaps *current_caps;
117
118         unsigned int descriptors_available;
119         unsigned int descriptors_count;
120
121         int dumpfd;
122
123         GstElement *dreamaudiosrc;
124         GstClockTime base_pts;
125
126         GMutex mutex;
127         int control_sock[2];
128
129         int buffers_in_use;
130 };
131
132 struct _GstDreamVideoSourceClass
133 {
134         GstPushSrcClass parent_class;
135         gint64 (*get_base_pts) (GstDreamVideoSource *self);
136 };
137
138 GType gst_dreamvideosource_get_type (void);
139 GType gst_dreamvideosource_input_mode_get_type (void);
140 gboolean gst_dreamvideosource_plugin_init (GstPlugin * plugin);
141
142 void gst_dreamvideosource_set_input_mode (GstDreamVideoSource *self, GstDreamVideoSourceInputMode mode);
143 GstDreamVideoSourceInputMode gst_dreamvideosource_get_input_mode (GstDreamVideoSource *self);
144
145 G_END_DECLS
146
147 #endif /* __GST_DREAMVIDEOSOURCE_H__ */
148