827f6b6bbddec4e6dfa5c0b982e6b861051c571e
[profile/ivi/gstreamer-vaapi.git] / gst / vaapi / gstvaapiencode_h263.c
1 /*
2  *  gstvaapiencode_h263.c - VA-API H.263 encoder
3  *
4  *  Copyright (C) 2011 Intel Corporation
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public License
8  *  as published by the Free Software Foundation; either version 2.1
9  *  of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free
18  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  *  Boston, MA 02110-1301 USA
20  */
21
22 #include "gstvaapiencode_h263.h"
23 #include "gst/vaapi/gstvaapiencoder_h263.h"
24
25 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_h263_encode_debug);
26 #define GST_CAT_DEFAULT gst_vaapi_h263_encode_debug
27
28 #define GST_VAAPI_ENCODE_GET_PRIVATE(obj)                  \
29     (G_TYPE_INSTANCE_GET_PRIVATE ((obj),                   \
30                                   GST_TYPE_VAAPI_ENCODE,   \
31                                   GstVaapiEncodePrivate))
32
33 static const char gst_vaapi_encode_h263_sink_caps_str[] =
34     GST_VAAPI_SURFACE_CAPS;
35
36 static const GstElementDetails gst_vaapi_encode_h263_details =
37     GST_ELEMENT_DETAILS(
38       "VA-API h263 encoder",
39       "Codec/Encoder/Video",
40       "A VA-API based h263 encoder",
41       "Feng Yuan <feng.yuan@intel.com>");
42
43
44 static const char gst_vaapi_encode_h263_src_caps_str[] =
45     GST_CAPS_CODEC("video/x-h263");
46
47 static GstStaticPadTemplate gst_vaapi_encode_h263_sink_factory =
48     GST_STATIC_PAD_TEMPLATE(
49         "sink",
50         GST_PAD_SINK,
51         GST_PAD_ALWAYS,
52         GST_STATIC_CAPS(gst_vaapi_encode_h263_sink_caps_str));
53
54 static GstStaticPadTemplate gst_vaapi_encode_h263_src_factory =
55     GST_STATIC_PAD_TEMPLATE(
56         "src",
57         GST_PAD_SRC,
58         GST_PAD_ALWAYS,
59         GST_STATIC_CAPS(gst_vaapi_encode_h263_src_caps_str));
60
61 /* h263 encode */
62 GST_BOILERPLATE(
63     GstVaapiEncodeH263,
64     gst_vaapi_encode_h263,
65     GstVaapiEncode,
66     GST_TYPE_VAAPI_ENCODE)
67
68 enum {
69     H263_PROP_0,
70     H263_PROP_BITRATE,
71     H263_PROP_INTRA_PERIOD,
72     H263_PROP_INIT_QP,
73     H263_PROP_MIN_QP,
74 };
75
76 static void
77 gst_vaapi_encode_h263_init(
78     GstVaapiEncodeH263 *h263_encode,
79     GstVaapiEncodeH263Class *klass
80 )
81 {
82   GstVaapiEncode *encode = GST_VAAPI_ENCODE(h263_encode);
83   encode->encoder = GST_VAAPI_ENCODER(gst_vaapi_encoder_h263_new());
84   ENCODER_ASSERT(encode->encoder);
85 }
86
87 static void
88 gst_vaapi_encode_h263_set_property(
89     GObject *object,
90     guint prop_id,
91     const GValue *value,
92     GParamSpec *pspec
93 )
94 {
95   GstVaapiEncode *base = GST_VAAPI_ENCODE(object);
96   GstVaapiEncoderH263 *encoder = GST_VAAPI_ENCODER_H263(base->encoder);
97
98   ENCODER_ASSERT(encoder);
99
100   switch (prop_id) {
101     case H263_PROP_BITRATE: {
102       encoder->bitrate = g_value_get_uint(value);
103     }
104       break;
105
106     case H263_PROP_INTRA_PERIOD: {
107       encoder->intra_period = g_value_get_uint(value);
108     }
109       break;
110
111     case H263_PROP_INIT_QP: {
112       encoder->init_qp = g_value_get_uint(value);
113     }
114       break;
115
116     case H263_PROP_MIN_QP: {
117       encoder->min_qp = g_value_get_uint(value);
118     }
119       break;
120
121     default:
122       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
123       break;
124   }
125 }
126
127 static void
128 gst_vaapi_encode_h263_get_property (
129     GObject * object,
130     guint prop_id,
131     GValue * value,
132     GParamSpec * pspec
133 )
134 {
135   GstVaapiEncode *base = GST_VAAPI_ENCODE(object);
136   GstVaapiEncoderH263 *encoder = GST_VAAPI_ENCODER_H263(base->encoder);
137   ENCODER_ASSERT(encoder);
138
139   switch (prop_id) {
140     case H263_PROP_BITRATE:
141       g_value_set_uint (value, encoder->bitrate);
142       break;
143
144     case H263_PROP_INTRA_PERIOD:
145       g_value_set_uint (value, encoder->intra_period);
146       break;
147
148     case H263_PROP_INIT_QP:
149       g_value_set_uint (value, encoder->init_qp);
150       break;
151
152     case H263_PROP_MIN_QP:
153       g_value_set_uint (value, encoder->min_qp);
154       break;
155
156     default:
157       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
158       break;
159   }
160 }
161
162 static void
163 gst_vaapi_encode_h263_base_init(gpointer klass)
164 {
165   GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
166
167   gst_element_class_set_details(element_class, &gst_vaapi_encode_h263_details);
168
169   /* sink pad */
170   gst_element_class_add_pad_template(
171       element_class,
172       gst_static_pad_template_get(&gst_vaapi_encode_h263_sink_factory)
173   );
174
175   /* src pad */
176   gst_element_class_add_pad_template(
177       element_class,
178       gst_static_pad_template_get(&gst_vaapi_encode_h263_src_factory)
179   );
180 }
181
182 static void
183 gst_vaapi_encode_h263_class_init(GstVaapiEncodeH263Class *klass)
184 {
185   GObjectClass * const object_class = G_OBJECT_CLASS(klass);
186
187   GST_DEBUG_CATEGORY_INIT (gst_vaapi_h263_encode_debug,
188                            "vaapih263encode",
189                            0,
190                            "vaapih263encode element");
191
192   /* object_class->finalize      = gst_vaapi_encode_h263_finalize; */
193   object_class->set_property  = gst_vaapi_encode_h263_set_property;
194   object_class->get_property  = gst_vaapi_encode_h263_get_property;
195
196   g_object_class_install_property (
197       object_class,
198       H263_PROP_BITRATE,
199       g_param_spec_uint (
200           "bitrate",
201           "H263 encoding bitrate",
202           "H263 encoding bitrate, 10k~100M, (0, auto-calculate)",
203           0,
204           100*1000*1000,
205           0,
206           G_PARAM_READWRITE));
207
208   g_object_class_install_property (
209       object_class,
210       H263_PROP_INTRA_PERIOD,
211       g_param_spec_uint (
212           "intra-period",
213           "H263 encoding intra-period",
214           "H263 encoding intra-period",
215           1,
216           300,
217           H263_DEFAULT_INTRA_PERIOD,
218           G_PARAM_READWRITE));
219
220   g_object_class_install_property (
221       object_class,
222       H263_PROP_INIT_QP,
223       g_param_spec_uint (
224           "init-qp",
225           "H263 init-qp",
226           "H263 init-qp",
227           1,
228           51,
229           H263_DEFAULT_INIT_QP,
230           G_PARAM_READWRITE));
231
232   g_object_class_install_property (
233       object_class,
234       H263_PROP_MIN_QP,
235       g_param_spec_uint (
236           "min-qp",
237           "H263 min-qp",
238           "H263 min-qp",
239           1,
240           51,
241           H263_DEFAULT_MIN_QP,
242           G_PARAM_READWRITE));
243
244 }