decoder: get rid of GstVaapiDecoderUnit::buffer field.
[vaapi:gstreamer-vaapi.git] / gst-libs / gst / vaapi / gstvaapidecoder_unit.h
1 /*
2  *  gstvaapidecoder_unit.h - VA decoder units
3  *
4  *  Copyright (C) 2012-2013 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 #ifndef GST_VAAPI_DECODER_UNIT_H
23 #define GST_VAAPI_DECODER_UNIT_H
24
25 G_BEGIN_DECLS
26
27 typedef struct _GstVaapiDecoderUnit             GstVaapiDecoderUnit;
28
29 #define GST_VAAPI_DECODER_UNIT(unit) \
30     ((GstVaapiDecoderUnit *)(unit))
31
32 #define GST_VAAPI_IS_DECODER_UNIT(unit) \
33     (GST_VAAPI_DECODER_UNIT(unit) != NULL)
34
35 /**
36  * GstVaapiDecoderUnitFlags:
37  * @GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START: marks the start of a frame.
38  * @GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END: marks the end of a frame.
39  * @GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END: marks the end of a stream.
40  * @GST_VAAPI_DECODER_UNIT_FLAG_SLICE: the unit contains slice data.
41  * @GST_VAAPI_DECODER_UNIT_FLAG_SKIP: marks the unit as unused/skipped.
42  *
43  * Flags for #GstVaapiDecoderUnit.
44  */
45 typedef enum {
46     GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START = (1 << 0),
47     GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END   = (1 << 1),
48     GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END  = (1 << 2),
49     GST_VAAPI_DECODER_UNIT_FLAG_SLICE       = (1 << 3),
50     GST_VAAPI_DECODER_UNIT_FLAG_SKIP        = (1 << 4),
51     GST_VAAPI_DECODER_UNIT_FLAG_LAST        = (1 << 5)
52 } GstVaapiDecoderUnitFlags;
53
54 /**
55  * GST_VAAPI_DECODER_UNIT_FLAGS:
56  * @unit: a #GstVaapiDecoderUnit
57  *
58  * The entire set of flags for the @unit
59  */
60 #define GST_VAAPI_DECODER_UNIT_FLAGS(unit) \
61     ((unit)->flags)
62
63 /**
64  * GST_VAAPI_DECODER_UNIT_FLAG_IS_SET:
65  * @unit: a #GstVaapiDecoderUnit
66  * @flag: a flag to check for
67  *
68  * Checks whether the given @flag is set
69  */
70 #define GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, flag) \
71     ((GST_VAAPI_DECODER_UNIT_FLAGS(unit) & (flag)) != 0)
72
73 /**
74  * GST_VAAPI_DECODER_UNIT_FLAG_SET:
75  * @unit: a #GstVaapiDecoderUnit
76  * @flags: flags to set
77  *
78  * This macro sets the given bits
79  */
80 #define GST_VAAPI_DECODER_UNIT_FLAG_SET(unit, flags) \
81     (GST_VAAPI_DECODER_UNIT_FLAGS(unit) |= (flags))
82
83 /**
84  * GST_VAAPI_DECODER_UNIT_FLAG_UNSET:
85  * @unit: a #GstVaapiDecoderUnit
86  * @flags: flags to unset
87  *
88  * This macro unsets the given bits.
89  */
90 #define GST_VAAPI_DECODER_UNIT_FLAG_UNSET(unit, flags) \
91     (GST_VAAPI_DECODER_UNIT_FLAGS(unit) &= ~(flags))
92
93 /**
94  * GST_VAAPI_DECODER_UNIT_IS_FRAME_START:
95  * @unit: a #GstVaapiDecoderUnit
96  *
97  * Tests if the decoder unit marks the start of a frame.
98  *
99  * The start of a frame is codec dependent but it may include any new
100  * sequence header.
101  */
102 #define GST_VAAPI_DECODER_UNIT_IS_FRAME_START(unit) \
103     (GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit,   \
104         GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START))
105
106 /**
107  * GST_VAAPI_DECODER_UNIT_IS_FRAME_END:
108  * @unit: a #GstVaapiDecoderUnit
109  *
110  * Tests if the decoder unit marks the end of a frame.
111  *
112  * The end of a frame is codec dependent but it is usually represented
113  * by the last bitstream chunk that holds valid slice data.
114  */
115 #define GST_VAAPI_DECODER_UNIT_IS_FRAME_END(unit) \
116     (GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit,   \
117         GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END))
118
119 /**
120  * GST_VAAPI_DECODER_UNIT_IS_STREAM_END:
121  * @unit: a #GstVaapiDecoderUnit
122  *
123  * Tests if the decoder unit marks the end of the stream.
124  */
125 #define GST_VAAPI_DECODER_UNIT_IS_STREAM_END(unit) \
126     (GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit,   \
127         GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END))
128
129 /**
130  * GST_VAAPI_DECODER_UNIT_IS_SLICE:
131  * @unit: a #GstVaapiDecoderUnit
132  *
133  * Tests if the decoder unit contains slice data.
134  */
135 #define GST_VAAPI_DECODER_UNIT_IS_SLICE(unit) \
136     (GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit,   \
137         GST_VAAPI_DECODER_UNIT_FLAG_SLICE))
138
139 /**
140  * GST_VAAPI_DECODER_UNIT_IS_SKIPPED:
141  * @unit: a #GstVaapiDecoderUnit
142  *
143  * Tests if the decoder unit is not needed for decoding an can be skipped.
144  * i.e. #GstVaapiDecoder sub-classes won't see this chunk of bitstream
145  * data.
146  */
147 #define GST_VAAPI_DECODER_UNIT_IS_SKIPPED(unit) \
148     (GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit,   \
149         GST_VAAPI_DECODER_UNIT_FLAG_SKIP))
150
151 /**
152  * GstVaapiDecoderUnit:
153  * @size: size in bytes of this bitstream unit
154  * @offset: relative offset in bytes to bitstream unit within the
155  *    associated #GstVideoCodecFrame input_buffer
156  * @parsed_info: parser-specific data (this is codec specific)
157  * @parsed_info_destroy_notify: function used to release @parsed_info data
158  *
159  * A chunk of bitstream data that was parsed.
160  */
161 struct _GstVaapiDecoderUnit {
162     guint               flags;
163     guint               size;
164     guint               offset;
165     gpointer            parsed_info;
166     GDestroyNotify      parsed_info_destroy_notify;
167 };
168
169 G_GNUC_INTERNAL
170 void
171 gst_vaapi_decoder_unit_init(GstVaapiDecoderUnit *unit);
172
173 G_GNUC_INTERNAL
174 void
175 gst_vaapi_decoder_unit_clear(GstVaapiDecoderUnit *unit);
176
177 G_GNUC_INTERNAL
178 GstVaapiDecoderUnit *
179 gst_vaapi_decoder_unit_new(void);
180
181 G_GNUC_INTERNAL
182 void
183 gst_vaapi_decoder_unit_set_parsed_info(GstVaapiDecoderUnit *unit,
184     gpointer parsed_info, GDestroyNotify destroy_notify);
185
186 G_END_DECLS
187
188 #endif /* GST_VAAPI_DECODER_UNIT_H */