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