1 | /* GStreamer |
2 | * Copyright (C) <2011> Wim Taymans <wim.taymans@gmail.com> |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Library General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Library General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Library General Public |
15 | * License along with this library; if not, write to the |
16 | * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
17 | * Boston, MA 02110-1301, USA. |
18 | */ |
19 | |
20 | #ifndef __GST_VIDEO_INFO_H__ |
21 | #define __GST_VIDEO_INFO_H__ |
22 | |
23 | #include <gst/gst.h> |
24 | #include <gst/video/video-format.h> |
25 | #include <gst/video/video-color.h> |
26 | |
27 | G_BEGIN_DECLS |
28 | |
29 | #include <gst/video/video-enumtypes.h> |
30 | |
31 | typedef struct _GstVideoInfo GstVideoInfo; |
32 | |
33 | /** |
34 | * GST_CAPS_FEATURE_FORMAT_INTERLACED: |
35 | * |
36 | * Name of the caps feature indicating that the stream is interlaced. |
37 | * |
38 | * Currently it is only used for video with 'interlace-mode=alternate' |
39 | * to ensure backwards compatibility for this new mode. |
40 | * In this mode each buffer carries a single field of interlaced video. |
41 | * @GST_VIDEO_BUFFER_FLAG_TOP_FIELD and @GST_VIDEO_BUFFER_FLAG_BOTTOM_FIELD |
42 | * indicate whether the buffer carries a top or bottom field. The order of |
43 | * buffers/fields in the stream and the timestamps on the buffers indicate the |
44 | * temporal order of the fields. |
45 | * Top and bottom fields are expected to alternate in this mode. |
46 | * The frame rate in the caps still signals the frame rate, so the notional field |
47 | * rate will be twice the frame rate from the caps |
48 | * (see @GST_VIDEO_INFO_FIELD_RATE_N). |
49 | * |
50 | * Since: 1.16. |
51 | */ |
52 | #define GST_CAPS_FEATURE_FORMAT_INTERLACED "format:Interlaced" |
53 | |
54 | /** |
55 | * GstVideoInterlaceMode: |
56 | * @GST_VIDEO_INTERLACE_MODE_PROGRESSIVE: all frames are progressive |
57 | * @GST_VIDEO_INTERLACE_MODE_INTERLEAVED: 2 fields are interleaved in one video |
58 | * frame. Extra buffer flags describe the field order. |
59 | * @GST_VIDEO_INTERLACE_MODE_MIXED: frames contains both interlaced and |
60 | * progressive video, the buffer flags describe the frame and fields. |
61 | * @GST_VIDEO_INTERLACE_MODE_FIELDS: 2 fields are stored in one buffer, use the |
62 | * frame ID to get access to the required field. For multiview (the |
63 | * 'views' property > 1) the fields of view N can be found at frame ID |
64 | * (N * 2) and (N * 2) + 1. |
65 | * Each field has only half the amount of lines as noted in the |
66 | * height property. This mode requires multiple GstVideoMeta metadata |
67 | * to describe the fields. |
68 | * @GST_VIDEO_INTERLACE_MODE_ALTERNATE: 1 field is stored in one buffer, |
69 | * @GST_VIDEO_BUFFER_FLAG_TF or @GST_VIDEO_BUFFER_FLAG_BF indicates if |
70 | * the buffer is carrying the top or bottom field, respectively. The top and |
71 | * bottom buffers must alternate in the pipeline, with this mode |
72 | * (Since: 1.16). |
73 | * |
74 | * The possible values of the #GstVideoInterlaceMode describing the interlace |
75 | * mode of the stream. |
76 | */ |
77 | typedef enum { |
78 | GST_VIDEO_INTERLACE_MODE_PROGRESSIVE = 0, |
79 | GST_VIDEO_INTERLACE_MODE_INTERLEAVED, |
80 | GST_VIDEO_INTERLACE_MODE_MIXED, |
81 | GST_VIDEO_INTERLACE_MODE_FIELDS, |
82 | GST_VIDEO_INTERLACE_MODE_ALTERNATE, |
83 | } GstVideoInterlaceMode; |
84 | |
85 | GST_VIDEO_API |
86 | const gchar * gst_video_interlace_mode_to_string (GstVideoInterlaceMode mode); |
87 | |
88 | GST_VIDEO_API |
89 | GstVideoInterlaceMode gst_video_interlace_mode_from_string (const gchar * mode); |
90 | |
91 | /** |
92 | * GstVideoMultiviewMode: |
93 | * @GST_VIDEO_MULTIVIEW_MODE_NONE: A special value indicating |
94 | * no multiview information. Used in GstVideoInfo and other places to |
95 | * indicate that no specific multiview handling has been requested or |
96 | * provided. This value is never carried on caps. |
97 | * @GST_VIDEO_MULTIVIEW_MODE_MONO: All frames are monoscopic. |
98 | * @GST_VIDEO_MULTIVIEW_MODE_LEFT: All frames represent a left-eye view. |
99 | * @GST_VIDEO_MULTIVIEW_MODE_RIGHT: All frames represent a right-eye view. |
100 | * @GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE: Left and right eye views are |
101 | * provided in the left and right half of the frame respectively. |
102 | * @GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX: Left and right eye |
103 | * views are provided in the left and right half of the frame, but |
104 | * have been sampled using quincunx method, with half-pixel offset |
105 | * between the 2 views. |
106 | * @GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED: Alternating vertical |
107 | * columns of pixels represent the left and right eye view respectively. |
108 | * @GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED: Alternating horizontal |
109 | * rows of pixels represent the left and right eye view respectively. |
110 | * @GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM: The top half of the frame |
111 | * contains the left eye, and the bottom half the right eye. |
112 | * @GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD: Pixels are arranged with |
113 | * alternating pixels representing left and right eye views in a |
114 | * checkerboard fashion. |
115 | * @GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME: Left and right eye views |
116 | * are provided in separate frames alternately. |
117 | * @GST_VIDEO_MULTIVIEW_MODE_MULTIVIEW_FRAME_BY_FRAME: Multiple |
118 | * independent views are provided in separate frames in sequence. |
119 | * This method only applies to raw video buffers at the moment. |
120 | * Specific view identification is via the `GstVideoMultiviewMeta` |
121 | * and #GstVideoMeta(s) on raw video buffers. |
122 | * @GST_VIDEO_MULTIVIEW_MODE_SEPARATED: Multiple views are |
123 | * provided as separate #GstMemory framebuffers attached to each |
124 | * #GstBuffer, described by the `GstVideoMultiviewMeta` |
125 | * and #GstVideoMeta(s) |
126 | * |
127 | * All possible stereoscopic 3D and multiview representations. |
128 | * In conjunction with #GstVideoMultiviewFlags, describes how |
129 | * multiview content is being transported in the stream. |
130 | */ |
131 | typedef enum { |
132 | GST_VIDEO_MULTIVIEW_MODE_NONE = -1, |
133 | GST_VIDEO_MULTIVIEW_MODE_MONO = 0, |
134 | /* Single view modes */ |
135 | GST_VIDEO_MULTIVIEW_MODE_LEFT, |
136 | GST_VIDEO_MULTIVIEW_MODE_RIGHT, |
137 | /* Stereo view modes */ |
138 | GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE, |
139 | GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX, |
140 | GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED, |
141 | GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED, |
142 | GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM, |
143 | GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD, |
144 | /* Padding for new frame packing modes */ |
145 | |
146 | GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME = 32, |
147 | /* Multivew mode(s) */ |
148 | GST_VIDEO_MULTIVIEW_MODE_MULTIVIEW_FRAME_BY_FRAME, |
149 | GST_VIDEO_MULTIVIEW_MODE_SEPARATED |
150 | /* future expansion for annotated modes */ |
151 | } GstVideoMultiviewMode; |
152 | |
153 | /** |
154 | * GstVideoMultiviewFramePacking: |
155 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE: A special value indicating |
156 | * no frame packing info. |
157 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_MONO: All frames are monoscopic. |
158 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_LEFT: All frames represent a left-eye view. |
159 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_RIGHT: All frames represent a right-eye view. |
160 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_SIDE_BY_SIDE: Left and right eye views are |
161 | * provided in the left and right half of the frame respectively. |
162 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_SIDE_BY_SIDE_QUINCUNX: Left and right eye |
163 | * views are provided in the left and right half of the frame, but |
164 | * have been sampled using quincunx method, with half-pixel offset |
165 | * between the 2 views. |
166 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_COLUMN_INTERLEAVED: Alternating vertical |
167 | * columns of pixels represent the left and right eye view respectively. |
168 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_ROW_INTERLEAVED: Alternating horizontal |
169 | * rows of pixels represent the left and right eye view respectively. |
170 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_TOP_BOTTOM: The top half of the frame |
171 | * contains the left eye, and the bottom half the right eye. |
172 | * @GST_VIDEO_MULTIVIEW_FRAME_PACKING_CHECKERBOARD: Pixels are arranged with |
173 | * alternating pixels representing left and right eye views in a |
174 | * checkerboard fashion. |
175 | * |
176 | * #GstVideoMultiviewFramePacking represents the subset of #GstVideoMultiviewMode |
177 | * values that can be applied to any video frame without needing extra metadata. |
178 | * It can be used by elements that provide a property to override the |
179 | * multiview interpretation of a video stream when the video doesn't contain |
180 | * any markers. |
181 | * |
182 | * This enum is used (for example) on playbin, to re-interpret a played |
183 | * video stream as a stereoscopic video. The individual enum values are |
184 | * equivalent to and have the same value as the matching #GstVideoMultiviewMode. |
185 | * |
186 | */ |
187 | typedef enum { |
188 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE = GST_VIDEO_MULTIVIEW_MODE_NONE, |
189 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_MONO = GST_VIDEO_MULTIVIEW_MODE_MONO, |
190 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_LEFT = GST_VIDEO_MULTIVIEW_MODE_LEFT, |
191 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_RIGHT = GST_VIDEO_MULTIVIEW_MODE_RIGHT, |
192 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_SIDE_BY_SIDE = GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE, |
193 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_SIDE_BY_SIDE_QUINCUNX = GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX, |
194 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_COLUMN_INTERLEAVED = GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED, |
195 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_ROW_INTERLEAVED = GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED, |
196 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_TOP_BOTTOM = GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM, |
197 | GST_VIDEO_MULTIVIEW_FRAME_PACKING_CHECKERBOARD = GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD |
198 | } GstVideoMultiviewFramePacking; |
199 | |
200 | #define GST_VIDEO_MULTIVIEW_MAX_FRAME_PACKING GST_VIDEO_MULTIVIEW_FRAME_PACKING_CHECKERBOARD |
201 | |
202 | /** |
203 | * GstVideoMultiviewFlags: |
204 | * @GST_VIDEO_MULTIVIEW_FLAGS_NONE: No flags |
205 | * @GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST: For stereo streams, the |
206 | * normal arrangement of left and right views is reversed. |
207 | * @GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLIPPED: The left view is vertically |
208 | * mirrored. |
209 | * @GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLOPPED: The left view is horizontally |
210 | * mirrored. |
211 | * @GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLIPPED: The right view is |
212 | * vertically mirrored. |
213 | * @GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLOPPED: The right view is |
214 | * horizontally mirrored. |
215 | * @GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT: For frame-packed |
216 | * multiview modes, indicates that the individual |
217 | * views have been encoded with half the true width or height |
218 | * and should be scaled back up for display. This flag |
219 | * is used for overriding input layout interpretation |
220 | * by adjusting pixel-aspect-ratio. |
221 | * For side-by-side, column interleaved or checkerboard packings, the |
222 | * pixel width will be doubled. For row interleaved and top-bottom |
223 | * encodings, pixel height will be doubled. |
224 | * @GST_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO: The video stream contains both |
225 | * mono and multiview portions, signalled on each buffer by the |
226 | * absence or presence of the @GST_VIDEO_BUFFER_FLAG_MULTIPLE_VIEW |
227 | * buffer flag. |
228 | * |
229 | * GstVideoMultiviewFlags are used to indicate extra properties of a |
230 | * stereo/multiview stream beyond the frame layout and buffer mapping |
231 | * that is conveyed in the #GstVideoMultiviewMode. |
232 | */ |
233 | typedef enum { |
234 | GST_VIDEO_MULTIVIEW_FLAGS_NONE = 0, |
235 | GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST = (1 << 0), |
236 | GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLIPPED = (1 << 1), |
237 | GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLOPPED = (1 << 2), |
238 | GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLIPPED = (1 << 3), |
239 | GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLOPPED = (1 << 4), |
240 | GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT = (1 << 14), |
241 | GST_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO = (1 << 15) |
242 | } GstVideoMultiviewFlags; |
243 | |
244 | /** |
245 | * GstVideoFlags: |
246 | * @GST_VIDEO_FLAG_NONE: no flags |
247 | * @GST_VIDEO_FLAG_VARIABLE_FPS: a variable fps is selected, fps_n and fps_d |
248 | * denote the maximum fps of the video |
249 | * @GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA: Each color has been scaled by the alpha |
250 | * value. |
251 | * |
252 | * Extra video flags |
253 | */ |
254 | typedef enum { |
255 | GST_VIDEO_FLAG_NONE = 0, |
256 | GST_VIDEO_FLAG_VARIABLE_FPS = (1 << 0), |
257 | GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA = (1 << 1) |
258 | } GstVideoFlags; |
259 | |
260 | /** |
261 | * GstVideoFieldOrder: |
262 | * @GST_VIDEO_FIELD_ORDER_UNKNOWN: unknown field order for interlaced content. |
263 | * The actual field order is signalled via buffer flags. |
264 | * @GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST: top field is first |
265 | * @GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST: bottom field is first |
266 | * |
267 | * Field order of interlaced content. This is only valid for |
268 | * interlace-mode=interleaved and not interlace-mode=mixed. In the case of |
269 | * mixed or GST_VIDEO_FIELD_ORDER_UNKOWN, the field order is signalled via |
270 | * buffer flags. |
271 | * |
272 | * Since: 1.12 |
273 | */ |
274 | typedef enum { |
275 | GST_VIDEO_FIELD_ORDER_UNKNOWN = 0, |
276 | GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST = 1, |
277 | GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST = 2, |
278 | } GstVideoFieldOrder; |
279 | |
280 | GST_VIDEO_API |
281 | const gchar * gst_video_field_order_to_string (GstVideoFieldOrder order); |
282 | |
283 | GST_VIDEO_API |
284 | GstVideoFieldOrder gst_video_field_order_from_string (const gchar * order); |
285 | |
286 | /** |
287 | * GstVideoInfo: |
288 | * @finfo: the format info of the video |
289 | * @interlace_mode: the interlace mode |
290 | * @flags: additional video flags |
291 | * @width: the width of the video |
292 | * @height: the height of the video |
293 | * @views: the number of views for multiview video |
294 | * @size: the default size of one frame |
295 | * @chroma_site: a #GstVideoChromaSite. |
296 | * @colorimetry: the colorimetry info |
297 | * @par_n: the pixel-aspect-ratio numerator |
298 | * @par_d: the pixel-aspect-ratio denominator |
299 | * @fps_n: the framerate numerator |
300 | * @fps_d: the framerate denominator |
301 | * @offset: offsets of the planes |
302 | * @stride: strides of the planes |
303 | * @multiview_mode: delivery mode for multiple views. (Since: 1.6) |
304 | * @multiview_flags: flags for multiple views configuration (Since: 1.6) |
305 | * |
306 | * Information describing image properties. This information can be filled |
307 | * in from GstCaps with gst_video_info_from_caps(). The information is also used |
308 | * to store the specific video info when mapping a video frame with |
309 | * gst_video_frame_map(). |
310 | * |
311 | * Use the provided macros to access the info in this structure. |
312 | */ |
313 | struct _GstVideoInfo { |
314 | const GstVideoFormatInfo *finfo; |
315 | |
316 | GstVideoInterlaceMode interlace_mode; |
317 | GstVideoFlags flags; |
318 | gint width; |
319 | gint height; |
320 | gsize size; |
321 | gint views; |
322 | |
323 | GstVideoChromaSite chroma_site; |
324 | GstVideoColorimetry colorimetry; |
325 | |
326 | gint par_n; |
327 | gint par_d; |
328 | gint fps_n; |
329 | gint fps_d; |
330 | |
331 | gsize offset[GST_VIDEO_MAX_PLANES]; |
332 | gint stride[GST_VIDEO_MAX_PLANES]; |
333 | |
334 | /* Union preserves padded struct size for backwards compat |
335 | * Consumer code should use the accessor macros for fields */ |
336 | union { |
337 | struct { /* < skip > */ |
338 | GstVideoMultiviewMode multiview_mode; |
339 | GstVideoMultiviewFlags multiview_flags; |
340 | GstVideoFieldOrder field_order; |
341 | } abi; |
342 | /*< private >*/ |
343 | gpointer _gst_reserved[GST_PADDING]; |
344 | } ABI; |
345 | }; |
346 | |
347 | #define GST_TYPE_VIDEO_INFO (gst_video_info_get_type ()) |
348 | GST_VIDEO_API |
349 | GType gst_video_info_get_type (void); |
350 | |
351 | /* general info */ |
352 | #define GST_VIDEO_INFO_FORMAT(i) (GST_VIDEO_FORMAT_INFO_FORMAT((i)->finfo)) |
353 | #define GST_VIDEO_INFO_NAME(i) (GST_VIDEO_FORMAT_INFO_NAME((i)->finfo)) |
354 | #define GST_VIDEO_INFO_IS_YUV(i) (GST_VIDEO_FORMAT_INFO_IS_YUV((i)->finfo)) |
355 | #define GST_VIDEO_INFO_IS_RGB(i) (GST_VIDEO_FORMAT_INFO_IS_RGB((i)->finfo)) |
356 | #define GST_VIDEO_INFO_IS_GRAY(i) (GST_VIDEO_FORMAT_INFO_IS_GRAY((i)->finfo)) |
357 | #define GST_VIDEO_INFO_HAS_ALPHA(i) (GST_VIDEO_FORMAT_INFO_HAS_ALPHA((i)->finfo)) |
358 | |
359 | #define GST_VIDEO_INFO_INTERLACE_MODE(i) ((i)->interlace_mode) |
360 | #define GST_VIDEO_INFO_IS_INTERLACED(i) ((i)->interlace_mode != GST_VIDEO_INTERLACE_MODE_PROGRESSIVE) |
361 | #define GST_VIDEO_INFO_FIELD_ORDER(i) ((i)->ABI.abi.field_order) |
362 | #define GST_VIDEO_INFO_FLAGS(i) ((i)->flags) |
363 | #define GST_VIDEO_INFO_WIDTH(i) ((i)->width) |
364 | #define GST_VIDEO_INFO_HEIGHT(i) ((i)->height) |
365 | /** |
366 | * GST_VIDEO_INFO_FIELD_HEIGHT: |
367 | * |
368 | * The height of a field. It's the height of the full frame unless split-field |
369 | * (alternate) interlacing is in use. |
370 | * |
371 | * Since: 1.16. |
372 | */ |
373 | #define GST_VIDEO_INFO_FIELD_HEIGHT(i) ((i)->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE? GST_ROUND_UP_2 ((i)->height) / 2 : (i)->height) |
374 | #define GST_VIDEO_INFO_SIZE(i) ((i)->size) |
375 | #define GST_VIDEO_INFO_VIEWS(i) ((i)->views) |
376 | #define GST_VIDEO_INFO_PAR_N(i) ((i)->par_n) |
377 | #define GST_VIDEO_INFO_PAR_D(i) ((i)->par_d) |
378 | #define GST_VIDEO_INFO_FPS_N(i) ((i)->fps_n) |
379 | #define GST_VIDEO_INFO_FIELD_RATE_N(i) ((GST_VIDEO_INFO_INTERLACE_MODE ((i)) == \ |
380 | GST_VIDEO_INTERLACE_MODE_ALTERNATE) ? \ |
381 | (i)->fps_n * 2 : (i)->fps_n) |
382 | #define GST_VIDEO_INFO_FPS_D(i) ((i)->fps_d) |
383 | |
384 | #define GST_VIDEO_INFO_COLORIMETRY(i) ((i)->colorimetry) |
385 | #define GST_VIDEO_INFO_CHROMA_SITE(i) ((i)->chroma_site) |
386 | |
387 | #define GST_VIDEO_INFO_MULTIVIEW_MODE(i) ((i)->ABI.abi.multiview_mode) |
388 | #define GST_VIDEO_INFO_MULTIVIEW_FLAGS(i) ((i)->ABI.abi.multiview_flags) |
389 | |
390 | /* dealing with GstVideoInfo flags */ |
391 | #define GST_VIDEO_INFO_FLAG_IS_SET(i,flag) ((GST_VIDEO_INFO_FLAGS(i) & (flag)) == (flag)) |
392 | #define GST_VIDEO_INFO_FLAG_SET(i,flag) (GST_VIDEO_INFO_FLAGS(i) |= (flag)) |
393 | #define GST_VIDEO_INFO_FLAG_UNSET(i,flag) (GST_VIDEO_INFO_FLAGS(i) &= ~(flag)) |
394 | |
395 | /* dealing with planes */ |
396 | #define GST_VIDEO_INFO_N_PLANES(i) (GST_VIDEO_FORMAT_INFO_N_PLANES((i)->finfo)) |
397 | #define GST_VIDEO_INFO_PLANE_OFFSET(i,p) ((i)->offset[p]) |
398 | #define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[p]) |
399 | /** |
400 | * GST_VIDEO_INFO_PLANE_HEIGHT: |
401 | * |
402 | * The padded height in pixels of a plane (padded size divided by the plane stride). |
403 | * In case of GST_VIDEO_INTERLACE_MODE_ALTERNATE info, this macro returns the |
404 | * plane heights used to hold a single field, not the full frame. |
405 | * |
406 | * The size passed as third argument is the size of the pixel data and should |
407 | * not contain any extra metadata padding. |
408 | * |
409 | * It is not valid to use this macro with a TILED format. |
410 | * |
411 | * Since: 1.18 |
412 | */ |
413 | #define GST_VIDEO_INFO_PLANE_HEIGHT(i,p,sizes) ((i)->stride[p] == 0 ? 0 : sizes[p] / (i)->stride[p]) |
414 | |
415 | /* dealing with components */ |
416 | #define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo) |
417 | #define GST_VIDEO_INFO_COMP_DEPTH(i,c) GST_VIDEO_FORMAT_INFO_DEPTH((i)->finfo,(c)) |
418 | #define GST_VIDEO_INFO_COMP_DATA(i,d,c) GST_VIDEO_FORMAT_INFO_DATA((i)->finfo,d,(c)) |
419 | #define GST_VIDEO_INFO_COMP_OFFSET(i,c) GST_VIDEO_FORMAT_INFO_OFFSET((i)->finfo,(i)->offset,(c)) |
420 | #define GST_VIDEO_INFO_COMP_STRIDE(i,c) GST_VIDEO_FORMAT_INFO_STRIDE((i)->finfo,(i)->stride,(c)) |
421 | #define GST_VIDEO_INFO_COMP_WIDTH(i,c) GST_VIDEO_FORMAT_INFO_SCALE_WIDTH((i)->finfo,(c),(i)->width) |
422 | #define GST_VIDEO_INFO_COMP_HEIGHT(i,c) GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT((i)->finfo,(c),GST_VIDEO_INFO_FIELD_HEIGHT(i)) |
423 | #define GST_VIDEO_INFO_COMP_PLANE(i,c) GST_VIDEO_FORMAT_INFO_PLANE((i)->finfo,(c)) |
424 | #define GST_VIDEO_INFO_COMP_PSTRIDE(i,c) GST_VIDEO_FORMAT_INFO_PSTRIDE((i)->finfo,(c)) |
425 | #define GST_VIDEO_INFO_COMP_POFFSET(i,c) GST_VIDEO_FORMAT_INFO_POFFSET((i)->finfo,(c)) |
426 | |
427 | GST_VIDEO_API |
428 | GstVideoInfo * gst_video_info_new (void); |
429 | |
430 | GST_VIDEO_API |
431 | void gst_video_info_init (GstVideoInfo *info); |
432 | |
433 | GST_VIDEO_API |
434 | GstVideoInfo * gst_video_info_copy (const GstVideoInfo *info); |
435 | |
436 | GST_VIDEO_API |
437 | void gst_video_info_free (GstVideoInfo *info); |
438 | |
439 | GST_VIDEO_API |
440 | GstVideoInfo * gst_video_info_new_from_caps (const GstCaps * caps); |
441 | |
442 | GST_VIDEO_API |
443 | gboolean gst_video_info_set_format (GstVideoInfo *info, GstVideoFormat format, |
444 | guint width, guint height); |
445 | |
446 | GST_VIDEO_API |
447 | gboolean gst_video_info_set_interlaced_format |
448 | (GstVideoInfo *info, |
449 | GstVideoFormat format, |
450 | GstVideoInterlaceMode mode, |
451 | guint width, |
452 | guint height); |
453 | |
454 | GST_VIDEO_API |
455 | gboolean gst_video_info_from_caps (GstVideoInfo *info, const GstCaps * caps); |
456 | |
457 | GST_VIDEO_API |
458 | GstCaps * gst_video_info_to_caps (const GstVideoInfo *info); |
459 | |
460 | GST_VIDEO_API |
461 | gboolean gst_video_info_convert (const GstVideoInfo *info, |
462 | GstFormat src_format, |
463 | gint64 src_value, |
464 | GstFormat dest_format, |
465 | gint64 *dest_value); |
466 | |
467 | GST_VIDEO_API |
468 | gboolean gst_video_info_is_equal (const GstVideoInfo *info, |
469 | const GstVideoInfo *other); |
470 | |
471 | #include <gst/video/video.h> |
472 | |
473 | GST_VIDEO_API |
474 | gboolean gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align); |
475 | |
476 | GST_VIDEO_API |
477 | gboolean gst_video_info_align_full (GstVideoInfo * info, GstVideoAlignment * align, gsize plane_size[GST_VIDEO_MAX_PLANES]); |
478 | |
479 | |
480 | G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoInfo, gst_video_info_free) |
481 | |
482 | G_END_DECLS |
483 | |
484 | #endif /* __GST_VIDEO_INFO_H__ */ |
485 | |