40a46bf84364680ae39c9e9dfba8e773accef1b1
[profile/ivi/gstreamer-vaapi.git] / gst / vaapiencode / gstvaapih263encode.c
1 #include "gstvaapih263encode.h"
2 #include "gstvaapih263encoder.h"
3
4 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_h263_encode_debug);
5 #define GST_CAT_DEFAULT gst_vaapi_h263_encode_debug
6
7 #define GST_VAAPI_ENCODE_GET_PRIVATE(obj)  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_VAAPI_ENCODE, GstVaapiEncodePrivate))
8
9 static const char gst_h263encode_sink_caps_str[] =
10     GST_VAAPI_SURFACE_CAPS;
11
12 static const GstElementDetails gst_h263encode_details =
13     GST_ELEMENT_DETAILS(
14       "VA-API h263 encoder",
15       "Codec/Encoder/Video",
16       "A VA-API based h263 encoder",
17       "Feng Yuan <feng.yuan@intel.com>");
18
19
20 static const char gst_h263encode_src_caps_str[] =
21     GST_CAPS_CODEC("video/x-h263");
22
23 static GstStaticPadTemplate gst_h263encode_sink_factory =
24     GST_STATIC_PAD_TEMPLATE(
25         "sink",
26         GST_PAD_SINK,
27         GST_PAD_ALWAYS,
28         GST_STATIC_CAPS(gst_h263encode_sink_caps_str));
29
30 static GstStaticPadTemplate gst_h263encode_src_factory =
31     GST_STATIC_PAD_TEMPLATE(
32         "src",
33         GST_PAD_SRC,
34         GST_PAD_ALWAYS,
35         GST_STATIC_CAPS(gst_h263encode_src_caps_str));
36
37 static void gst_h263encode_set_property(GObject *object, guint prop_id,
38     const GValue *value, GParamSpec *pspec);
39 static void gst_h263encode_get_property (GObject * object, guint prop_id,
40     GValue * value, GParamSpec * pspec);
41
42 /* h263 encode */
43 GST_BOILERPLATE(
44     GstH263Encode,
45     gst_h263encode,
46     GstVaapiEncode,
47     GST_TYPE_VAAPI_ENCODE);
48
49 enum {
50     H263_PROP_0,
51     H263_PROP_BITRATE,
52     H263_PROP_INTRA_PERIOD,
53     H263_PROP_INIT_QP,
54     H263_PROP_MIN_QP,
55 };
56
57
58 static void
59 gst_h263encode_base_init(gpointer klass)
60 {
61   GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
62
63   gst_element_class_set_details(element_class, &gst_h263encode_details);
64
65   /* sink pad */
66   gst_element_class_add_pad_template(
67       element_class,
68       gst_static_pad_template_get(&gst_h263encode_sink_factory)
69   );
70
71   /* src pad */
72   gst_element_class_add_pad_template(
73       element_class,
74       gst_static_pad_template_get(&gst_h263encode_src_factory)
75   );
76 }
77
78 static void
79 gst_h263encode_class_init(GstH263EncodeClass *klass)
80 {
81   GObjectClass * const object_class = G_OBJECT_CLASS(klass);
82
83   GST_DEBUG_CATEGORY_INIT (gst_vaapi_h263_encode_debug, "vaapih263encode", 0,
84       "vaapih263encode element");
85
86   /* object_class->finalize      = gst_h263encode_finalize; */
87   object_class->set_property  = gst_h263encode_set_property;
88   object_class->get_property  = gst_h263encode_get_property;
89
90   g_object_class_install_property (object_class, H263_PROP_BITRATE,
91         g_param_spec_uint ("bitrate",
92             "H263 encoding bitrate",
93             "H263 encoding bitrate, 10k~100M, (0, auto-calculate)",
94             0,
95             100*1000*1000,
96             0,
97             G_PARAM_READWRITE));
98   g_object_class_install_property (object_class, H263_PROP_INTRA_PERIOD,
99         g_param_spec_uint ("intra-period",
100             "H263 encoding intra-period",
101             "H263 encoding intra-period",
102             1,
103             300,
104             H263_DEFAULT_INTRA_PERIOD,
105             G_PARAM_READWRITE));
106   g_object_class_install_property (object_class, H263_PROP_INIT_QP,
107         g_param_spec_uint ("init-qp",
108             "H263 init-qp",
109             "H263 init-qp",
110             1,
111             51,
112             H263_DEFAULT_INIT_QP,
113             G_PARAM_READWRITE));
114   g_object_class_install_property (object_class, H263_PROP_MIN_QP,
115         g_param_spec_uint ("min-qp",
116             "H263 min-qp",
117             "H263 min-qp",
118             1,
119             51,
120             H263_DEFAULT_MIN_QP,
121             G_PARAM_READWRITE));
122
123 }
124
125 static void
126 gst_h263encode_init(GstH263Encode *h263_encode, GstH263EncodeClass *klass)
127 {
128   GstVaapiEncode *encode = GST_VAAPI_ENCODE(h263_encode);
129   encode->encoder = GST_VAAPI_ENCODER(gst_h263_encoder_new());
130   ENCODER_ASSERT(encode->encoder);
131 }
132
133 static void
134 gst_h263encode_set_property(GObject *object, guint prop_id,
135     const GValue *value, GParamSpec *pspec)
136 {
137   GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
138   GstH263Encoder *h263encoder = GST_H263_ENCODER(encode->encoder);
139
140   ENCODER_ASSERT(h263encoder);
141
142   switch (prop_id) {
143     case H263_PROP_BITRATE: {
144       h263encoder->bitrate = g_value_get_uint(value);
145     }
146       break;
147
148     case H263_PROP_INTRA_PERIOD: {
149       h263encoder->intra_period = g_value_get_uint(value);
150     }
151       break;
152
153     case H263_PROP_INIT_QP: {
154       h263encoder->init_qp = g_value_get_uint(value);
155     }
156       break;
157
158     case H263_PROP_MIN_QP: {
159       h263encoder->min_qp = g_value_get_uint(value);
160     }
161       break;
162
163     default:
164       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
165       break;
166   }
167 }
168
169 static void
170 gst_h263encode_get_property (GObject * object, guint prop_id,
171     GValue * value, GParamSpec * pspec)
172 {
173   GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
174   GstH263Encoder *h263encoder = GST_H263_ENCODER(encode->encoder);
175   ENCODER_ASSERT(h263encoder);
176
177   switch (prop_id) {
178     case H263_PROP_BITRATE:
179       g_value_set_uint (value, h263encoder->bitrate);
180       break;
181
182     case H263_PROP_INTRA_PERIOD:
183       g_value_set_uint (value, h263encoder->intra_period);
184       break;
185
186     case H263_PROP_INIT_QP:
187       g_value_set_uint (value, h263encoder->init_qp);
188       break;
189
190     case H263_PROP_MIN_QP:
191       g_value_set_uint (value, h263encoder->min_qp);
192       break;
193
194     default:
195       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
196       break;
197   }
198 }
199