2 * gstvaapisubpicture.c - VA subpicture abstraction
4 * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program 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
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 * SECTION:gstvaapisubpicture
23 * @short_description: VA subpicture abstraction
28 #include "gstvaapicompat.h"
29 #include "gstvaapiutils.h"
30 #include "gstvaapisubpicture.h"
31 #include "gstvaapiobject_priv.h"
34 #include "gstvaapidebug.h"
36 G_DEFINE_TYPE(GstVaapiSubpicture, gst_vaapi_subpicture, GST_VAAPI_TYPE_OBJECT);
38 #define GST_VAAPI_SUBPICTURE_GET_PRIVATE(obj) \
39 (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
40 GST_VAAPI_TYPE_SUBPICTURE, \
41 GstVaapiSubpicturePrivate))
43 struct _GstVaapiSubpicturePrivate {
54 gst_vaapi_subpicture_destroy(GstVaapiSubpicture *subpicture)
56 GstVaapiDisplay * const display = GST_VAAPI_OBJECT_DISPLAY(subpicture);
57 GstVaapiSubpicturePrivate * const priv = subpicture->priv;
58 VASubpictureID subpicture_id;
61 subpicture_id = GST_VAAPI_OBJECT_ID(subpicture);
62 GST_DEBUG("subpicture %" GST_VAAPI_ID_FORMAT,
63 GST_VAAPI_ID_ARGS(subpicture_id));
65 if (subpicture_id != VA_INVALID_ID) {
67 GST_VAAPI_DISPLAY_LOCK(display);
68 status = vaDestroySubpicture(
69 GST_VAAPI_DISPLAY_VADISPLAY(display),
72 GST_VAAPI_DISPLAY_UNLOCK(display);
73 if (!vaapi_check_status(status, "vaDestroySubpicture()"))
74 g_warning("failed to destroy subpicture %" GST_VAAPI_ID_FORMAT,
75 GST_VAAPI_ID_ARGS(subpicture_id));
77 GST_VAAPI_OBJECT_ID(subpicture) = VA_INVALID_ID;
81 g_object_unref(priv->image);
87 gst_vaapi_subpicture_create(GstVaapiSubpicture *subpicture)
89 GstVaapiDisplay * const display = GST_VAAPI_OBJECT_DISPLAY(subpicture);
90 GstVaapiSubpicturePrivate * const priv = subpicture->priv;
91 VASubpictureID subpicture_id;
97 GST_VAAPI_DISPLAY_LOCK(display);
98 status = vaCreateSubpicture(
99 GST_VAAPI_DISPLAY_VADISPLAY(display),
100 GST_VAAPI_OBJECT_ID(priv->image),
103 GST_VAAPI_DISPLAY_UNLOCK(display);
104 if (!vaapi_check_status(status, "vaCreateSubpicture()"))
107 GST_DEBUG("subpicture %" GST_VAAPI_ID_FORMAT,
108 GST_VAAPI_ID_ARGS(subpicture_id));
109 GST_VAAPI_OBJECT_ID(subpicture) = subpicture_id;
114 gst_vaapi_subpicture_finalize(GObject *object)
116 gst_vaapi_subpicture_destroy(GST_VAAPI_SUBPICTURE(object));
118 G_OBJECT_CLASS(gst_vaapi_subpicture_parent_class)->finalize(object);
122 gst_vaapi_subpicture_set_property(
129 GstVaapiSubpicture * const subpicture = GST_VAAPI_SUBPICTURE(object);
133 gst_vaapi_subpicture_set_image(subpicture, g_value_get_object(value));
136 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
142 gst_vaapi_subpicture_get_property(
149 GstVaapiSubpicture * const subpicture = GST_VAAPI_SUBPICTURE(object);
153 g_value_set_object(value, gst_vaapi_subpicture_get_image(subpicture));
156 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
162 gst_vaapi_subpicture_class_init(GstVaapiSubpictureClass *klass)
164 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
166 g_type_class_add_private(klass, sizeof(GstVaapiSubpicturePrivate));
168 object_class->finalize = gst_vaapi_subpicture_finalize;
169 object_class->set_property = gst_vaapi_subpicture_set_property;
170 object_class->get_property = gst_vaapi_subpicture_get_property;
173 * GstVaapiSubpicture:image:
175 * The #GstVaapiImage this subpicture is bound to.
177 g_object_class_install_property
180 g_param_spec_object("image",
182 "The GstVaapiImage this subpicture is bound to",
183 GST_VAAPI_TYPE_IMAGE,
188 gst_vaapi_subpicture_init(GstVaapiSubpicture *subpicture)
190 GstVaapiSubpicturePrivate *priv = GST_VAAPI_SUBPICTURE_GET_PRIVATE(subpicture);
192 subpicture->priv = priv;
197 * gst_vaapi_subpicture_new:
198 * @image: a #GstVaapiImage
200 * Creates a new #GstVaapiSubpicture with @image as source pixels. The
201 * newly created object holds a reference on @image.
203 * Return value: the newly allocated #GstVaapiSubpicture object
206 gst_vaapi_subpicture_new(GstVaapiImage *image)
208 g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), NULL);
210 GST_DEBUG("create from image %" GST_VAAPI_ID_FORMAT,
211 GST_VAAPI_ID_ARGS(GST_VAAPI_OBJECT_ID(image)));
213 return g_object_new(GST_VAAPI_TYPE_SUBPICTURE,
214 "display", GST_VAAPI_OBJECT_DISPLAY(image),
215 "id", GST_VAAPI_ID(VA_INVALID_ID),
221 * gst_vaapi_subpicture_get_image:
222 * @subpicture: a #GstVaapiSubpicture
224 * Returns the #GstVaapiImage this @subpicture is bound to.
226 * Return value: the #GstVaapiImage this @subpicture is bound to
229 gst_vaapi_subpicture_get_image(GstVaapiSubpicture *subpicture)
231 g_return_val_if_fail(GST_VAAPI_IS_SUBPICTURE(subpicture), NULL);
233 return subpicture->priv->image;
237 * gst_vaapi_subpicture_set_image:
238 * @subpicture: a #GstVaapiSubpicture
239 * @image: a #GstVaapiImage
241 * Binds a new #GstVaapiImage to the @subpicture. The reference to the
242 * previous image is released a new one acquired on @image.
245 gst_vaapi_subpicture_set_image(
246 GstVaapiSubpicture *subpicture,
250 g_return_if_fail(GST_VAAPI_IS_SUBPICTURE(subpicture));
251 g_return_if_fail(GST_VAAPI_IS_IMAGE(image));
253 gst_vaapi_subpicture_destroy(subpicture);
255 subpicture->priv->image = g_object_ref(image);
256 gst_vaapi_subpicture_create(subpicture);