[packages/gstreamer-vaapi] - updated to 0.5.7 - removed obsolete git patch

qboosh qboosh at pld-linux.org
Sun Dec 1 11:35:54 CET 2013


commit f465fd48c5ca8e565c6394ea420badeb1c522dc8
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sun Dec 1 11:37:05 2013 +0100

    - updated to 0.5.7
    - removed obsolete git patch

 git.patch            | 2163 --------------------------------------------------
 gstreamer-vaapi.spec |    8 +-
 2 files changed, 3 insertions(+), 2168 deletions(-)
---
diff --git a/gstreamer-vaapi.spec b/gstreamer-vaapi.spec
index e66b432..669f9ff 100644
--- a/gstreamer-vaapi.spec
+++ b/gstreamer-vaapi.spec
@@ -7,13 +7,12 @@
 Summary:	GStreamer plugin to support Video Acceleration API
 Summary(pl.UTF-8):	Wtyczka GStreamera obsługująca Video Acceleration API
 Name:		gstreamer-vaapi
-Version:	0.5.6
-Release:	2
+Version:	0.5.7
+Release:	1
 License:	LGPL v2.1+
 Group:		Libraries
 Source0:	http://www.freedesktop.org/software/vaapi/releases/gstreamer-vaapi/%{name}-%{version}.tar.bz2
-# Source0-md5:	0a3e645d12c8f275e8ea221ecb89f981
-Patch0:		git.patch
+# Source0-md5:	50d4009c8c85bae55217fcc911243df8
 URL:		http://www.freedesktop.org/wiki/Software/vaapi/
 BuildRequires:	Mesa-libGL-devel
 BuildRequires:	autoconf >= 2.66
@@ -89,7 +88,6 @@ Statyczne biblioteki VA-API GStreamera.
 
 %prep
 %setup -q
-%patch0 -p1
 
 %build
 %{__libtoolize}
