diff options
19 files changed, 69 insertions, 1622 deletions
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.10.1.bb index 3d86221d22..98f5a50a9a 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.10.1.bb | |||
| @@ -13,8 +13,7 @@ SRC_URI = " \ | |||
| 13 | file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ | 13 | file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ |
| 14 | file://workaround-to-build-gst-libav-for-i586-with-gcc.patch \ | 14 | file://workaround-to-build-gst-libav-for-i586-with-gcc.patch \ |
| 15 | " | 15 | " |
| 16 | 16 | SRC_URI[md5sum] = "9dc8fb8dd01818c27230a1ed6ba9f4de" | |
| 17 | SRC_URI[md5sum] = "b51a736147bacb40f85827a4e0ae0d2c" | 17 | SRC_URI[sha256sum] = "27b28b8de0e6dff1e3952428e8ed8ba4a12f452f789ac0ae9bbe50f00a5c72c7" |
| 18 | SRC_URI[sha256sum] = "9006a05990089f7155ee0e848042f6bb24e52ab1d0a59ff8d1b5d7e33001a495" | ||
| 19 | 18 | ||
| 20 | S = "${WORKDIR}/gst-libav-${PV}" | 19 | S = "${WORKDIR}/gst-libav-${PV}" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc index 0fe5564b53..d26a6a9433 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc | |||
| @@ -42,6 +42,7 @@ PACKAGECONFIG[gtk] = "--enable-gtk3,--disable-gtk3,gtk+3" | |||
| 42 | # ensure OpenSSL is used for HLS AES description instead of nettle | 42 | # ensure OpenSSL is used for HLS AES description instead of nettle |
| 43 | # (OpenSSL is a shared dependency with dtls) | 43 | # (OpenSSL is a shared dependency with dtls) |
| 44 | PACKAGECONFIG[hls] = "--enable-hls --with-hls-crypto=openssl,--disable-hls,openssl" | 44 | PACKAGECONFIG[hls] = "--enable-hls --with-hls-crypto=openssl,--disable-hls,openssl" |
| 45 | PACKAGECONFIG[kms] = "--enable-kms,--disable-kms,libdrm" | ||
| 45 | PACKAGECONFIG[libmms] = "--enable-libmms,--disable-libmms,libmms" | 46 | PACKAGECONFIG[libmms] = "--enable-libmms,--disable-libmms,libmms" |
| 46 | PACKAGECONFIG[libssh2] = "--enable-libssh2,--disable-libssh2,libssh2" | 47 | PACKAGECONFIG[libssh2] = "--enable-libssh2,--disable-libssh2,libssh2" |
| 47 | PACKAGECONFIG[modplug] = "--enable-modplug,--disable-modplug,libmodplug" | 48 | PACKAGECONFIG[modplug] = "--enable-modplug,--disable-modplug,libmodplug" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch index 33efc503eb..43f1ee0d23 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch | |||
| @@ -13,24 +13,24 @@ Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> | |||
| 13 | gst-libs/gst/mpegts/Makefile.am | 2 +- | 13 | gst-libs/gst/mpegts/Makefile.am | 2 +- |
| 14 | 3 files changed, 3 insertions(+), 3 deletions(-) | 14 | 3 files changed, 3 insertions(+), 3 deletions(-) |
| 15 | 15 | ||
| 16 | diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am | 16 | Index: gst-plugins-bad-1.10.1/gst-libs/gst/gl/Makefile.am |
| 17 | index f968357..7cc2c7a 100644 | 17 | =================================================================== |
| 18 | --- a/gst-libs/gst/gl/Makefile.am | 18 | --- gst-plugins-bad-1.10.1.orig/gst-libs/gst/gl/Makefile.am |
| 19 | +++ b/gst-libs/gst/gl/Makefile.am | 19 | +++ gst-plugins-bad-1.10.1/gst-libs/gst/gl/Makefile.am |
| 20 | @@ -167,7 +167,7 @@ GstGL-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstgl-@GST_API_VERSION@ | 20 | @@ -171,7 +171,7 @@ GstGL-@GST_API_VERSION@.gir: $(INTROSPEC |
| 21 | --library=libgstgl-@GST_API_VERSION@.la \ | ||
| 22 | --include=Gst-@GST_API_VERSION@ \ | 21 | --include=Gst-@GST_API_VERSION@ \ |
| 23 | --include=GstBase-@GST_API_VERSION@ \ | 22 | --include=GstBase-@GST_API_VERSION@ \ |
| 23 | --include=GstVideo-@GST_API_VERSION@ \ | ||
| 24 | - --libtool="$(top_builddir)/libtool" \ | 24 | - --libtool="$(top_builddir)/libtool" \ |
| 25 | + --libtool="$(LIBTOOL)" \ | 25 | + --libtool="$(LIBTOOL)" \ |
| 26 | --pkg gstreamer-@GST_API_VERSION@ \ | 26 | --pkg gstreamer-@GST_API_VERSION@ \ |
| 27 | --pkg gstreamer-base-@GST_API_VERSION@ \ | 27 | --pkg gstreamer-base-@GST_API_VERSION@ \ |
| 28 | --pkg gstreamer-video-@GST_API_VERSION@ \ | 28 | --pkg gstreamer-video-@GST_API_VERSION@ \ |
| 29 | diff --git a/gst-libs/gst/insertbin/Makefile.am b/gst-libs/gst/insertbin/Makefile.am | 29 | Index: gst-plugins-bad-1.10.1/gst-libs/gst/insertbin/Makefile.am |
| 30 | index 09eb97c..b746885 100644 | 30 | =================================================================== |
| 31 | --- a/gst-libs/gst/insertbin/Makefile.am | 31 | --- gst-plugins-bad-1.10.1.orig/gst-libs/gst/insertbin/Makefile.am |
| 32 | +++ b/gst-libs/gst/insertbin/Makefile.am | 32 | +++ gst-plugins-bad-1.10.1/gst-libs/gst/insertbin/Makefile.am |
| 33 | @@ -44,7 +44,7 @@ GstInsertBin-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstinsertbin-@GS | 33 | @@ -45,7 +45,7 @@ GstInsertBin-@GST_API_VERSION@.gir: $(IN |
| 34 | --library=libgstinsertbin-@GST_API_VERSION@.la \ | 34 | --library=libgstinsertbin-@GST_API_VERSION@.la \ |
| 35 | --include=Gst-@GST_API_VERSION@ \ | 35 | --include=Gst-@GST_API_VERSION@ \ |
| 36 | --include=GstBase-@GST_API_VERSION@ \ | 36 | --include=GstBase-@GST_API_VERSION@ \ |
| @@ -39,11 +39,11 @@ index 09eb97c..b746885 100644 | |||
| 39 | --pkg gstreamer-@GST_API_VERSION@ \ | 39 | --pkg gstreamer-@GST_API_VERSION@ \ |
| 40 | --pkg gstreamer-base-@GST_API_VERSION@ \ | 40 | --pkg gstreamer-base-@GST_API_VERSION@ \ |
| 41 | --pkg-export gstreamer-insertbin-@GST_API_VERSION@ \ | 41 | --pkg-export gstreamer-insertbin-@GST_API_VERSION@ \ |
| 42 | diff --git a/gst-libs/gst/mpegts/Makefile.am b/gst-libs/gst/mpegts/Makefile.am | 42 | Index: gst-plugins-bad-1.10.1/gst-libs/gst/mpegts/Makefile.am |
| 43 | index 2511d49..c1cbce6 100644 | 43 | =================================================================== |
| 44 | --- a/gst-libs/gst/mpegts/Makefile.am | 44 | --- gst-plugins-bad-1.10.1.orig/gst-libs/gst/mpegts/Makefile.am |
| 45 | +++ b/gst-libs/gst/mpegts/Makefile.am | 45 | +++ gst-plugins-bad-1.10.1/gst-libs/gst/mpegts/Makefile.am |
| 46 | @@ -78,7 +78,7 @@ GstMpegts-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstmpegts-@GST_API_ | 46 | @@ -79,7 +79,7 @@ GstMpegts-@GST_API_VERSION@.gir: $(INTRO |
| 47 | --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-@GST_API_VERSION@` \ | 47 | --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-@GST_API_VERSION@` \ |
| 48 | --library=libgstmpegts-@GST_API_VERSION@.la \ | 48 | --library=libgstmpegts-@GST_API_VERSION@.la \ |
| 49 | --include=Gst-@GST_API_VERSION@ \ | 49 | --include=Gst-@GST_API_VERSION@ \ |
| @@ -52,6 +52,3 @@ index 2511d49..c1cbce6 100644 | |||
| 52 | --pkg gstreamer-@GST_API_VERSION@ \ | 52 | --pkg gstreamer-@GST_API_VERSION@ \ |
| 53 | --pkg gstreamer-video-@GST_API_VERSION@ \ | 53 | --pkg gstreamer-video-@GST_API_VERSION@ \ |
| 54 | --pkg-export gstreamer-mpegts-@GST_API_VERSION@ \ | 54 | --pkg-export gstreamer-mpegts-@GST_API_VERSION@ \ |
| 55 | -- | ||
| 56 | 2.6.2 | ||
| 57 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch index e81b065705..9fc91d8fc4 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch | |||
| @@ -12,16 +12,13 @@ Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> | |||
| 12 | pkgconfig/gstreamer-gl.pc.in | 2 +- | 12 | pkgconfig/gstreamer-gl.pc.in | 2 +- |
| 13 | 1 file changed, 1 insertion(+), 1 deletion(-) | 13 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 14 | 14 | ||
| 15 | diff --git a/pkgconfig/gstreamer-gl.pc.in b/pkgconfig/gstreamer-gl.pc.in | 15 | Index: gst-plugins-bad-1.10.1/pkgconfig/gstreamer-gl.pc.in |
| 16 | index 5589e2a..b986450 100644 | 16 | =================================================================== |
| 17 | --- a/pkgconfig/gstreamer-gl.pc.in | 17 | --- gst-plugins-bad-1.10.1.orig/pkgconfig/gstreamer-gl.pc.in |
| 18 | +++ b/pkgconfig/gstreamer-gl.pc.in | 18 | +++ gst-plugins-bad-1.10.1/pkgconfig/gstreamer-gl.pc.in |
| 19 | @@ -10,4 +10,4 @@ Version: @VERSION@ | 19 | @@ -10,4 +10,4 @@ Version: @VERSION@ |
| 20 | Requires: gstreamer-base-@GST_API_VERSION@ gstreamer-@GST_API_VERSION@ | 20 | Requires: gstreamer-base-@GST_API_VERSION@ gstreamer-@GST_API_VERSION@ |
| 21 | 21 | ||
| 22 | Libs: -L${libdir} -lgstgl-@GST_API_VERSION@ @GL_LIBS@ | 22 | Libs: -L${libdir} -lgstgl-@GST_API_VERSION@ @GL_LIBS@ |
| 23 | -Cflags: -I${includedir} @GL_CFLAGS@ | 23 | -Cflags: -I${includedir} -I${libdir}/gstreamer-@GST_API_VERSION@/include @GL_CFLAGS@ |
| 24 | +Cflags: -I${includedir} | 24 | +Cflags: -I${includedir} -I${libdir}/gstreamer-@GST_API_VERSION@/include |
| 25 | -- | ||
| 26 | 2.7.0 | ||
| 27 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch deleted file mode 100755 index 51f4eb4b39..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch +++ /dev/null | |||
| @@ -1,634 +0,0 @@ | |||
| 1 | From 8a0e97f7e672301cc76e394855e8c7a3448b0249 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Haihua Hu <jared.hu@nxp.com> | ||
| 3 | Date: Fri, 8 Apr 2016 16:47:15 +0800 | ||
| 4 | Subject: [PATCH 4/6] [glplugin] enable gldeinterlace on OpenGL ES | ||
| 5 | MIME-Version: 1.0 | ||
| 6 | Content-Type: text/plain; charset=UTF-8 | ||
| 7 | Content-Transfer-Encoding: 8bit | ||
| 8 | |||
| 9 | 1.Porting the exist deinterlace shader and OpenGL callback | ||
| 10 | to be compatible with OpenGL ES. | ||
| 11 | 2.Add a our blur vertical shader to gldeinterlace. | ||
| 12 | 3.Add a property named “method” to let user choose which | ||
| 13 | deinterlace function to use. Default to choose blur vertical | ||
| 14 | method for better performance. | ||
| 15 | |||
| 16 | Upstream-Status: Backport [1.9.1] | ||
| 17 | |||
| 18 | https://bugzilla.gnome.org/show_bug.cgi?id=764873 | ||
| 19 | |||
| 20 | Signed-off-by: Haihua Hu <jared.hu@nxp.com> | ||
| 21 | --- | ||
| 22 | ext/gl/Makefile.am | 4 +- | ||
| 23 | ext/gl/gstgldeinterlace.c | 344 +++++++++++++++++++++++++++++++++++----------- | ||
| 24 | ext/gl/gstgldeinterlace.h | 6 +- | ||
| 25 | ext/gl/gstopengl.c | 13 +- | ||
| 26 | 4 files changed, 275 insertions(+), 92 deletions(-) | ||
| 27 | |||
| 28 | diff --git a/ext/gl/Makefile.am b/ext/gl/Makefile.am | ||
| 29 | index 5d55f54..46419a7 100644 | ||
| 30 | --- a/ext/gl/Makefile.am | ||
| 31 | +++ b/ext/gl/Makefile.am | ||
| 32 | @@ -40,6 +40,7 @@ libgstopengl_la_SOURCES = \ | ||
| 33 | gstglfilterapp.c \ | ||
| 34 | gstglviewconvert.c \ | ||
| 35 | gstglstereosplit.c \ | ||
| 36 | + gstgldeinterlace.c \ | ||
| 37 | gstglstereomix.c | ||
| 38 | |||
| 39 | noinst_HEADERS = \ | ||
| 40 | @@ -63,20 +64,19 @@ noinst_HEADERS = \ | ||
| 41 | gstglfilterapp.h \ | ||
| 42 | gstglstereosplit.h \ | ||
| 43 | gstglstereomix.h \ | ||
| 44 | + gstgldeinterlace.h \ | ||
| 45 | gstglviewconvert.h | ||
| 46 | |||
| 47 | # full opengl required | ||
| 48 | if USE_OPENGL | ||
| 49 | libgstopengl_la_SOURCES += \ | ||
| 50 | gstglfilterglass.c \ | ||
| 51 | - gstgldeinterlace.c \ | ||
| 52 | gltestsrc.c \ | ||
| 53 | gstgltestsrc.c \ | ||
| 54 | gstglmosaic.c | ||
| 55 | |||
| 56 | noinst_HEADERS += \ | ||
| 57 | gstglfilterglass.h \ | ||
| 58 | - gstgldeinterlace.h \ | ||
| 59 | gltestsrc.h \ | ||
| 60 | gstgltestsrc.h \ | ||
| 61 | gstglmosaic.h \ | ||
| 62 | diff --git a/ext/gl/gstgldeinterlace.c b/ext/gl/gstgldeinterlace.c | ||
| 63 | index bd0eff0..c1250dc 100644 | ||
| 64 | --- a/ext/gl/gstgldeinterlace.c | ||
| 65 | +++ b/ext/gl/gstgldeinterlace.c | ||
| 66 | @@ -43,7 +43,8 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); | ||
| 67 | |||
| 68 | enum | ||
| 69 | { | ||
| 70 | - PROP_0 | ||
| 71 | + PROP_0, | ||
| 72 | + PROP_METHOD | ||
| 73 | }; | ||
| 74 | |||
| 75 | #define DEBUG_INIT \ | ||
| 76 | @@ -57,17 +58,23 @@ static void gst_gl_deinterlace_set_property (GObject * object, | ||
| 77 | static void gst_gl_deinterlace_get_property (GObject * object, | ||
| 78 | guint prop_id, GValue * value, GParamSpec * pspec); | ||
| 79 | |||
| 80 | +static gboolean gst_gl_deinterlace_start (GstBaseTransform * trans); | ||
| 81 | static gboolean gst_gl_deinterlace_reset (GstBaseTransform * trans); | ||
| 82 | -static gboolean gst_gl_deinterlace_init_shader (GstGLFilter * filter); | ||
| 83 | +static gboolean gst_gl_deinterlace_init_fbo (GstGLFilter * filter); | ||
| 84 | static gboolean gst_gl_deinterlace_filter (GstGLFilter * filter, | ||
| 85 | GstBuffer * inbuf, GstBuffer * outbuf); | ||
| 86 | static gboolean gst_gl_deinterlace_filter_texture (GstGLFilter * filter, | ||
| 87 | guint in_tex, guint out_tex); | ||
| 88 | -static void gst_gl_deinterlace_callback (gint width, gint height, | ||
| 89 | +static void gst_gl_deinterlace_vfir_callback (gint width, gint height, | ||
| 90 | + guint texture, gpointer stuff); | ||
| 91 | +static void gst_gl_deinterlace_greedyh_callback (gint width, gint height, | ||
| 92 | guint texture, gpointer stuff); | ||
| 93 | |||
| 94 | /* *INDENT-OFF* */ | ||
| 95 | static const gchar *greedyh_fragment_source = | ||
| 96 | + "#ifdef GL_ES\n" | ||
| 97 | + "precision mediump float;\n" | ||
| 98 | + "#endif\n" | ||
| 99 | "uniform sampler2D tex;\n" | ||
| 100 | "uniform sampler2D tex_prev;\n" | ||
| 101 | "uniform float max_comb;\n" | ||
| 102 | @@ -75,35 +82,35 @@ static const gchar *greedyh_fragment_source = | ||
| 103 | "uniform float motion_sense;\n" | ||
| 104 | "uniform float width;\n" | ||
| 105 | "uniform float height;\n" | ||
| 106 | + "varying vec2 v_texcoord;\n" | ||
| 107 | |||
| 108 | "void main () {\n" | ||
| 109 | - " vec2 texcoord = gl_TexCoord[0].xy;\n" | ||
| 110 | - " if (int(mod(texcoord.y * height, 2.0)) == 0) {\n" | ||
| 111 | - " gl_FragColor = vec4(texture2D(tex_prev, texcoord).rgb, 1.0);\n" | ||
| 112 | + " if (int(mod(v_texcoord.y * height, 2.0)) == 0) {\n" | ||
| 113 | + " gl_FragColor = vec4(texture2D(tex_prev, v_texcoord).rgb, 1.0);\n" | ||
| 114 | " } else {\n" | ||
| 115 | " vec2 texcoord_L1_a1, texcoord_L3_a1, texcoord_L1, texcoord_L3, texcoord_L1_1, texcoord_L3_1;\n" | ||
| 116 | " vec3 L1_a1, L3_a1, L1, L3, L1_1, L3_1;\n" | ||
| 117 | |||
| 118 | - " texcoord_L1 = vec2(texcoord.x, texcoord.y - 1.0 / height);\n" | ||
| 119 | - " texcoord_L3 = vec2(texcoord.x, texcoord.y + 1.0 / height);\n" | ||
| 120 | + " texcoord_L1 = vec2(v_texcoord.x, v_texcoord.y - 1.0 / height);\n" | ||
| 121 | + " texcoord_L3 = vec2(v_texcoord.x, v_texcoord.y + 1.0 / height);\n" | ||
| 122 | " L1 = texture2D(tex_prev, texcoord_L1).rgb;\n" | ||
| 123 | " L3 = texture2D(tex_prev, texcoord_L3).rgb;\n" | ||
| 124 | - " if (texcoord.x == 1.0 && texcoord.y == 1.0) {\n" | ||
| 125 | + " if (v_texcoord.x == 1.0 && v_texcoord.y == 1.0) {\n" | ||
| 126 | " L1_1 = L1;\n" | ||
| 127 | " L3_1 = L3;\n" | ||
| 128 | " } else {\n" | ||
| 129 | - " texcoord_L1_1 = vec2(texcoord.x + 1.0 / width, texcoord.y - 1.0 / height);\n" | ||
| 130 | - " texcoord_L3_1 = vec2(texcoord.x + 1.0 / width, texcoord.y + 1.0 / height);\n" | ||
| 131 | + " texcoord_L1_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y - 1.0 / height);\n" | ||
| 132 | + " texcoord_L3_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y + 1.0 / height);\n" | ||
| 133 | " L1_1 = texture2D(tex_prev, texcoord_L1_1).rgb;\n" | ||
| 134 | " L3_1 = texture2D(tex_prev, texcoord_L3_1).rgb;\n" | ||
| 135 | " }\n" | ||
| 136 | |||
| 137 | - " if (int(ceil(texcoord.x + texcoord.y)) == 0) {\n" | ||
| 138 | + " if (int(ceil(v_texcoord.x + v_texcoord.y)) == 0) {\n" | ||
| 139 | " L1_a1 = L1;\n" | ||
| 140 | " L3_a1 = L3;\n" | ||
| 141 | " } else {\n" | ||
| 142 | - " texcoord_L1_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y - 1.0 / height);\n" | ||
| 143 | - " texcoord_L3_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y + 1.0 / height);\n" | ||
| 144 | + " texcoord_L1_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y - 1.0 / height);\n" | ||
| 145 | + " texcoord_L3_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y + 1.0 / height);\n" | ||
| 146 | " L1_a1 = texture2D(tex_prev, texcoord_L1_a1).rgb;\n" | ||
| 147 | " L3_a1 = texture2D(tex_prev, texcoord_L3_a1).rgb;\n" | ||
| 148 | " }\n" | ||
| 149 | @@ -113,8 +120,8 @@ static const gchar *greedyh_fragment_source = | ||
| 150 | " vec3 avg_1 = (L1_1 + L3_1) / 2.0;\n" | ||
| 151 | " vec3 avg_s = (avg_a1 + avg_1) / 2.0;\n" | ||
| 152 | " vec3 avg_sc = (avg_s + avg) / 2.0;\n" | ||
| 153 | - " vec3 L2 = texture2D(tex, texcoord).rgb;\n" | ||
| 154 | - " vec3 LP2 = texture2D(tex_prev, texcoord).rgb;\n" | ||
| 155 | + " vec3 L2 = texture2D(tex, v_texcoord).rgb;\n" | ||
| 156 | + " vec3 LP2 = texture2D(tex_prev, v_texcoord).rgb;\n" | ||
| 157 | " vec3 best;\n" | ||
| 158 | " if (abs(L2.r - avg_sc.r) < abs(LP2.r - avg_sc.r)) {\n" | ||
| 159 | " best.r = L2.r;\n" " } else {\n" | ||
| 160 | @@ -144,8 +151,87 @@ static const gchar *greedyh_fragment_source = | ||
| 161 | " gl_FragColor = vec4(last, 1.0);\n" | ||
| 162 | " }\n" | ||
| 163 | "}\n"; | ||
| 164 | + | ||
| 165 | +const gchar *vfir_fragment_source = | ||
| 166 | + "#ifdef GL_ES\n" | ||
| 167 | + "precision mediump float;\n" | ||
| 168 | + "#endif\n" | ||
| 169 | + "uniform sampler2D tex;\n" | ||
| 170 | + "uniform float width;\n" | ||
| 171 | + "uniform float height;\n" | ||
| 172 | + "varying vec2 v_texcoord;\n" | ||
| 173 | + "void main()\n" | ||
| 174 | + "{\n" | ||
| 175 | + " vec2 topcoord, botcoord;\n" | ||
| 176 | + " vec4 cur_color, top_color, bot_color;\n" | ||
| 177 | + " topcoord.x = v_texcoord.x;\n" | ||
| 178 | + " botcoord.x = v_texcoord.x;\n" | ||
| 179 | + " if (v_texcoord.y == 0.0 || v_texcoord.y == 1.0) {\n" | ||
| 180 | + " topcoord.y = v_texcoord.y ;\n" | ||
| 181 | + " botcoord.y = v_texcoord.y ;\n" | ||
| 182 | + " }\n" | ||
| 183 | + " else {\n" | ||
| 184 | + " topcoord.y = v_texcoord.y - 1.0/height;\n" | ||
| 185 | + " botcoord.y = v_texcoord.y + 1.0/height;\n" | ||
| 186 | + " }\n" | ||
| 187 | + " cur_color = texture2D(tex, v_texcoord);\n" | ||
| 188 | + " top_color = texture2D(tex, topcoord);\n" | ||
| 189 | + " bot_color = texture2D(tex, botcoord);\n" | ||
| 190 | + " gl_FragColor = 0.5*cur_color + 0.25*top_color + 0.25*bot_color;\n" | ||
| 191 | + "}"; | ||
| 192 | /* *INDENT-ON* */ | ||
| 193 | |||
| 194 | +/* dont' forget to edit the following when a new method is added */ | ||
| 195 | +typedef enum | ||
| 196 | +{ | ||
| 197 | + GST_GL_DEINTERLACE_VFIR, | ||
| 198 | + GST_GL_DEINTERLACE_GREEDYH | ||
| 199 | +} GstGLDeinterlaceMethod; | ||
| 200 | + | ||
| 201 | +static const GEnumValue * | ||
| 202 | +gst_gl_deinterlace_get_methods (void) | ||
| 203 | +{ | ||
| 204 | + static const GEnumValue method_types[] = { | ||
| 205 | + {GST_GL_DEINTERLACE_VFIR, "Blur Vertical", "vfir"}, | ||
| 206 | + {GST_GL_DEINTERLACE_GREEDYH, "Motion Adaptive: Advanced Detection", | ||
| 207 | + "greedhy"}, | ||
| 208 | + {0, NULL, NULL} | ||
| 209 | + }; | ||
| 210 | + return method_types; | ||
| 211 | +} | ||
| 212 | + | ||
| 213 | +#define GST_TYPE_GL_DEINTERLACE_METHODS (gst_gl_deinterlace_method_get_type ()) | ||
| 214 | +static GType | ||
| 215 | +gst_gl_deinterlace_method_get_type (void) | ||
| 216 | +{ | ||
| 217 | + static GType gl_deinterlace_method_type = 0; | ||
| 218 | + if (!gl_deinterlace_method_type) { | ||
| 219 | + gl_deinterlace_method_type = | ||
| 220 | + g_enum_register_static ("GstGLDeinterlaceMethod", | ||
| 221 | + gst_gl_deinterlace_get_methods ()); | ||
| 222 | + } | ||
| 223 | + return gl_deinterlace_method_type; | ||
| 224 | +} | ||
| 225 | + | ||
| 226 | +static void | ||
| 227 | +gst_gl_deinterlace_set_method (GstGLDeinterlace * deinterlace, | ||
| 228 | + guint method_types) | ||
| 229 | +{ | ||
| 230 | + switch (method_types) { | ||
| 231 | + case GST_GL_DEINTERLACE_VFIR: | ||
| 232 | + deinterlace->deinterlacefunc = gst_gl_deinterlace_vfir_callback; | ||
| 233 | + deinterlace->current_method = method_types; | ||
| 234 | + break; | ||
| 235 | + case GST_GL_DEINTERLACE_GREEDYH: | ||
| 236 | + deinterlace->deinterlacefunc = gst_gl_deinterlace_greedyh_callback; | ||
| 237 | + deinterlace->current_method = method_types; | ||
| 238 | + break; | ||
| 239 | + default: | ||
| 240 | + g_assert_not_reached (); | ||
| 241 | + break; | ||
| 242 | + } | ||
| 243 | +} | ||
| 244 | + | ||
| 245 | static void | ||
| 246 | gst_gl_deinterlace_class_init (GstGLDeinterlaceClass * klass) | ||
| 247 | { | ||
| 248 | @@ -163,25 +249,60 @@ gst_gl_deinterlace_class_init (GstGLDeinterlaceClass * klass) | ||
| 249 | "Deinterlacing based on fragment shaders", | ||
| 250 | "Julien Isorce <julien.isorce@mail.com>"); | ||
| 251 | |||
| 252 | + g_object_class_install_property (gobject_class, | ||
| 253 | + PROP_METHOD, | ||
| 254 | + g_param_spec_enum ("method", | ||
| 255 | + "Deinterlace Method", | ||
| 256 | + "Select which deinterlace method apply to GL video texture", | ||
| 257 | + GST_TYPE_GL_DEINTERLACE_METHODS, | ||
| 258 | + GST_GL_DEINTERLACE_VFIR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); | ||
| 259 | + | ||
| 260 | + GST_BASE_TRANSFORM_CLASS (klass)->start = gst_gl_deinterlace_start; | ||
| 261 | GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_deinterlace_reset; | ||
| 262 | |||
| 263 | GST_GL_FILTER_CLASS (klass)->filter = gst_gl_deinterlace_filter; | ||
| 264 | GST_GL_FILTER_CLASS (klass)->filter_texture = | ||
| 265 | gst_gl_deinterlace_filter_texture; | ||
| 266 | - GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_shader; | ||
| 267 | + GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_fbo; | ||
| 268 | |||
| 269 | - GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = GST_GL_API_OPENGL; | ||
| 270 | + GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = | ||
| 271 | + GST_GL_API_OPENGL | GST_GL_API_GLES2 | GST_GL_API_OPENGL3; | ||
| 272 | } | ||
| 273 | |||
| 274 | static void | ||
| 275 | gst_gl_deinterlace_init (GstGLDeinterlace * filter) | ||
| 276 | { | ||
| 277 | - filter->shader = NULL; | ||
| 278 | + filter->shaderstable = NULL; | ||
| 279 | + filter->deinterlacefunc = gst_gl_deinterlace_vfir_callback; | ||
| 280 | + filter->current_method = GST_GL_DEINTERLACE_VFIR; | ||
| 281 | filter->prev_buffer = NULL; | ||
| 282 | filter->prev_tex = 0; | ||
| 283 | } | ||
| 284 | |||
| 285 | static gboolean | ||
| 286 | +gst_gl_deinterlace_start (GstBaseTransform * trans) | ||
| 287 | +{ | ||
| 288 | + GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (trans); | ||
| 289 | + | ||
| 290 | + deinterlace_filter->shaderstable = g_hash_table_new (g_str_hash, g_str_equal); | ||
| 291 | + | ||
| 292 | + return GST_BASE_TRANSFORM_CLASS (parent_class)->start (trans); | ||
| 293 | +} | ||
| 294 | + | ||
| 295 | +static void | ||
| 296 | +gst_gl_deinterlace_ghash_func_clean (gpointer key, gpointer value, | ||
| 297 | + gpointer data) | ||
| 298 | +{ | ||
| 299 | + GstGLShader *shader = (GstGLShader *) value; | ||
| 300 | + GstGLFilter *filter = (GstGLFilter *) data; | ||
| 301 | + | ||
| 302 | + //blocking call, wait the opengl thread has destroyed the shader | ||
| 303 | + gst_gl_context_del_shader (GST_GL_BASE_FILTER (filter)->context, shader); | ||
| 304 | + | ||
| 305 | + value = NULL; | ||
| 306 | +} | ||
| 307 | + | ||
| 308 | +static gboolean | ||
| 309 | gst_gl_deinterlace_reset (GstBaseTransform * trans) | ||
| 310 | { | ||
| 311 | GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (trans); | ||
| 312 | @@ -189,10 +310,17 @@ gst_gl_deinterlace_reset (GstBaseTransform * trans) | ||
| 313 | gst_buffer_replace (&deinterlace_filter->prev_buffer, NULL); | ||
| 314 | |||
| 315 | //blocking call, wait the opengl thread has destroyed the shader | ||
| 316 | - if (deinterlace_filter->shader) | ||
| 317 | - gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context, | ||
| 318 | - deinterlace_filter->shader); | ||
| 319 | - deinterlace_filter->shader = NULL; | ||
| 320 | + if (deinterlace_filter->shaderstable) { | ||
| 321 | + /* release shaders in the gl thread */ | ||
| 322 | + g_hash_table_foreach (deinterlace_filter->shaderstable, | ||
| 323 | + gst_gl_deinterlace_ghash_func_clean, deinterlace_filter); | ||
| 324 | + | ||
| 325 | + /* clean the htable without calling values destructors | ||
| 326 | + * because shaders have been released in the glthread | ||
| 327 | + * through the foreach func */ | ||
| 328 | + g_hash_table_unref (deinterlace_filter->shaderstable); | ||
| 329 | + deinterlace_filter->shaderstable = NULL; | ||
| 330 | + } | ||
| 331 | |||
| 332 | return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans); | ||
| 333 | } | ||
| 334 | @@ -201,9 +329,12 @@ static void | ||
| 335 | gst_gl_deinterlace_set_property (GObject * object, guint prop_id, | ||
| 336 | const GValue * value, GParamSpec * pspec) | ||
| 337 | { | ||
| 338 | - //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); | ||
| 339 | + GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); | ||
| 340 | |||
| 341 | switch (prop_id) { | ||
| 342 | + case PROP_METHOD: | ||
| 343 | + gst_gl_deinterlace_set_method (filter, g_value_get_enum (value)); | ||
| 344 | + break; | ||
| 345 | default: | ||
| 346 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||
| 347 | break; | ||
| 348 | @@ -214,9 +345,12 @@ static void | ||
| 349 | gst_gl_deinterlace_get_property (GObject * object, guint prop_id, | ||
| 350 | GValue * value, GParamSpec * pspec) | ||
| 351 | { | ||
| 352 | - //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); | ||
| 353 | + GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); | ||
| 354 | |||
| 355 | switch (prop_id) { | ||
| 356 | + case PROP_METHOD: | ||
| 357 | + g_value_set_enum (value, filter->current_method); | ||
| 358 | + break; | ||
| 359 | default: | ||
| 360 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||
| 361 | break; | ||
| 362 | @@ -224,13 +358,9 @@ gst_gl_deinterlace_get_property (GObject * object, guint prop_id, | ||
| 363 | } | ||
| 364 | |||
| 365 | static gboolean | ||
| 366 | -gst_gl_deinterlace_init_shader (GstGLFilter * filter) | ||
| 367 | +gst_gl_deinterlace_init_fbo (GstGLFilter * filter) | ||
| 368 | { | ||
| 369 | - GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); | ||
| 370 | - | ||
| 371 | - //blocking call, wait the opengl thread has compiled the shader | ||
| 372 | - return gst_gl_context_gen_shader (GST_GL_BASE_FILTER (filter)->context, 0, | ||
| 373 | - greedyh_fragment_source, &deinterlace_filter->shader); | ||
| 374 | + return TRUE; | ||
| 375 | } | ||
| 376 | |||
| 377 | static gboolean | ||
| 378 | @@ -241,7 +371,7 @@ gst_gl_deinterlace_filter_texture (GstGLFilter * filter, guint in_tex, | ||
| 379 | |||
| 380 | //blocking call, use a FBO | ||
| 381 | gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex, | ||
| 382 | - gst_gl_deinterlace_callback, deinterlace_filter); | ||
| 383 | + deinterlace_filter->deinterlacefunc, deinterlace_filter); | ||
| 384 | |||
| 385 | return TRUE; | ||
| 386 | } | ||
| 387 | @@ -259,36 +389,104 @@ gst_gl_deinterlace_filter (GstGLFilter * filter, GstBuffer * inbuf, | ||
| 388 | return TRUE; | ||
| 389 | } | ||
| 390 | |||
| 391 | -//opengl scene, params: input texture (not the output filter->texture) | ||
| 392 | +static GstGLShader * | ||
| 393 | +gst_gl_deinterlace_get_fragment_shader (GstGLFilter * filter, | ||
| 394 | + const gchar * shader_name, const gchar * shader_source) | ||
| 395 | +{ | ||
| 396 | + GstGLShader *shader = NULL; | ||
| 397 | + GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); | ||
| 398 | + GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; | ||
| 399 | + | ||
| 400 | + shader = g_hash_table_lookup (deinterlace_filter->shaderstable, shader_name); | ||
| 401 | + | ||
| 402 | + if (!shader) { | ||
| 403 | + GError *error = NULL; | ||
| 404 | + | ||
| 405 | + if (!(shader = gst_gl_shader_new_link_with_stages (context, &error, | ||
| 406 | + gst_glsl_stage_new_default_vertex (context), | ||
| 407 | + gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER, | ||
| 408 | + GST_GLSL_VERSION_NONE, | ||
| 409 | + GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY, | ||
| 410 | + shader_source), NULL))) { | ||
| 411 | + GST_ELEMENT_ERROR (deinterlace_filter, RESOURCE, NOT_FOUND, | ||
| 412 | + ("Failed to initialize %s shader", shader_name), (NULL)); | ||
| 413 | + } | ||
| 414 | + | ||
| 415 | + filter->draw_attr_position_loc = | ||
| 416 | + gst_gl_shader_get_attribute_location (shader, "a_position"); | ||
| 417 | + filter->draw_attr_texture_loc = | ||
| 418 | + gst_gl_shader_get_attribute_location (shader, "a_texcoord"); | ||
| 419 | + } | ||
| 420 | + | ||
| 421 | + g_hash_table_insert (deinterlace_filter->shaderstable, (gchar *) shader_name, | ||
| 422 | + shader); | ||
| 423 | + | ||
| 424 | + return shader; | ||
| 425 | +} | ||
| 426 | + | ||
| 427 | static void | ||
| 428 | -gst_gl_deinterlace_callback (gint width, gint height, guint texture, | ||
| 429 | +gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture, | ||
| 430 | gpointer stuff) | ||
| 431 | { | ||
| 432 | - GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (stuff); | ||
| 433 | + GstGLShader *shader; | ||
| 434 | GstGLFilter *filter = GST_GL_FILTER (stuff); | ||
| 435 | - GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; | ||
| 436 | + GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); | ||
| 437 | + GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; | ||
| 438 | + GstGLFuncs *gl = context->gl_vtable; | ||
| 439 | + | ||
| 440 | + shader = gst_gl_deinterlace_get_fragment_shader (deinterlace_filter, "vfir", | ||
| 441 | + vfir_fragment_source); | ||
| 442 | + | ||
| 443 | + if (!shader) | ||
| 444 | + return; | ||
| 445 | + | ||
| 446 | +#if GST_GL_HAVE_OPENGL | ||
| 447 | + if (USING_OPENGL (context)) { | ||
| 448 | + gl->MatrixMode (GL_PROJECTION); | ||
| 449 | + gl->LoadIdentity (); | ||
| 450 | + } | ||
| 451 | +#endif | ||
| 452 | + | ||
| 453 | + gst_gl_shader_use (shader); | ||
| 454 | + | ||
| 455 | + gl->ActiveTexture (GL_TEXTURE0); | ||
| 456 | + gl->BindTexture (GL_TEXTURE_2D, texture); | ||
| 457 | + | ||
| 458 | + gst_gl_shader_set_uniform_1i (shader, "tex", 0); | ||
| 459 | + gst_gl_shader_set_uniform_1f (shader, "width", | ||
| 460 | + GST_VIDEO_INFO_WIDTH (&filter->out_info)); | ||
| 461 | + gst_gl_shader_set_uniform_1f (shader, "height", | ||
| 462 | + GST_VIDEO_INFO_HEIGHT (&filter->out_info)); | ||
| 463 | + | ||
| 464 | + gst_gl_filter_draw_texture (filter, texture, width, height); | ||
| 465 | +} | ||
| 466 | + | ||
| 467 | +static void | ||
| 468 | +gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture, | ||
| 469 | + gpointer stuff) | ||
| 470 | +{ | ||
| 471 | + GstGLShader *shader; | ||
| 472 | + GstGLFilter *filter = GST_GL_FILTER (stuff); | ||
| 473 | + GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); | ||
| 474 | + GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; | ||
| 475 | + GstGLFuncs *gl = context->gl_vtable; | ||
| 476 | guint temp; | ||
| 477 | |||
| 478 | - GLfloat verts[] = { -1.0, -1.0, | ||
| 479 | - 1.0, -1.0, | ||
| 480 | - 1.0, 1.0, | ||
| 481 | - -1.0, 1.0 | ||
| 482 | - }; | ||
| 483 | - GLfloat texcoords0[] = { 0.0f, 0.0f, | ||
| 484 | - 1.0f, 0.0f, | ||
| 485 | - 1.0f, 1.0f, | ||
| 486 | - 0.0f, 1.0f | ||
| 487 | - }; | ||
| 488 | - GLfloat texcoords1[] = { 0.0f, 0.0f, | ||
| 489 | - 1.0f, 0.0f, | ||
| 490 | - 1.0f, 1.0f, | ||
| 491 | - 0.0f, 1.0f | ||
| 492 | - }; | ||
| 493 | + shader = | ||
| 494 | + gst_gl_deinterlace_get_fragment_shader (deinterlace_filter, "greedhy", | ||
| 495 | + greedyh_fragment_source); | ||
| 496 | |||
| 497 | - gl->MatrixMode (GL_PROJECTION); | ||
| 498 | - gl->LoadIdentity (); | ||
| 499 | + if (!shader) | ||
| 500 | + return; | ||
| 501 | |||
| 502 | - gst_gl_shader_use (deinterlace_filter->shader); | ||
| 503 | +#if GST_GL_HAVE_OPENGL | ||
| 504 | + if (USING_OPENGL (context)) { | ||
| 505 | + gl->MatrixMode (GL_PROJECTION); | ||
| 506 | + gl->LoadIdentity (); | ||
| 507 | + } | ||
| 508 | +#endif | ||
| 509 | + | ||
| 510 | + gst_gl_shader_use (shader); | ||
| 511 | |||
| 512 | if (G_UNLIKELY (deinterlace_filter->prev_tex == 0)) { | ||
| 513 | gst_gl_context_gen_texture (GST_GL_BASE_FILTER (filter)->context, | ||
| 514 | @@ -298,44 +496,24 @@ gst_gl_deinterlace_callback (gint width, gint height, guint texture, | ||
| 515 | GST_VIDEO_INFO_HEIGHT (&filter->out_info)); | ||
| 516 | } else { | ||
| 517 | gl->ActiveTexture (GL_TEXTURE1); | ||
| 518 | - gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex_prev", 1); | ||
| 519 | + gst_gl_shader_set_uniform_1i (shader, "tex_prev", 1); | ||
| 520 | gl->BindTexture (GL_TEXTURE_2D, deinterlace_filter->prev_tex); | ||
| 521 | } | ||
| 522 | |||
| 523 | gl->ActiveTexture (GL_TEXTURE0); | ||
| 524 | - gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex", 0); | ||
| 525 | + gl->BindTexture (GL_TEXTURE_2D, texture); | ||
| 526 | |||
| 527 | - gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "max_comb", | ||
| 528 | - 5.0f / 255.0f); | ||
| 529 | - gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_threshold", | ||
| 530 | - 25.0f / 255.0f); | ||
| 531 | - gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_sense", | ||
| 532 | - 30.0f / 255.0f); | ||
| 533 | + gst_gl_shader_set_uniform_1i (shader, "tex", 0); | ||
| 534 | + gst_gl_shader_set_uniform_1f (shader, "max_comb", 5.0f / 255.0f); | ||
| 535 | + gst_gl_shader_set_uniform_1f (shader, "motion_threshold", 25.0f / 255.0f); | ||
| 536 | + gst_gl_shader_set_uniform_1f (shader, "motion_sense", 30.0f / 255.0f); | ||
| 537 | |||
| 538 | - gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "width", | ||
| 539 | + gst_gl_shader_set_uniform_1f (shader, "width", | ||
| 540 | GST_VIDEO_INFO_WIDTH (&filter->out_info)); | ||
| 541 | - gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "height", | ||
| 542 | + gst_gl_shader_set_uniform_1f (shader, "height", | ||
| 543 | GST_VIDEO_INFO_HEIGHT (&filter->out_info)); | ||
| 544 | |||
| 545 | - gl->ClientActiveTexture (GL_TEXTURE0); | ||
| 546 | - | ||
| 547 | - gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); | ||
| 548 | - gl->EnableClientState (GL_VERTEX_ARRAY); | ||
| 549 | - | ||
| 550 | - gl->VertexPointer (2, GL_FLOAT, 0, &verts); | ||
| 551 | - gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords0); | ||
| 552 | - | ||
| 553 | - gl->ClientActiveTexture (GL_TEXTURE1); | ||
| 554 | - gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); | ||
| 555 | - gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords1); | ||
| 556 | - | ||
| 557 | - gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4); | ||
| 558 | - | ||
| 559 | - gl->DisableClientState (GL_VERTEX_ARRAY); | ||
| 560 | - gl->DisableClientState (GL_TEXTURE_COORD_ARRAY); | ||
| 561 | - | ||
| 562 | - gl->ClientActiveTexture (GL_TEXTURE0); | ||
| 563 | - gl->DisableClientState (GL_TEXTURE_COORD_ARRAY); | ||
| 564 | + gst_gl_filter_draw_texture (filter, texture, width, height); | ||
| 565 | |||
| 566 | if (texture == filter->in_tex_id) { | ||
| 567 | temp = filter->in_tex_id; | ||
| 568 | diff --git a/ext/gl/gstgldeinterlace.h b/ext/gl/gstgldeinterlace.h | ||
| 569 | index a81a2e7..58a9c0c 100644 | ||
| 570 | --- a/ext/gl/gstgldeinterlace.h | ||
| 571 | +++ b/ext/gl/gstgldeinterlace.h | ||
| 572 | @@ -38,9 +38,13 @@ typedef struct _GstGLDeinterlaceClass GstGLDeinterlaceClass; | ||
| 573 | struct _GstGLDeinterlace | ||
| 574 | { | ||
| 575 | GstGLFilter filter; | ||
| 576 | - GstGLShader *shader; | ||
| 577 | + | ||
| 578 | + GLCB deinterlacefunc; | ||
| 579 | + GHashTable *shaderstable; | ||
| 580 | GstBuffer *prev_buffer; | ||
| 581 | guint prev_tex; | ||
| 582 | + | ||
| 583 | + gint current_method; | ||
| 584 | }; | ||
| 585 | |||
| 586 | struct _GstGLDeinterlaceClass | ||
| 587 | diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c | ||
| 588 | index 50676c4..135862a 100644 | ||
| 589 | --- a/ext/gl/gstopengl.c | ||
| 590 | +++ b/ext/gl/gstopengl.c | ||
| 591 | @@ -62,6 +62,7 @@ | ||
| 592 | #include "gstglstereosplit.h" | ||
| 593 | #include "gstglstereomix.h" | ||
| 594 | #include "gstglviewconvert.h" | ||
| 595 | +#include "gstgldeinterlace.h" | ||
| 596 | |||
| 597 | #if HAVE_GRAPHENE | ||
| 598 | #include "gstgltransformation.h" | ||
| 599 | @@ -77,7 +78,6 @@ | ||
| 600 | #include "gstgltestsrc.h" | ||
| 601 | #include "gstglfilterglass.h" | ||
| 602 | /* #include "gstglfilterreflectedscreen.h" */ | ||
| 603 | -#include "gstgldeinterlace.h" | ||
| 604 | #include "gstglmosaic.h" | ||
| 605 | #if HAVE_PNG | ||
| 606 | #include "gstgldifferencematte.h" | ||
| 607 | @@ -226,6 +226,12 @@ plugin_init (GstPlugin * plugin) | ||
| 608 | GST_RANK_NONE, GST_TYPE_GL_STEREO_MIX)) { | ||
| 609 | return FALSE; | ||
| 610 | } | ||
| 611 | + | ||
| 612 | + if (!gst_element_register (plugin, "gldeinterlace", | ||
| 613 | + GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) { | ||
| 614 | + return FALSE; | ||
| 615 | + } | ||
| 616 | + | ||
| 617 | #if HAVE_JPEG | ||
| 618 | #if HAVE_PNG | ||
| 619 | if (!gst_element_register (plugin, "gloverlay", | ||
| 620 | @@ -250,11 +256,6 @@ plugin_init (GstPlugin * plugin) | ||
| 621 | return FALSE; | ||
| 622 | } | ||
| 623 | #endif | ||
| 624 | - if (!gst_element_register (plugin, "gldeinterlace", | ||
| 625 | - GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) { | ||
| 626 | - return FALSE; | ||
| 627 | - } | ||
| 628 | - | ||
| 629 | if (!gst_element_register (plugin, "glmosaic", | ||
| 630 | GST_RANK_NONE, GST_TYPE_GL_MOSAIC)) { | ||
| 631 | return FALSE; | ||
| 632 | -- | ||
| 633 | 1.9.1 | ||
| 634 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch deleted file mode 100755 index 31d8e052fd..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch +++ /dev/null | |||
| @@ -1,244 +0,0 @@ | |||
| 1 | From 127e517568490fc147211d8b2fb4da01cecbbeb5 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Matthew Waters <matthew@centricular.com> | ||
| 3 | Date: Thu, 31 Mar 2016 19:50:28 +1100 | ||
| 4 | Subject: [PATCH 5/6] glcolorconvert: implement multiple render targets for | ||
| 5 | GLES3 | ||
| 6 | |||
| 7 | There are numerous slight differences required between Desktop GL and GLES3 for | ||
| 8 | multiple render targets. | ||
| 9 | |||
| 10 | 1. gl_FragData doesn't exist at all and one is required to use | ||
| 11 | 'layout (location = ?) out ...' instead. | ||
| 12 | 2. gl_FragColor doesn't exist, same as 1 | ||
| 13 | 3. texture2D() has been deprecated | ||
| 14 | |||
| 15 | Fortunately most of these have been taken care of with GL3 and the shader | ||
| 16 | mangling already exists so just expand the conditions they are used in. The | ||
| 17 | gl_FragData issue requires a new mangle pass though. We also use this new | ||
| 18 | pass on desktop GL for consistency. | ||
| 19 | |||
| 20 | Upstream-Status: Backport [1.9.1] | ||
| 21 | |||
| 22 | --- | ||
| 23 | gst-libs/gst/gl/gstglcolorconvert.c | 125 ++++++++++++++++++++++++++++-------- | ||
| 24 | 1 file changed, 99 insertions(+), 26 deletions(-) | ||
| 25 | |||
| 26 | diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 27 | index 490ec54..f478faa 100644 | ||
| 28 | --- a/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 29 | +++ b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 30 | @@ -1802,10 +1802,11 @@ _mangle_sampler_type (const gchar * str, GstGLTextureTarget from, | ||
| 31 | |||
| 32 | static gchar * | ||
| 33 | _mangle_varying_attribute (const gchar * str, guint shader_type, | ||
| 34 | - GstGLAPI gl_api) | ||
| 35 | + GstGLAPI gl_api, guint gl_major, guint gl_minor) | ||
| 36 | { | ||
| 37 | - if (gl_api & GST_GL_API_OPENGL3) { | ||
| 38 | - if (shader_type == GL_VERTEX_SHADER) { | ||
| 39 | + if (shader_type == GL_VERTEX_SHADER) { | ||
| 40 | + if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 | ||
| 41 | + && gl_major >= 3)) { | ||
| 42 | gchar *tmp, *tmp2; | ||
| 43 | GRegex *regex; | ||
| 44 | |||
| 45 | @@ -1821,7 +1822,10 @@ _mangle_varying_attribute (const gchar * str, guint shader_type, | ||
| 46 | |||
| 47 | g_free (tmp); | ||
| 48 | return tmp2; | ||
| 49 | - } else if (shader_type == GL_FRAGMENT_SHADER) { | ||
| 50 | + } | ||
| 51 | + } else if (shader_type == GL_FRAGMENT_SHADER) { | ||
| 52 | + if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 | ||
| 53 | + && gl_major > 3)) { | ||
| 54 | gchar *tmp; | ||
| 55 | GRegex *regex; | ||
| 56 | |||
| 57 | @@ -1837,28 +1841,48 @@ _mangle_varying_attribute (const gchar * str, guint shader_type, | ||
| 58 | } | ||
| 59 | |||
| 60 | static gchar * | ||
| 61 | -_mangle_frag_color (const gchar * str) | ||
| 62 | +_mangle_frag_color_data (const gchar * str) | ||
| 63 | { | ||
| 64 | GRegex *regex; | ||
| 65 | - gchar *ret; | ||
| 66 | + gchar *ret, *tmp; | ||
| 67 | |||
| 68 | regex = g_regex_new ("gl_FragColor", 0, 0, NULL); | ||
| 69 | ret = g_regex_replace_literal (regex, str, -1, 0, "fragColor", 0, NULL); | ||
| 70 | g_regex_unref (regex); | ||
| 71 | |||
| 72 | + tmp = ret; | ||
| 73 | + /* search and replace 'gl_FragData[NUM]' into fragColor_NUM */ | ||
| 74 | + regex = g_regex_new ("gl_FragData\\[(\\d+)\\]", 0, 0, NULL); | ||
| 75 | + ret = g_regex_replace (regex, tmp, -1, 0, "fragColor_\\1", 0, NULL); | ||
| 76 | + g_regex_unref (regex); | ||
| 77 | + g_free (tmp); | ||
| 78 | + | ||
| 79 | return ret; | ||
| 80 | } | ||
| 81 | |||
| 82 | static void | ||
| 83 | -_mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version, | ||
| 84 | - GstGLSLProfile * profile) | ||
| 85 | +_mangle_version_profile_from_gl_api (GstGLAPI gl_api, gint gl_major, | ||
| 86 | + gint gl_minor, GstGLSLVersion * version, GstGLSLProfile * profile) | ||
| 87 | { | ||
| 88 | + *version = GST_GLSL_VERSION_NONE; | ||
| 89 | + *profile = GST_GLSL_PROFILE_NONE; | ||
| 90 | + | ||
| 91 | if (gl_api & GST_GL_API_OPENGL3) { | ||
| 92 | - *version = GST_GLSL_VERSION_150; | ||
| 93 | - *profile = GST_GLSL_PROFILE_NONE; | ||
| 94 | + if (gl_major > 3 || gl_minor >= 3) { | ||
| 95 | + *version = GST_GLSL_VERSION_330; | ||
| 96 | + *profile = GST_GLSL_PROFILE_CORE; | ||
| 97 | + } else { | ||
| 98 | + *version = GST_GLSL_VERSION_150; | ||
| 99 | + *profile = GST_GLSL_PROFILE_NONE; | ||
| 100 | + } | ||
| 101 | } else if (gl_api & GST_GL_API_GLES2) { | ||
| 102 | - *version = GST_GLSL_VERSION_100; | ||
| 103 | - *profile = GST_GLSL_PROFILE_ES; | ||
| 104 | + if (gl_major >= 3) { | ||
| 105 | + *version = GST_GLSL_VERSION_300; | ||
| 106 | + *profile = GST_GLSL_PROFILE_ES; | ||
| 107 | + } else if (gl_major >= 2) { | ||
| 108 | + *version = GST_GLSL_VERSION_100; | ||
| 109 | + *profile = GST_GLSL_PROFILE_ES; | ||
| 110 | + } | ||
| 111 | } else if (gl_api & GST_GL_API_OPENGL) { | ||
| 112 | *version = GST_GLSL_VERSION_110; | ||
| 113 | *profile = GST_GLSL_PROFILE_COMPATIBILITY; | ||
| 114 | @@ -1867,22 +1891,28 @@ _mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version, | ||
| 115 | |||
| 116 | static gchar * | ||
| 117 | _mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from, | ||
| 118 | - GstGLTextureTarget to, GstGLAPI gl_api, GstGLSLVersion * version, | ||
| 119 | - GstGLSLProfile * profile) | ||
| 120 | + GstGLTextureTarget to, GstGLAPI gl_api, gint gl_major, gint gl_minor, | ||
| 121 | + GstGLSLVersion * version, GstGLSLProfile * profile) | ||
| 122 | { | ||
| 123 | gchar *tmp, *tmp2; | ||
| 124 | |||
| 125 | + _mangle_version_profile_from_gl_api (gl_api, gl_major, gl_minor, version, | ||
| 126 | + profile); | ||
| 127 | tmp = _mangle_texture_access (str, from, to, gl_api); | ||
| 128 | tmp2 = _mangle_sampler_type (tmp, from, to); | ||
| 129 | g_free (tmp); | ||
| 130 | - tmp = _mangle_varying_attribute (tmp2, shader_type, gl_api); | ||
| 131 | + tmp = | ||
| 132 | + _mangle_varying_attribute (tmp2, shader_type, gl_api, gl_major, gl_minor); | ||
| 133 | g_free (tmp2); | ||
| 134 | - if (shader_type == GL_FRAGMENT_SHADER && gl_api & GST_GL_API_OPENGL3) { | ||
| 135 | - tmp2 = _mangle_frag_color (tmp); | ||
| 136 | - g_free (tmp); | ||
| 137 | - tmp = tmp2; | ||
| 138 | + if (shader_type == GL_FRAGMENT_SHADER) { | ||
| 139 | + if ((*profile == GST_GLSL_PROFILE_ES && *version >= GST_GLSL_VERSION_300) | ||
| 140 | + || (*profile == GST_GLSL_PROFILE_CORE | ||
| 141 | + && *version >= GST_GLSL_VERSION_150)) { | ||
| 142 | + tmp2 = _mangle_frag_color_data (tmp); | ||
| 143 | + g_free (tmp); | ||
| 144 | + tmp = tmp2; | ||
| 145 | + } | ||
| 146 | } | ||
| 147 | - _mangle_version_profile_from_gl_api (gl_api, version, profile); | ||
| 148 | return tmp; | ||
| 149 | } | ||
| 150 | |||
| 151 | @@ -1899,15 +1929,18 @@ _create_shader (GstGLColorConvert * convert) | ||
| 152 | const gchar *strings[2]; | ||
| 153 | GError *error = NULL; | ||
| 154 | GstGLAPI gl_api; | ||
| 155 | + gint gl_major, gl_minor; | ||
| 156 | int i; | ||
| 157 | |||
| 158 | gl_api = gst_gl_context_get_gl_api (convert->context); | ||
| 159 | + gst_gl_context_get_gl_version (convert->context, &gl_major, &gl_minor); | ||
| 160 | |||
| 161 | ret = gst_gl_shader_new (convert->context); | ||
| 162 | |||
| 163 | tmp = | ||
| 164 | _mangle_shader (text_vertex_shader, GL_VERTEX_SHADER, info->templ->target, | ||
| 165 | - convert->priv->from_texture_target, gl_api, &version, &profile); | ||
| 166 | + convert->priv->from_texture_target, gl_api, gl_major, gl_minor, &version, | ||
| 167 | + &profile); | ||
| 168 | |||
| 169 | tmp1 = gst_glsl_version_profile_to_string (version, profile); | ||
| 170 | version_str = g_strdup_printf ("#version %s\n", tmp1); | ||
| 171 | @@ -1945,9 +1978,37 @@ _create_shader (GstGLColorConvert * convert) | ||
| 172 | if (info->templ->uniforms) | ||
| 173 | g_string_append (str, info->templ->uniforms); | ||
| 174 | |||
| 175 | - if (gl_api & GST_GL_API_OPENGL3) { | ||
| 176 | - g_string_append_c (str, '\n'); | ||
| 177 | - g_string_append (str, "out vec4 fragColor;\n"); | ||
| 178 | + g_string_append_c (str, '\n'); | ||
| 179 | + | ||
| 180 | + /* GL 3.3+ and GL ES 3.x */ | ||
| 181 | + if ((profile == GST_GLSL_PROFILE_CORE && version >= GST_GLSL_VERSION_330) | ||
| 182 | + || (profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)) { | ||
| 183 | + if (info->out_n_textures > 1) { | ||
| 184 | + gint i; | ||
| 185 | + | ||
| 186 | + for (i = 0; i < info->out_n_textures; i++) { | ||
| 187 | + g_string_append_printf (str, | ||
| 188 | + "layout(location = %d) out vec4 fragColor_%d;\n", i, i); | ||
| 189 | + } | ||
| 190 | + } else { | ||
| 191 | + g_string_append (str, "layout (location = 0) out vec4 fragColor;\n"); | ||
| 192 | + } | ||
| 193 | + } else if (profile == GST_GLSL_PROFILE_CORE | ||
| 194 | + && version >= GST_GLSL_VERSION_150) { | ||
| 195 | + /* no layout specifiers, use glBindFragDataLocation instead */ | ||
| 196 | + if (info->out_n_textures > 1) { | ||
| 197 | + gint i; | ||
| 198 | + | ||
| 199 | + for (i = 0; i < info->out_n_textures; i++) { | ||
| 200 | + gchar *var_name = g_strdup_printf ("fragColor_%d", i); | ||
| 201 | + g_string_append_printf (str, "out vec4 %s;\n", var_name); | ||
| 202 | + gst_gl_shader_bind_frag_data_location (ret, i, var_name); | ||
| 203 | + g_free (var_name); | ||
| 204 | + } | ||
| 205 | + } else { | ||
| 206 | + g_string_append (str, "out vec4 fragColor;\n"); | ||
| 207 | + gst_gl_shader_bind_frag_data_location (ret, 0, "fragColor"); | ||
| 208 | + } | ||
| 209 | } | ||
| 210 | |||
| 211 | for (i = 0; i < MAX_FUNCTIONS; i++) { | ||
| 212 | @@ -1959,7 +2020,19 @@ _create_shader (GstGLColorConvert * convert) | ||
| 213 | g_string_append_c (str, '\n'); | ||
| 214 | } | ||
| 215 | |||
| 216 | - g_string_append (str, "\nvarying vec2 v_texcoord;\nvoid main (void) {\n"); | ||
| 217 | + { | ||
| 218 | + const gchar *varying = NULL; | ||
| 219 | + | ||
| 220 | + if ((profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300) | ||
| 221 | + || (profile == GST_GLSL_PROFILE_CORE | ||
| 222 | + && version >= GST_GLSL_VERSION_150)) { | ||
| 223 | + varying = "in"; | ||
| 224 | + } else { | ||
| 225 | + varying = "varying"; | ||
| 226 | + } | ||
| 227 | + g_string_append_printf (str, "\n%s vec2 v_texcoord;\nvoid main (void) {\n", | ||
| 228 | + varying); | ||
| 229 | + } | ||
| 230 | if (info->frag_body) { | ||
| 231 | g_string_append (str, "vec2 texcoord;\n"); | ||
| 232 | if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE | ||
| 233 | @@ -1975,7 +2048,7 @@ _create_shader (GstGLColorConvert * convert) | ||
| 234 | tmp = g_string_free (str, FALSE); | ||
| 235 | info->frag_prog = _mangle_shader (tmp, GL_FRAGMENT_SHADER, | ||
| 236 | info->templ->target, convert->priv->from_texture_target, gl_api, | ||
| 237 | - &version, &profile); | ||
| 238 | + gl_major, gl_minor, &version, &profile); | ||
| 239 | g_free (tmp); | ||
| 240 | |||
| 241 | strings[1] = info->frag_prog; | ||
| 242 | -- | ||
| 243 | 1.9.1 | ||
| 244 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch deleted file mode 100755 index b75f402d82..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch +++ /dev/null | |||
| @@ -1,32 +0,0 @@ | |||
| 1 | From b069672ace2b762f400ca6d318571cbedf5141f2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Matthew Waters <matthew@centricular.com> | ||
| 3 | Date: Thu, 31 Mar 2016 20:00:37 +1100 | ||
| 4 | Subject: [PATCH 1/3] glcolorconvert: don't use the predefined variable name | ||
| 5 | sample | ||
| 6 | |||
| 7 | Using 'sample' as a variable name is an error in GLES3 | ||
| 8 | |||
| 9 | Upstream-Status: Backport [1.9.1] | ||
| 10 | --- | ||
| 11 | gst-libs/gst/gl/gstglcolorconvert.c | 4 ++-- | ||
| 12 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
| 13 | |||
| 14 | diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 15 | index f478faa..c23624f 100644 | ||
| 16 | --- a/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 17 | +++ b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 18 | @@ -261,9 +261,9 @@ static const struct shader_templ templ_RGB_to_PLANAR_YUV = | ||
| 19 | " for (int j = 0; j < int(chroma_sampling.y); j++) {\n" | ||
| 20 | " int n = (i+1)*(j+1);\n" | ||
| 21 | " delta.y = float(j);\n" | ||
| 22 | - " vec4 sample = texture2D(tex, (chroma_pos + delta) / unnormalization).%c%c%c%c;\n" | ||
| 23 | + " vec4 s = texture2D(tex, (chroma_pos + delta) / unnormalization).%c%c%c%c;\n" | ||
| 24 | /* rolling average */ | ||
| 25 | - " uv_texel = (float(n-1) * uv_texel + sample) / float(n);\n" | ||
| 26 | + " uv_texel = (float(n-1) * uv_texel + s) / float(n);\n" | ||
| 27 | " }\n" | ||
| 28 | " }\n" | ||
| 29 | "}\n" | ||
| 30 | -- | ||
| 31 | 1.9.1 | ||
| 32 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch deleted file mode 100755 index 57e9d1a46e..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch +++ /dev/null | |||
| @@ -1,77 +0,0 @@ | |||
| 1 | From 38221080181229d520522a20bcb1663ca19f7aff Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Matthew Waters <matthew@centricular.com> | ||
| 3 | Date: Thu, 31 Mar 2016 19:25:32 +1100 | ||
| 4 | Subject: [PATCH 2/3] glshader: add glBindFragDataLocation | ||
| 5 | |||
| 6 | There are some cases where it's needed for binding in/out variables in shaders. | ||
| 7 | e.g. glsl 150 (gl 3.2) doesn't support the 'layout (location = ?)' specifiers in | ||
| 8 | the shader source so we have to bind them ourselves. | ||
| 9 | |||
| 10 | Upstream-Status: Backport [1.9.1] | ||
| 11 | --- | ||
| 12 | gst-libs/gst/gl/glprototypes/shaders.h | 10 ++++++++++ | ||
| 13 | gst-libs/gst/gl/gstglshader.c | 20 ++++++++++++++++++++ | ||
| 14 | gst-libs/gst/gl/gstglshader.h | 1 + | ||
| 15 | 3 files changed, 31 insertions(+) | ||
| 16 | |||
| 17 | diff --git a/gst-libs/gst/gl/glprototypes/shaders.h b/gst-libs/gst/gl/glprototypes/shaders.h | ||
| 18 | index 817e479..6d828db 100644 | ||
| 19 | --- a/gst-libs/gst/gl/glprototypes/shaders.h | ||
| 20 | +++ b/gst-libs/gst/gl/glprototypes/shaders.h | ||
| 21 | @@ -362,3 +362,13 @@ GST_GL_EXT_FUNCTION (void, UniformMatrix3x4fv, | ||
| 22 | GST_GL_EXT_FUNCTION (void, UniformMatrix4x3fv, | ||
| 23 | (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) | ||
| 24 | GST_GL_EXT_END () | ||
| 25 | + | ||
| 26 | +GST_GL_EXT_BEGIN (bind_frag_data, | ||
| 27 | + GST_GL_API_OPENGL | GST_GL_API_OPENGL3, | ||
| 28 | + 3, 0, | ||
| 29 | + 255, 255, | ||
| 30 | + "\0", | ||
| 31 | + "\0") | ||
| 32 | +GST_GL_EXT_FUNCTION (void, BindFragDataLocation, | ||
| 33 | + (GLuint program, GLuint index, const GLchar * name)) | ||
| 34 | +GST_GL_EXT_END () | ||
| 35 | diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c | ||
| 36 | index 9d96784..9f09236 100644 | ||
| 37 | --- a/gst-libs/gst/gl/gstglshader.c | ||
| 38 | +++ b/gst-libs/gst/gl/gstglshader.c | ||
| 39 | @@ -1306,3 +1306,23 @@ gst_gl_shader_bind_attribute_location (GstGLShader * shader, GLuint index, | ||
| 40 | |||
| 41 | gl->BindAttribLocation (priv->program_handle, index, name); | ||
| 42 | } | ||
| 43 | + | ||
| 44 | +void | ||
| 45 | +gst_gl_shader_bind_frag_data_location (GstGLShader * shader, | ||
| 46 | + guint index, const gchar * name) | ||
| 47 | +{ | ||
| 48 | + GstGLShaderPrivate *priv; | ||
| 49 | + GstGLFuncs *gl; | ||
| 50 | + | ||
| 51 | + g_return_if_fail (shader != NULL); | ||
| 52 | + if (!_ensure_program (shader)) | ||
| 53 | + g_return_if_fail (shader->priv->program_handle); | ||
| 54 | + priv = shader->priv; | ||
| 55 | + gl = shader->context->gl_vtable; | ||
| 56 | + g_return_if_fail (gl->BindFragDataLocation); | ||
| 57 | + | ||
| 58 | + GST_TRACE_OBJECT (shader, "binding program %i frag data \'%s\' location %i", | ||
| 59 | + (int) priv->program_handle, name, index); | ||
| 60 | + | ||
| 61 | + gl->BindFragDataLocation (priv->program_handle, index, name); | ||
| 62 | +} | ||
| 63 | diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h | ||
| 64 | index 21410e2..2200b89 100644 | ||
| 65 | --- a/gst-libs/gst/gl/gstglshader.h | ||
| 66 | +++ b/gst-libs/gst/gl/gstglshader.h | ||
| 67 | @@ -104,6 +104,7 @@ void gst_gl_shader_set_uniform_matrix_4x3fv (GstGLShader *shader, const gchar *n | ||
| 68 | |||
| 69 | gint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name); | ||
| 70 | void gst_gl_shader_bind_attribute_location (GstGLShader * shader, guint index, const gchar * name); | ||
| 71 | +void gst_gl_shader_bind_frag_data_location (GstGLShader * shader, guint index, const gchar * name); | ||
| 72 | |||
| 73 | G_END_DECLS | ||
| 74 | |||
| 75 | -- | ||
| 76 | 1.9.1 | ||
| 77 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch deleted file mode 100755 index 79ef4c81ab..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch +++ /dev/null | |||
| @@ -1,51 +0,0 @@ | |||
| 1 | From 764fd69f8482eca9f925cefe72ebae090ae59d43 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com> | ||
| 3 | Date: Tue, 19 Apr 2016 19:27:33 +0300 | ||
| 4 | Subject: [PATCH 3/3] glcolorconvert: GLES3 deprecates texture2D() and it does | ||
| 5 | not work at all in newer versions than 3.3 | ||
| 6 | |||
| 7 | Use the newer texture() function instead. This fixes glimagesink and other | ||
| 8 | things on various Android devices. | ||
| 9 | |||
| 10 | Upstream-Status: Backport [1.9.1] | ||
| 11 | |||
| 12 | https://bugzilla.gnome.org/show_bug.cgi?id=765266 | ||
| 13 | --- | ||
| 14 | gst-libs/gst/gl/gstglcolorconvert.c | 7 ++++--- | ||
| 15 | 1 file changed, 4 insertions(+), 3 deletions(-) | ||
| 16 | |||
| 17 | diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 18 | index c23624f..f472d5d 100644 | ||
| 19 | --- a/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 20 | +++ b/gst-libs/gst/gl/gstglcolorconvert.c | ||
| 21 | @@ -1716,7 +1716,7 @@ _unbind_buffer (GstGLColorConvert * convert) | ||
| 22 | |||
| 23 | static gchar * | ||
| 24 | _mangle_texture_access (const gchar * str, GstGLTextureTarget from, | ||
| 25 | - GstGLTextureTarget to, GstGLAPI gl_api) | ||
| 26 | + GstGLTextureTarget to, GstGLAPI gl_api, guint gl_major, guint gl_minor) | ||
| 27 | { | ||
| 28 | const gchar *from_str = NULL, *to_str = NULL; | ||
| 29 | gchar *ret, *tmp; | ||
| 30 | @@ -1730,7 +1730,8 @@ _mangle_texture_access (const gchar * str, GstGLTextureTarget from, | ||
| 31 | if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) | ||
| 32 | from_str = "texture2D"; | ||
| 33 | |||
| 34 | - if (gl_api & GST_GL_API_OPENGL3) { | ||
| 35 | + if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 | ||
| 36 | + && gl_major >= 3)) { | ||
| 37 | to_str = "texture"; | ||
| 38 | } else { | ||
| 39 | if (to == GST_GL_TEXTURE_TARGET_2D) | ||
| 40 | @@ -1898,7 +1899,7 @@ _mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from, | ||
| 41 | |||
| 42 | _mangle_version_profile_from_gl_api (gl_api, gl_major, gl_minor, version, | ||
| 43 | profile); | ||
| 44 | - tmp = _mangle_texture_access (str, from, to, gl_api); | ||
| 45 | + tmp = _mangle_texture_access (str, from, to, gl_api, gl_major, gl_minor); | ||
| 46 | tmp2 = _mangle_sampler_type (tmp, from, to); | ||
| 47 | g_free (tmp); | ||
| 48 | tmp = | ||
| 49 | -- | ||
| 50 | 1.9.1 | ||
| 51 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch deleted file mode 100644 index a67381cfef..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch +++ /dev/null | |||
| @@ -1,495 +0,0 @@ | |||
| 1 | From 806bbe75b0b6947f589bce3960c28fee51b5c6c2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Gwang Yoon Hwang <yoon@igalia.com> | ||
| 3 | Date: Thu, 21 Jan 2016 22:18:17 +0900 | ||
| 4 | Subject: [PATCH] gl: implement GstGLMemoryEGL | ||
| 5 | |||
| 6 | Because current GstEGLImageMemory does not inherit GstGLMemory, GLUpload | ||
| 7 | allocates additional GLMemory and upload the decoded contents from the decoder | ||
| 8 | which uses EGLImage (e.g. gst-omx in RPi). | ||
| 9 | |||
| 10 | This work adds GstGLMemoryEGL to avoid this overhead. Decoders allocate | ||
| 11 | GstGLMemoryEGL and decode its contents to the EGLImage of GstGLMemoryEGL. And | ||
| 12 | GLUpload uses this memory without allocation of additional textures and blit | ||
| 13 | operations. | ||
| 14 | |||
| 15 | https://bugzilla.gnome.org/show_bug.cgi?id=760916 | ||
| 16 | --- | ||
| 17 | Upstream-Status: Backport | ||
| 18 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 19 | |||
| 20 | gst-libs/gst/gl/egl/Makefile.am | 2 + | ||
| 21 | gst-libs/gst/gl/egl/gstgldisplay_egl.c | 2 + | ||
| 22 | gst-libs/gst/gl/egl/gstglmemoryegl.c | 241 +++++++++++++++++++++++++++++++++ | ||
| 23 | gst-libs/gst/gl/egl/gstglmemoryegl.h | 108 +++++++++++++++ | ||
| 24 | gst-libs/gst/gl/gstgl_fwd.h | 4 + | ||
| 25 | gst-libs/gst/gl/gstgldisplay.c | 2 + | ||
| 26 | gst-libs/gst/gl/gstglupload.c | 8 ++ | ||
| 27 | 7 files changed, 367 insertions(+) | ||
| 28 | create mode 100644 gst-libs/gst/gl/egl/gstglmemoryegl.c | ||
| 29 | create mode 100644 gst-libs/gst/gl/egl/gstglmemoryegl.h | ||
| 30 | |||
| 31 | diff --git a/gst-libs/gst/gl/egl/Makefile.am b/gst-libs/gst/gl/egl/Makefile.am | ||
| 32 | index b808178..878f16c 100644 | ||
| 33 | --- a/gst-libs/gst/gl/egl/Makefile.am | ||
| 34 | +++ b/gst-libs/gst/gl/egl/Makefile.am | ||
| 35 | @@ -5,6 +5,7 @@ noinst_LTLIBRARIES = libgstgl-egl.la | ||
| 36 | libgstgl_egl_la_SOURCES = \ | ||
| 37 | gstgldisplay_egl.c \ | ||
| 38 | gstglcontext_egl.c \ | ||
| 39 | + gstglmemoryegl.c \ | ||
| 40 | gsteglimagememory.c | ||
| 41 | |||
| 42 | noinst_HEADERS = | ||
| 43 | @@ -13,6 +14,7 @@ libgstgl_eglincludedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/gl/egl | ||
| 44 | libgstgl_eglinclude_HEADERS = \ | ||
| 45 | gstgldisplay_egl.h \ | ||
| 46 | gstglcontext_egl.h \ | ||
| 47 | + gstglmemoryegl.h \ | ||
| 48 | gsteglimagememory.h \ | ||
| 49 | gstegl.h | ||
| 50 | |||
| 51 | diff --git a/gst-libs/gst/gl/egl/gstgldisplay_egl.c b/gst-libs/gst/gl/egl/gstgldisplay_egl.c | ||
| 52 | index 9acf4f0..20816c2 100644 | ||
| 53 | --- a/gst-libs/gst/gl/egl/gstgldisplay_egl.c | ||
| 54 | +++ b/gst-libs/gst/gl/egl/gstgldisplay_egl.c | ||
| 55 | @@ -24,6 +24,7 @@ | ||
| 56 | |||
| 57 | #include <gst/gl/egl/gstgldisplay_egl.h> | ||
| 58 | #include <gst/gl/egl/gsteglimagememory.h> | ||
| 59 | +#include <gst/gl/egl/gstglmemoryegl.h> | ||
| 60 | |||
| 61 | GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug); | ||
| 62 | #define GST_CAT_DEFAULT gst_gl_display_debug | ||
| 63 | @@ -51,6 +52,7 @@ gst_gl_display_egl_init (GstGLDisplayEGL * display_egl) | ||
| 64 | display_egl->foreign_display = FALSE; | ||
| 65 | |||
| 66 | gst_egl_image_memory_init (); | ||
| 67 | + gst_gl_memory_egl_init_once (); | ||
| 68 | } | ||
| 69 | |||
| 70 | static void | ||
| 71 | diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.c b/gst-libs/gst/gl/egl/gstglmemoryegl.c | ||
| 72 | new file mode 100644 | ||
| 73 | index 0000000..03cf432 | ||
| 74 | --- /dev/null | ||
| 75 | +++ b/gst-libs/gst/gl/egl/gstglmemoryegl.c | ||
| 76 | @@ -0,0 +1,241 @@ | ||
| 77 | +/* | ||
| 78 | + * GStreamer | ||
| 79 | + * Copyright (C) 2012 Collabora Ltd. | ||
| 80 | + * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk> | ||
| 81 | + * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com> | ||
| 82 | + * Copyright (C) 2015 Igalia | ||
| 83 | + * Author: Gwang Yoon Hwang <yoon@igalia.com> | ||
| 84 | + * | ||
| 85 | + * This library is free software; you can redistribute it and/or | ||
| 86 | + * modify it under the terms of the GNU Library General Public | ||
| 87 | + * License as published by the Free Software Foundation; either | ||
| 88 | + * version 2 of the License, or (at your option) any later version. | ||
| 89 | + * | ||
| 90 | + * This library is distributed in the hope that it will be useful, | ||
| 91 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 92 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 93 | + * Library General Public License for more details. | ||
| 94 | + * | ||
| 95 | + * You should have received a copy of the GNU Library General Public | ||
| 96 | + * License along with this library; if not, write to the | ||
| 97 | + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | ||
| 98 | + * Boston, MA 02110-1301, USA. | ||
| 99 | + */ | ||
| 100 | + | ||
| 101 | +#ifdef HAVE_CONFIG_H | ||
| 102 | +#include "config.h" | ||
| 103 | +#endif | ||
| 104 | + | ||
| 105 | +#include <string.h> | ||
| 106 | + | ||
| 107 | +#include <gst/gl/egl/gstglmemoryegl.h> | ||
| 108 | + | ||
| 109 | +static GstAllocator *_gl_memory_egl_allocator; | ||
| 110 | + | ||
| 111 | +GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY); | ||
| 112 | +#define GST_CAT_DEFAULT GST_CAT_GL_MEMORY | ||
| 113 | + | ||
| 114 | +#define parent_class gst_gl_memory_egl_allocator_parent_class | ||
| 115 | +G_DEFINE_TYPE (GstGLMemoryEGLAllocator, gst_gl_memory_egl_allocator, | ||
| 116 | + GST_TYPE_GL_MEMORY_ALLOCATOR); | ||
| 117 | + | ||
| 118 | +gboolean | ||
| 119 | +gst_is_gl_memory_egl (GstMemory * mem) | ||
| 120 | +{ | ||
| 121 | + return mem != NULL && mem->allocator != NULL | ||
| 122 | + && g_type_is_a (G_OBJECT_TYPE (mem->allocator), | ||
| 123 | + GST_TYPE_GL_MEMORY_EGL_ALLOCATOR); | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +static GstGLMemoryEGL * | ||
| 127 | +_gl_mem_get_parent (GstGLMemoryEGL * gl_mem) | ||
| 128 | +{ | ||
| 129 | + GstGLMemoryEGL *parent = (GstGLMemoryEGL *)gl_mem->mem.mem.mem.parent; | ||
| 130 | + return parent ? parent : gl_mem; | ||
| 131 | +} | ||
| 132 | + | ||
| 133 | +EGLImageKHR | ||
| 134 | +gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem) | ||
| 135 | +{ | ||
| 136 | + g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), | ||
| 137 | + EGL_NO_IMAGE_KHR); | ||
| 138 | + return _gl_mem_get_parent(mem)->image; | ||
| 139 | +} | ||
| 140 | + | ||
| 141 | +EGLDisplay | ||
| 142 | +gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem) | ||
| 143 | +{ | ||
| 144 | + g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), NULL); | ||
| 145 | + return GST_GL_CONTEXT_EGL(_gl_mem_get_parent(mem))->egl_display; | ||
| 146 | +} | ||
| 147 | + | ||
| 148 | +GstVideoGLTextureOrientation | ||
| 149 | +gst_gl_memory_egl_get_orientation (GstGLMemoryEGL * mem) | ||
| 150 | +{ | ||
| 151 | + g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), | ||
| 152 | + GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL); | ||
| 153 | + | ||
| 154 | + return _gl_mem_get_parent(mem)->orientation; | ||
| 155 | +} | ||
| 156 | + | ||
| 157 | +void | ||
| 158 | +gst_gl_memory_egl_set_orientation (GstGLMemoryEGL * mem, | ||
| 159 | + GstVideoGLTextureOrientation orientation) | ||
| 160 | +{ | ||
| 161 | + g_return_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem))); | ||
| 162 | + | ||
| 163 | + _gl_mem_get_parent(mem)->orientation = orientation; | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +static GstMemory * | ||
| 167 | +_gl_mem_alloc (GstAllocator * allocator, gsize size, | ||
| 168 | + GstAllocationParams * params) | ||
| 169 | +{ | ||
| 170 | + g_warning ("Use gst_gl_base_memory_allocator_alloc() to allocate from this " | ||
| 171 | + "GstGLMemoryEGL allocator"); | ||
| 172 | + | ||
| 173 | + return NULL; | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +static void | ||
| 177 | +_gl_mem_destroy (GstGLMemoryEGL * mem) | ||
| 178 | +{ | ||
| 179 | + /* Shared memory should not destroy all the data */ | ||
| 180 | + if (!mem->mem.mem.mem.parent) { | ||
| 181 | + GstGLContextEGL *context = GST_GL_CONTEXT_EGL(mem->mem.mem.context); | ||
| 182 | + context->eglDestroyImage (context->egl_display, mem->image); | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class)->destroy ((GstGLBaseMemory | ||
| 186 | + *) mem); | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | +static void | ||
| 190 | +_gl_mem_init (GstGLMemoryEGL * mem, GstAllocator * allocator, | ||
| 191 | + GstMemory * parent, GstGLContext * context, GstGLTextureTarget target, | ||
| 192 | + GstAllocationParams * params, GstVideoInfo * info, | ||
| 193 | + guint plane, GstVideoAlignment * valign, gpointer user_data, | ||
| 194 | + GDestroyNotify notify) | ||
| 195 | +{ | ||
| 196 | + gst_gl_memory_init ((GstGLMemory *) mem, allocator, parent, | ||
| 197 | + context, target, params, info, plane, valign, user_data, notify); | ||
| 198 | +} | ||
| 199 | + | ||
| 200 | +static GstGLMemoryEGL * | ||
| 201 | +_gl_mem_egl_alloc (GstGLBaseMemoryAllocator * allocator, | ||
| 202 | + GstGLVideoAllocationParams * params) | ||
| 203 | +{ | ||
| 204 | + guint alloc_flags = params->parent.alloc_flags; | ||
| 205 | + GstGLMemoryEGL *mem; | ||
| 206 | + | ||
| 207 | + g_return_val_if_fail (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO, | ||
| 208 | + NULL); | ||
| 209 | + g_return_val_if_fail ((alloc_flags & | ||
| 210 | + GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) == 0, NULL); | ||
| 211 | + g_return_val_if_fail ((alloc_flags & | ||
| 212 | + GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) == 0, NULL); | ||
| 213 | + | ||
| 214 | + mem = g_new0 (GstGLMemoryEGL, 1); | ||
| 215 | + mem->image = EGL_NO_IMAGE_KHR; | ||
| 216 | + | ||
| 217 | + _gl_mem_init (mem, GST_ALLOCATOR_CAST (allocator), NULL, | ||
| 218 | + params->parent.context, params->target, params->parent.alloc_params, | ||
| 219 | + params->v_info, params->plane, params->valign, params->parent.user_data, | ||
| 220 | + params->parent.notify); | ||
| 221 | + | ||
| 222 | + return mem; | ||
| 223 | +} | ||
| 224 | + | ||
| 225 | +static gboolean | ||
| 226 | +_gl_mem_create (GstGLMemoryEGL * gl_mem, GError ** error) | ||
| 227 | +{ | ||
| 228 | + GstGLContextEGL *context = GST_GL_CONTEXT_EGL (gl_mem->mem.mem.context); | ||
| 229 | + GstGLBaseMemoryAllocatorClass *alloc_class; | ||
| 230 | + | ||
| 231 | + if (!gst_gl_context_check_feature (GST_GL_CONTEXT (context), | ||
| 232 | + "EGL_KHR_image_base")) { | ||
| 233 | + g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_WRONG_API, | ||
| 234 | + "EGL_KHR_image_base is not supported"); | ||
| 235 | + return FALSE; | ||
| 236 | + } | ||
| 237 | + | ||
| 238 | + alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class); | ||
| 239 | + if (!alloc_class->create ((GstGLBaseMemory *) gl_mem, error)) | ||
| 240 | + return FALSE; | ||
| 241 | + | ||
| 242 | + gl_mem->image = context->eglCreateImage (context->egl_display, | ||
| 243 | + context->egl_context, EGL_GL_TEXTURE_2D_KHR, | ||
| 244 | + (EGLClientBuffer) GSIZE_TO_POINTER (gl_mem->mem.tex_id), NULL); | ||
| 245 | + | ||
| 246 | + GST_TRACE ("Generating EGLImage handle:%p from a texture:%u", | ||
| 247 | + gl_mem->image, gl_mem->mem.tex_id); | ||
| 248 | + | ||
| 249 | + if (eglGetError () != EGL_SUCCESS) { | ||
| 250 | + g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_FAILED, | ||
| 251 | + "Failed to create EGLImage"); | ||
| 252 | + return FALSE; | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + return TRUE; | ||
| 256 | +} | ||
| 257 | + | ||
| 258 | +static GstMemory * | ||
| 259 | +_gl_mem_copy (GstGLMemoryEGL * src, gssize offset, gssize size) | ||
| 260 | +{ | ||
| 261 | + GST_CAT_ERROR (GST_CAT_GL_MEMORY, "GstGLMemoryEGL does not support copy"); | ||
| 262 | + return NULL; | ||
| 263 | +} | ||
| 264 | + | ||
| 265 | +static void | ||
| 266 | +gst_gl_memory_egl_allocator_class_init (GstGLMemoryEGLAllocatorClass * klass) | ||
| 267 | +{ | ||
| 268 | + GstGLBaseMemoryAllocatorClass *gl_base; | ||
| 269 | + GstGLMemoryAllocatorClass *gl_tex; | ||
| 270 | + GstAllocatorClass *allocator_class; | ||
| 271 | + | ||
| 272 | + gl_tex = (GstGLMemoryAllocatorClass *) klass; | ||
| 273 | + gl_base = (GstGLBaseMemoryAllocatorClass *) klass; | ||
| 274 | + allocator_class = (GstAllocatorClass *) klass; | ||
| 275 | + | ||
| 276 | + gl_base->alloc = (GstGLBaseMemoryAllocatorAllocFunction) _gl_mem_egl_alloc; | ||
| 277 | + gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_mem_create; | ||
| 278 | + gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_mem_destroy; | ||
| 279 | + gl_tex->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_mem_copy; | ||
| 280 | + | ||
| 281 | + allocator_class->alloc = _gl_mem_alloc; | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +static void | ||
| 285 | +gst_gl_memory_egl_allocator_init (GstGLMemoryEGLAllocator * allocator) | ||
| 286 | +{ | ||
| 287 | + GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); | ||
| 288 | + | ||
| 289 | + alloc->mem_type = GST_GL_MEMORY_EGL_ALLOCATOR_NAME; | ||
| 290 | + | ||
| 291 | + GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); | ||
| 292 | +} | ||
| 293 | + | ||
| 294 | +/** | ||
| 295 | + * gst_gl_memory_egl_init_once: | ||
| 296 | + * | ||
| 297 | + * Initializes the GL Memory allocator. It is safe to call this function | ||
| 298 | + * multiple times. This must be called before any other GstGLMemoryEGL operation. | ||
| 299 | + */ | ||
| 300 | +void | ||
| 301 | +gst_gl_memory_egl_init_once (void) | ||
| 302 | +{ | ||
| 303 | + static volatile gsize _init = 0; | ||
| 304 | + | ||
| 305 | + if (g_once_init_enter (&_init)) { | ||
| 306 | + gst_gl_memory_init_once (); | ||
| 307 | + | ||
| 308 | + GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glmemory", 0, | ||
| 309 | + "OpenGL Texture with EGLImage memory"); | ||
| 310 | + | ||
| 311 | + _gl_memory_egl_allocator = g_object_new (GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, NULL); | ||
| 312 | + | ||
| 313 | + gst_allocator_register (GST_GL_MEMORY_EGL_ALLOCATOR_NAME, | ||
| 314 | + gst_object_ref (_gl_memory_egl_allocator)); | ||
| 315 | + g_once_init_leave (&_init, 1); | ||
| 316 | + } | ||
| 317 | +} | ||
| 318 | diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.h b/gst-libs/gst/gl/egl/gstglmemoryegl.h | ||
| 319 | new file mode 100644 | ||
| 320 | index 0000000..7256d33 | ||
| 321 | --- /dev/null | ||
| 322 | +++ b/gst-libs/gst/gl/egl/gstglmemoryegl.h | ||
| 323 | @@ -0,0 +1,108 @@ | ||
| 324 | +/* | ||
| 325 | + * GStreamer | ||
| 326 | + * Copyright (C) 2012 Collabora Ltd. | ||
| 327 | + * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk> | ||
| 328 | + * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com> | ||
| 329 | + * | ||
| 330 | + * This library is free software; you can redistribute it and/or | ||
| 331 | + * modify it under the terms of the GNU Library General Public | ||
| 332 | + * License as published by the Free Software Foundation; either | ||
| 333 | + * version 2 of the License, or (at your option) any later version. | ||
| 334 | + * | ||
| 335 | + * This library is distributed in the hope that it will be useful, | ||
| 336 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 337 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 338 | + * Library General Public License for more details. | ||
| 339 | + * | ||
| 340 | + * You should have received a copy of the GNU Library General Public | ||
| 341 | + * License along with this library; if not, write to the | ||
| 342 | + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | ||
| 343 | + * Boston, MA 02110-1301, USA. | ||
| 344 | + */ | ||
| 345 | + | ||
| 346 | +#ifndef _GST_GL_MEMORY_EGL_H_ | ||
| 347 | +#define _GST_GL_MEMORY_EGL_H_ | ||
| 348 | + | ||
| 349 | +#include <gst/gst.h> | ||
| 350 | +#include <gst/gstallocator.h> | ||
| 351 | +#include <gst/gstmemory.h> | ||
| 352 | +#include <gst/video/video.h> | ||
| 353 | + | ||
| 354 | +#include <gst/gl/gl.h> | ||
| 355 | +#include "gstglcontext_egl.h" | ||
| 356 | + | ||
| 357 | +#include <gst/gl/gstglmemory.h> | ||
| 358 | + | ||
| 359 | +G_BEGIN_DECLS | ||
| 360 | + | ||
| 361 | +#define GST_TYPE_GL_MEMORY_EGL_ALLOCATOR (gst_gl_memory_egl_allocator_get_type()) | ||
| 362 | +GType gst_gl_memory_egl_allocator_get_type(void); | ||
| 363 | + | ||
| 364 | +#define GST_IS_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR)) | ||
| 365 | +#define GST_IS_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR)) | ||
| 366 | +#define GST_GL_MEMORY_EGL_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocatorClass)) | ||
| 367 | +#define GST_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocator)) | ||
| 368 | +#define GST_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLAllocatorClass)) | ||
| 369 | +#define GST_GL_MEMORY_EGL_ALLOCATOR_CAST(obj) ((GstGLMemoryEGLAllocator *)(obj)) | ||
| 370 | + | ||
| 371 | +typedef void (*GstEGLImageDestroyNotify) (GstGLContextEGL * context, | ||
| 372 | + gpointer data); | ||
| 373 | + | ||
| 374 | +typedef struct _GstEGLImageMemory GstEGLImageMemory; | ||
| 375 | + | ||
| 376 | + | ||
| 377 | +/** | ||
| 378 | + * GstGLMemoryEGL: | ||
| 379 | + * | ||
| 380 | + * Private instance | ||
| 381 | + */ | ||
| 382 | +struct _GstGLMemoryEGL | ||
| 383 | +{ | ||
| 384 | + GstGLMemory mem; | ||
| 385 | + | ||
| 386 | + EGLImageKHR image; | ||
| 387 | + GstVideoGLTextureOrientation orientation; | ||
| 388 | +}; | ||
| 389 | + | ||
| 390 | +/** | ||
| 391 | + * GST_GL_MEMORY_EGL_ALLOCATOR: | ||
| 392 | + * | ||
| 393 | + * The name of the GL Memory EGL allocator | ||
| 394 | + */ | ||
| 395 | +#define GST_GL_MEMORY_EGL_ALLOCATOR_NAME "GLMemoryEGL" | ||
| 396 | + | ||
| 397 | +void gst_gl_memory_egl_init_once (void); | ||
| 398 | +gboolean gst_is_gl_memory_egl (GstMemory * mem); | ||
| 399 | + | ||
| 400 | +EGLImageKHR gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem); | ||
| 401 | +EGLDisplay gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem); | ||
| 402 | + | ||
| 403 | +GstVideoGLTextureOrientation gst_gl_memory_egl_get_orientation | ||
| 404 | + (GstGLMemoryEGL * mem); | ||
| 405 | + | ||
| 406 | +void gst_gl_memory_egl_set_orientation (GstGLMemoryEGL * mem, | ||
| 407 | + GstVideoGLTextureOrientation orientation); | ||
| 408 | + | ||
| 409 | +/** | ||
| 410 | + * GstGLAllocator | ||
| 411 | + * | ||
| 412 | + * Opaque #GstGLAllocator struct | ||
| 413 | + */ | ||
| 414 | +struct _GstGLMemoryEGLAllocator | ||
| 415 | +{ | ||
| 416 | + GstGLMemoryAllocator parent; | ||
| 417 | +}; | ||
| 418 | + | ||
| 419 | +/** | ||
| 420 | + * GstGLAllocatorClass: | ||
| 421 | + * | ||
| 422 | + * The #GstGLAllocatorClass only contains private data | ||
| 423 | + */ | ||
| 424 | +struct _GstGLMemoryEGLAllocatorClass | ||
| 425 | +{ | ||
| 426 | + GstGLMemoryAllocatorClass parent_class; | ||
| 427 | +}; | ||
| 428 | + | ||
| 429 | +G_END_DECLS | ||
| 430 | + | ||
| 431 | +#endif /* _GST_GL_MEMORY_EGL_H_ */ | ||
| 432 | diff --git a/gst-libs/gst/gl/gstgl_fwd.h b/gst-libs/gst/gl/gstgl_fwd.h | ||
| 433 | index fb64ff6..73e17bd 100644 | ||
| 434 | --- a/gst-libs/gst/gl/gstgl_fwd.h | ||
| 435 | +++ b/gst-libs/gst/gl/gstgl_fwd.h | ||
| 436 | @@ -55,6 +55,10 @@ typedef struct _GstGLMemoryPBO GstGLMemoryPBO; | ||
| 437 | typedef struct _GstGLMemoryPBOAllocator GstGLMemoryPBOAllocator; | ||
| 438 | typedef struct _GstGLMemoryPBOAllocatorClass GstGLMemoryPBOAllocatorClass; | ||
| 439 | |||
| 440 | +typedef struct _GstGLMemoryEGL GstGLMemoryEGL; | ||
| 441 | +typedef struct _GstGLMemoryEGLAllocator GstGLMemoryEGLAllocator; | ||
| 442 | +typedef struct _GstGLMemoryEGLAllocatorClass GstGLMemoryEGLAllocatorClass; | ||
| 443 | + | ||
| 444 | typedef struct _GstGLSLStage GstGLSLStage; | ||
| 445 | typedef struct _GstGLSLStagePrivate GstGLSLStagePrivate; | ||
| 446 | typedef struct _GstGLSLStageClass GstGLSLStageClass; | ||
| 447 | diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c | ||
| 448 | index 60dec6a..34770d0 100644 | ||
| 449 | --- a/gst-libs/gst/gl/gstgldisplay.c | ||
| 450 | +++ b/gst-libs/gst/gl/gstgldisplay.c | ||
| 451 | @@ -68,6 +68,7 @@ | ||
| 452 | #if GST_GL_HAVE_PLATFORM_EGL | ||
| 453 | #include <gst/gl/egl/gstgldisplay_egl.h> | ||
| 454 | #include <gst/gl/egl/gsteglimagememory.h> | ||
| 455 | +#include <gst/gl/egl/gstglmemoryegl.h> | ||
| 456 | #endif | ||
| 457 | |||
| 458 | GST_DEBUG_CATEGORY_STATIC (gst_context); | ||
| 459 | @@ -144,6 +145,7 @@ gst_gl_display_init (GstGLDisplay * display) | ||
| 460 | |||
| 461 | #if GST_GL_HAVE_PLATFORM_EGL | ||
| 462 | gst_egl_image_memory_init (); | ||
| 463 | + gst_gl_memory_egl_init_once (); | ||
| 464 | #endif | ||
| 465 | } | ||
| 466 | |||
| 467 | diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c | ||
| 468 | index 16ed5ea..73a9029 100644 | ||
| 469 | --- a/gst-libs/gst/gl/gstglupload.c | ||
| 470 | +++ b/gst-libs/gst/gl/gstglupload.c | ||
| 471 | @@ -29,6 +29,7 @@ | ||
| 472 | |||
| 473 | #if GST_GL_HAVE_PLATFORM_EGL | ||
| 474 | #include "egl/gsteglimagememory.h" | ||
| 475 | +#include "egl/gstglmemoryegl.h" | ||
| 476 | #endif | ||
| 477 | |||
| 478 | #if GST_GL_HAVE_DMABUF | ||
| 479 | @@ -301,6 +302,13 @@ _gl_memory_upload_propose_allocation (gpointer impl, GstQuery * decide_query, | ||
| 480 | context)); | ||
| 481 | gst_query_add_allocation_param (query, allocator, ¶ms); | ||
| 482 | gst_object_unref (allocator); | ||
| 483 | + | ||
| 484 | +#if GST_GL_HAVE_PLATFORM_EGL | ||
| 485 | + allocator = | ||
| 486 | + GST_ALLOCATOR (gst_allocator_find (GST_GL_MEMORY_EGL_ALLOCATOR_NAME)); | ||
| 487 | + gst_query_add_allocation_param (query, allocator, ¶ms); | ||
| 488 | + gst_object_unref (allocator); | ||
| 489 | +#endif | ||
| 490 | } | ||
| 491 | |||
| 492 | n_pools = gst_query_get_n_allocation_pools (query); | ||
| 493 | -- | ||
| 494 | 2.5.0 | ||
| 495 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch index 369ff93ac1..59321f704b 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch | |||
| @@ -23,43 +23,43 @@ Signed-off-by: Andre McCurdy <armccurdy@gmail.com> | |||
| 23 | sys/decklink/gstdecklinkvideosink.cpp | 2 +- | 23 | sys/decklink/gstdecklinkvideosink.cpp | 2 +- |
| 24 | 3 files changed, 7 insertions(+), 7 deletions(-) | 24 | 3 files changed, 7 insertions(+), 7 deletions(-) |
| 25 | 25 | ||
| 26 | diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp | 26 | Index: gst-plugins-bad-1.10.1/sys/decklink/gstdecklink.cpp |
| 27 | index 64637f1..bac956f 100644 | 27 | =================================================================== |
| 28 | --- a/sys/decklink/gstdecklink.cpp | 28 | --- gst-plugins-bad-1.10.1.orig/sys/decklink/gstdecklink.cpp |
| 29 | +++ b/sys/decklink/gstdecklink.cpp | 29 | +++ gst-plugins-bad-1.10.1/sys/decklink/gstdecklink.cpp |
| 30 | @@ -324,22 +324,22 @@ gst_decklink_mode_get_structure (GstDecklinkModeEnum e, BMDPixelFormat f) | 30 | @@ -476,22 +476,22 @@ gst_decklink_mode_get_structure (GstDeck |
| 31 | "height", G_TYPE_INT, mode->height, | ||
| 32 | "pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d, | 31 | "pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d, |
| 33 | "interlace-mode", G_TYPE_STRING, mode->interlaced ? "interleaved" : "progressive", | 32 | "interlace-mode", G_TYPE_STRING, |
| 33 | mode->interlaced ? "interleaved" : "progressive", | ||
| 34 | - "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, NULL); | 34 | - "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, NULL); |
| 35 | + "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, (void *) NULL); | 35 | + "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, (void *)NULL); |
| 36 | 36 | ||
| 37 | switch (f) { | 37 | switch (f) { |
| 38 | case bmdFormat8BitYUV: /* '2vuy' */ | 38 | case bmdFormat8BitYUV: /* '2vuy' */ |
| 39 | gst_structure_set (s, "format", G_TYPE_STRING, "UYVY", | 39 | gst_structure_set (s, "format", G_TYPE_STRING, "UYVY", |
| 40 | "colorimetry", G_TYPE_STRING, mode->colorimetry, | 40 | "colorimetry", G_TYPE_STRING, mode->colorimetry, |
| 41 | - "chroma-site", G_TYPE_STRING, "mpeg2", NULL); | 41 | - "chroma-site", G_TYPE_STRING, "mpeg2", NULL); |
| 42 | + "chroma-site", G_TYPE_STRING, "mpeg2", (void *) NULL); | 42 | + "chroma-site", G_TYPE_STRING, "mpeg2", (void *)NULL); |
| 43 | break; | 43 | break; |
| 44 | case bmdFormat10BitYUV: /* 'v210' */ | 44 | case bmdFormat10BitYUV: /* 'v210' */ |
| 45 | - gst_structure_set (s, "format", G_TYPE_STRING, "v210", NULL); | 45 | - gst_structure_set (s, "format", G_TYPE_STRING, "v210", NULL); |
| 46 | + gst_structure_set (s, "format", G_TYPE_STRING, "v210", (void *) NULL); | 46 | + gst_structure_set (s, "format", G_TYPE_STRING, "v210", (void *)NULL); |
| 47 | break; | 47 | break; |
| 48 | case bmdFormat8BitARGB: /* 'ARGB' */ | 48 | case bmdFormat8BitARGB: /* 'ARGB' */ |
| 49 | - gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", NULL); | 49 | - gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", NULL); |
| 50 | + gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", (void *) NULL); | 50 | + gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", (void *)NULL); |
| 51 | break; | 51 | break; |
| 52 | case bmdFormat8BitBGRA: /* 'BGRA' */ | 52 | case bmdFormat8BitBGRA: /* 'BGRA' */ |
| 53 | - gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", NULL); | 53 | - gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", NULL); |
| 54 | + gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", (void *) NULL); | 54 | + gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", (void *)NULL); |
| 55 | break; | 55 | break; |
| 56 | case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */ | 56 | case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */ |
| 57 | case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */ | 57 | case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */ |
| 58 | diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp | 58 | Index: gst-plugins-bad-1.10.1/sys/decklink/gstdecklinkaudiosrc.cpp |
| 59 | index 9a701ee..26fb7ec 100644 | 59 | =================================================================== |
| 60 | --- a/sys/decklink/gstdecklinkaudiosrc.cpp | 60 | --- gst-plugins-bad-1.10.1.orig/sys/decklink/gstdecklinkaudiosrc.cpp |
| 61 | +++ b/sys/decklink/gstdecklinkaudiosrc.cpp | 61 | +++ gst-plugins-bad-1.10.1/sys/decklink/gstdecklinkaudiosrc.cpp |
| 62 | @@ -312,7 +312,7 @@ gst_decklink_audio_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps) | 62 | @@ -322,7 +322,7 @@ gst_decklink_audio_src_set_caps (GstBase |
| 63 | g_mutex_unlock (&self->input->lock); | 63 | g_mutex_unlock (&self->input->lock); |
| 64 | 64 | ||
| 65 | if (videosrc) { | 65 | if (videosrc) { |
| @@ -68,11 +68,11 @@ index 9a701ee..26fb7ec 100644 | |||
| 68 | gst_object_unref (videosrc); | 68 | gst_object_unref (videosrc); |
| 69 | 69 | ||
| 70 | switch (vconn) { | 70 | switch (vconn) { |
| 71 | diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp | 71 | Index: gst-plugins-bad-1.10.1/sys/decklink/gstdecklinkvideosink.cpp |
| 72 | index eebeff3..da6e486 100644 | 72 | =================================================================== |
| 73 | --- a/sys/decklink/gstdecklinkvideosink.cpp | 73 | --- gst-plugins-bad-1.10.1.orig/sys/decklink/gstdecklinkvideosink.cpp |
| 74 | +++ b/sys/decklink/gstdecklinkvideosink.cpp | 74 | +++ gst-plugins-bad-1.10.1/sys/decklink/gstdecklinkvideosink.cpp |
| 75 | @@ -158,7 +158,7 @@ reset_framerate (GstCapsFeatures * features, GstStructure * structure, | 75 | @@ -163,7 +163,7 @@ reset_framerate (GstCapsFeatures * featu |
| 76 | gpointer user_data) | 76 | gpointer user_data) |
| 77 | { | 77 | { |
| 78 | gst_structure_set (structure, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, | 78 | gst_structure_set (structure, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, |
| @@ -81,6 +81,3 @@ index eebeff3..da6e486 100644 | |||
| 81 | 81 | ||
| 82 | return TRUE; | 82 | return TRUE; |
| 83 | } | 83 | } |
| 84 | -- | ||
| 85 | 1.9.1 | ||
| 86 | |||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.10.1.bb index ae3f04d75b..9cd892edf5 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.10.1.bb | |||
| @@ -12,16 +12,10 @@ SRC_URI = " \ | |||
| 12 | file://avoid-including-sys-poll.h-directly.patch \ | 12 | file://avoid-including-sys-poll.h-directly.patch \ |
| 13 | file://ensure-valid-sentinels-for-gst_structure_get-etc.patch \ | 13 | file://ensure-valid-sentinels-for-gst_structure_get-etc.patch \ |
| 14 | file://0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch \ | 14 | file://0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch \ |
| 15 | file://0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch \ | ||
| 16 | file://0003-glcolorconvert-implement-multiple-render-targets-for.patch \ | ||
| 17 | file://0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch \ | ||
| 18 | file://0005-glshader-add-glBindFragDataLocation.patch \ | ||
| 19 | file://0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch \ | ||
| 20 | file://0008-gl-implement-GstGLMemoryEGL.patch \ | ||
| 21 | file://0009-glimagesink-Downrank-to-marginal.patch \ | 15 | file://0009-glimagesink-Downrank-to-marginal.patch \ |
| 22 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ | 16 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ |
| 23 | " | 17 | " |
| 24 | SRC_URI[md5sum] = "955281a43e98c5464563fa049e0a0911" | 18 | SRC_URI[md5sum] = "491d2d5aab55ffc60c66e714d3d664ea" |
| 25 | SRC_URI[sha256sum] = "7899fcb18e6a1af2888b19c90213af018a57d741c6e72ec56b133bc73ec8509b" | 19 | SRC_URI[sha256sum] = "133e0ed9fe21011b15d3898e3d3a9d17ab74eed31996da2e353353e688ca921d" |
| 26 | 20 | ||
| 27 | S = "${WORKDIR}/gst-plugins-bad-${PV}" | 21 | S = "${WORKDIR}/gst-plugins-bad-${PV}" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.10.1.bb index 84cbc04823..82e5a84817 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.10.1.bb | |||
| @@ -13,8 +13,7 @@ SRC_URI = " \ | |||
| 13 | file://make-gio_unix_2_0-dependency-configurable.patch \ | 13 | file://make-gio_unix_2_0-dependency-configurable.patch \ |
| 14 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ | 14 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ |
| 15 | " | 15 | " |
| 16 | 16 | SRC_URI[md5sum] = "eb03953ff239b53a7d69a604edbe5c8c" | |
| 17 | SRC_URI[md5sum] = "4d03dd81828ea6b98a44c8f1ab7f4976" | 17 | SRC_URI[sha256sum] = "66cfee294c7aaf9d7867eaba4841ca6254ea74f1a8b53e1289f4d3b9b6c976c9" |
| 18 | SRC_URI[sha256sum] = "114871d4d63606b4af424a8433cd923e4ff66896b244bb7ac97b9da47f71e79e" | ||
| 19 | 18 | ||
| 20 | S = "${WORKDIR}/gst-plugins-base-${PV}" | 19 | S = "${WORKDIR}/gst-plugins-base-${PV}" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.10.1.bb index 840df15146..44703dc7e6 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.10.1.bb | |||
| @@ -11,8 +11,7 @@ SRC_URI = " \ | |||
| 11 | file://ensure-valid-sentinel-for-gst_structure_get.patch \ | 11 | file://ensure-valid-sentinel-for-gst_structure_get.patch \ |
| 12 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ | 12 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ |
| 13 | " | 13 | " |
| 14 | 14 | SRC_URI[md5sum] = "7d24b1412d49fa7bab763b35f4640abd" | |
| 15 | SRC_URI[md5sum] = "473ebb1f15c67de99ddb6e4d027c0876" | 15 | SRC_URI[sha256sum] = "a7642ea7e7c17fb67e94d0c17e56757b6577fa7ed244ff8c11031841d3556cc2" |
| 16 | SRC_URI[sha256sum] = "a1d6579ba203a7734927c24b90bf6590d846c5a5fcec01a48201018c8ad2827a" | ||
| 17 | 16 | ||
| 18 | S = "${WORKDIR}/gst-plugins-good-${PV}" | 17 | S = "${WORKDIR}/gst-plugins-good-${PV}" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.10.1.bb index 4a9a437b9d..16264301a0 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.10.1.bb | |||
| @@ -7,8 +7,7 @@ SRC_URI = " \ | |||
| 7 | http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-${PV}.tar.xz \ | 7 | http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-${PV}.tar.xz \ |
| 8 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ | 8 | file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ |
| 9 | " | 9 | " |
| 10 | 10 | SRC_URI[md5sum] = "646ab511bc8e56425e63d3fc4812e582" | |
| 11 | SRC_URI[md5sum] = "4fc66c77253b0ad5ce224bda654b2e7d" | 11 | SRC_URI[sha256sum] = "a5ecd59fc2091eeb52368de81cc6a91c1a1c19dc5bdde85ce90e1eed5d4183c2" |
| 12 | SRC_URI[sha256sum] = "6fa2599fdd072d31fbaf50c34af406e2be944a010b1f4eab67a5fe32a0310693" | ||
| 13 | 12 | ||
| 14 | S = "${WORKDIR}/gst-plugins-ugly-${PV}" | 13 | S = "${WORKDIR}/gst-plugins-ugly-${PV}" |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.1.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.1.bb new file mode 100644 index 0000000000..7b6e4cb508 --- /dev/null +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.1.bb | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | include gstreamer1.0-rtsp-server.inc | ||
| 2 | |||
| 3 | LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d" | ||
| 4 | |||
| 5 | SRC_URI[md5sum] = "ae93aa9e5d89a53636a8c0217d8d8c30" | ||
| 6 | SRC_URI[sha256sum] = "ddc0c2699598623c2d19d3a2856fb73365496a949783537b238f44bc51e5b005" | ||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb deleted file mode 100644 index 17059d0703..0000000000 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | include gstreamer1.0-rtsp-server.inc | ||
| 2 | |||
| 3 | LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d" | ||
| 4 | |||
| 5 | SRC_URI[md5sum] = "e4b07b10dd65b6c26c9ca5f72e59297b" | ||
| 6 | SRC_URI[sha256sum] = "010f06800c1c957851d1352e5ec7a8ba3ce6a857fec1b8afc7d1a9e5f53288bf" | ||
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc index cb0bd82f23..86c6f66a2f 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc | |||
| @@ -24,7 +24,6 @@ PACKAGECONFIG[debug] = "--enable-debug,--disable-debug" | |||
| 24 | PACKAGECONFIG[tests] = "--enable-tests,--disable-tests" | 24 | PACKAGECONFIG[tests] = "--enable-tests,--disable-tests" |
| 25 | PACKAGECONFIG[valgrind] = "--enable-valgrind,--disable-valgrind,valgrind," | 25 | PACKAGECONFIG[valgrind] = "--enable-valgrind,--disable-valgrind,valgrind," |
| 26 | PACKAGECONFIG[gst-tracer-hooks] = "--enable-gst-tracer-hooks,--disable-gst-tracer-hooks," | 26 | PACKAGECONFIG[gst-tracer-hooks] = "--enable-gst-tracer-hooks,--disable-gst-tracer-hooks," |
| 27 | PACKAGECONFIG[trace-historic] = "--enable-trace,--disable-trace," | ||
| 28 | 27 | ||
| 29 | EXTRA_OECONF = " \ | 28 | EXTRA_OECONF = " \ |
| 30 | --disable-dependency-tracking \ | 29 | --disable-dependency-tracking \ |
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.8.3.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.10.1.bb index d3561ebbde..428a01203b 100644 --- a/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.8.3.bb +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.10.1.bb | |||
| @@ -6,8 +6,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d \ | |||
| 6 | SRC_URI = " \ | 6 | SRC_URI = " \ |
| 7 | http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ | 7 | http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ |
| 8 | " | 8 | " |
| 9 | 9 | SRC_URI[md5sum] = "2c0cc6907aed5ea8005a8f332e34d92f" | |
| 10 | SRC_URI[md5sum] = "e88dad542df9d986822e982105d2b530" | 10 | SRC_URI[sha256sum] = "f68df996e0e699382b935bb4783dd402c301377df18f57e28e0318c4b3bff6da" |
| 11 | SRC_URI[sha256sum] = "66b37762d4fdcd63bce5a2bec57e055f92420e95037361609900278c0db7c53f" | ||
| 12 | 11 | ||
| 13 | S = "${WORKDIR}/gstreamer-${PV}" | 12 | S = "${WORKDIR}/gstreamer-${PV}" |
