summaryrefslogtreecommitdiff
path: root/gst-libs/gst/vaapi/gstvaapivalue.h
blob: f462671504ac5789c7eea4e8ae42d4e40ec2fe4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
 *  gstvaapivalue.h - GValue implementations specific to VA-API
 *
 *  Copyright (C) 2010-2011 Splitted-Desktop Systems
 *    Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
 *  Copyright (C) 2012-2014 Intel Corporation
 *    Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free
 *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301 USA
 */

#ifndef GST_VAAPI_VALUE_H
#define GST_VAAPI_VALUE_H

#include <glib-object.h>
#include <gst/vaapi/gstvaapitypes.h>

G_BEGIN_DECLS

/**
 * GST_VAAPI_TYPE_POINT:
 *
 * A #GstVaapiPoint type that represents a 2D point coordinates.
 *
 * Return value: the GType of #GstVaapiPoint
 */
#define GST_VAAPI_TYPE_POINT gst_vaapi_point_get_type()

/**
 * GST_VAAPI_TYPE_RECTANGLE:
 *
 * A #GstVaapiRectangle type that represents a 2D rectangle position
 * and size.
 *
 * Return value: the GType of #GstVaapiRectangle
 */
#define GST_VAAPI_TYPE_RECTANGLE gst_vaapi_rectangle_get_type()

/**
 * GST_VAAPI_TYPE_RENDER_MODE:
 *
 * A #GstVaapiRenderMode type that represents the VA display backend
 * rendering mode: overlay (2D engine) or textured-blit (3D engine).
 *
 * Return value: the #GType of GstVaapiRenderMode
 */
#define GST_VAAPI_TYPE_RENDER_MODE gst_vaapi_render_mode_get_type()

/**
 * GST_VAAPI_TYPE_ROTATION:
 *
 * A type that represents the VA display rotation.
 *
 * Return value: the #GType of GstVaapiRotation
 */
#define GST_VAAPI_TYPE_ROTATION gst_vaapi_rotation_get_type()

/**
 * GST_VAAPI_TYPE_RATE_CONTROL:
 *
 * A type that represents the VA rate control.
 *
 * Return value: the #GType of GstVaapiRateControl
 */
#define GST_VAAPI_TYPE_RATE_CONTROL gst_vaapi_rate_control_get_type()

GType
gst_vaapi_point_get_type(void) G_GNUC_CONST;

GType
gst_vaapi_rectangle_get_type(void) G_GNUC_CONST;

GType
gst_vaapi_render_mode_get_type(void) G_GNUC_CONST;

GType
gst_vaapi_rotation_get_type(void) G_GNUC_CONST;

GType
gst_vaapi_rate_control_get_type(void) G_GNUC_CONST;

/**
 * GST_VAAPI_POPCOUNT32:
 * @x: the value from which to compute population count
 *
 * Computes the number of bits set in the supplied 32-bit value @x.
 *
 * Return value: the number of bits set in @x
 */
#define GST_VAAPI_POPCOUNT32(x) \
    GST_VAAPI_POPCOUNT32_0(x)
#define GST_VAAPI_POPCOUNT32_0(x) \
    GST_VAAPI_POPCOUNT32_1((x) - (((x) >> 1) & 0x55555555))
#define GST_VAAPI_POPCOUNT32_1(x) \
    GST_VAAPI_POPCOUNT32_2(((x) & 0x33333333) + (((x) >> 2) & 0x33333333))
#define GST_VAAPI_POPCOUNT32_2(x) \
    GST_VAAPI_POPCOUNT32_3((x) + ((x) >> 4))
#define GST_VAAPI_POPCOUNT32_3(x) \
    GST_VAAPI_POPCOUNT32_4((x) & 0x0f0f0f0f)
#define GST_VAAPI_POPCOUNT32_4(x) \
    (((x) * 0x01010101) >> 24)

/* --- GstVaapiEnumSubset --- */

/**
 * GstVaapiEnumSubset:
 * @name: name of the enum subset
 * @parent_type: parent enum type
 * @type: registered #GType
 * @type_info: #GTypeInfo used to build the @type
 * @values: pointer to a static array of #GEnumValue elements
 * @num_values: number of elements in the @values array, including the
 *   terminator
 *
 * Structure that holds the required information to build a GEnum
 * subset from the supplied @parent_type, i.e. a subset of its values.
 */
typedef struct {
    GType parent_type;
    GType type;
    GTypeInfo type_info;
    const gchar *type_name;
    GEnumValue *values;
    guint num_values;
} GstVaapiEnumSubset;

G_GNUC_INTERNAL
GType
gst_vaapi_type_define_enum_subset_from_mask(GstVaapiEnumSubset *subset,
    guint32 mask);

#define GST_VAAPI_TYPE_DEFINE_ENUM_SUBSET_FROM_MASK(NAME, name, TYPE, MASK) \
static GType                                                            \
G_PASTE(name,_get_type)(void)                                           \
{                                                                       \
    static GEnumValue enum_values[GST_VAAPI_POPCOUNT32(MASK) + 1];      \
    static GstVaapiEnumSubset subset = {                                \
        .type_name = G_STRINGIFY(NAME),                                 \
        .values = enum_values,                                          \
        .num_values = G_N_ELEMENTS(enum_values),                        \
    };                                                                  \
    if (g_once_init_enter(&subset.parent_type))                         \
        g_once_init_leave(&subset.parent_type, TYPE);                   \
    return gst_vaapi_type_define_enum_subset_from_mask(&subset, MASK);  \
}

G_GNUC_INTERNAL
const gchar *
gst_vaapi_enum_type_get_nick (GType type, gint value);

G_END_DECLS

#endif /* GST_VAAPI_VALUE_H */