37
37
/* ------------------------------------------------------------------------- */
39
39
#define GST_VAAPI_PICTURE_CAST(obj) \
40
((GstVaapiPicture *)(obj))
40
((GstVaapiPicture *) (obj))
42
42
#define GST_VAAPI_PICTURE(obj) \
43
GST_VAAPI_PICTURE_CAST(obj)
43
GST_VAAPI_PICTURE_CAST (obj)
45
45
#define GST_VAAPI_IS_PICTURE(obj) \
46
(GST_VAAPI_PICTURE(obj) != NULL)
46
(GST_VAAPI_PICTURE (obj) != NULL)
49
GST_VAAPI_PICTURE_TYPE_NONE = 0, // Undefined
50
GST_VAAPI_PICTURE_TYPE_I, // Intra
51
GST_VAAPI_PICTURE_TYPE_P, // Predicted
52
GST_VAAPI_PICTURE_TYPE_B, // Bi-directional predicted
53
GST_VAAPI_PICTURE_TYPE_S, // S(GMC)-VOP (MPEG-4)
54
GST_VAAPI_PICTURE_TYPE_SI, // Switching Intra
55
GST_VAAPI_PICTURE_TYPE_SP, // Switching Predicted
56
GST_VAAPI_PICTURE_TYPE_BI, // BI type (VC-1)
50
GST_VAAPI_PICTURE_TYPE_NONE = 0, // Undefined
51
GST_VAAPI_PICTURE_TYPE_I, // Intra
52
GST_VAAPI_PICTURE_TYPE_P, // Predicted
53
GST_VAAPI_PICTURE_TYPE_B, // Bi-directional predicted
54
GST_VAAPI_PICTURE_TYPE_S, // S(GMC)-VOP (MPEG-4)
55
GST_VAAPI_PICTURE_TYPE_SI, // Switching Intra
56
GST_VAAPI_PICTURE_TYPE_SP, // Switching Predicted
57
GST_VAAPI_PICTURE_TYPE_BI, // BI type (VC-1)
57
58
} GstVaapiPictureType;
64
65
* @GST_VAAPI_PICTURE_FLAG_INTERLACED: interlaced frame
65
66
* @GST_VAAPI_PICTURE_FLAG_FF: first-field
66
67
* @GST_VAAPI_PICTURE_FLAG_TFF: top-field-first
68
* @GST_VAAPI_PICTURE_FLAG_ONEFIELD: only one field is valid
69
* @GST_VAAPI_PICTURE_FLAG_MVC: multiview component
67
70
* @GST_VAAPI_PICTURE_FLAG_LAST: first flag that can be used by subclasses
69
72
* Enum values used for #GstVaapiPicture flags.
72
GST_VAAPI_PICTURE_FLAG_SKIPPED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 0),
73
GST_VAAPI_PICTURE_FLAG_REFERENCE = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 1),
74
GST_VAAPI_PICTURE_FLAG_OUTPUT = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 2),
75
GST_VAAPI_PICTURE_FLAG_INTERLACED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
76
GST_VAAPI_PICTURE_FLAG_FF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 4),
77
GST_VAAPI_PICTURE_FLAG_TFF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
78
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
76
GST_VAAPI_PICTURE_FLAG_SKIPPED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 0),
77
GST_VAAPI_PICTURE_FLAG_REFERENCE = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 1),
78
GST_VAAPI_PICTURE_FLAG_OUTPUT = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 2),
79
GST_VAAPI_PICTURE_FLAG_INTERLACED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
80
GST_VAAPI_PICTURE_FLAG_FF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 4),
81
GST_VAAPI_PICTURE_FLAG_TFF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
82
GST_VAAPI_PICTURE_FLAG_ONEFIELD = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
83
GST_VAAPI_PICTURE_FLAG_MVC = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 7),
84
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 8),
79
85
} GstVaapiPictureFlags;
81
87
#define GST_VAAPI_PICTURE_FLAGS GST_VAAPI_MINI_OBJECT_FLAGS
84
90
#define GST_VAAPI_PICTURE_FLAG_UNSET GST_VAAPI_MINI_OBJECT_FLAG_UNSET
86
92
#define GST_VAAPI_PICTURE_IS_SKIPPED(picture) \
87
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_SKIPPED)
93
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_SKIPPED)
89
95
#define GST_VAAPI_PICTURE_IS_REFERENCE(picture) \
90
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_REFERENCE)
96
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_REFERENCE)
92
98
#define GST_VAAPI_PICTURE_IS_OUTPUT(picture) \
93
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_OUTPUT)
99
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_OUTPUT)
95
101
#define GST_VAAPI_PICTURE_IS_INTERLACED(picture) \
96
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_INTERLACED)
102
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_INTERLACED)
98
104
#define GST_VAAPI_PICTURE_IS_FIRST_FIELD(picture) \
99
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_FF)
105
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_FF)
101
107
#define GST_VAAPI_PICTURE_IS_TFF(picture) \
102
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_TFF)
108
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_TFF)
110
#define GST_VAAPI_PICTURE_IS_ONEFIELD(picture) \
111
GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_ONEFIELD)
104
113
#define GST_VAAPI_PICTURE_IS_FRAME(picture) \
105
(GST_VAAPI_PICTURE(picture)->structure == GST_VAAPI_PICTURE_STRUCTURE_FRAME)
114
(GST_VAAPI_PICTURE (picture)->structure == GST_VAAPI_PICTURE_STRUCTURE_FRAME)
107
116
#define GST_VAAPI_PICTURE_IS_COMPLETE(picture) \
108
(GST_VAAPI_PICTURE_IS_FRAME(picture) || \
109
!GST_VAAPI_PICTURE_IS_FIRST_FIELD(picture))
117
(GST_VAAPI_PICTURE_IS_FRAME (picture) || \
118
GST_VAAPI_PICTURE_IS_ONEFIELD (picture) || \
119
!GST_VAAPI_PICTURE_IS_FIRST_FIELD (picture))
121
#define GST_VAAPI_PICTURE_IS_MVC(picture) \
122
(GST_VAAPI_PICTURE_FLAG_IS_SET (picture, GST_VAAPI_PICTURE_FLAG_MVC))
112
125
* GstVaapiPicture:
114
127
* A #GstVaapiCodecObject holding a picture parameter.
116
struct _GstVaapiPicture {
118
GstVaapiCodecObject parent_instance;
119
GstVaapiPicture *parent_picture;
120
GstVideoCodecFrame *frame;
121
GstVaapiSurface *surface;
122
GstVaapiSurfaceProxy *proxy;
129
struct _GstVaapiPicture
132
GstVaapiCodecObject parent_instance;
133
GstVaapiPicture *parent_picture;
134
GstVideoCodecFrame *frame;
135
GstVaapiSurface *surface;
136
GstVaapiSurfaceProxy *proxy;
127
GstVaapiPictureType type;
128
VASurfaceID surface_id;
131
GstVaapiIqMatrix *iq_matrix;
132
GstVaapiHuffmanTable *huf_table;
133
GstVaapiBitPlane *bitplane;
137
GstVaapiRectangle crop_rect;
138
guint has_crop_rect : 1;
141
GstVaapiPictureType type;
142
VASurfaceID surface_id;
145
GstVaapiIqMatrix *iq_matrix;
146
GstVaapiHuffmanTable *huf_table;
147
GstVaapiBitPlane *bitplane;
148
GstVaapiProbabilityTable *prob_table;
154
GstVaapiRectangle crop_rect;
155
guint has_crop_rect:1;
143
gst_vaapi_picture_destroy(GstVaapiPicture *picture);
147
gst_vaapi_picture_create(GstVaapiPicture *picture,
148
const GstVaapiCodecObjectConstructorArgs *args);
152
gst_vaapi_picture_new(
153
GstVaapiDecoder *decoder,
160
gst_vaapi_picture_new_field(GstVaapiPicture *picture);
164
gst_vaapi_picture_add_slice(GstVaapiPicture *picture, GstVaapiSlice *slice);
168
gst_vaapi_picture_decode(GstVaapiPicture *picture);
172
gst_vaapi_picture_output(GstVaapiPicture *picture);
176
gst_vaapi_picture_set_crop_rect(GstVaapiPicture *picture,
177
const GstVaapiRectangle *crop_rect);
179
static inline gpointer
180
gst_vaapi_picture_ref(gpointer ptr)
182
return gst_vaapi_mini_object_ref(GST_VAAPI_MINI_OBJECT(ptr));
186
gst_vaapi_picture_unref(gpointer ptr)
188
gst_vaapi_mini_object_unref(GST_VAAPI_MINI_OBJECT(ptr));
191
#define gst_vaapi_picture_replace(old_picture_p, new_picture) \
192
gst_vaapi_mini_object_replace((GstVaapiMiniObject **)(old_picture_p), \
193
(GstVaapiMiniObject *)(new_picture))
160
gst_vaapi_picture_destroy (GstVaapiPicture * picture);
164
gst_vaapi_picture_create (GstVaapiPicture * picture,
165
const GstVaapiCodecObjectConstructorArgs * args);
169
gst_vaapi_picture_new (GstVaapiDecoder * decoder,
170
gconstpointer param, guint param_size);
174
gst_vaapi_picture_new_field (GstVaapiPicture * picture);
178
gst_vaapi_picture_add_slice (GstVaapiPicture * picture, GstVaapiSlice * slice);
182
gst_vaapi_picture_decode (GstVaapiPicture * picture);
186
gst_vaapi_picture_output (GstVaapiPicture * picture);
190
gst_vaapi_picture_set_crop_rect (GstVaapiPicture * picture,
191
const GstVaapiRectangle * crop_rect);
193
#define gst_vaapi_picture_ref(picture) \
194
gst_vaapi_codec_object_ref (picture)
196
#define gst_vaapi_picture_unref(picture) \
197
gst_vaapi_codec_object_unref (picture)
199
#define gst_vaapi_picture_replace(old_picture_ptr, new_picture) \
200
gst_vaapi_codec_object_replace (old_picture_ptr, new_picture)
195
202
/* ------------------------------------------------------------------------- */
196
203
/* --- Slices --- */
197
204
/* ------------------------------------------------------------------------- */
199
206
#define GST_VAAPI_SLICE_CAST(obj) \
200
((GstVaapiSlice *)(obj))
207
((GstVaapiSlice *) (obj))
202
209
#define GST_VAAPI_SLICE(obj) \
203
GST_VAAPI_SLICE_CAST(obj)
210
GST_VAAPI_SLICE_CAST (obj)
205
212
#define GST_VAAPI_IS_SLICE(obj) \
206
(GST_VAAPI_SLICE(obj) != NULL)
213
(GST_VAAPI_SLICE (obj) != NULL)
211
218
* A #GstVaapiCodecObject holding a slice parameter.
213
struct _GstVaapiSlice {
215
GstVaapiCodecObject parent_instance;
222
/* Per-slice overrides */
223
GstVaapiHuffmanTable *huf_table;
220
struct _GstVaapiSlice
223
GstVaapiCodecObject parent_instance;
230
/* Per-slice overrides */
231
GstVaapiHuffmanTable *huf_table;
228
gst_vaapi_slice_destroy(GstVaapiSlice *slice);
236
gst_vaapi_slice_destroy (GstVaapiSlice * slice);
232
gst_vaapi_slice_create(GstVaapiSlice *slice,
233
const GstVaapiCodecObjectConstructorArgs *args);
240
gst_vaapi_slice_create (GstVaapiSlice * slice,
241
const GstVaapiCodecObjectConstructorArgs * args);
238
GstVaapiDecoder *decoder,
245
gst_vaapi_slice_new (GstVaapiDecoder * decoder, gconstpointer param,
246
guint param_size, const guchar * data, guint data_size);
245
248
/* ------------------------------------------------------------------------- */
246
249
/* --- Helpers to create codec-dependent objects --- */
247
250
/* ------------------------------------------------------------------------- */
249
#define GST_VAAPI_PICTURE_NEW(codec, decoder) \
250
gst_vaapi_picture_new(GST_VAAPI_DECODER_CAST(decoder), \
251
NULL, sizeof(VAPictureParameterBuffer##codec))
252
#define GST_VAAPI_PICTURE_NEW(codec, decoder) \
253
gst_vaapi_picture_new (GST_VAAPI_DECODER_CAST (decoder), \
254
NULL, sizeof (G_PASTE (VAPictureParameterBuffer, codec)))
253
#define GST_VAAPI_SLICE_NEW(codec, decoder, buf, buf_size) \
254
gst_vaapi_slice_new(GST_VAAPI_DECODER_CAST(decoder), \
255
NULL, sizeof(VASliceParameterBuffer##codec), \
256
#define GST_VAAPI_SLICE_NEW(codec, decoder, buf, buf_size) \
257
gst_vaapi_slice_new (GST_VAAPI_DECODER_CAST (decoder), \
258
NULL, sizeof (G_PASTE (VASliceParameterBuffer, codec)), \