diff --git a/git.patch b/git.patch
deleted file mode 100644
index 836cbdb..0000000
--- a/git.patch
+++ /dev/null
@@ -1,2163 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index ac37510..f9029e3 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,8 +1,8 @@
- # gstreamer-vaapi package version number
- m4_define([gst_vaapi_major_version], [0])
- m4_define([gst_vaapi_minor_version], [5])
--m4_define([gst_vaapi_micro_version], [6])
--m4_define([gst_vaapi_pre_version],   [0])
-+m4_define([gst_vaapi_micro_version], [7])
-+m4_define([gst_vaapi_pre_version],   [1])
- m4_define([gst_vaapi_version],
-           [gst_vaapi_major_version.gst_vaapi_minor_version.gst_vaapi_micro_version])
- m4_if(gst_vaapi_pre_version, [0], [], [
-@@ -13,6 +13,7 @@ m4_append([gst_vaapi_version], gst_vaapi_pre_version, [.pre])
- m4_define([gst_vaapi_lt_current],       [4])
- m4_define([gst0_vaapi_lt_current_bias], [0])
- m4_define([gst1_vaapi_lt_current_bias], [2])
-+m4_define([gst2_vaapi_lt_current_bias], [4])
- m4_define([gst_vaapi_lt_revision],      [0])
- m4_define([gst_vaapi_lt_age],           [0])
- 
-@@ -27,6 +28,9 @@ m4_define([gst0_plugins_bad_version],   [0.10.22])
- m4_define([gst1_version],               [1.0.0])
- m4_define([gst1_plugins_base_version],  [1.0.0])
- m4_define([gst1_plugins_bad_version],   [1.0.0])
-+m4_define([gst12_version],              [1.1.90])
-+m4_define([gst12_plugins_base_version], [1.1.0])
-+m4_define([gst12_plugins_bad_version],  [1.1.0])
- 
- # Wayland minimum version number
- m4_define([wayland_api_version], [1.0.0])
-@@ -158,6 +162,11 @@ case $GST_API_VERSION in
-     GST_PLUGINS_BASE_VERSION_REQUIRED=gst1_plugins_base_version
-     GST_PLUGINS_BAD_VERSION_REQUIRED=gst1_plugins_bad_version
-     ;;
-+1.2)
-+    GST_VERSION_REQUIRED=gst12_version
-+    GST_PLUGINS_BASE_VERSION_REQUIRED=gst12_plugins_base_version
-+    GST_PLUGINS_BAD_VERSION_REQUIRED=gst12_plugins_bad_version
-+    ;;
- *)
-     AC_MSG_ERROR([unsupported GStreamer API version $GST_API_VERSION])
-     ;;
-@@ -169,18 +178,29 @@ AC_SUBST(GST_PLUGINS_BAD_VERSION_REQUIRED)
- 
- USE_GST_API_0_10="no"
- USE_GST_API_1_0p="no"
-+USE_GST_API_1_2p="no"
- AS_VERSION_COMPARE([$GST_API_VERSION], [0.10],
-     [], [USE_GST_API_0_10="yes"], [])
- AS_VERSION_COMPARE([$GST_API_VERSION], [1.0],
-     [], [USE_GST_API_1_0p="yes"], [USE_GST_API_1_0p="yes"])
-+AS_VERSION_COMPARE([$GST_API_VERSION], [1.2],
-+    [], [USE_GST_API_1_2p="yes"], [USE_GST_API_1_2p="yes"])
- AM_CONDITIONAL([USE_GST_API_0_10], [test "$USE_GST_API_0_10" = "yes"])
- AM_CONDITIONAL([USE_GST_API_1_0p], [test "$USE_GST_API_1_0p" = "yes"])
-+AM_CONDITIONAL([USE_GST_API_1_2p], [test "$USE_GST_API_1_2p" = "yes"])
-+
-+dnl GStreamer 1.2.x APIs don't have their own namespace
-+GST_PKG_VERSION="$GST_API_VERSION"
-+if test "$USE_GST_API_1_2p" = "yes"; then
-+    GST_PKG_VERSION="1.0"
-+fi
-+AC_SUBST([GST_PKG_VERSION])
- 
- dnl GStreamer Core
- PKG_CHECK_MODULES([GST],
--    [gstreamer-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
-+    [gstreamer-$GST_PKG_VERSION >= $GST_VERSION_REQUIRED])
- PKG_CHECK_MODULES([GST_BASE],
--    [gstreamer-base-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
-+    [gstreamer-base-$GST_PKG_VERSION >= $GST_VERSION_REQUIRED])
- 
- AC_CACHE_CHECK([for GstBaseSink::query hook], ac_cv_have_gst_base_sink_query, [
-     saved_CPPFLAGS="$CPPFLAGS"
-@@ -203,15 +223,15 @@ fi
- 
- dnl GStreamer -base plugins
- PKG_CHECK_MODULES([GST_PLUGINS_BASE],
--    [gstreamer-plugins-base-$GST_API_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
-+    [gstreamer-plugins-base-$GST_PKG_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
- if test "$GST_API_VERSION" = "0.10"; then
- PKG_CHECK_MODULES([GST_INTERFACES],
--    [gstreamer-interfaces-$GST_API_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
-+    [gstreamer-interfaces-$GST_PKG_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
- fi
- 
- dnl ... GstVideoOverlayComposition (gstreamer-video)
- PKG_CHECK_MODULES([GST_VIDEO],
--    [gstreamer-video-$GST_API_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
-+    [gstreamer-video-$GST_PKG_VERSION >= $GST_PLUGINS_BASE_VERSION_REQUIRED])
- 
- AC_CACHE_CHECK([for GstVideoOverlayComposition],
-     ac_cv_have_gst_video_overlay_composition, [
-@@ -288,9 +308,11 @@ AC_CACHE_CHECK([for GstVideoDecoder],
- AM_CONDITIONAL([USE_LOCAL_GST_VIDEO_DECODER],
-     [test "$ac_cv_have_gst_video_decoder" != "yes"])
- 
--dnl GStreamer -bad plugins
-+dnl GStreamer -bad plugins (deprecated in GStreamer v1.2)
-+if test "$USE_GST_API_1_2p" != "yes"; then
- PKG_CHECK_MODULES([GST_BASEVIDEO],
--    [gstreamer-basevideo-$GST_API_VERSION >= $GST_PLUGINS_BAD_VERSION_REQUIRED])
-+    [gstreamer-basevideo-$GST_PKG_VERSION >= $GST_PLUGINS_BAD_VERSION_REQUIRED])
-+fi
- 
- dnl ... bitstream parsers
- if test "$enable_builtin_codecparsers" = "yes"; then
-@@ -299,7 +321,7 @@ if test "$enable_builtin_codecparsers" = "yes"; then
-     ac_cv_have_gst_jpeg_parser="no"
- else
- PKG_CHECK_MODULES([GST_CODEC_PARSERS],
--    [gstreamer-codecparsers-$GST_API_VERSION >= $GST_PLUGINS_BAD_VERSION_REQUIRED])
-+    [gstreamer-codecparsers-$GST_PKG_VERSION >= $GST_PLUGINS_BAD_VERSION_REQUIRED])
- fi
- 
- dnl ... MPEG-2 parser, with the required extensions
-@@ -378,6 +400,7 @@ AM_CONDITIONAL([USE_LOCAL_CODEC_PARSERS_JPEG],
- case $GST_API_VERSION in
- 0.10)   lt_bias=gst0_vaapi_lt_current_bias;;
- 1.0)    lt_bias=gst1_vaapi_lt_current_bias;;
-+1.2)    lt_bias=gst2_vaapi_lt_current_bias;;
- esac
- GST_VAAPI_MAJOR_VERSION=`expr gst_vaapi_lt_current - "$lt_bias"`
- AC_SUBST(GST_VAAPI_MAJOR_VERSION)
-@@ -410,13 +433,14 @@ AC_MSG_CHECKING([for GStreamer plugins directory])
- case $GST_API_VERSION in
- 0.10)   _gst_plugin_path="$GST_PLUGIN_PATH";;
- 1.0)    _gst_plugin_path="$GST_PLUGIN_PATH_1_0";;
-+1.2)    _gst_plugin_path="$GST_PLUGIN_PATH_1_0";;
- esac
- if test -d "$_gst_plugin_path"; then
-     GST_PLUGINS_DIR="$_gst_plugin_path"
- else
--    GST_PLUGINS_DIR=`$PKG_CONFIG gstreamer-$GST_API_VERSION --variable pluginsdir`
-+    GST_PLUGINS_DIR=`$PKG_CONFIG gstreamer-$GST_PKG_VERSION --variable pluginsdir`
-     if test -z "$GST_PLUGINS_DIR"; then
--        GST_PLUGINS_DIR="\$(libdir)/gstreamer-$GST_API_VERSION"
-+        GST_PLUGINS_DIR="\$(libdir)/gstreamer-$GST_PKG_VERSION"
-     fi
- fi
- AC_MSG_RESULT([$GST_PLUGINS_DIR])
-diff --git a/debian.upstream/control.in b/debian.upstream/control.in
-index 2ee6225..9897e9d 100644
---- a/debian.upstream/control.in
-+++ b/debian.upstream/control.in
-@@ -5,9 +5,9 @@ Maintainer: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
- Build-Depends: debhelper (>= 5),
- 	       cdbs,
- 	       libglib2.0-dev (>= @GLIB_VERSION_REQUIRED@),
--	       libgstreamer at GST_API_VERSION@-dev (>= @GST_VERSION_REQUIRED@),
--	       libgstreamer-plugins-base at GST_API_VERSION@-dev (>= @GST_PLUGINS_BASE_VERSION_REQUIRED@),
--	       libgstreamer-plugins-bad at GST_API_VERSION@-dev (>= @GST_PLUGINS_BAD_VERSION_REQUIRED@),
-+	       libgstreamer at GST_PKG_VERSION@-dev (>= @GST_VERSION_REQUIRED@),
-+	       libgstreamer-plugins-base at GST_PKG_VERSION@-dev (>= @GST_PLUGINS_BASE_VERSION_REQUIRED@),
-+	       libgstreamer-plugins-bad at GST_PKG_VERSION@-dev (>= @GST_PLUGINS_BAD_VERSION_REQUIRED@),
- @USE_DRM_TRUE@	       libdrm-dev, libudev-dev,
- @USE_X11_TRUE@	       libx11-dev, libxrandr-dev,
- @USE_GLX_TRUE@	       libgl-dev,
-diff --git a/gst-libs/gst/vaapi/gstvaapidecoder.c b/gst-libs/gst/vaapi/gstvaapidecoder.c
-index 7870291..76a46ff 100644
---- a/gst-libs/gst/vaapi/gstvaapidecoder.c
-+++ b/gst-libs/gst/vaapi/gstvaapidecoder.c
-@@ -85,6 +85,7 @@ parser_state_prepare(GstVaapiParserState *ps, GstAdapter *adapter)
- 
- reset:
-     ps->current_adapter = adapter;
-+    ps->input_offset1 = -1;
-     ps->input_offset2 = -1;
- }
- 
-diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_jpeg.c b/gst-libs/gst/vaapi/gstvaapidecoder_jpeg.c
-index 9e62778..c3655f0 100644
---- a/gst-libs/gst/vaapi/gstvaapidecoder_jpeg.c
-+++ b/gst-libs/gst/vaapi/gstvaapidecoder_jpeg.c
-@@ -47,6 +47,19 @@
- typedef struct _GstVaapiDecoderJpegPrivate      GstVaapiDecoderJpegPrivate;
- typedef struct _GstVaapiDecoderJpegClass        GstVaapiDecoderJpegClass;
- 
-+typedef enum  {
-+    GST_JPEG_VIDEO_STATE_GOT_SOI        = 1 << 0,
-+    GST_JPEG_VIDEO_STATE_GOT_SOF        = 1 << 1,
-+    GST_JPEG_VIDEO_STATE_GOT_SOS        = 1 << 2,
-+    GST_JPEG_VIDEO_STATE_GOT_HUF_TABLE  = 1 << 3,
-+    GST_JPEG_VIDEO_STATE_GOT_IQ_TABLE   = 1 << 4,
-+
-+    GST_JPEG_VIDEO_STATE_VALID_PICTURE = (
-+        GST_JPEG_VIDEO_STATE_GOT_SOI |
-+        GST_JPEG_VIDEO_STATE_GOT_SOF |
-+        GST_JPEG_VIDEO_STATE_GOT_SOS),
-+} GstJpegVideoState;
-+
- struct _GstVaapiDecoderJpegPrivate {
-     GstVaapiProfile             profile;
-     guint                       width;
-@@ -55,9 +68,9 @@ struct _GstVaapiDecoderJpegPrivate {
-     GstJpegFrameHdr             frame_hdr;
-     GstJpegHuffmanTables        huf_tables;
-     GstJpegQuantTables          quant_tables;
--    gboolean                    has_huf_table;
--    gboolean                    has_quant_table;
-     guint                       mcu_restart;
-+    guint                       parser_state;
-+    guint                       decoder_state;
-     guint                       is_opened       : 1;
-     guint                       profile_changed : 1;
- };
-@@ -83,14 +96,17 @@ struct _GstVaapiDecoderJpegClass {
-     GstVaapiDecoderClass parent_class;
- };
- 
--typedef struct _GstJpegScanSegment GstJpegScanSegment;
--struct _GstJpegScanSegment {
--    guint                       header_offset;
--    guint                       header_size;
--    guint                       data_offset;
--    guint                       data_size;
--    guint                       is_valid        : 1;
--};
-+static inline void
-+unit_set_marker_code(GstVaapiDecoderUnit *unit, GstJpegMarkerCode marker)
-+{
-+    unit->parsed_info = GSIZE_TO_POINTER(marker);
-+}
-+
-+static inline GstJpegMarkerCode
-+unit_get_marker_code(GstVaapiDecoderUnit *unit)
-+{
-+    return GPOINTER_TO_SIZE(unit->parsed_info);
-+}
- 
- static void
- gst_vaapi_decoder_jpeg_close(GstVaapiDecoderJpeg *decoder)
-@@ -110,8 +126,12 @@ gst_vaapi_decoder_jpeg_close(GstVaapiDecoderJpeg *decoder)
- static gboolean
- gst_vaapi_decoder_jpeg_open(GstVaapiDecoderJpeg *decoder)
- {
-+    GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-+
-     gst_vaapi_decoder_jpeg_close(decoder);
- 
-+    priv->parser_state  = 0;
-+    priv->decoder_state = 0;
-     return TRUE;
- }
- 
-@@ -182,70 +202,90 @@ ensure_context(GstVaapiDecoderJpeg *decoder)
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
--static gboolean
-+static inline gboolean
-+is_valid_state(guint state, guint ref_state)
-+{
-+    return (state & ref_state) == ref_state;
-+}
-+
-+#define VALID_STATE(TYPE, STATE)                \
-+    is_valid_state(priv->G_PASTE(TYPE,_state),  \
-+        G_PASTE(GST_JPEG_VIDEO_STATE_,STATE))
-+
-+static GstVaapiDecoderStatus
- decode_current_picture(GstVaapiDecoderJpeg *decoder)
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-     GstVaapiPicture * const picture = priv->current_picture;
--    gboolean success = TRUE;
--
--    if (picture) {
--        if (!gst_vaapi_picture_decode(picture))
--            success = FALSE;
--        else if (!gst_vaapi_picture_output(picture))
--            success = FALSE;
--        gst_vaapi_picture_replace(&priv->current_picture, NULL);
--    }
--    return success;
-+
-+    if (!VALID_STATE(decoder, VALID_PICTURE))
-+        goto drop_frame;
-+    priv->decoder_state = 0;
-+
-+    if (!picture)
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-+    if (!gst_vaapi_picture_decode(picture))
-+        goto error;
-+    if (!gst_vaapi_picture_output(picture))
-+        goto error;
-+    gst_vaapi_picture_replace(&priv->current_picture, NULL);
-+    return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-+error:
-+    gst_vaapi_picture_replace(&priv->current_picture, NULL);
-+    return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
-+
-+drop_frame:
-+    priv->decoder_state = 0;
-+    return GST_VAAPI_DECODER_STATUS_DROP_FRAME;
- }
- 
- static gboolean
- fill_picture(
-     GstVaapiDecoderJpeg *decoder, 
-     GstVaapiPicture     *picture,
--    GstJpegFrameHdr     *jpeg_frame_hdr
-+    GstJpegFrameHdr     *frame_hdr
- )
- {
--    VAPictureParameterBufferJPEGBaseline *pic_param = picture->param;
-+    VAPictureParameterBufferJPEGBaseline * const pic_param = picture->param;
-     guint i;
- 
--    g_assert(pic_param);
--
-     memset(pic_param, 0, sizeof(VAPictureParameterBufferJPEGBaseline));
--    pic_param->picture_width    = jpeg_frame_hdr->width;
--    pic_param->picture_height   = jpeg_frame_hdr->height;
-+    pic_param->picture_width    = frame_hdr->width;
-+    pic_param->picture_height   = frame_hdr->height;
- 
--    pic_param->num_components   = jpeg_frame_hdr->num_components;
--    if (jpeg_frame_hdr->num_components > 4)
-+    pic_param->num_components   = frame_hdr->num_components;
-+    if (frame_hdr->num_components > 4)
-         return FALSE;
-     for (i = 0; i < pic_param->num_components; i++) {
-         pic_param->components[i].component_id =
--            jpeg_frame_hdr->components[i].identifier;
-+            frame_hdr->components[i].identifier;
-         pic_param->components[i].h_sampling_factor =
--            jpeg_frame_hdr->components[i].horizontal_factor;
-+            frame_hdr->components[i].horizontal_factor;
-         pic_param->components[i].v_sampling_factor =
--            jpeg_frame_hdr->components[i].vertical_factor;
-+            frame_hdr->components[i].vertical_factor;
-         pic_param->components[i].quantiser_table_selector =
--            jpeg_frame_hdr->components[i].quant_table_selector;
-+            frame_hdr->components[i].quant_table_selector;
-     }
-     return TRUE;
- }
- 
--static gboolean
--fill_quantization_table(
--    GstVaapiDecoderJpeg *decoder, 
--    GstVaapiPicture     *picture
--)
-+static GstVaapiDecoderStatus
-+fill_quantization_table(GstVaapiDecoderJpeg *decoder, GstVaapiPicture *picture)
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-     VAIQMatrixBufferJPEGBaseline *iq_matrix;
-     guint i, j, num_tables;
- 
--    if (!priv->has_quant_table)
-+    if (!VALID_STATE(decoder, GOT_IQ_TABLE))
-         gst_jpeg_get_default_quantization_tables(&priv->quant_tables);
-     
-     picture->iq_matrix = GST_VAAPI_IQ_MATRIX_NEW(JPEGBaseline, decoder);
--    g_assert(picture->iq_matrix);
-+    if (!picture->iq_matrix) {
-+        GST_ERROR("failed to allocate quantiser table");
-+        return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
-+    }
-     iq_matrix = picture->iq_matrix->param;
- 
-     num_tables = MIN(G_N_ELEMENTS(iq_matrix->quantiser_table),
-@@ -259,32 +299,51 @@ fill_quantization_table(
-         if (!iq_matrix->load_quantiser_table[i])
-             continue;
- 
--        g_assert(quant_table->quant_precision == 0);
-+        if (quant_table->quant_precision != 0) {
-+            // Only Baseline profile is supported, thus 8-bit Qk values
-+            GST_ERROR("unsupported quantization table element precision");
-+            return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CHROMA_FORMAT;
-+        }
-+
-         for (j = 0; j < GST_JPEG_MAX_QUANT_ELEMENTS; j++)
-             iq_matrix->quantiser_table[i][j] = quant_table->quant_table[j];
-         iq_matrix->load_quantiser_table[i] = 1;
-         quant_table->valid = FALSE;
-     }
--    return TRUE;
-+    return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
- static gboolean
--fill_huffman_table(
--    GstVaapiDecoderJpeg *decoder, 
--    GstVaapiPicture     *picture
--)
-+huffman_tables_updated(const GstJpegHuffmanTables *huf_tables)
- {
--    GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
--    GstJpegHuffmanTables * const huf_tables = &priv->huf_tables;
--    VAHuffmanTableBufferJPEGBaseline *huffman_table;
--    guint i, num_tables;
-+    guint i;
- 
--    if (!priv->has_huf_table)
--        gst_jpeg_get_default_huffman_tables(&priv->huf_tables);
--    
--    picture->huf_table = GST_VAAPI_HUFFMAN_TABLE_NEW(JPEGBaseline, decoder);
--    g_assert(picture->huf_table);
--    huffman_table = picture->huf_table->param;
-+    for (i = 0; i < G_N_ELEMENTS(huf_tables->dc_tables); i++)
-+        if (huf_tables->dc_tables[i].valid)
-+            return TRUE;
-+    for (i = 0; i < G_N_ELEMENTS(huf_tables->ac_tables); i++)
-+        if (huf_tables->ac_tables[i].valid)
-+            return TRUE;
-+    return FALSE;
-+}
-+
-+static void
-+huffman_tables_reset(GstJpegHuffmanTables *huf_tables)
-+{
-+    guint i;
-+
-+    for (i = 0; i < G_N_ELEMENTS(huf_tables->dc_tables); i++)
-+        huf_tables->dc_tables[i].valid = FALSE;
-+    for (i = 0; i < G_N_ELEMENTS(huf_tables->ac_tables); i++)
-+        huf_tables->ac_tables[i].valid = FALSE;
-+}
-+
-+static void
-+fill_huffman_table(GstVaapiHuffmanTable *huf_table,
-+    const GstJpegHuffmanTables *huf_tables)
-+{
-+    VAHuffmanTableBufferJPEGBaseline * const huffman_table = huf_table->param;
-+    guint i, num_tables;
- 
-     num_tables = MIN(G_N_ELEMENTS(huffman_table->huffman_table),
-                      GST_JPEG_MAX_SCAN_COMPONENTS);
-@@ -311,85 +370,71 @@ fill_huffman_table(
-                0,
-                sizeof(huffman_table->huffman_table[i].pad));
-     }
--    return TRUE;
- }
- 
--static guint
--get_max_horizontal_samples(GstJpegFrameHdr *frame_hdr)
-+static void
-+get_max_sampling_factors(const GstJpegFrameHdr *frame_hdr,
-+    guint *h_max_ptr, guint *v_max_ptr)
- {
--    guint i, max_factor = 0;
-+    guint h_max = frame_hdr->components[0].horizontal_factor;
-+    guint v_max = frame_hdr->components[0].vertical_factor;
-+    guint i;
- 
--    for (i = 0; i < frame_hdr->num_components; i++) {
--        if (frame_hdr->components[i].horizontal_factor > max_factor)
--            max_factor = frame_hdr->components[i].horizontal_factor;
-+    for (i = 1; i < frame_hdr->num_components; i++) {
-+        const GstJpegFrameComponent * const fcp = &frame_hdr->components[i];
-+        if (h_max < fcp->horizontal_factor)
-+            h_max = fcp->horizontal_factor;
-+        if (v_max < fcp->vertical_factor)
-+            v_max = fcp->vertical_factor;
-     }
--    return max_factor;
-+
-+    if (h_max_ptr)
-+        *h_max_ptr = h_max;
-+    if (v_max_ptr)
-+        *v_max_ptr = v_max;
- }
- 
--static guint
--get_max_vertical_samples(GstJpegFrameHdr *frame_hdr)
-+static const GstJpegFrameComponent *
-+get_component(const GstJpegFrameHdr *frame_hdr, guint selector)
- {
--    guint i, max_factor = 0;
-+    guint i;
- 
-     for (i = 0; i < frame_hdr->num_components; i++) {
--        if (frame_hdr->components[i].vertical_factor > max_factor)
--            max_factor = frame_hdr->components[i].vertical_factor;
-+        const GstJpegFrameComponent * const fcp = &frame_hdr->components[i];
-+        if (fcp->identifier == selector)
-+            return fcp;
-     }
--    return max_factor;
-+    return NULL;
- }
- 
- static GstVaapiDecoderStatus
--decode_picture(
--    GstVaapiDecoderJpeg *decoder, 
--    guint8               profile,
--    const guchar        *buf,
--    guint                buf_size
--)
-+decode_picture(GstVaapiDecoderJpeg *decoder, GstJpegMarkerSegment *seg,
-+    const guchar *buf)
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-     GstJpegFrameHdr * const frame_hdr = &priv->frame_hdr;
--    GstVaapiPicture *picture;
--    GstVaapiDecoderStatus status;
- 
--    switch (profile) {
-+    if (!VALID_STATE(decoder, GOT_SOI))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-+    switch (seg->marker) {
-     case GST_JPEG_MARKER_SOF_MIN:
-         priv->profile = GST_VAAPI_PROFILE_JPEG_BASELINE;
-         break;
-     default:
--        GST_ERROR("unsupported profile %d", profile);
-+        GST_ERROR("unsupported profile %d", seg->marker);
-         return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
-     }
- 
-     memset(frame_hdr, 0, sizeof(*frame_hdr));
--    if (!gst_jpeg_parse_frame_hdr(frame_hdr, buf, buf_size, 0)) {
-+    if (!gst_jpeg_parse_frame_hdr(frame_hdr, buf + seg->offset, seg->size, 0)) {
-         GST_ERROR("failed to parse image");
-         return GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
-     }
-     priv->height = frame_hdr->height;
-     priv->width  = frame_hdr->width;
- 
--    status = ensure_context(decoder);
--    if (status != GST_VAAPI_DECODER_STATUS_SUCCESS) {
--        GST_ERROR("failed to reset context");
--        return status;
--    }
--
--    if (priv->current_picture && !decode_current_picture(decoder))
--        return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
--
--    picture = GST_VAAPI_PICTURE_NEW(JPEGBaseline, decoder);
--    if (!picture) {
--        GST_ERROR("failed to allocate picture");
--        return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
--    }
--    gst_vaapi_picture_replace(&priv->current_picture, picture);
--    gst_vaapi_picture_unref(picture);
--
--    if (!fill_picture(decoder, picture, frame_hdr))
--        return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
--
--    /* Update presentation time */
--    picture->pts = GST_VAAPI_DECODER_CODEC_FRAME(decoder)->pts;
-+    priv->decoder_state |= GST_JPEG_VIDEO_STATE_GOT_SOF;
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
-@@ -402,11 +447,15 @@ decode_huffman_table(
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
- 
-+    if (!VALID_STATE(decoder, GOT_SOI))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-     if (!gst_jpeg_parse_huffman_table(&priv->huf_tables, buf, buf_size, 0)) {
--        GST_DEBUG("failed to parse Huffman table");
-+        GST_ERROR("failed to parse Huffman table");
-         return GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
-     }
--    priv->has_huf_table = TRUE;
-+
-+    priv->decoder_state |= GST_JPEG_VIDEO_STATE_GOT_HUF_TABLE;
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
-@@ -419,11 +468,15 @@ decode_quant_table(
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
- 
-+    if (!VALID_STATE(decoder, GOT_SOI))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-     if (!gst_jpeg_parse_quant_table(&priv->quant_tables, buf, buf_size, 0)) {
--        GST_DEBUG("failed to parse quantization table");
-+        GST_ERROR("failed to parse quantization table");
-         return GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
-     }
--    priv->has_quant_table = TRUE;
-+
-+    priv->decoder_state |= GST_JPEG_VIDEO_STATE_GOT_IQ_TABLE;
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
-@@ -436,55 +489,64 @@ decode_restart_interval(
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
- 
-+    if (!VALID_STATE(decoder, GOT_SOI))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-     if (!gst_jpeg_parse_restart_interval(&priv->mcu_restart, buf, buf_size, 0)) {
--        GST_DEBUG("failed to parse restart interval");
-+        GST_ERROR("failed to parse restart interval");
-         return GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
-     }
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
- static GstVaapiDecoderStatus
--decode_scan(
--    GstVaapiDecoderJpeg *decoder,
--    const guchar        *scan_header,
--    guint                scan_header_size,
--    const guchar        *scan_data,
--    guint                scan_data_size
--)
-+decode_scan(GstVaapiDecoderJpeg *decoder, GstJpegMarkerSegment *seg,
-+    const guchar *buf)
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
--    GstVaapiPicture *picture = priv->current_picture;
-+    GstVaapiPicture * const picture = priv->current_picture;
-+    GstVaapiSlice *slice;
-     VASliceParameterBufferJPEGBaseline *slice_param;
--    GstVaapiSlice *gst_slice;
--    guint total_h_samples, total_v_samples;
--    GstJpegScanHdr  scan_hdr;
--    guint i;
-+    GstJpegScanHdr scan_hdr;
-+    guint scan_hdr_size, scan_data_size;
-+    guint i, h_max, v_max, mcu_width, mcu_height;
- 
--    if (!picture) {
--        GST_ERROR("There is no VAPicture before decoding scan.");
--        return GST_VAAPI_DECODER_STATUS_ERROR_INVALID_SURFACE;
--    }
--
--    if (!fill_quantization_table(decoder, picture)) {
--        GST_ERROR("failed to fill in quantization table");
--        return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
--    }
-+    if (!VALID_STATE(decoder, GOT_SOF))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
- 
--    if (!fill_huffman_table(decoder, picture)) {
--        GST_ERROR("failed to fill in huffman table");
--        return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
--    }
-+    scan_hdr_size = (buf[seg->offset] << 8) | buf[seg->offset + 1];
-+    scan_data_size = seg->size - scan_hdr_size;
- 
-     memset(&scan_hdr, 0, sizeof(scan_hdr));
--    if (!gst_jpeg_parse_scan_hdr(&scan_hdr, scan_header, scan_header_size, 0)) {
--        GST_DEBUG("Jpeg parsed scan failed.");
-+    if (!gst_jpeg_parse_scan_hdr(&scan_hdr, buf + seg->offset, seg->size, 0)) {
-+        GST_ERROR("failed to parse scan header");
-         return GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
-     }
- 
--    gst_slice = GST_VAAPI_SLICE_NEW(JPEGBaseline, decoder, scan_data, scan_data_size);
--    gst_vaapi_picture_add_slice(picture, gst_slice);
-+    slice = GST_VAAPI_SLICE_NEW(JPEGBaseline, decoder,
-+        buf + seg->offset + scan_hdr_size, scan_data_size);
-+    if (!slice) {
-+        GST_ERROR("failed to allocate slice");
-+        return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
-+    }
-+    gst_vaapi_picture_add_slice(picture, slice);
-+
-+    if (!VALID_STATE(decoder, GOT_HUF_TABLE))
-+        gst_jpeg_get_default_huffman_tables(&priv->huf_tables);
- 
--    slice_param = gst_slice->param;
-+    // Update VA Huffman table if it changed for this scan
-+    if (huffman_tables_updated(&priv->huf_tables)) {
-+        slice->huf_table = GST_VAAPI_HUFFMAN_TABLE_NEW(JPEGBaseline, decoder);
-+        if (!slice->huf_table) {
-+            GST_ERROR("failed to allocate Huffman tables");
-+            huffman_tables_reset(&priv->huf_tables);
-+            return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
-+        }
-+        fill_huffman_table(slice->huf_table, &priv->huf_tables);
-+        huffman_tables_reset(&priv->huf_tables);
-+    }
-+
-+    slice_param = slice->param;
-     slice_param->num_components = scan_hdr.num_components;
-     for (i = 0; i < scan_hdr.num_components; i++) {
-         slice_param->components[i].component_selector =
-@@ -495,142 +557,73 @@ decode_scan(
-             scan_hdr.components[i].ac_selector;
-     }
-     slice_param->restart_interval = priv->mcu_restart;
--    if (scan_hdr.num_components == 1) { /*non-interleaved*/
--        slice_param->slice_horizontal_position = 0;
--        slice_param->slice_vertical_position = 0;
--        /* Y mcu numbers*/
--        if (slice_param->components[0].component_selector == priv->frame_hdr.components[0].identifier) {
--            slice_param->num_mcus = (priv->frame_hdr.width/8)*(priv->frame_hdr.height/8);
--        } else { /*Cr, Cb mcu numbers*/
--            slice_param->num_mcus = (priv->frame_hdr.width/16)*(priv->frame_hdr.height/16);
-+    slice_param->slice_horizontal_position = 0;
-+    slice_param->slice_vertical_position = 0;
-+
-+    get_max_sampling_factors(&priv->frame_hdr, &h_max, &v_max);
-+    mcu_width = 8 * h_max;
-+    mcu_height = 8 * v_max;
-+
-+    if (scan_hdr.num_components == 1) { // Non-interleaved
-+        const guint Csj = slice_param->components[0].component_selector;
-+        const GstJpegFrameComponent * const fcp =
-+            get_component(&priv->frame_hdr, Csj);
-+
-+        if (!fcp || fcp->horizontal_factor == 0 || fcp->vertical_factor == 0) {
-+            GST_ERROR("failed to validate image component %u", Csj);
-+            return GST_VAAPI_DECODER_STATUS_ERROR_INVALID_PARAMETER;
-         }
--    } else { /* interleaved */
--        slice_param->slice_horizontal_position = 0;
--        slice_param->slice_vertical_position = 0;
--        total_v_samples = get_max_vertical_samples(&priv->frame_hdr);
--        total_h_samples = get_max_horizontal_samples(&priv->frame_hdr);
--        slice_param->num_mcus = ((priv->frame_hdr.width + total_h_samples*8 - 1)/(total_h_samples*8)) *
--                                ((priv->frame_hdr.height + total_v_samples*8 -1)/(total_v_samples*8));
-+        mcu_width /= fcp->horizontal_factor;
-+        mcu_height /= fcp->vertical_factor;
-     }
-+    slice_param->num_mcus =
-+        ((priv->frame_hdr.width + mcu_width - 1) / mcu_width) *
-+        ((priv->frame_hdr.height + mcu_height - 1) / mcu_height);
- 
--    if (picture->slices && picture->slices->len)
--        return GST_VAAPI_DECODER_STATUS_SUCCESS;
--    return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
-+    priv->decoder_state |= GST_JPEG_VIDEO_STATE_GOT_SOS;
-+    return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
- static GstVaapiDecoderStatus
--decode_buffer(GstVaapiDecoderJpeg *decoder, const guchar *buf, guint buf_size)
-+decode_segment(GstVaapiDecoderJpeg *decoder, GstJpegMarkerSegment *seg,
-+    const guchar *buf)
- {
-     GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
--    GstVaapiDecoderStatus status = GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
--    GstJpegMarkerSegment seg;
--    GstJpegScanSegment scan_seg;
--    guint ofs;
--    gboolean append_ecs;
--
--    memset(&scan_seg, 0, sizeof(scan_seg));
--
--    ofs = 0;
--    while (gst_jpeg_parse(&seg, buf, buf_size, ofs)) {
--        if (seg.size < 0) {
--            GST_DEBUG("buffer to short for parsing");
--            return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
--        }
--        ofs += seg.size;
--
--        /* Decode scan, if complete */
--        if (seg.marker == GST_JPEG_MARKER_EOI && scan_seg.header_size > 0) {
--            scan_seg.data_size = seg.offset - scan_seg.data_offset;
--            scan_seg.is_valid  = TRUE;
--        }
--        if (scan_seg.is_valid) {
--            status = decode_scan(
--                decoder,
--                buf + scan_seg.header_offset,
--                scan_seg.header_size,
--                buf + scan_seg.data_offset,
--                scan_seg.data_size
--            );
--            if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
--                break;
--            memset(&scan_seg, 0, sizeof(scan_seg));
--        }
--
--        append_ecs = TRUE;
--        switch (seg.marker) {
--        case GST_JPEG_MARKER_SOI:
--            priv->has_quant_table = FALSE;
--            priv->has_huf_table   = FALSE;
--            priv->mcu_restart     = 0;
--            status = GST_VAAPI_DECODER_STATUS_SUCCESS;
--            break;
--        case GST_JPEG_MARKER_EOI:
--            if (decode_current_picture(decoder)) {
--                /* Get out of the loop, trailing data is not needed */
--                status = GST_VAAPI_DECODER_STATUS_SUCCESS;
--                goto end;
--            }
--            status = GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
--            break;
--        case GST_JPEG_MARKER_DHT:
--            status = decode_huffman_table(decoder, buf + seg.offset, seg.size);
--            break;
--        case GST_JPEG_MARKER_DQT:
--            status = decode_quant_table(decoder, buf + seg.offset, seg.size);
--            break;
--        case GST_JPEG_MARKER_DRI:
--            status = decode_restart_interval(decoder, buf + seg.offset, seg.size);
--            break;
--        case GST_JPEG_MARKER_DAC:
--            GST_ERROR("unsupported arithmetic coding mode");
--            status = GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
--            break;
--        case GST_JPEG_MARKER_SOS:
--            scan_seg.header_offset = seg.offset;
--            scan_seg.header_size   = seg.size;
--            scan_seg.data_offset   = seg.offset + seg.size;
--            scan_seg.data_size     = 0;
--            append_ecs             = FALSE;
--            break;
--        default:
--            /* Restart marker */
--            if (seg.marker >= GST_JPEG_MARKER_RST_MIN &&
--                seg.marker <= GST_JPEG_MARKER_RST_MAX) {
--                append_ecs = FALSE;
--                break;
--            }
--
--            /* Frame header */
--            if (seg.marker >= GST_JPEG_MARKER_SOF_MIN &&
--                seg.marker <= GST_JPEG_MARKER_SOF_MAX) {
--                status = decode_picture(
--                    decoder,
--                    seg.marker,
--                    buf + seg.offset, seg.size
--                );
--                break;
--            }
--
--            /* Application segments */
--            if (seg.marker >= GST_JPEG_MARKER_APP_MIN &&
--                seg.marker <= GST_JPEG_MARKER_APP_MAX) {
--                status = GST_VAAPI_DECODER_STATUS_SUCCESS;
--                break;
--            }
--
--            GST_WARNING("unsupported marker (0x%02x)", seg.marker);
--            status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
--            break;
--        }
--
--        /* Append entropy coded segments */
--        if (append_ecs)
--            scan_seg.data_size = seg.offset - scan_seg.data_offset;
-+    GstVaapiDecoderStatus status;
- 
--        if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
--            break;
-+    // Decode segment
-+    status = GST_VAAPI_DECODER_STATUS_SUCCESS;
-+    switch (seg->marker) {
-+    case GST_JPEG_MARKER_SOI:
-+        priv->mcu_restart = 0;
-+        priv->decoder_state |= GST_JPEG_VIDEO_STATE_GOT_SOI;
-+        break;
-+    case GST_JPEG_MARKER_EOI:
-+        priv->decoder_state = 0;
-+        break;
-+    case GST_JPEG_MARKER_DAC:
-+        GST_ERROR("unsupported arithmetic coding mode");
-+        status = GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
-+        break;
-+    case GST_JPEG_MARKER_DHT:
-+        status = decode_huffman_table(decoder, buf + seg->offset, seg->size);
-+        break;
-+    case GST_JPEG_MARKER_DQT:
-+        status = decode_quant_table(decoder, buf + seg->offset, seg->size);
-+        break;
-+    case GST_JPEG_MARKER_DRI:
-+        status = decode_restart_interval(decoder, buf + seg->offset, seg->size);
-+        break;
-+    case GST_JPEG_MARKER_SOS:
-+        status = decode_scan(decoder, seg, buf);
-+        break;
-+    default:
-+        // SOFn segments
-+        if (seg->marker >= GST_JPEG_MARKER_SOF_MIN &&
-+            seg->marker <= GST_JPEG_MARKER_SOF_MAX)
-+            status = decode_picture(decoder, seg, buf);
-+        break;
-     }
--end:
-     return status;
- }
- 
-@@ -647,11 +640,11 @@ ensure_decoder(GstVaapiDecoderJpeg *decoder)
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
--static inline gint
--scan_for_start_code(GstAdapter *adapter, guint ofs, guint size, guint32 *scp)
-+static gboolean
-+is_scan_complete(GstJpegMarkerCode marker)
- {
--    return (gint)gst_adapter_masked_scan_uint32_peek(adapter,
--        0xffff0000, 0xffd80000, ofs, size, scp);
-+    // Scan is assumed to be complete when the new segment is not RSTi
-+    return marker < GST_JPEG_MARKER_RST_MIN || marker > GST_JPEG_MARKER_RST_MAX;
- }
- 
- static GstVaapiDecoderStatus
-@@ -660,40 +653,129 @@ gst_vaapi_decoder_jpeg_parse(GstVaapiDecoder *base_decoder,
- {
-     GstVaapiDecoderJpeg * const decoder =
-         GST_VAAPI_DECODER_JPEG_CAST(base_decoder);
-+    GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-+    GstVaapiParserState * const ps = GST_VAAPI_PARSER_STATE(base_decoder);
-     GstVaapiDecoderStatus status;
--    guint size, buf_size, flags = 0;
--    gint ofs;
-+    GstJpegMarkerCode marker;
-+    GstJpegMarkerSegment seg;
-+    const guchar *buf;
-+    guint buf_size, flags;
-+    gint ofs1, ofs2;
- 
-     status = ensure_decoder(decoder);
-     if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
-         return status;
- 
--    /* Expect at least 4 bytes, SOI .. EOI */
--    size = gst_adapter_available(adapter);
--    if (size < 4)
-+    /* Expect at least 2 bytes for the marker */
-+    buf_size = gst_adapter_available(adapter);
-+    if (buf_size < 2)
-         return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- 
--    ofs = scan_for_start_code(adapter, 0, size, NULL);
--    if (ofs < 0)
-+    buf = gst_adapter_map(adapter, buf_size);
-+    if (!buf)
-         return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
--    gst_adapter_flush(adapter, ofs);
--    size -= ofs;
--
--    ofs = G_UNLIKELY(size < 4) ? -1 :
--        scan_for_start_code(adapter, 2, size - 2, NULL);
--    if (ofs < 0) {
--        // Assume the whole packet is present if end-of-stream
--        if (!at_eos)
--            return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
--        ofs = size;
--    }
--    buf_size = ofs;
- 
--    unit->size = buf_size;
-+    ofs1 = ps->input_offset1 - 2;
-+    if (ofs1 < 0)
-+        ofs1 = 0;
- 
--    flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
--    flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END;
--    flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
-+    for (;;) {
-+        // Skip any garbage until we reach SOI, if needed
-+        if (!gst_jpeg_parse(&seg, buf, buf_size, ofs1)) {
-+            gst_adapter_unmap(adapter);
-+            ps->input_offset1 = buf_size;
-+            return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
-+        }
-+        ofs1 = seg.offset;
-+
-+        marker = seg.marker;
-+        if (!VALID_STATE(parser, GOT_SOI) && marker != GST_JPEG_MARKER_SOI)
-+            continue;
-+        if (marker == GST_JPEG_MARKER_SOS) {
-+            ofs2 = ps->input_offset2 - 2;
-+            if (ofs2 < ofs1 + seg.size)
-+                ofs2 = ofs1 + seg.size;
-+
-+            // Parse the whole scan + ECSs, including RSTi
-+            for (;;) {
-+                if (!gst_jpeg_parse(&seg, buf, buf_size, ofs2)) {
-+                    gst_adapter_unmap(adapter);
-+                    ps->input_offset1 = ofs1;
-+                    ps->input_offset2 = buf_size;
-+                    return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
-+                }
-+
-+                if (is_scan_complete(seg.marker))
-+                    break;
-+                ofs2 = seg.offset + seg.size;
-+            }
-+            ofs2 = seg.offset - 2;
-+        }
-+        else {
-+            // Check that the whole segment is actually available (in buffer)
-+            ofs2 = ofs1 + seg.size;
-+            if (ofs2 > buf_size) {
-+                gst_adapter_unmap(adapter);
-+                ps->input_offset1 = ofs1;
-+                return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
-+            }
-+        }
-+        break;
-+    }
-+    gst_adapter_unmap(adapter);
-+
-+    unit->size = ofs2 - ofs1;
-+    unit_set_marker_code(unit, marker);
-+    gst_adapter_flush(adapter, ofs1);
-+    ps->input_offset1 = 2;
-+    ps->input_offset2 = 2;
-+
-+    flags = 0;
-+    switch (marker) {
-+    case GST_JPEG_MARKER_SOI:
-+        flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
-+        priv->parser_state |= GST_JPEG_VIDEO_STATE_GOT_SOI;
-+        break;
-+    case GST_JPEG_MARKER_EOI:
-+        flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END;
-+        priv->parser_state = 0;
-+        break;
-+    case GST_JPEG_MARKER_SOS:
-+        flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
-+        priv->parser_state |= GST_JPEG_VIDEO_STATE_GOT_SOS;
-+        break;
-+    case GST_JPEG_MARKER_DAC:
-+    case GST_JPEG_MARKER_DHT:
-+    case GST_JPEG_MARKER_DQT:
-+        if (priv->parser_state & GST_JPEG_VIDEO_STATE_GOT_SOF)
-+            flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
-+        break;
-+    case GST_JPEG_MARKER_DRI:
-+        if (priv->parser_state & GST_JPEG_VIDEO_STATE_GOT_SOS)
-+            flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
-+        break;
-+    case GST_JPEG_MARKER_DNL:
-+        flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
-+        break;
-+    case GST_JPEG_MARKER_COM:
-+        flags |= GST_VAAPI_DECODER_UNIT_FLAG_SKIP;
-+        break;
-+    default:
-+        /* SOFn segments */
-+        if (marker >= GST_JPEG_MARKER_SOF_MIN &&
-+            marker <= GST_JPEG_MARKER_SOF_MAX)
-+            priv->parser_state |= GST_JPEG_VIDEO_STATE_GOT_SOF;
-+
-+        /* Application segments */
-+        else if (marker >= GST_JPEG_MARKER_APP_MIN &&
-+                 marker <= GST_JPEG_MARKER_APP_MAX)
-+            flags |= GST_VAAPI_DECODER_UNIT_FLAG_SKIP;
-+
-+        /* Reserved */
-+        else if (marker >= 0x02 && marker <= 0xbf)
-+            flags |= GST_VAAPI_DECODER_UNIT_FLAG_SKIP;
-+        break;
-+    }
-     GST_VAAPI_DECODER_UNIT_FLAG_SET(unit, flags);
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
-@@ -705,6 +787,7 @@ gst_vaapi_decoder_jpeg_decode(GstVaapiDecoder *base_decoder,
-     GstVaapiDecoderJpeg * const decoder =
-         GST_VAAPI_DECODER_JPEG_CAST(base_decoder);
-     GstVaapiDecoderStatus status;
-+    GstJpegMarkerSegment seg;
-     GstBuffer * const buffer =
-         GST_VAAPI_DECODER_CODEC_FRAME(decoder)->input_buffer;
-     GstMapInfo map_info;
-@@ -718,13 +801,65 @@ gst_vaapi_decoder_jpeg_decode(GstVaapiDecoder *base_decoder,
-         return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
-     }
- 
--    status = decode_buffer(decoder, map_info.data + unit->offset, unit->size);
-+    seg.marker = unit_get_marker_code(unit);
-+    seg.offset = unit->offset;
-+    seg.size = unit->size;
-+
-+    status = decode_segment(decoder, &seg, map_info.data);
-     gst_buffer_unmap(buffer, &map_info);
-     if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
-         return status;
-     return GST_VAAPI_DECODER_STATUS_SUCCESS;
- }
- 
-+static GstVaapiDecoderStatus
-+gst_vaapi_decoder_jpeg_start_frame(GstVaapiDecoder *base_decoder,
-+    GstVaapiDecoderUnit *base_unit)
-+{
-+    GstVaapiDecoderJpeg * const decoder =
-+        GST_VAAPI_DECODER_JPEG_CAST(base_decoder);
-+    GstVaapiDecoderJpegPrivate * const priv = &decoder->priv;
-+    GstVaapiPicture *picture;
-+    GstVaapiDecoderStatus status;
-+
-+    if (!VALID_STATE(decoder, GOT_SOF))
-+        return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+
-+    status = ensure_context(decoder);
-+    if (status != GST_VAAPI_DECODER_STATUS_SUCCESS) {
-+        GST_ERROR("failed to reset context");
-+        return status;
-+    }
-+
-+    picture = GST_VAAPI_PICTURE_NEW(JPEGBaseline, decoder);
-+    if (!picture) {
-+        GST_ERROR("failed to allocate picture");
-+        return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
-+    }
-+    gst_vaapi_picture_replace(&priv->current_picture, picture);
-+    gst_vaapi_picture_unref(picture);
-+
-+    if (!fill_picture(decoder, picture, &priv->frame_hdr))
-+        return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
-+
-+    status = fill_quantization_table(decoder, picture);
-+    if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
-+        return status;
-+
-+    /* Update presentation time */
-+    picture->pts = GST_VAAPI_DECODER_CODEC_FRAME(decoder)->pts;
-+    return GST_VAAPI_DECODER_STATUS_SUCCESS;
-+}
-+
-+static GstVaapiDecoderStatus
-+gst_vaapi_decoder_jpeg_end_frame(GstVaapiDecoder *base_decoder)
-+{
-+    GstVaapiDecoderJpeg * const decoder =
-+        GST_VAAPI_DECODER_JPEG_CAST(base_decoder);
-+
-+    return decode_current_picture(decoder);
-+}
-+
- static void
- gst_vaapi_decoder_jpeg_class_init(GstVaapiDecoderJpegClass *klass)
- {
-@@ -739,6 +874,8 @@ gst_vaapi_decoder_jpeg_class_init(GstVaapiDecoderJpegClass *klass)
-     decoder_class->destroy      = gst_vaapi_decoder_jpeg_destroy;
-     decoder_class->parse        = gst_vaapi_decoder_jpeg_parse;
-     decoder_class->decode       = gst_vaapi_decoder_jpeg_decode;
-+    decoder_class->start_frame  = gst_vaapi_decoder_jpeg_start_frame;
-+    decoder_class->end_frame    = gst_vaapi_decoder_jpeg_end_frame;
- }
- 
- static inline const GstVaapiDecoderClass *
-diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_objects.c b/gst-libs/gst/vaapi/gstvaapidecoder_objects.c
-index fbbe5f7..218b512 100644
---- a/gst-libs/gst/vaapi/gstvaapidecoder_objects.c
-+++ b/gst-libs/gst/vaapi/gstvaapidecoder_objects.c
-@@ -291,6 +291,11 @@ gst_vaapi_picture_decode(GstVaapiPicture *picture)
-         GstVaapiSlice * const slice = g_ptr_array_index(picture->slices, i);
-         VABufferID va_buffers[2];
- 
-+        huf_table = slice->huf_table;
-+        if (huf_table && !do_decode(va_display, va_context,
-+                &huf_table->param_id, (void **)&huf_table->param))
-+            return FALSE;
-+
-         vaapi_unmap_buffer(va_display, slice->param_id, NULL);
-         va_buffers[0] = slice->param_id;
-         va_buffers[1] = slice->data_id;
-@@ -396,6 +401,9 @@ gst_vaapi_slice_destroy(GstVaapiSlice *slice)
- {
-     VADisplay const va_display = GET_VA_DISPLAY(slice);
- 
-+    gst_vaapi_mini_object_replace((GstVaapiMiniObject **)&slice->huf_table,
-+        NULL);
-+
-     vaapi_destroy_buffer(va_display, &slice->data_id);
-     vaapi_destroy_buffer(va_display, &slice->param_id);
-     slice->param = NULL;
-diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_objects.h b/gst-libs/gst/vaapi/gstvaapidecoder_objects.h
-index 90e8f04..3d595ae 100644
---- a/gst-libs/gst/vaapi/gstvaapidecoder_objects.h
-+++ b/gst-libs/gst/vaapi/gstvaapidecoder_objects.h
-@@ -216,6 +216,9 @@ struct _GstVaapiSlice {
-     VABufferID                  param_id;
-     VABufferID                  data_id;
-     gpointer                    param;
-+
-+    /* Per-slice overrides */
-+    GstVaapiHuffmanTable       *huf_table;
- };
- 
- G_GNUC_INTERNAL
-diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_priv.h b/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
-index a86b4a1..8b6d897 100644
---- a/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
-+++ b/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
-@@ -168,6 +168,7 @@ struct _GstVaapiParserState {
-     GstVideoCodecFrame *current_frame;
-     GstAdapter         *current_adapter;
-     GstAdapter         *input_adapter;
-+    gint                input_offset1;
-     gint                input_offset2;
-     GstAdapter         *output_adapter;
-     GstVaapiDecoderUnit next_unit;
-diff --git a/gst/vaapi/Makefile.am b/gst/vaapi/Makefile.am
-index 1b89467..0b8a45e 100644
---- a/gst/vaapi/Makefile.am
-+++ b/gst/vaapi/Makefile.am
-@@ -33,38 +33,60 @@ libgstvaapi_source_c = \
- 	gstvaapi.c		\
- 	gstvaapidecode.c	\
- 	gstvaapipluginutil.c	\
--	gstvaapipostproc.c	\
- 	gstvaapisink.c		\
- 	gstvaapiuploader.c	\
- 	gstvaapivideobuffer.c	\
-+	gstvaapivideocontext.c	\
- 	gstvaapivideometa.c	\
- 	$(NULL)
- 
- libgstvaapi_source_h = \
- 	gstvaapidecode.h	\
- 	gstvaapipluginutil.h	\
--	gstvaapipostproc.h	\
- 	gstvaapisink.h		\
- 	gstvaapiuploader.h	\
- 	gstvaapivideobuffer.h	\
-+	gstvaapivideocontext.h	\
- 	gstvaapivideometa.h	\
- 	$(NULL)
- 
-+if !USE_GST_API_1_2p
-+libgstvaapi_source_c += gstvaapipostproc.c
-+libgstvaapi_source_h += gstvaapipostproc.h
-+endif
-+
- libgstvaapi_x11_source_c = gstvaapivideoconverter_x11.c
- libgstvaapi_x11_source_h = gstvaapivideoconverter_x11.h
- 
- if USE_X11
-+if !USE_GST_API_1_2p
- libgstvaapi_source_c += $(libgstvaapi_x11_source_c)
- libgstvaapi_source_h += $(libgstvaapi_x11_source_h)
- endif
-+endif
- 
- libgstvaapi_glx_source_c = gstvaapivideoconverter_glx.c
- libgstvaapi_glx_source_h = gstvaapivideoconverter_glx.h
- 
- if USE_GLX
-+if !USE_GST_API_1_2p
- libgstvaapi_source_c += $(libgstvaapi_glx_source_c)
- libgstvaapi_source_h += $(libgstvaapi_glx_source_h)
- endif
-+endif
-+
-+libgstvaapi_1_2p_source_c = \
-+	gstvaapivideometa_texture.c \
-+	$(NULL)
-+
-+libgstvaapi_1_2p_source_h = \
-+	gstvaapivideometa_texture.h \
-+	$(NULL)
-+
-+if USE_GST_API_1_2p
-+libgstvaapi_source_c += $(libgstvaapi_1_2p_source_c)
-+libgstvaapi_source_h += $(libgstvaapi_1_2p_source_h)
-+endif
- 
- libgstvaapi_1_0p_source_c = \
- 	gstvaapivideobufferpool.c \
-@@ -126,6 +148,8 @@ libgstvaapi_la_LIBTOOLFLAGS = --tag=disable-static
- EXTRA_DIST = \
- 	$(libgstvaapi_glx_source_c)	\
- 	$(libgstvaapi_glx_source_h)	\
-+	$(libgstvaapi_1_2p_source_c)	\
-+	$(libgstvaapi_1_2p_source_h)	\
- 	$(libgstvaapi_1_0p_source_c)	\
- 	$(libgstvaapi_1_0p_source_h)	\
- 	$(libgstvaapi_0_10_source_c)	\
-diff --git a/gst/vaapi/gstvaapi.c b/gst/vaapi/gstvaapi.c
-index 3000b22..7d12a66 100644
---- a/gst/vaapi/gstvaapi.c
-+++ b/gst/vaapi/gstvaapi.c
-@@ -47,9 +47,11 @@ plugin_init (GstPlugin *plugin)
-     gst_element_register(plugin, "vaapidecode",
-                          GST_RANK_PRIMARY,
-                          GST_TYPE_VAAPIDECODE);
-+#if !GST_CHECK_VERSION(1,1,0)
-     gst_element_register(plugin, "vaapipostproc",
-                          GST_RANK_PRIMARY,
-                          GST_TYPE_VAAPIPOSTPROC);
-+#endif
-     gst_element_register(plugin, "vaapisink",
-                          GST_RANK_PRIMARY,
-                          GST_TYPE_VAAPISINK);
-diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c
-index 68cc58f..597a3fb 100644
---- a/gst/vaapi/gstvaapidecode.c
-+++ b/gst/vaapi/gstvaapidecode.c
-@@ -30,11 +30,14 @@
- 
- #include "gst/vaapi/sysdeps.h"
- #include <gst/vaapi/gstvaapidisplay.h>
--#include <gst/video/videocontext.h>
- 
- #include "gstvaapidecode.h"
- #include "gstvaapipluginutil.h"
-+#include "gstvaapivideocontext.h"
- #include "gstvaapivideobuffer.h"
-+#if GST_CHECK_VERSION(1,1,0)
-+#include "gstvaapivideometa_texture.h"
-+#endif
- #if GST_CHECK_VERSION(1,0,0)
- #include "gstvaapivideobufferpool.h"
- #include "gstvaapivideomemory.h"
-@@ -67,7 +70,15 @@ static const char gst_vaapidecode_sink_caps_str[] =
-     ;
- 
- static const char gst_vaapidecode_src_caps_str[] =
-+#if GST_CHECK_VERSION(1,1,0)
-+    GST_VIDEO_CAPS_MAKE_WITH_FEATURES(
-+        GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, GST_VIDEO_FORMATS_ALL) ";"
-+    GST_VIDEO_CAPS_MAKE_WITH_FEATURES(
-+        GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
-+        GST_VIDEO_FORMATS_ALL);
-+#else
-     GST_VAAPI_SURFACE_CAPS;
-+#endif
- 
- static GstStaticPadTemplate gst_vaapidecode_sink_factory =
-     GST_STATIC_PAD_TEMPLATE(
-@@ -102,6 +113,7 @@ gst_vaapidecode_implements_iface_init(GstImplementsInterfaceClass *iface)
- #endif
- 
- /* GstVideoContext interface */
-+#if !GST_CHECK_VERSION(1,1,0)
- static void
- gst_vaapidecode_set_video_context(GstVideoContext *context, const gchar *type,
-     const GValue *value)
-@@ -117,6 +129,8 @@ gst_video_context_interface_init(GstVideoContextInterface *iface)
- }
- 
- #define GstVideoContextClass GstVideoContextInterface
-+#endif
-+
- G_DEFINE_TYPE_WITH_CODE(
-     GstVaapiDecode,
-     gst_vaapidecode,
-@@ -125,8 +139,11 @@ G_DEFINE_TYPE_WITH_CODE(
-     G_IMPLEMENT_INTERFACE(GST_TYPE_IMPLEMENTS_INTERFACE,
-                           gst_vaapidecode_implements_iface_init);
- #endif
-+#if !GST_CHECK_VERSION(1,1,0)
-     G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_CONTEXT,
--                          gst_video_context_interface_init))
-+                          gst_video_context_interface_init)
-+#endif
-+    )
- 
- static gboolean
- gst_vaapidecode_update_src_caps(GstVaapiDecode *decode,
-@@ -174,6 +191,9 @@ gst_vaapidecode_update_src_caps(GstVaapiDecode *decode,
-     }
-     gst_video_codec_state_unref(state);
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+    state->caps = gst_video_info_to_caps(&vis);
-+#else
-     /* XXX: gst_video_info_to_caps() from GStreamer 0.10 does not
-        reconstruct suitable caps for "encoded" video formats */
-     state->caps = gst_caps_from_string(GST_VAAPI_SURFACE_CAPS_NAME);
-@@ -194,6 +214,7 @@ gst_vaapidecode_update_src_caps(GstVaapiDecode *decode,
-             gst_caps_get_structure(state->caps, 0);
-         gst_structure_set_interlaced(structure, TRUE);
-     }
-+#endif
-     gst_caps_replace(&decode->srcpad_caps, state->caps);
-     return TRUE;
- }
-@@ -328,6 +349,11 @@ gst_vaapidecode_push_decoded_frame(GstVideoDecoder *vdec)
-                 crop_meta->height = crop_rect->height;
-             }
-         }
-+
-+#if GST_CHECK_VERSION(1,1,0)
-+        if (decode->has_texture_upload_meta)
-+            gst_buffer_add_texture_upload_meta(out_frame->output_buffer);
-+#endif
- #else
-         out_frame->output_buffer =
-             gst_vaapi_video_buffer_new_with_surface_proxy(proxy);
-@@ -514,6 +540,18 @@ gst_vaapidecode_decide_allocation(GstVideoDecoder *vdec, GstQuery *query)
-         gst_buffer_pool_set_config(pool, config);
-     }
- 
-+    decode->has_texture_upload_meta = FALSE;
-+    if (gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL)) {
-+        config = gst_buffer_pool_get_config(pool);
-+        gst_buffer_pool_config_add_option(config,
-+            GST_BUFFER_POOL_OPTION_VIDEO_META);
-+        gst_buffer_pool_set_config(pool, config);
-+#if GST_CHECK_VERSION(1,1,0)
-+        decode->has_texture_upload_meta = gst_query_find_allocation_meta(query,
-+            GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL);
-+#endif
-+    }
-+
-     if (update_pool)
-         gst_query_set_nth_allocation_pool(query, 0, pool, size, min, max);
-     else
-@@ -536,6 +574,20 @@ error_create_pool:
- }
- #endif
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+static void
-+gst_vaapidecode_set_context(GstElement *element, GstContext *context)
-+{
-+    GstVaapiDecode * const decode = GST_VAAPIDECODE(element);
-+    GstVaapiDisplay *display = NULL;
-+
-+    if (gst_vaapi_video_context_get_display(context, &display)) {
-+        GST_INFO_OBJECT(element, "set display %p", display);
-+        gst_vaapi_display_replace(&decode->display, display);
-+    }
-+}
-+#endif
-+
- static inline gboolean
- gst_vaapidecode_ensure_display(GstVaapiDecode *decode)
- {
-@@ -607,6 +659,8 @@ gst_vaapidecode_reset_full(GstVaapiDecode *decode, GstCaps *caps, gboolean hard)
- {
-     GstVaapiCodec codec;
- 
-+    decode->has_texture_upload_meta = FALSE;
-+
-     /* Reset timers if hard reset was requested (e.g. seek) */
-     if (hard) {
-         decode->render_time_base = 0;
-@@ -769,6 +823,10 @@ gst_vaapidecode_class_init(GstVaapiDecodeClass *klass)
-         GST_DEBUG_FUNCPTR(gst_vaapidecode_decide_allocation);
- #endif
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+    element_class->set_context = GST_DEBUG_FUNCPTR(gst_vaapidecode_set_context);
-+#endif
-+
-     gst_element_class_set_static_metadata(element_class,
-         "VA-API decoder",
-         "Codec/Decoder/Video",
-@@ -858,10 +916,12 @@ gst_vaapidecode_query(GST_PAD_QUERY_FUNCTION_ARGS)
-         GST_VAAPIDECODE(gst_pad_get_parent_element(pad));
-     gboolean res;
- 
--    GST_DEBUG("sharing display %p", decode->display);
-+    GST_INFO_OBJECT(decode, "query type %s", GST_QUERY_TYPE_NAME(query));
- 
--    if (gst_vaapi_reply_to_query(query, decode->display))
-+    if (gst_vaapi_reply_to_query(query, decode->display)) {
-+        GST_DEBUG("sharing display %p", decode->display);
-         res = TRUE;
-+    }
-     else if (GST_PAD_IS_SINK(pad)) {
-         switch (GST_QUERY_TYPE(query)) {
- #if GST_CHECK_VERSION(1,0,0)
-@@ -873,6 +933,24 @@ gst_vaapidecode_query(GST_PAD_QUERY_FUNCTION_ARGS)
-             break;
-         }
- #endif
-+#if GST_CHECK_VERSION(1,1,0)
-+        case GST_QUERY_CONTEXT: {
-+            const gchar *context_type = NULL;
-+
-+            if (gst_query_parse_context_type(query, &context_type) &&
-+                !g_strcmp0(context_type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME) &&
-+                decode->display) {
-+                GstContext *context;
-+
-+                context = gst_vaapi_video_context_new_with_display(
-+                    decode->display, FALSE);
-+                gst_query_set_context(query, context);
-+                gst_context_unref(context);
-+                return TRUE;
-+            }
-+            // fall-through
-+        }
-+#endif
-         default:
-             res = GST_PAD_QUERY_FUNCTION_CALL(decode->sinkpad_query,
-                 decode->sinkpad, parent, query);
-diff --git a/gst/vaapi/gstvaapidecode.h b/gst/vaapi/gstvaapidecode.h
-index 23991cf..161937b 100644
---- a/gst/vaapi/gstvaapidecode.h
-+++ b/gst/vaapi/gstvaapidecode.h
-@@ -79,6 +79,7 @@ struct _GstVaapiDecode {
-     gint64              render_time_base;
-     GstClockTime        last_buffer_time;
-     guint               current_frame_size;
-+    guint               has_texture_upload_meta : 1;
- };
- 
- struct _GstVaapiDecodeClass {
-diff --git a/gst/vaapi/gstvaapipluginutil.c b/gst/vaapi/gstvaapipluginutil.c
-index ac48d01..43b1fc5 100644
---- a/gst/vaapi/gstvaapipluginutil.c
-+++ b/gst/vaapi/gstvaapipluginutil.c
-@@ -22,7 +22,7 @@
-  */
- 
- #include "gst/vaapi/sysdeps.h"
--#include <gst/video/videocontext.h>
-+#include "gstvaapivideocontext.h"
- #if USE_DRM
- # include <gst/vaapi/gstvaapidisplay_drm.h>
- #endif
-@@ -130,7 +130,7 @@ gst_vaapi_ensure_display(
-     context = GST_VIDEO_CONTEXT(element);
-     g_return_val_if_fail(context != NULL, FALSE);
- 
--    gst_video_context_prepare(context, display_types);
-+    gst_vaapi_video_context_prepare(context, display_types);
- 
-     /* Neighbour found and it updated the display */
-     if (*display_ptr)
-@@ -141,6 +141,8 @@ gst_vaapi_ensure_display(
- 
-     if (display_ptr)
-         *display_ptr = display;
-+
-+    gst_vaapi_video_context_propagate(context, display);
-     return display != NULL;
- }
- 
-@@ -217,6 +219,9 @@ gst_vaapi_set_display(
- gboolean
- gst_vaapi_reply_to_query(GstQuery *query, GstVaapiDisplay *display)
- {
-+#if GST_CHECK_VERSION(1,1,0)
-+    return FALSE;
-+#else
-     GstVaapiDisplayType display_type;
-     const gchar **types;
-     const gchar *type;
-@@ -305,6 +310,7 @@ gst_vaapi_reply_to_query(GstQuery *query, GstVaapiDisplay *display)
-         }
-     }
-     return res;
-+#endif /* !GST_CHECK_VERSION(1,1,0) */
- }
- 
- gboolean
-diff --git a/gst/vaapi/gstvaapisink.c b/gst/vaapi/gstvaapisink.c
-index ae39a51..b6ffca3 100644
---- a/gst/vaapi/gstvaapisink.c
-+++ b/gst/vaapi/gstvaapisink.c
-@@ -32,7 +32,7 @@
- #include "gst/vaapi/sysdeps.h"
- #include <gst/gst.h>
- #include <gst/video/video.h>
--#include <gst/video/videocontext.h>
-+
- #include <gst/vaapi/gstvaapivalue.h>
- #if USE_DRM
- # include <gst/vaapi/gstvaapidisplay_drm.h>
-@@ -69,6 +69,7 @@
- 
- #include "gstvaapisink.h"
- #include "gstvaapipluginutil.h"
-+#include "gstvaapivideocontext.h"
- #include "gstvaapivideometa.h"
- #if GST_CHECK_VERSION(1,0,0)
- #include "gstvaapivideobufferpool.h"
-@@ -83,6 +84,13 @@ GST_DEBUG_CATEGORY_STATIC(gst_debug_vaapisink);
- 
- /* Default template */
- static const char gst_vaapisink_sink_caps_str[] =
-+#if GST_CHECK_VERSION(1,1,0)
-+    GST_VIDEO_CAPS_MAKE_WITH_FEATURES(
-+        GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, GST_VIDEO_FORMATS_ALL) ";"
-+    GST_VIDEO_CAPS_MAKE_WITH_FEATURES(
-+        GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
-+        GST_VIDEO_FORMATS_ALL);
-+#else
- #if GST_CHECK_VERSION(1,0,0)
-     GST_VIDEO_CAPS_MAKE(GST_VIDEO_FORMATS_ALL) "; "
- #else
-@@ -91,6 +99,7 @@ static const char gst_vaapisink_sink_caps_str[] =
-     "height = (int) [ 1, MAX ]; "
- #endif
-     GST_VAAPI_SURFACE_CAPS;
-+#endif
- 
- static GstStaticPadTemplate gst_vaapisink_sink_factory =
-     GST_STATIC_PAD_TEMPLATE(
-@@ -119,6 +128,7 @@ gst_vaapisink_implements_iface_init(GstImplementsInterfaceClass *iface)
- #endif
- 
- /* GstVideoContext interface */
-+#if !GST_CHECK_VERSION(1,1,0)
- static void
- gst_vaapisink_set_video_context(GstVideoContext *context, const gchar *type,
-     const GValue *value)
-@@ -132,6 +142,7 @@ gst_vaapisink_video_context_iface_init(GstVideoContextInterface *iface)
- {
-     iface->set_context = gst_vaapisink_set_video_context;
- }
-+#endif
- 
- static void
- gst_vaapisink_video_overlay_iface_init(GstVideoOverlayInterface *iface);
-@@ -144,8 +155,10 @@ G_DEFINE_TYPE_WITH_CODE(
-     G_IMPLEMENT_INTERFACE(GST_TYPE_IMPLEMENTS_INTERFACE,
-                           gst_vaapisink_implements_iface_init);
- #endif
-+#if !GST_CHECK_VERSION(1,1,0)
-     G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_CONTEXT,
-                           gst_vaapisink_video_context_iface_init);
-+#endif
-     G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_OVERLAY,
-                           gst_vaapisink_video_overlay_iface_init))
- 
-@@ -714,14 +727,20 @@ gst_vaapisink_get_caps_impl(GstBaseSink *base_sink)
-     GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
-     GstCaps *out_caps, *yuv_caps;
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+    out_caps = gst_static_pad_template_get_caps(&gst_vaapisink_sink_factory);
-+#else
-     out_caps = gst_caps_from_string(GST_VAAPI_SURFACE_CAPS);
-+#endif
-     if (!out_caps)
-         return NULL;
- 
-     if (gst_vaapisink_ensure_uploader(sink)) {
-         yuv_caps = gst_vaapi_uploader_get_caps(sink->uploader);
--        if (yuv_caps)
-+        if (yuv_caps) {
-+            out_caps = gst_caps_make_writable(out_caps);
-             gst_caps_append(out_caps, gst_caps_copy(yuv_caps));
-+	}
-     }
-     return out_caps;
- }
-@@ -1323,15 +1342,55 @@ gst_vaapisink_buffer_alloc(
- }
- #endif
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+static void
-+gst_vaapisink_set_context(GstElement *element, GstContext *context)
-+{
-+    GstVaapiSink * const sink = GST_VAAPISINK(element);
-+    GstVaapiDisplay *display = NULL;
-+
-+    if (gst_vaapi_video_context_get_display(context, &display)) {
-+        GST_INFO_OBJECT(element, "set display %p", display);
-+        gst_vaapi_display_replace(&sink->display, display);
-+    }
-+}
-+#endif
-+
- static gboolean
- gst_vaapisink_query(GstBaseSink *base_sink, GstQuery *query)
- {
-     GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
- 
-+    GST_INFO_OBJECT(sink, "query type %s", GST_QUERY_TYPE_NAME(query));
-+
-     if (gst_vaapi_reply_to_query(query, sink->display)) {
-         GST_DEBUG("sharing display %p", sink->display);
-         return TRUE;
-     }
-+
-+    switch(GST_QUERY_TYPE(query)) {
-+#if GST_CHECK_VERSION(1,1,0)
-+      case GST_QUERY_CONTEXT: {
-+          const gchar *context_type = NULL;
-+
-+          if (gst_query_parse_context_type(query, &context_type) &&
-+              !g_strcmp0(context_type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME) &&
-+              sink->display) {
-+              GstContext *context;
-+
-+              context = gst_vaapi_video_context_new_with_display(
-+                  sink->display, FALSE);
-+              gst_query_set_context(query, context);
-+              gst_context_unref(context);
-+              return TRUE;
-+          }
-+          // fall-through
-+      }
-+#endif
-+      default:
-+          break;
-+    }
-+
-     return GST_BASE_SINK_CLASS(gst_vaapisink_parent_class)->query(base_sink,
-         query);
- }
-@@ -1448,6 +1507,10 @@ gst_vaapisink_class_init(GstVaapiSinkClass *klass)
-     basesink_class->buffer_alloc = gst_vaapisink_buffer_alloc;
- #endif
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+    element_class->set_context = gst_vaapisink_set_context;
-+#endif
-+
-     gst_element_class_set_static_metadata(element_class,
-         "VA-API sink",
-         "Sink/Video",
-diff --git a/gst/vaapi/gstvaapivideobuffer.c b/gst/vaapi/gstvaapivideobuffer.c
-index 19926d3..40c11e8 100644
---- a/gst/vaapi/gstvaapivideobuffer.c
-+++ b/gst/vaapi/gstvaapivideobuffer.c
-@@ -27,14 +27,20 @@
- 
- #include "gst/vaapi/sysdeps.h"
- #include "gstvaapivideobuffer.h"
--#if USE_X11
-+#if USE_X11 && !GST_CHECK_VERSION(1,1,0)
- # include "gstvaapivideoconverter_x11.h"
- #endif
--#if USE_GLX
-+#if USE_GLX && !GST_CHECK_VERSION(1,1,0)
- # include "gstvaapivideoconverter_glx.h"
- #endif
- 
--#if GST_CHECK_VERSION(1,0,0)
-+#if GST_CHECK_VERSION(1,1,0)
-+static inline GstBuffer *
-+gst_surface_buffer_new(void)
-+{
-+    return gst_buffer_new();
-+}
-+#elif GST_CHECK_VERSION(1,0,0)
- #include <gst/video/gstsurfacemeta.h>
- 
- #define GST_VAAPI_SURFACE_META_CAST(obj) \
-@@ -263,12 +269,12 @@ get_surface_converter(GstVaapiDisplay *display)
-     GFunc func;
- 
-     switch (gst_vaapi_display_get_display_type(display)) {
--#if USE_X11
-+#if USE_X11 && !GST_CHECK_VERSION(1,1,0)
-     case GST_VAAPI_DISPLAY_TYPE_X11:
-         func = (GFunc)gst_vaapi_video_converter_x11_new;
-         break;
- #endif
--#if USE_GLX
-+#if USE_GLX && !GST_CHECK_VERSION(1,1,0)
-     case GST_VAAPI_DISPLAY_TYPE_GLX:
-         func = (GFunc)gst_vaapi_video_converter_glx_new;
-         break;
-diff --git a/gst/vaapi/gstvaapivideocontext.c b/gst/vaapi/gstvaapivideocontext.c
-new file mode 100644
-index 0000000..1331d4b
---- /dev/null
-+++ b/gst/vaapi/gstvaapivideocontext.c
-@@ -0,0 +1,163 @@
-+/*
-+ *  gstvaapivideocontext.c - GStreamer/VA video context
-+ *
-+ *  Copyright (C) 2010-2011 Splitted-Desktop Systems
-+ *  Copyright (C) 2011-2013 Intel Corporation
-+ *  Copyright (C) 2013 Igalia
-+ *
-+ *  This library is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU Lesser General Public License
-+ *  as published by the Free Software Foundation; either version 2.1
-+ *  of the License, or (at your option) any later version.
-+ *
-+ *  This library is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  Lesser General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU Lesser General Public
-+ *  License along with this library; if not, write to the Free
-+ *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ *  Boston, MA 02110-1301 USA
-+ */
-+
-+#include "gst/vaapi/sysdeps.h"
-+#include "gstvaapivideocontext.h"
-+
-+#if GST_CHECK_VERSION(1,1,0)
-+
-+GST_DEBUG_CATEGORY_STATIC(GST_CAT_CONTEXT);
-+
-+#define GST_VAAPI_TYPE_DISPLAY \
-+    gst_vaapi_display_get_type()
-+
-+GType
-+gst_vaapi_display_get_type(void) G_GNUC_CONST;
-+
-+G_DEFINE_BOXED_TYPE(GstVaapiDisplay, gst_vaapi_display,
-+    (GBoxedCopyFunc)gst_vaapi_display_ref,
-+    (GBoxedFreeFunc)gst_vaapi_display_unref)
-+
-+GstContext *
-+gst_vaapi_video_context_new_with_display(GstVaapiDisplay *display,
-+    gboolean persistent)
-+{
-+    GstContext *context;
-+    GstStructure *structure;
-+
-+    context = gst_context_new(GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME, persistent);
-+    structure = gst_context_writable_structure(context);
-+    gst_structure_set(structure, "display", GST_VAAPI_TYPE_DISPLAY,
-+        display, NULL);
-+    return context;
-+}
-+
-+gboolean
-+gst_vaapi_video_context_get_display(GstContext *context,
-+    GstVaapiDisplay **display_ptr)
-+{
-+    const GstStructure *structure;
-+
-+    g_return_val_if_fail(GST_IS_CONTEXT(context), FALSE);
-+    g_return_val_if_fail(g_strcmp0(gst_context_get_context_type(context),
-+                  GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME) == 0, FALSE);
-+
-+    structure = gst_context_get_structure(context);
-+    return gst_structure_get(structure, "display", GST_VAAPI_TYPE_DISPLAY,
-+        display_ptr, NULL);
-+}
-+
-+static gboolean
-+context_pad_query(const GValue *item, GValue *value, gpointer user_data)
-+{
-+    GstPad * const pad = g_value_get_object(item);
-+    GstQuery * const query = user_data;
-+
-+    if (gst_pad_peer_query(pad, query)) {
-+        g_value_set_boolean(value, TRUE);
-+        return FALSE;
-+    }
-+
-+    GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, pad, "context pad peer query failed");
-+    return TRUE;
-+}
-+
-+static gboolean
-+run_context_query(GstElement *element, GstQuery *query)
-+{
-+    GstIteratorFoldFunction const func = context_pad_query;
-+    GstIterator *it;
-+    GValue res = { 0 };
-+
-+    g_value_init(&res, G_TYPE_BOOLEAN);
-+    g_value_set_boolean(&res, FALSE);
-+
-+    /* Ask downstream neighbour */
-+    it = gst_element_iterate_src_pads(element);
-+    while (gst_iterator_fold(it, func, &res, query) == GST_ITERATOR_RESYNC)
-+        gst_iterator_resync(it);
-+    gst_iterator_free(it);
-+
-+    /* Ignore upstream neighbours */
-+    return g_value_get_boolean(&res);
-+}
-+
-+void
-+gst_vaapi_video_context_prepare(GstElement *element, const gchar **types)
-+{
-+    GstContext *context;
-+    GstQuery *query;
-+
-+    if (!GST_CAT_CONTEXT)
-+        GST_DEBUG_CATEGORY_GET(GST_CAT_CONTEXT, "GST_CONTEXT");
-+
-+    /* (2) Query downstream with GST_QUERY_CONTEXT for the context and
-+       check if downstream already has a context of the specified type */
-+    context = NULL;
-+    query = gst_query_new_context(GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME);
-+    if (run_context_query(element, query)) {
-+        gst_query_parse_context(query, &context);
-+        GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, element,
-+            "found context (%p) in query", context);
-+        gst_element_set_context(element, context);
-+    }
-+    else {
-+        /* (3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with
-+           the required context types and afterwards check if a usable
-+           context was set now as in (1). The message could be handled
-+           by the parent bins of the element and the application */
-+        GstMessage *msg;
-+
-+        GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, element,
-+            "posting `need-context' message");
-+        msg = gst_message_new_need_context(GST_OBJECT_CAST(element),
-+            GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME);
-+        gst_element_post_message(element, msg);
-+    }
-+    gst_query_unref(query);
-+}
-+
-+/* (4) Create context by itself and post a GST_MESSAGE_HAVE_CONTEXT
-+   message and send a GST_EVENT_CONTEXT event downstream, thus
-+   containing the complete context information at this time */
-+void
-+gst_vaapi_video_context_propagate(GstElement *element, GstVaapiDisplay *display)
-+{
-+    GstContext *context;
-+    GstMessage *msg;
-+
-+    if (!display) {
-+        GST_ERROR_OBJECT(element, "failed to get VA-API display connection");
-+        return;
-+    }
-+
-+    context = gst_vaapi_video_context_new_with_display(display, FALSE);
-+
-+    GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, element,
-+        "posting `have-context' (%p) message with display (%p)",
-+        context, display);
-+    msg = gst_message_new_have_context(GST_OBJECT_CAST(element), context);
-+    gst_element_post_message(GST_ELEMENT_CAST(element), msg);
-+}
-+
-+#endif
-diff --git a/gst/vaapi/gstvaapivideocontext.h b/gst/vaapi/gstvaapivideocontext.h
-new file mode 100644
-index 0000000..3ef5849
---- /dev/null
-+++ b/gst/vaapi/gstvaapivideocontext.h
-@@ -0,0 +1,75 @@
-+/*
-+ *  gstvaapivideocontext.h - GStreamer/VA video context
-+ *
-+ *  Copyright (C) 2010-2011 Splitted-Desktop Systems
-+ *  Copyright (C) 2011-2013 Intel Corporation
-+ *  Copyright (C) 2013 Igalia
-+ *
-+ *  This library is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU Lesser General Public License
-+ *  as published by the Free Software Foundation; either version 2.1
-+ *  of the License, or (at your option) any later version.
-+ *
-+ *  This library is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  Lesser General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU Lesser General Public
-+ *  License along with this library; if not, write to the Free
-+ *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ *  Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef GST_VAAPI_VIDEO_CONTEXT_H
-+#define GST_VAAPI_VIDEO_CONTEXT_H
-+
-+#include <gst/vaapi/gstvaapidisplay.h>
-+
-+#if GST_CHECK_VERSION(1,1,0)
-+
-+#define GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME "gst.vaapi.Display"
-+
-+/* Fake GstVideoContext symbols */
-+#define GST_VIDEO_CONTEXT(obj)          (GST_ELEMENT(obj))
-+#define GST_IS_VIDEO_CONTEXT(obj)       (GST_IS_ELEMENT(obj))
-+#define GstVideoContext                 GstElement
-+#define gst_video_context_prepare       gst_vaapi_video_context_prepare
-+
-+G_GNUC_INTERNAL
-+GstContext *
-+gst_vaapi_video_context_new_with_display(GstVaapiDisplay *display,
-+    gboolean persistent);
-+
-+G_GNUC_INTERNAL
-+gboolean
-+gst_vaapi_video_context_get_display(GstContext *context,
-+    GstVaapiDisplay **display_ptr);
-+
-+G_GNUC_INTERNAL
-+void
-+gst_vaapi_video_context_prepare(GstElement *element, const gchar **types);
-+
-+G_GNUC_INTERNAL
-+void
-+gst_vaapi_video_context_propagate(GstElement *element,
-+    GstVaapiDisplay *display);
-+
-+#else
-+#include <gst/video/videocontext.h>
-+
-+static inline void
-+gst_vaapi_video_context_prepare(GstVideoContext *context, const gchar **types)
-+{
-+    gst_video_context_prepare(context, types);
-+}
-+
-+static inline void
-+gst_vaapi_video_context_propagate(GstVideoContext *context,
-+    GstVaapiDisplay *display)
-+{
-+}
-+
-+#endif
-+
-+#endif /* GST_VAAPI_VIDEO_CONTEXT_H */
-diff --git a/gst/vaapi/gstvaapivideomemory.h b/gst/vaapi/gstvaapivideomemory.h
-index a169930..a82742b 100644
---- a/gst/vaapi/gstvaapivideomemory.h
-+++ b/gst/vaapi/gstvaapivideomemory.h
-@@ -42,6 +42,10 @@ typedef struct _GstVaapiVideoAllocatorClass     GstVaapiVideoAllocatorClass;
- 
- #define GST_VAAPI_VIDEO_MEMORY_NAME             "GstVaapiVideoMemory"
- 
-+#if GST_CHECK_VERSION(1,1,0)
-+#define GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE   "memory:VASurface"
-+#endif
-+
- /**
-  * GstVaapiVideoMemoryMapType:
-  * @GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_SURFACE: map with gst_buffer_map()
-diff --git a/gst/vaapi/gstvaapivideometa_texture.c b/gst/vaapi/gstvaapivideometa_texture.c
-new file mode 100644
-index 0000000..17b19a0
---- /dev/null
-+++ b/gst/vaapi/gstvaapivideometa_texture.c
-@@ -0,0 +1,92 @@
-+/*
-+ *  gstvaapivideometa_texture.c - GStreamer/VA video meta (GLTextureUpload)
-+ *
-+ *  Copyright (C) 2010-2011 Splitted-Desktop Systems
-+ *  Copyright (C) 2011-2013 Intel Corporation
-+ *  Copyright (C) 2013 Igalia
-+ *
-+ *  This library is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU Lesser General Public License
-+ *  as published by the Free Software Foundation; either version 2.1
-+ *  of the License, or (at your option) any later version.
-+ *
-+ *  This library is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  Lesser General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU Lesser General Public
-+ *  License along with this library; if not, write to the Free
-+ *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ *  Boston, MA 02110-1301 USA
-+ */
-+
-+#include "gst/vaapi/sysdeps.h"
-+#include "gstvaapivideometa.h"
-+#include "gstvaapivideometa_texture.h"
-+#include "gstvaapipluginutil.h"
-+
-+#if GST_CHECK_VERSION(1,1,0) && USE_GLX
-+static void
-+gst_vaapi_texure_upload_free(gpointer data)
-+{
-+    GstVaapiTexture * const texture = data;
-+
-+    if (texture)
-+        gst_vaapi_texture_unref(texture);
-+}
-+
-+static gboolean
-+gst_vaapi_texture_upload(GstVideoGLTextureUploadMeta *meta, guint texture_id[4])
-+{
-+    GstVaapiVideoMeta * const vmeta =
-+        gst_buffer_get_vaapi_video_meta(meta->buffer);
-+    GstVaapiTexture *texture = meta->user_data;
-+    GstVaapiSurface * const surface = gst_vaapi_video_meta_get_surface(vmeta);
-+    GstVaapiDisplay * const dpy =
-+        gst_vaapi_object_get_display(GST_VAAPI_OBJECT(surface));
-+
-+    if (gst_vaapi_display_get_display_type(dpy) != GST_VAAPI_DISPLAY_TYPE_GLX)
-+        return FALSE;
-+
-+    if (texture) {
-+        GstVaapiDisplay * const tex_dpy =
-+            gst_vaapi_object_get_display(GST_VAAPI_OBJECT(texture));
-+        if (tex_dpy != dpy)
-+            gst_vaapi_texture_replace(&texture, NULL);
-+    }
-+
-+    if (!texture) {
-+        /* FIXME: should we assume target? */
-+        texture = gst_vaapi_texture_new_with_texture(dpy, texture_id[0],
-+            GL_TEXTURE_2D, GL_RGBA);
-+        meta->user_data = texture;
-+    }
-+
-+    if (!gst_vaapi_apply_composition(surface, meta->buffer))
-+        GST_WARNING("could not update subtitles");
-+
-+    return gst_vaapi_texture_put_surface(texture, surface,
-+        gst_vaapi_video_meta_get_render_flags(vmeta));
-+}
-+#endif
-+
-+#if GST_CHECK_VERSION(1,1,0)
-+gboolean
-+gst_buffer_add_texture_upload_meta(GstBuffer *buffer)
-+{
-+    GstVideoGLTextureUploadMeta *meta = NULL;
-+    GstVideoGLTextureType tex_type[] = { GST_VIDEO_GL_TEXTURE_TYPE_RGBA };
-+
-+    if (!buffer)
-+        return FALSE;
-+
-+#if USE_GLX
-+    meta = gst_buffer_add_video_gl_texture_upload_meta(buffer,
-+        GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL,
-+        1, tex_type, gst_vaapi_texture_upload,
-+        NULL, NULL, gst_vaapi_texure_upload_free);
-+#endif
-+    return meta != NULL;
-+}
-+#endif
-diff --git a/gst/vaapi/gstvaapivideometa_texture.h b/gst/vaapi/gstvaapivideometa_texture.h
-new file mode 100644
-index 0000000..2f95434
---- /dev/null
-+++ b/gst/vaapi/gstvaapivideometa_texture.h
-@@ -0,0 +1,37 @@
-+/*
-+ *  gstvaapivideometa_texture.h - GStreamer/VA video meta (GLTextureUpload)
-+ *
-+ *  Copyright (C) 2010-2011 Splitted-Desktop Systems
-+ *  Copyright (C) 2011-2013 Intel Corporation
-+ *  Copyright (C) 2013 Igalia
-+ *
-+ *  This library is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU Lesser General Public License
-+ *  as published by the Free Software Foundation; either version 2.1
-+ *  of the License, or (at your option) any later version.
-+ *
-+ *  This library is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  Lesser General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU Lesser General Public
-+ *  License along with this library; if not, write to the Free
-+ *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ *  Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef GST_VAAPI_VIDEO_META_TEXTURE_H
-+#define GST_VAAPI_VIDEO_META_TEXTURE_H
-+
-+#include <gst/vaapi/gstvaapitexture.h>
-+
-+G_BEGIN_DECLS
-+
-+G_GNUC_INTERNAL
-+gboolean
-+gst_buffer_add_texture_upload_meta(GstBuffer *buffer);
-+
-+G_END_DECLS
-+
-+#endif /* GST_VAAPI_VIDEO_META_TEXTURE_H */
-diff --git a/tests/simple-decoder.c b/tests/simple-decoder.c
-index 5b50c87..3c434d0 100644
---- a/tests/simple-decoder.c
-+++ b/tests/simple-decoder.c
-@@ -498,7 +498,7 @@ renderer_process(App *app, RenderFrame *rfp)
-     ensure_window_size(app, surface);
- 
-     crop_rect = gst_vaapi_surface_proxy_get_crop_rect(rfp->proxy);
--    if (!ensure_pixmaps(app, surface, crop_rect))
-+    if (g_use_pixmap && !ensure_pixmaps(app, surface, crop_rect))
-         SEND_ERROR("failed to create intermediate pixmaps");
- 
-     if (!gst_vaapi_surface_sync(surface))
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/gstreamer-vaapi.git/commitdiff/f465fd48c5ca8e565c6394ea420badeb1c522dc8



More information about the pld-cvs-commit mailing list