summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-03-28 15:16:17 +0200
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-03-28 17:59:19 +0200
commitb98d334dce30746df20787dfc8d0d7c4324ccaea (patch)
tree8a53b17db2e014d1193e39f10a9c23a889f68e50 /gst-libs
parent894d65b81a457cb3cbdfc470848a97bf90a8f09c (diff)
vaapipostproc: get "interlaced" attribute from surface proxy.
Add new "interlaced" attribute to GstVaapiSurfaceProxy. Use this in vaapipostproc so that to handles cases where bitstream is interlaced but almost only frame pictures are generated. In this case, we should not be alternating between top/bottom fields.
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c4
-rw-r--r--gst-libs/gst/vaapi/gstvaapisurfaceproxy.c55
-rw-r--r--gst-libs/gst/vaapi/gstvaapisurfaceproxy.h15
3 files changed, 70 insertions, 4 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c b/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
index 6309ed8d..2d4d5501 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
@@ -496,8 +496,8 @@ render_frame(GstVaapiDecoderFfmpeg *decoder, AVFrame *frame)
return GST_VAAPI_DECODER_STATUS_ERROR_INVALID_SURFACE;
gst_vaapi_surface_proxy_set_timestamp(proxy, frame->pts);
- if (frame->interlaced_frame)
- gst_vaapi_surface_proxy_set_tff(proxy, frame->top_field_first);
+ gst_vaapi_surface_proxy_set_interlaced(proxy, !!frame->interlaced_frame);
+ gst_vaapi_surface_proxy_set_tff(proxy, frame->top_field_first);
gst_vaapi_decoder_push_surface_proxy(base_decoder, g_object_ref(proxy));
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
diff --git a/gst-libs/gst/vaapi/gstvaapisurfaceproxy.c b/gst-libs/gst/vaapi/gstvaapisurfaceproxy.c
index 9b01ac34..3c2f2299 100644
--- a/gst-libs/gst/vaapi/gstvaapisurfaceproxy.c
+++ b/gst-libs/gst/vaapi/gstvaapisurfaceproxy.c
@@ -43,7 +43,8 @@ struct _GstVaapiSurfaceProxyPrivate {
GstVaapiContext *context;
GstVaapiSurface *surface;
GstClockTime timestamp;
- gboolean tff;
+ guint is_interlaced : 1;
+ guint tff : 1;
};
enum {
@@ -52,6 +53,7 @@ enum {
PROP_CONTEXT,
PROP_SURFACE,
PROP_TIMESTAMP,
+ PROP_INTERLACED,
PROP_TFF
};
@@ -86,6 +88,9 @@ gst_vaapi_surface_proxy_set_property(
case PROP_TIMESTAMP:
gst_vaapi_surface_proxy_set_timestamp(proxy, g_value_get_uint64(value));
break;
+ case PROP_INTERLACED:
+ gst_vaapi_surface_proxy_set_interlaced(proxy, g_value_get_boolean(value));
+ break;
case PROP_TFF:
gst_vaapi_surface_proxy_set_tff(proxy, g_value_get_boolean(value));
break;
@@ -115,6 +120,9 @@ gst_vaapi_surface_proxy_get_property(
case PROP_TIMESTAMP:
g_value_set_uint64(value, gst_vaapi_surface_proxy_get_timestamp(proxy));
break;
+ case PROP_INTERLACED:
+ g_value_set_boolean(value, gst_vaapi_surface_proxy_get_interlaced(proxy));
+ break;
case PROP_TFF:
g_value_set_boolean(value, gst_vaapi_surface_proxy_get_tff(proxy));
break;
@@ -162,6 +170,15 @@ gst_vaapi_surface_proxy_class_init(GstVaapiSurfaceProxyClass *klass)
g_object_class_install_property
(object_class,
+ PROP_INTERLACED,
+ g_param_spec_boolean("interlaced",
+ "Interlaced",
+ "Flag indicating whether surface is interlaced",
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property
+ (object_class,
PROP_TFF,
g_param_spec_boolean("tff",
"Top-Field-First",
@@ -180,6 +197,7 @@ gst_vaapi_surface_proxy_init(GstVaapiSurfaceProxy *proxy)
priv->context = NULL;
priv->surface = NULL;
priv->timestamp = GST_CLOCK_TIME_NONE;
+ priv->is_interlaced = FALSE;
priv->tff = FALSE;
}
@@ -352,6 +370,39 @@ gst_vaapi_surface_proxy_set_timestamp(
}
/**
+ * gst_vaapi_surface_proxy_get_interlaced:
+ * @proxy: a #GstVaapiSurfaceProxy
+ *
+ * Returns whether the @proxy holds an interlaced #GstVaapiSurface or not.
+ *
+ * Return value: %TRUE if the underlying surface is interlaced, %FALSE
+ * otherwise.
+ */
+gboolean
+gst_vaapi_surface_proxy_get_interlaced(GstVaapiSurfaceProxy *proxy)
+{
+ g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), FALSE);
+
+ return proxy->priv->is_interlaced;
+}
+
+/**
+ * gst_vaapi_surface_proxy_set_interlaced:
+ * @proxy: a #GstVaapiSurfaceProxy
+ * @b: a boolean value
+ *
+ * Sets whether the underlying #GstVaapiSurface for @proxy is interlaced
+ * or not.
+ */
+void
+gst_vaapi_surface_proxy_set_interlaced(GstVaapiSurfaceProxy *proxy, gboolean b)
+{
+ g_return_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy));
+
+ proxy->priv->is_interlaced = b;
+}
+
+/**
* gst_vaapi_surface_proxy_get_tff:
* @proxy: a #GstVaapiSurfaceProxy
*
@@ -364,7 +415,7 @@ gst_vaapi_surface_proxy_get_tff(GstVaapiSurfaceProxy *proxy)
{
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), FALSE);
- return proxy->priv->tff;
+ return proxy->priv->is_interlaced && proxy->priv->tff;
}
/**
diff --git a/gst-libs/gst/vaapi/gstvaapisurfaceproxy.h b/gst-libs/gst/vaapi/gstvaapisurfaceproxy.h
index a6d96308..b32458c7 100644
--- a/gst-libs/gst/vaapi/gstvaapisurfaceproxy.h
+++ b/gst-libs/gst/vaapi/gstvaapisurfaceproxy.h
@@ -73,6 +73,15 @@ G_BEGIN_DECLS
gst_vaapi_surface_proxy_get_timestamp(surface)
/**
+ * GST_VAAPI_SURFACE_PROXY_INTERLACED:
+ * @surface: a #GstVaapiSurfaceProxy
+ *
+ * Macro that evaluates to %TRUE if the @surface is interlaced.
+ */
+#define GST_VAAPI_SURFACE_PROXY_INTERLACED(surface) \
+ gst_vaapi_surface_proxy_get_interlaced(surface)
+
+/**
* GST_VAAPI_SURFACE_PROXY_TFF:
* @surface: a #GstVaapiSurfaceProxy
*
@@ -144,6 +153,12 @@ gst_vaapi_surface_proxy_set_timestamp(
);
gboolean
+gst_vaapi_surface_proxy_get_interlaced(GstVaapiSurfaceProxy *proxy);
+
+void
+gst_vaapi_surface_proxy_set_interlaced(GstVaapiSurfaceProxy *proxy, gboolean b);
+
+gboolean
gst_vaapi_surface_proxy_get_tff(GstVaapiSurfaceProxy *proxy);
void