diff --git a/extra/gstreamer/PKGBUILD b/extra/gstreamer/PKGBUILD
index c374b1fc9..3796ed1e9 100644
--- a/extra/gstreamer/PKGBUILD
+++ b/extra/gstreamer/PKGBUILD
@@ -30,7 +30,7 @@ pkgname=(
   gstreamer-docs
 )
 pkgver=1.20.5
-pkgrel=3
+pkgrel=4
 pkgdesc="Multimedia graph framework"
 url="https://gstreamer.freedesktop.org/"
 arch=(x86_64)
@@ -82,13 +82,15 @@ source=(
   0001-meson-Add-a-new-option-to-control-the-source-for-orc.patch
   0002-HACK-meson-Disable-broken-tests.patch
   0003-HACK-meson-Work-around-broken-detection-of-underscor.patch
+  zxing-2.patch
 )
 sha256sums=('SKIP'
             'b3177d9320e2a1d872b85adf1a29cd4fad995adb4a41a478372419bdd8c87a95'
             'SKIP'
             'c2b2fb2ebbb36527f5a43178597367485d95fe58268be043f8a9ebe962147bd9'
             '2b44fe7562d876d41878c9b513f9d36fbac43fa1c42db3ad2df309ced644de87'
-            '79d3038a0ba0c3958ffa8b5aec8431336b372906c07c0c878c3767bec0acb46f')
+            '79d3038a0ba0c3958ffa8b5aec8431336b372906c07c0c878c3767bec0acb46f'
+            'ab9407d58042c19f8d6f9a58bfd0e009d3fc0d61c6178fe52ff272aed18fdbb5')
 validpgpkeys=(D637032E45B8C6585B9456565D2EEE6F6F349D7C) # Tim Müller <tim@gstreamer-foundation.org>
 
 pkgver() {
@@ -111,6 +113,10 @@ prepare() {
 
   # Fix build with opencv 4.7
   git cherry-pick -n 8d5ac30955cf052a12ef8c87c0cae6d124d4d7b6
+
+  # Fix build with zxing-cpp 2.0
+  git cherry-pick -n 7cfc3130a7906c199861d2ef331a07d749a4b769
+  patch -p1 -i ../zxing-2.patch
 }
 
 build() {
diff --git a/extra/gstreamer/zxing-2.patch b/extra/gstreamer/zxing-2.patch
new file mode 100644
index 000000000..fa879ff43
--- /dev/null
+++ b/extra/gstreamer/zxing-2.patch
@@ -0,0 +1,48 @@
+From cb168ab9441b3748f13aa846817e8d1b996d6bee Mon Sep 17 00:00:00 2001
+From: Antonio Rojas <arojas@archlinux.org>
+Date: Sat, 7 Jan 2023 16:18:03 +0100
+Subject: [PATCH] Support zxing-c++ 2.0
+
+format is a C++ string in 2.0
+---
+ subprojects/gst-plugins-bad/ext/zxing/gstzxing.cpp | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/subprojects/gst-plugins-bad/ext/zxing/gstzxing.cpp b/subprojects/gst-plugins-bad/ext/zxing/gstzxing.cpp
+index 7836dbbcf18..a8a0f7b49aa 100644
+--- a/subprojects/gst-plugins-bad/ext/zxing/gstzxing.cpp
++++ b/subprojects/gst-plugins-bad/ext/zxing/gstzxing.cpp
+@@ -62,6 +62,7 @@
+ 
+ #include "ReadBarcode.h"
+ #include "TextUtfEncoding.h"
++#include "ZXVersion.h"
+ 
+ using namespace ZXing;
+ 
+@@ -369,7 +370,11 @@ gst_zxing_transform_frame_ip (GstVideoFilter * vfilter, GstVideoFrame * frame)
+   if (result.isValid ()) {
+     GST_DEBUG_OBJECT (zxing, "Symbol found. Text: %s Format: %s",
+         result.text ().c_str (),
++#if ZXING_VERSION_MAJOR >= 2
++        ToString (result.format ()).c_str ());
++#else
+         ToString (result.format ()));
++#endif
+   } else {
+     goto out;
+   }
+@@ -394,7 +399,11 @@ gst_zxing_transform_frame_ip (GstVideoFilter * vfilter, GstVideoFrame * frame)
+         "timestamp", G_TYPE_UINT64, timestamp,
+         "stream-time", G_TYPE_UINT64, stream_time,
+         "running-time", G_TYPE_UINT64, running_time,
++#if ZXING_VERSION_MAJOR >= 2
++        "type", G_TYPE_STRING, ToString (result.format ()).c_str (),
++#else
+         "type", G_TYPE_STRING, ToString (result.format ()),
++#endif
+         "symbol", G_TYPE_STRING,
+         result.text ().c_str (), NULL);
+ 
+-- 
+GitLab