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