#include <string.h>
#include <gst/gst.h>
#include <gst/video/video.h>
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+#include <gst/allocators/gsttizenbufferpool.h>
+#endif
/* GstVideoFlip properties */
enum
};
#define PROP_METHOD_DEFAULT GST_VIDEO_FLIP_METHOD_IDENTITY
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+#define TIZEN_BUFFER_POOL_MIN_BUFFERS 4
+#define TIZEN_BUFFER_POOL_MAX_BUFFERS 10
+#endif
GST_DEBUG_CATEGORY_STATIC (video_flip_debug);
#define GST_CAT_DEFAULT video_flip_debug
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx, xBGR, BGRx, "
- "RGB, BGR, I420, YV12, IYUV, YUY2, UYVY, YVYU, NV12, NV21,"
+ "RGB, BGR, I420, YV12, IYUV, YUY2, UYVY, YVYU, NV12, NV21, "
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+ "SN12, "
+#endif
"GRAY8, GRAY16_BE, GRAY16_LE, I420_10LE, I420_10BE, I420_12LE, I420_12BE, "
"I422_10LE, I422_10BE, I422_12LE, I422_12BE, Y444_10LE, Y444_10BE, Y444_12LE, Y444_12BE }"))
);
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx, xBGR, BGRx, "
- "RGB, BGR, I420, YV12, IYUV, YUY2, UYVY, YVYU, NV12, NV21,"
+ "RGB, BGR, I420, YV12, IYUV, YUY2, UYVY, YVYU, NV12, NV21, "
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+ "SN12, "
+#endif
"GRAY8, GRAY16_BE, GRAY16_LE, I420_10LE, I420_10BE, I420_12LE, I420_12BE, "
"I422_10LE, I422_10BE, I422_12LE, I422_12BE, Y444_10LE, Y444_10BE, Y444_12LE, Y444_12BE }"))
);
break;
case GST_VIDEO_FORMAT_NV12:
case GST_VIDEO_FORMAT_NV21:
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+ case GST_VIDEO_FORMAT_SN12:
+#endif
vf->process = gst_video_flip_semi_planar_yuv;
break;
default:
}
}
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+static gboolean
+gst_video_flip_decide_allocation (GstBaseTransform * trans,
+ GstQuery * query)
+{
+ GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans);
+ GstVideoFilter *filter = GST_VIDEO_FILTER_CAST (trans);
+
+ GST_WARNING_OBJECT (videoflip, "format[%s]", filter->out_info.finfo->name);
+
+ if (filter->out_info.finfo->format == GST_VIDEO_FORMAT_SN12) {
+ guint size;
+ GstStructure *config;
+ GstCaps *caps = NULL;
+ GstVideoInfo vinfo;
+
+ gst_query_parse_allocation (query, &caps, NULL);
+ if (!caps) {
+ GST_WARNING_OBJECT (videoflip, "caps failed");
+ return FALSE;
+ }
+
+ gst_video_info_init (&vinfo);
+ gst_video_info_from_caps (&vinfo, caps);
+
+ size = vinfo.size;
+
+ videoflip->pool = gst_tizen_buffer_pool_new ();
+ config = gst_buffer_pool_get_config (videoflip->pool);
+
+ gst_buffer_pool_config_set_params (config, caps, size,
+ TIZEN_BUFFER_POOL_MIN_BUFFERS, TIZEN_BUFFER_POOL_MAX_BUFFERS);
+ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
+ gst_buffer_pool_set_config (videoflip->pool, config);
+
+ if (!gst_buffer_pool_set_active (videoflip->pool, TRUE)) {
+ gst_object_unref (videoflip->pool);
+ videoflip->pool = NULL;
+ GST_WARNING_OBJECT (videoflip, "Failed to activate pool");
+ return FALSE;
+ }
+
+ GST_WARNING_OBJECT (videoflip, "new buffer pool[%p]", videoflip->pool);
+ }
+
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans, query);
+}
+
+static GstFlowReturn
+gst_video_flip_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer *input, GstBuffer **outbuf)
+{
+ GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans);
+ GstBuffer *buf = NULL;
+
+ if (!videoflip->pool)
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->prepare_output_buffer (trans, input, outbuf);
+
+ if (gst_buffer_pool_acquire_buffer (videoflip->pool, &buf, 0) != GST_FLOW_OK) {
+ GST_ERROR_OBJECT (trans, "Buffer acquire failed");
+ return GST_FLOW_ERROR;
+ }
+
+ GST_DEBUG_OBJECT (videoflip, "acquired buffer[%p]", buf);
+
+ if (input != buf)
+ GST_BASE_TRANSFORM_CLASS (parent_class)->copy_metadata (trans, input, buf);
+
+ *outbuf = buf;
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_video_flip_finalize (GstVideoFlip * videoflip)
+{
+ if (videoflip->pool) {
+ GST_WARNING_OBJECT (videoflip, "free buffer pool[%p]", videoflip->pool);
+ gst_buffer_pool_set_active (videoflip->pool, FALSE);
+ gst_object_unref (videoflip->pool);
+ videoflip->pool = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (G_OBJECT (videoflip));
+}
+#endif
+
static void
gst_video_flip_class_init (GstVideoFlipClass * klass)
{
vfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_video_flip_set_info);
vfilter_class->transform_frame =
GST_DEBUG_FUNCPTR (gst_video_flip_transform_frame);
+#ifdef TIZEN_FEATURE_VIDEOFLIP_TBM_SUPPORT
+ trans_class->decide_allocation = gst_video_flip_decide_allocation;
+ trans_class->prepare_output_buffer = gst_video_flip_prepare_output_buffer;
+ gobject_class->finalize = gst_video_flip_finalize;
+#endif
gst_type_mark_as_plugin_api (GST_TYPE_VIDEO_FLIP_METHOD, 0);
}