UVC H264 plugin
[platform/upstream/gstreamer.git] / sys / uvch264 / gstuvch264_src.h
1 /*
2  * GStreamer
3  *
4  * Copyright (C) 2012 Cisco Systems, Inc.
5  *   Author: Youness Alaoui <youness.alaoui@collabora.co.uk>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23
24 #ifndef __GST_UVC_H264_SRC_H__
25 #define __GST_UVC_H264_SRC_H__
26
27 #ifdef HAVE_CONFIG_H
28 #  include <config.h>
29 #endif
30
31 #include <gst/gst.h>
32 #include <gst/basecamerabinsrc/gstbasecamerasrc.h>
33 #if defined (HAVE_GUDEV) && defined (HAVE_LIBUSB)
34 #include <libusb.h>
35 #endif
36
37 #include "uvc_h264.h"
38
39 G_BEGIN_DECLS
40 #define GST_TYPE_UVC_H264_SRC                   \
41   (gst_uvc_h264_src_get_type())
42 #define GST_UVC_H264_SRC(obj)                                           \
43   (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_UVC_H264_SRC, GstUvcH264Src))
44 #define GST_UVC_H264_SRC_CLASS(klass)                                   \
45   (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_UVC_H264_SRC, GstUvcH264SrcClass))
46 #define GST_IS_UVC_H264_SRC(obj)                                \
47   (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_UVC_H264_SRC))
48 #define GST_IS_UVC_H264_SRC_CLASS(klass)                        \
49   (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_UVC_H264_SRC))
50     GType gst_uvc_h264_src_get_type (void);
51
52 typedef struct _GstUvcH264Src GstUvcH264Src;
53 typedef struct _GstUvcH264SrcClass GstUvcH264SrcClass;
54
55 enum GstVideoRecordingStatus {
56   GST_VIDEO_RECORDING_STATUS_DONE,
57   GST_VIDEO_RECORDING_STATUS_STARTING,
58   GST_VIDEO_RECORDING_STATUS_RUNNING,
59   GST_VIDEO_RECORDING_STATUS_FINISHING
60 };
61
62 enum  {
63   QP_I_FRAME = 0,
64   QP_P_FRAME,
65   QP_B_FRAME,
66   QP_FRAMES
67 };
68
69 typedef enum {
70   UVC_H264_SRC_FORMAT_NONE,
71   UVC_H264_SRC_FORMAT_JPG,
72   UVC_H264_SRC_FORMAT_H264,
73   UVC_H264_SRC_FORMAT_RAW
74 } GstUvcH264SrcFormat;
75
76 /**
77  * GstUcH264Src:
78  *
79  */
80 struct _GstUvcH264Src
81 {
82   GstBaseCameraSrc parent;
83
84   GstPad *vfsrc;
85   GstPad *imgsrc;
86   GstPad *vidsrc;
87
88   /* source elements */
89   GstElement *v4l2_src;
90   GstElement *mjpg_demux;
91   GstElement *jpeg_dec;
92   GstElement *vid_colorspace;
93   GstElement *vf_colorspace;
94
95   GstUvcH264SrcFormat main_format;
96   guint16 main_width;
97   guint16 main_height;
98   guint32 main_frame_interval;
99   UvcH264StreamFormat main_stream_format;
100   guint16 main_profile;
101   GstUvcH264SrcFormat secondary_format;
102   guint16 secondary_width;
103   guint16 secondary_height;
104   guint32 secondary_frame_interval;
105
106   int v4l2_fd;
107   guint8 h264_unit_id;
108 #if defined (HAVE_GUDEV) && defined (HAVE_LIBUSB)
109   libusb_context *usb_ctx;
110 #endif
111
112   GstPadEventFunction srcpad_event_func;
113   GstEvent *key_unit_event;
114   GstSegment segment;
115
116   gboolean started;
117
118   /* When restarting the source */
119   gboolean reconfiguring;
120   gboolean vid_newseg;
121   gboolean vf_newseg;
122
123   gchar *colorspace_name;
124   gchar *jpeg_decoder_name;
125   int num_clock_samples;
126
127   /* v4l2src proxied properties */
128   guint32 num_buffers;
129   gchar *device;
130
131   /* Static controls */
132   guint32 initial_bitrate;
133   guint16 slice_units;
134   UvcH264SliceMode slice_mode;
135   guint16 iframe_period;
136   UvcH264UsageType usage_type;
137   UvcH264Entropy entropy;
138   gboolean enable_sei;
139   guint8 num_reorder_frames;
140   gboolean preview_flipped;
141   guint16 leaky_bucket_size;
142
143   /* Dynamic controls */
144   UvcH264RateControl rate_control;
145   gboolean fixed_framerate;
146   guint8 level_idc;
147   guint32 peak_bitrate;
148   guint32 average_bitrate;
149   gint8 min_qp[QP_FRAMES];
150   gint8 max_qp[QP_FRAMES];
151   guint8 ltr_buffer_size;
152   guint8 ltr_encoder_control;
153 };
154
155
156 /**
157  * GstUvcH264SrcClass:
158  *
159  */
160 struct _GstUvcH264SrcClass
161 {
162   GstBaseCameraSrcClass parent;
163 };
164
165
166 #endif /* __GST_UVC_H264_SRC_H__ */