1 /* Generic video aggregator plugin 2 * Copyright (C) 2008 Wim Taymans <wim@fluendo.com> 3 * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public 16 * License along with this library; if not, write to the 17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #ifndef __GST_VIDEO_AGGREGATOR_H__ 22 #define __GST_VIDEO_AGGREGATOR_H__ 23 24 #include <gst/video/video.h> 25 #include <gst/base/gstaggregator.h> 26 27 G_BEGIN_DECLS 28 29 typedef struct _GstVideoAggregator GstVideoAggregator; 30 typedef struct _GstVideoAggregatorClass GstVideoAggregatorClass; 31 typedef struct _GstVideoAggregatorPrivate GstVideoAggregatorPrivate; 32 33 /************************* 34 * GstVideoAggregatorPad * 35 *************************/ 36 37 #define GST_TYPE_VIDEO_AGGREGATOR_PAD (gst_video_aggregator_pad_get_type()) 38 #define GST_VIDEO_AGGREGATOR_PAD(obj) \ 39 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR_PAD, GstVideoAggregatorPad)) 40 #define GST_VIDEO_AGGREGATOR_PAD_CAST(obj) ((GstVideoAggregatorPad *)(obj)) 41 #define GST_VIDEO_AGGREGATOR_PAD_CLASS(klass) \ 42 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_AGGREGATOR_PAD, GstVideoAggregatorPadClass)) 43 #define GST_IS_VIDEO_AGGREGATOR_PAD(obj) \ 44 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_AGGREGATOR_PAD)) 45 #define GST_IS_VIDEO_AGGREGATOR_PAD_CLASS(klass) \ 46 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_AGGREGATOR_PAD)) 47 #define GST_VIDEO_AGGREGATOR_PAD_GET_CLASS(obj) \ 48 (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_VIDEO_AGGREGATOR_PAD,GstVideoAggregatorPadClass)) 49 50 typedef struct _GstVideoAggregatorPad GstVideoAggregatorPad; 51 typedef struct _GstVideoAggregatorPadClass GstVideoAggregatorPadClass; 52 typedef struct _GstVideoAggregatorPadPrivate GstVideoAggregatorPadPrivate; 53 54 /** 55 * GstVideoAggregatorPad: 56 * @info: The #GstVideoInfo currently set on the pad 57 * 58 * Since: 1.16 59 */ 60 struct _GstVideoAggregatorPad 61 { 62 GstAggregatorPad parent; 63 64 /*< public >*/ 65 /* read-only, with OBJECT_LOCK */ 66 GstVideoInfo info; 67 68 /* < private > */ 69 GstVideoAggregatorPadPrivate *priv; 70 71 gpointer _gst_reserved[GST_PADDING]; 72 }; 73 74 /** 75 * GstVideoAggregatorPadClass: 76 * @update_conversion_info: Called when either the input or output formats 77 * have changed. 78 * @prepare_frame: Prepare the frame from the pad buffer and sets it to prepared_frame. 79 * Implementations should always return TRUE. Returning FALSE will cease 80 * iteration over subsequent pads. 81 * @clean_frame: clean the frame previously prepared in prepare_frame 82 * 83 * Since: 1.16 84 */ 85 /** 86 * GstVideoAggregatorPadClass::prepare_frame_start: 87 * @pad: the #GstVideoAggregatorPad 88 * @videoaggregator: the parent #GstVideoAggregator 89 * @buffer: the input #GstBuffer to prepare 90 * @prepared_frame: the #GstVideoFrame to prepare into 91 * 92 * Begin preparing the frame from the pad buffer and sets it to prepared_frame. 93 * 94 * If overriden, `prepare_frame_finish` must also be overriden. 95 * 96 * Since: 1.20 97 */ 98 /** 99 * GstVideoAggregatorPadClass::prepare_frame_finish: 100 * @pad: the #GstVideoAggregatorPad 101 * @videoaggregator: the parent #GstVideoAggregator 102 * @prepared_frame: the #GstVideoFrame to prepare into 103 * 104 * Finish preparing @prepared_frame. 105 * 106 * If overriden, `prepare_frame_start` must also be overriden. 107 * 108 * Since: 1.20 109 */ 110 struct _GstVideoAggregatorPadClass 111 { 112 GstAggregatorPadClass parent_class; 113 void (*update_conversion_info) (GstVideoAggregatorPad * pad); 114 115 gboolean (*prepare_frame) (GstVideoAggregatorPad * pad, 116 GstVideoAggregator * videoaggregator, 117 GstBuffer * buffer, 118 GstVideoFrame * prepared_frame); 119 120 void (*clean_frame) (GstVideoAggregatorPad * pad, 121 GstVideoAggregator * videoaggregator, 122 GstVideoFrame * prepared_frame); 123 124 void (*prepare_frame_start) (GstVideoAggregatorPad * pad, 125 GstVideoAggregator * videoaggregator, 126 GstBuffer * buffer, 127 GstVideoFrame * prepared_frame); 128 129 void (*prepare_frame_finish) (GstVideoAggregatorPad * pad, 130 GstVideoAggregator * videoaggregator, 131 GstVideoFrame * prepared_frame); 132 133 gpointer _gst_reserved[GST_PADDING_LARGE-2]; 134 }; 135 136 GST_VIDEO_API 137 GType gst_video_aggregator_pad_get_type (void); 138 139 GST_VIDEO_API 140 gboolean gst_video_aggregator_pad_has_current_buffer (GstVideoAggregatorPad *pad); 141 142 GST_VIDEO_API 143 GstBuffer * gst_video_aggregator_pad_get_current_buffer (GstVideoAggregatorPad *pad); 144 145 GST_VIDEO_API 146 GstVideoFrame * gst_video_aggregator_pad_get_prepared_frame (GstVideoAggregatorPad *pad); 147 148 GST_VIDEO_API 149 void gst_video_aggregator_pad_set_needs_alpha (GstVideoAggregatorPad *pad, gboolean needs_alpha); 150 151 /******************************** 152 * GstVideoAggregatorConvertPad * 153 *******************************/ 154 155 #define GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD (gst_video_aggregator_convert_pad_get_type()) 156 #define GST_VIDEO_AGGREGATOR_CONVERT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD, GstVideoAggregatorConvertPad)) 157 #define GST_VIDEO_AGGREGATOR_CONVERT_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD, GstVideoAggregatorConvertPadClass)) 158 #define GST_VIDEO_AGGREGATOR_CONVERT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD, GstVideoAggregatorConvertPadClass)) 159 #define GST_IS_VIDEO_AGGREGATOR_CONVERT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD)) 160 #define GST_IS_VIDEO_AGGREGATOR_CONVERT_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_AGGREGATOR_CONVERT_PAD)) 161 162 typedef struct _GstVideoAggregatorConvertPad GstVideoAggregatorConvertPad; 163 typedef struct _GstVideoAggregatorConvertPadClass GstVideoAggregatorConvertPadClass; 164 typedef struct _GstVideoAggregatorConvertPadPrivate GstVideoAggregatorConvertPadPrivate; 165 166 /** 167 * GstVideoAggregatorConvertPad: 168 * 169 * An implementation of GstPad that can be used with #GstVideoAggregator. 170 * 171 * See #GstVideoAggregator for more details. 172 * 173 * Since: 1.16 174 */ 175 struct _GstVideoAggregatorConvertPad 176 { 177 /*< private >*/ 178 GstVideoAggregatorPad parent; 179 180 GstVideoAggregatorConvertPadPrivate *priv; 181 182 gpointer _gst_reserved[GST_PADDING]; 183 }; 184 185 /** 186 * GstVideoAggregatorConvertPadClass: 187 * 188 * Since: 1.16 189 */ 190 struct _GstVideoAggregatorConvertPadClass 191 { 192 GstVideoAggregatorPadClass parent_class; 193 194 void (*create_conversion_info) (GstVideoAggregatorConvertPad *pad, GstVideoAggregator *agg, GstVideoInfo *conversion_info); 195 196 /*< private >*/ 197 gpointer _gst_reserved[GST_PADDING]; 198 }; 199 200 GST_VIDEO_API 201 GType gst_video_aggregator_convert_pad_get_type (void); 202 203 GST_VIDEO_API 204 void gst_video_aggregator_convert_pad_update_conversion_info (GstVideoAggregatorConvertPad * pad); 205 206 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoAggregatorConvertPad, gst_object_unref) 207 208 /**************************************** 209 * GstVideoAggregatorParallelConvertPad * 210 ****************************************/ 211 212 #define GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD (gst_video_aggregator_parallel_convert_pad_get_type()) 213 GST_VIDEO_API 214 G_DECLARE_DERIVABLE_TYPE (GstVideoAggregatorParallelConvertPad, gst_video_aggregator_parallel_convert_pad, GST, VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD, GstVideoAggregatorConvertPad) 215 216 #define GST_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD, GstVideoAggregatorParallelConvertPad)) 217 #define GST_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD, GstVideoAggregatorConvertPadClass)) 218 #define GST_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD, GstVideoAggregatorConvertPadClass)) 219 #define GST_IS_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD)) 220 #define GST_IS_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD)) 221 222 /** 223 * GstVideoAggregatorParallelConvertPad: 224 * 225 * An implementation of GstPad that can be used with #GstVideoAggregator. 226 * 227 * See #GstVideoAggregator for more details. 228 * 229 * Since: 1.20 230 */ 231 232 /** 233 * GstVideoAggregatorParallelConvertPadClass: 234 * 235 * Since: 1.20 236 */ 237 struct _GstVideoAggregatorParallelConvertPadClass 238 { 239 GstVideoAggregatorConvertPadClass parent_class; 240 241 /*< private >*/ 242 gpointer _gst_reserved[GST_PADDING]; 243 }; 244 245 /********************** 246 * GstVideoAggregator * 247 *********************/ 248 249 #define GST_TYPE_VIDEO_AGGREGATOR (gst_video_aggregator_get_type()) 250 #define GST_VIDEO_AGGREGATOR(obj) \ 251 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_AGGREGATOR, GstVideoAggregator)) 252 #define GST_VIDEO_AGGREGATOR_CAST(obj) ((GstVideoAggregator *)(obj)) 253 #define GST_VIDEO_AGGREGATOR_CLASS(klass) \ 254 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_AGGREGATOR, GstVideoAggregatorClass)) 255 #define GST_IS_VIDEO_AGGREGATOR(obj) \ 256 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_AGGREGATOR)) 257 #define GST_IS_VIDEO_AGGREGATOR_CLASS(klass) \ 258 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_AGGREGATOR)) 259 #define GST_VIDEO_AGGREGATOR_GET_CLASS(obj) \ 260 (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_VIDEO_AGGREGATOR,GstVideoAggregatorClass)) 261 262 /** 263 * GstVideoAggregator: 264 * @info: The #GstVideoInfo representing the currently set 265 * srcpad caps. 266 * 267 * Since: 1.16 268 */ 269 struct _GstVideoAggregator 270 { 271 GstAggregator aggregator; 272 273 /*< public >*/ 274 /* Output caps */ 275 GstVideoInfo info; 276 277 /* < private > */ 278 GstVideoAggregatorPrivate *priv; 279 gpointer _gst_reserved[GST_PADDING_LARGE]; 280 }; 281 282 /** 283 * GstVideoAggregatorClass: 284 * @update_caps: Optional. 285 * Lets subclasses update the #GstCaps representing 286 * the src pad caps before usage. Return %NULL to indicate failure. 287 * @aggregate_frames: Lets subclasses aggregate frames that are ready. Subclasses 288 * should iterate the GstElement.sinkpads and use the already 289 * mapped #GstVideoFrame from gst_video_aggregator_pad_get_prepared_frame() 290 * or directly use the #GstBuffer from gst_video_aggregator_pad_get_current_buffer() 291 * if it needs to map the buffer in a special way. The result of the 292 * aggregation should land in @outbuffer. 293 * @create_output_buffer: Optional. 294 * Lets subclasses provide a #GstBuffer to be used as @outbuffer of 295 * the #aggregate_frames vmethod. 296 * @find_best_format: Optional. 297 * Lets subclasses decide of the best common format to use. 298 * 299 * Since: 1.16 300 **/ 301 struct _GstVideoAggregatorClass 302 { 303 /*< private >*/ 304 GstAggregatorClass parent_class; 305 306 /*< public >*/ 307 GstCaps * (*update_caps) (GstVideoAggregator * videoaggregator, 308 GstCaps * caps); 309 GstFlowReturn (*aggregate_frames) (GstVideoAggregator * videoaggregator, 310 GstBuffer * outbuffer); 311 GstFlowReturn (*create_output_buffer) (GstVideoAggregator * videoaggregator, 312 GstBuffer ** outbuffer); 313 void (*find_best_format) (GstVideoAggregator * vagg, 314 GstCaps * downstream_caps, 315 GstVideoInfo * best_info, 316 gboolean * at_least_one_alpha); 317 318 /* < private > */ 319 gpointer _gst_reserved[GST_PADDING_LARGE]; 320 }; 321 322 GST_VIDEO_API 323 GType gst_video_aggregator_get_type (void); 324 325 GST_VIDEO_API 326 GstTaskPool * gst_video_aggregator_get_execution_task_pool (GstVideoAggregator * vagg); 327 328 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoAggregator, gst_object_unref) 329 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoAggregatorPad, gst_object_unref) 330 331 G_END_DECLS 332 #endif /* __GST_VIDEO_AGGREGATOR_H__ */ 333