Tizen 2.0 Release
[framework/multimedia/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     GST_VAAPI_BUFFER_SHARING_CAPS;
36
37 static const GstElementDetails gst_vaapi_encode_h263_details =
38     GST_ELEMENT_DETAILS(
39       "VA-API h263 encoder",
40       "Codec/Encoder/Video",
41       "A VA-API based h263 encoder",
42       "Feng Yuan <feng.yuan@intel.com>");
43
44
45 static const char gst_vaapi_encode_h263_src_caps_str[] =
46     GST_CAPS_CODEC("video/x-h263");
47
48 static GstStaticPadTemplate gst_vaapi_encode_h263_sink_factory =
49     GST_STATIC_PAD_TEMPLATE(
50         "sink",
51         GST_PAD_SINK,
52         GST_PAD_ALWAYS,
53         GST_STATIC_CAPS(gst_vaapi_encode_h263_sink_caps_str));
54
55 static GstStaticPadTemplate gst_vaapi_encode_h263_src_factory =
56     GST_STATIC_PAD_TEMPLATE(
57         "src",
58         GST_PAD_SRC,
59         GST_PAD_ALWAYS,
60         GST_STATIC_CAPS(gst_vaapi_encode_h263_src_caps_str));
61
62 /* h263 encode */
63 GST_BOILERPLATE(
64     GstVaapiEncodeH263,
65     gst_vaapi_encode_h263,
66     GstVaapiEncode,
67     GST_TYPE_VAAPI_ENCODE)
68
69 enum {
70     H263_PROP_0,
71     H263_PROP_BITRATE,
72     H263_PROP_INTRA_PERIOD,
73     H263_PROP_INIT_QP,
74     H263_PROP_MIN_QP,
75 };
76
77 static void
78 gst_vaapi_encode_h263_init(
79     GstVaapiEncodeH263 *h263_encode,
80     GstVaapiEncodeH263Class *klass
81 )
82 {
83   GstVaapiEncode *encode = GST_VAAPI_ENCODE(h263_encode);
84   encode->encoder = GST_VAAPI_ENCODER(gst_vaapi_encoder_h263_new());
85   ENCODER_ASSERT(encode->encoder);
86 }
87
88 static void
89 gst_vaapi_encode_h263_set_property(
90     GObject *object,
91     guint prop_id,
92     const GValue *value,
93     GParamSpec *pspec
94 )
95 {
96   GstVaapiEncode *base = GST_VAAPI_ENCODE(object);
97   GstVaapiEncoderH263 *encoder = GST_VAAPI_ENCODER_H263(base->encoder);
98
99   ENCODER_ASSERT(encoder);
100
101   switch (prop_id) {
102     case H263_PROP_BITRATE: {
103       encoder->bitrate = g_value_get_uint(value);
104     }
105       break;
106
107     case H263_PROP_INTRA_PERIOD: {
108       encoder->intra_period = g_value_get_uint(value);
109     }
110       break;
111
112     case H263_PROP_INIT_QP: {
113       encoder->init_qp = g_value_get_uint(value);
114     }
115       break;
116
117     case H263_PROP_MIN_QP: {
118       encoder->min_qp = g_value_get_uint(value);
119     }
120       break;
121
122     default:
123       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
124       break;
125   }
126 }
127
128 static void
129 gst_vaapi_encode_h263_get_property (
130     GObject * object,
131     guint prop_id,
132     GValue * value,
133     GParamSpec * pspec
134 )
135 {
136   GstVaapiEncode *base = GST_VAAPI_ENCODE(object);
137   GstVaapiEncoderH263 *encoder = GST_VAAPI_ENCODER_H263(base->encoder);
138   ENCODER_ASSERT(encoder);
139
140   switch (prop_id) {
141     case H263_PROP_BITRATE:
142       g_value_set_uint (value, encoder->bitrate);
143       break;
144
145     case H263_PROP_INTRA_PERIOD:
146       g_value_set_uint (value, encoder->intra_period);
147       break;
148
149     case H263_PROP_INIT_QP:
150       g_value_set_uint (value, encoder->init_qp);
151       break;
152
153     case H263_PROP_MIN_QP:
154       g_value_set_uint (value, encoder->min_qp);
155       break;
156
157     default:
158       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
159       break;
160   }
161 }
162
163 static void
164 gst_vaapi_encode_h263_base_init(gpointer klass)
165 {
166   GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
167
168   gst_element_class_set_details(element_class, &gst_vaapi_encode_h263_details);
169
170   /* sink pad */
171   gst_element_class_add_pad_template(
172       element_class,
173       gst_static_pad_template_get(&gst_vaapi_encode_h263_sink_factory)
174   );
175
176   /* src pad */
177   gst_element_class_add_pad_template(
178       element_class,
179       gst_static_pad_template_get(&gst_vaapi_encode_h263_src_factory)
180   );
181 }
182
183 static void
184 gst_vaapi_encode_h263_class_init(GstVaapiEncodeH263Class *klass)
185 {
186   GObjectClass * const object_class = G_OBJECT_CLASS(klass);
187
188   GST_DEBUG_CATEGORY_INIT (gst_vaapi_h263_encode_debug,
189                            "vaapih263encode",
190                            0,
191                            "vaapih263encode element");
192
193   /* object_class->finalize      = gst_vaapi_encode_h263_finalize; */
194   object_class->set_property  = gst_vaapi_encode_h263_set_property;
195   object_class->get_property  = gst_vaapi_encode_h263_get_property;
196
197   g_object_class_install_property (
198       object_class,
199       H263_PROP_BITRATE,
200       g_param_spec_uint (
201           "bitrate",
202           "H263 encoding bitrate(kpbs)",
203           "H263 encoding bitrate(kbps), (0, auto-calculate)",
204           0,
205           100*1024,
206           0,
207           G_PARAM_READWRITE));
208
209   g_object_class_install_property (
210       object_class,
211       H263_PROP_INTRA_PERIOD,
212       g_param_spec_uint (
213           "intra-period",
214           "H263 encoding intra-period",
215           "H263 encoding intra-period",
216           1,
217           300,
218           H263_DEFAULT_INTRA_PERIOD,
219           G_PARAM_READWRITE));
220
221   g_object_class_install_property (
222       object_class,
223       H263_PROP_INIT_QP,
224       g_param_spec_uint (
225           "init-qp",
226           "H263 init-qp",
227           "H263 init-qp",
228           1,
229           51,
230           H263_DEFAULT_INIT_QP,
231           G_PARAM_READWRITE));
232
233   g_object_class_install_property (
234       object_class,
235       H263_PROP_MIN_QP,
236       g_param_spec_uint (
237           "min-qp",
238           "H263 min-qp",
239           "H263 min-qp",
240           1,
241           51,
242           H263_DEFAULT_MIN_QP,
243           G_PARAM_READWRITE));
244
245 }