package/tvheadend: add option to en-/disable transcoding support
PATCH 1/4 package/tvheadend: add option to en-/disable transcoding support
https://github.com/tvheadend/tvheadend/commit/014bb9505e1d7eb6e37e10931dd89ab3b1a0dc01
extended the already present transcoding support and included vaapi- accelerated transcoding.
In order to support these new options and their numerous dependencies we add a new Kconfig option for transcoding support to allow users to disable transcoding support, because they use tvheadend for recording or by its internal hts protocol, for example with the kodi-pvr-hts addon.
--- package/tvheadend/Config.in | 18 ++++++++++++++---- package/tvheadend/tvheadend.mk | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-)
package/tvheadend/Config.in +14 -4
@@ -10,10 +10,6 @@ config BR2_PACKAGE_TVHEADEND depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_2 depends on BR2_TOOLCHAIN_HAS_SYNC_4 select BR2_PACKAGE_DTV_SCAN_TABLES - select BR2_PACKAGE_FFMPEG_AVRESAMPLE if BR2_PACKAGE_FFMPEG - select BR2_PACKAGE_FFMPEG_SWSCALE if BR2_PACKAGE_FFMPEG - select BR2_PACKAGE_LIBVPX if BR2_PACKAGE_FFMPEG && !BR2_bfin # libvpx - select BR2_PACKAGE_X264 if BR2_PACKAGE_FFMPEG select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE select BR2_PACKAGE_OPENSSL help
@@ -28,3 +24,17 @@ config BR2_PACKAGE_TVHEADEND is available on port 9981. - if you want Avahi support, you'll need to enable: Avahi, D-Bus, libdaemon + +if BR2_PACKAGE_TVHEADEND + +config BR2_PACKAGE_TVHEADEND_TRANSCODING + bool "transcoding support" + select BR2_PACKAGE_FFMPEG + select BR2_PACKAGE_FFMPEG_AVRESAMPLE + select BR2_PACKAGE_FFMPEG_SWSCALE + select BR2_PACKAGE_LIBVPX if !BR2_bfin # libvpx + select BR2_PACKAGE_X264 + help + Enable transcoding support. + +endif
package/tvheadend/tvheadend.mk +1 -1
@@ -26,7 +26,7 @@ else TVHEADEND_CONF_OPTS += --disable-dbus-1 endif -ifeq ($(BR2_PACKAGE_FFMPEG),y) +ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) TVHEADEND_DEPENDENCIES += ffmpeg TVHEADEND_CONF_OPTS += --enable-libav else
Signature · 1 line
2.11.0
PATCH 2/4 package/tvheadend: bump version, add optional dependencies to opus & x265
This bump
https://github.com/tvheadend/tvheadend/compare/54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732...303f418e1ac2bb3078f7a974b69f04ab6a56c636
updated the transcoding support already present:
https://github.com/tvheadend/tvheadend/commit/014bb9505e1d7eb6e37e10931dd89ab3b1a0dc01
To avoid these build errors
src/transcoding/codec/codecs/libs/libx26x.c:105:18: fatal error: x264.h: No such file or directory
#include <x264.h>
src/transcoding/codec/codecs/libs/libx26x.c:213:18: fatal error: x265.h: No such file or directory
#include <x265.h>
src/transcoding/codec/codecs/libs/libopus.c:23:31: fatal error: opus/opus_defines.h: No such file or directory
#include <opus/opus_defines.h>
we need to add dependency handling already with this patch and keep the hard dependency x264 as minimum codec for transcoding but we now need to enable BR2_PACKAGE_FFMPEG_GPL to enable x264-support also in ffmpeg.
--- package/tvheadend/Config.in | 1 + package/tvheadend/tvheadend.hash | 2 +- package/tvheadend/tvheadend.mk | 24 ++++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-)
package/tvheadend/Config.in +1 -0
@@ -31,6 +31,7 @@ config BR2_PACKAGE_TVHEADEND_TRANSCODING bool "transcoding support" select BR2_PACKAGE_FFMPEG select BR2_PACKAGE_FFMPEG_AVRESAMPLE + select BR2_PACKAGE_FFMPEG_GPL # needed for x264 support select BR2_PACKAGE_FFMPEG_SWSCALE select BR2_PACKAGE_LIBVPX if !BR2_bfin # libvpx select BR2_PACKAGE_X264
package/tvheadend/tvheadend.hash +1 -1
@@ -1,2 +1,2 @@ # Locally computed -sha256 1994e379c798b118243e70f7fa38064a9b288d6e38b9ced0e8ad465f5d2e8fd9 tvheadend-54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732.tar.gz +sha256 00f67fbf9d8cfea7da90f469b36a8205fb9a38727c4cc5022f4ee5fd322459d3 tvheadend-303f418e1ac2bb3078f7a974b69f04ab6a56c636.tar.gz
package/tvheadend/tvheadend.mk +20 -4
@@ -4,7 +4,7 @@ # ################################################################################ -TVHEADEND_VERSION = 54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732 +TVHEADEND_VERSION = 303f418e1ac2bb3078f7a974b69f04ab6a56c636 TVHEADEND_SITE = $(call github,tvheadend,tvheadend,$(TVHEADEND_VERSION)) TVHEADEND_LICENSE = GPL-3.0+ TVHEADEND_LICENSE_FILES = LICENSE.md
@@ -27,10 +27,26 @@ TVHEADEND_CONF_OPTS += --disable-dbus-1 endif ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) -TVHEADEND_DEPENDENCIES += ffmpeg -TVHEADEND_CONF_OPTS += --enable-libav +TVHEADEND_CONF_OPTS += --enable-libav --enable-libx264 +TVHEADEND_DEPENDENCIES += ffmpeg x264 +ifeq ($(BR2_PACKAGE_OPUS),y) +TVHEADEND_CONF_OPTS += --enable-libopus +TVHEADEND_DEPENDENCIES += opus else -TVHEADEND_CONF_OPTS += --disable-libav +TVHEADEND_CONF_OPTS += --disable-libopus +endif +ifeq ($(BR2_PACKAGE_X265),y) +TVHEADEND_CONF_OPTS += --enable-libx265 +TVHEADEND_DEPENDENCIES += x265 +else +TVHEADEND_CONF_OPTS += --disable-libx265 +endif +else +TVHEADEND_CONF_OPTS += \ + --disable-libav \ + --disable-libopus \ + --disable-libx264 \ + --disable-libx265 endif ifeq ($(BR2_PACKAGE_LIBDVBCSA),y)
Signature · 1 line
2.11.0
PATCH 2/4 package/tvheadend: bump version, add optional dependencies to opus & x265
Bernd, All,
On 2017-09-06 22:49 +0200, Bernd Kuhls spake thusly:
Quoted 32 lines
This bump
https://github.com/tvheadend/tvheadend/compare/54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732...303f418e1ac2bb3078f7a974b69f04ab6a56c636
updated the transcoding support already present:
https://github.com/tvheadend/tvheadend/commit/014bb9505e1d7eb6e37e10931dd89ab3b1a0dc01To avoid these build errors
src/transcoding/codec/codecs/libs/libx26x.c:105:18: fatal error:x264.h: No such file or directory
#include <x264.h>
src/transcoding/codec/codecs/libs/libx26x.c:213:18: fatal error:x265.h: No such file or directory
#include <x265.h>
src/transcoding/codec/codecs/libs/libopus.c:23:31: fatal error:opus/opus_defines.h: No such file or directory
#include <opus/opus_defines.h>we need to add dependency handling already with this patch and keep the hard dependency x264 as minimum codec for transcoding but we now need to enable
BR2_PACKAGE_FFMPEG_GPLto enable x264-support also in ffmpeg.Signed-off-by Bernd Kuhls <[email protected]>--- package/tvheadend/Config.in | 1 + package/tvheadend/tvheadend.hash | 2 +- package/tvheadend/tvheadend.mk | 24 ++++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-)package/tvheadend/Config.in +0
-0
package/tvheadend/Config.in config BR2_PACKAGE_TVHEADEND_TRANSCODING · line 34
Quoted 4 lines
package/tvheadend/Config.in +1
-0@@ -31,6 +31,7 @@ config BR2_PACKAGE_TVHEADEND_TRANSCODING bool "transcoding support" select BR2_PACKAGE_FFMPEG select BR2_PACKAGE_FFMPEG_AVRESAMPLE + select BR2_PACKAGE_FFMPEG_GPL # needed for x264 support
NAK. If we have an option to enable/disable GPL-licensed codecs, it is to leave the option to the user to enable/disable them.
We do not want to automatically force that option. Such an option must only be available as a user-selected option.
However, we've started to remove similar options, like the recently dropped Qt license.
Instead, I would try to simply remove that option altogether. Instead, add the GPL license to the license list in the .mk, when such-licensed codecs are enabled.
After all, ffmpeg is not the only package whose licening terms change depending on the set of options enabled for that package.
Regards,
Yann E. MORIN.
Quoted 61 lines
package/tvheadend/Config.in +0
-0select BR2_PACKAGE_FFMPEG_SWSCALE select BR2_PACKAGE_LIBVPX if !BR2_bfin # libvpx select BR2_PACKAGE_X264package/tvheadend/tvheadend.hash +1
-1@@ -1,2 +1,2 @@ # Locally computed -sha256 1994e379c798b118243e70f7fa38064a9b288d6e38b9ced0e8ad465f5d2e8fd9 tvheadend-54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732.tar.gz +sha256 00f67fbf9d8cfea7da90f469b36a8205fb9a38727c4cc5022f4ee5fd322459d3 tvheadend-303f418e1ac2bb3078f7a974b69f04ab6a56c636.tar.gzpackage/tvheadend/tvheadend.mk +20
-4@@ -4,7 +4,7 @@ # ################################################################################ -TVHEADEND_VERSION = 54e63e3f9af8fdc0d23f61f3cda7fa7b246c1732 +TVHEADEND_VERSION = 303f418e1ac2bb3078f7a974b69f04ab6a56c636 TVHEADEND_SITE = $(call github,tvheadend,tvheadend,$(TVHEADEND_VERSION)) TVHEADEND_LICENSE = GPL-3.0+ TVHEADEND_LICENSE_FILES = LICENSE.md@@ -27,10 +27,26 @@ TVHEADEND_CONF_OPTS += --disable-dbus-1 endif ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) -TVHEADEND_DEPENDENCIES += ffmpeg -TVHEADEND_CONF_OPTS += --enable-libav +TVHEADEND_CONF_OPTS += --enable-libav --enable-libx264 +TVHEADEND_DEPENDENCIES += ffmpeg x264 +ifeq ($(BR2_PACKAGE_OPUS),y) +TVHEADEND_CONF_OPTS += --enable-libopus +TVHEADEND_DEPENDENCIES += opus else -TVHEADEND_CONF_OPTS += --disable-libav +TVHEADEND_CONF_OPTS += --disable-libopus +endif +ifeq ($(BR2_PACKAGE_X265),y) +TVHEADEND_CONF_OPTS += --enable-libx265 +TVHEADEND_DEPENDENCIES += x265 +else +TVHEADEND_CONF_OPTS += --disable-libx265 +endif +else +TVHEADEND_CONF_OPTS += \ + --disable-libav \ + --disable-libopus \ + --disable-libx264 \ + --disable-libx265 endif ifeq ($(BR2_PACKAGE_LIBDVBCSA),y)Signature · 6 lines
2.11.0 _______________________________________________ buildroot mailing list buildroot at busybox.net http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 2/4 package/tvheadend: bump version, add optional dependencies to opus & x265
Quoted 3 lines · Yann E. MORIN
Bernd, All,
On 2017-09-06 22:49 +0200, Bernd Kuhls spake thusly:
[snip]
Quoted 11 lines
package/tvheadend/Config.in config BR2_PACKAGE_TVHEADEND_TRANSCODING · line 34
Quoted 5 lines
package/tvheadend/Config.in +1
-0@@ -31,6 +31,7 @@ config BR2_PACKAGE_TVHEADEND_TRANSCODING bool "transcoding support" select BR2_PACKAGE_FFMPEG select BR2_PACKAGE_FFMPEG_AVRESAMPLE + select BR2_PACKAGE_FFMPEG_GPL # needed for x264 supportNAK. If we have an option to enable/disable GPL-licensed codecs, it is to leave the option to the user to enable/disable them.
We do not want to automatically force that option. Such an option must only be available as a user-selected option.
The situation is quite different here. The option BR2_PACKAGE_FFMPEG_GPL exists
because we don't have suboptions for every possible codec in ffmpeg, and because ffmpeg's configure script has a corresponding option.
However, in this case the user has an explicit optionBR2_PACKAGE_TVHEADEND_TRANSCODING that controls whether or not the GPL codecs of ffmpeg are included. To top things off, tvheadend already is GPL-3.0+, so the point is kind of moot.
Therefore, I've applied the entire series to master.
Quoted 9 lines
However, we've started to remove similar options, like the recently dropped Qt license.
Instead, I would try to simply remove that option altogether. Instead, add the GPL license to the license list in the .mk, when such-licensed codecs are enabled.
After all, ffmpeg is not the only package whose licening terms change depending on the set of options enabled for that package.
Since we don't have individual options for every ffmpeg codec, such an approach
wouldn't be possible. In addition, since ffmpeg configure has the --enable-gpl and --enable-nonfree options, I think it makes sense to keep them.
Regards,
Arnout
[snip]
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
PATCH 3/4 package/tvheadend: add optional support for libva-accelerated transcoding
In reply to Bernd Kuhls--- package/tvheadend/tvheadend.mk | 7 +++++++ 1 file changed, 7 insertions(+)
package/tvheadend/tvheadend.mk +7 -0
@@ -29,6 +29,12 @@ endif ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) TVHEADEND_CONF_OPTS += --enable-libav --enable-libx264 TVHEADEND_DEPENDENCIES += ffmpeg x264 +ifeq ($(BR2_PACKAGE_LIBVA)$(BR2_PACKAGE_XORG7),yy) +TVHEADEND_CONF_OPTS += --enable-vaapi +TVHEADEND_DEPENDENCIES += libva +else +TVHEADEND_CONF_OPTS += --disable-vaapi +endif ifeq ($(BR2_PACKAGE_OPUS),y) TVHEADEND_CONF_OPTS += --enable-libopus TVHEADEND_DEPENDENCIES += opus
@@ -45,6 +51,7 @@ else TVHEADEND_CONF_OPTS += \ --disable-libav \ --disable-libopus \ + --disable-vaapi \ --disable-libx264 \ --disable-libx265 endif
Signature · 1 line
2.11.0
PATCH 3/4 package/tvheadend: add optional support for libva-accelerated transcoding
Bernd, All,
On 2017-09-06 22:49 +0200, Bernd Kuhls spake thusly:
Quoted 1 line
Signed-off-by Bernd Kuhls <[email protected]>
Regards,
Yann E. MORIN.
Quoted 36 lines
--- package/tvheadend/tvheadend.mk | 7 +++++++ 1 file changed, 7 insertions(+)package/tvheadend/tvheadend.mk +7
-0@@ -29,6 +29,12 @@ endif ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) TVHEADEND_CONF_OPTS += --enable-libav --enable-libx264 TVHEADEND_DEPENDENCIES += ffmpeg x264 +ifeq ($(BR2_PACKAGE_LIBVA)$(BR2_PACKAGE_XORG7),yy) +TVHEADEND_CONF_OPTS += --enable-vaapi +TVHEADEND_DEPENDENCIES += libva +else +TVHEADEND_CONF_OPTS += --disable-vaapi +endif ifeq ($(BR2_PACKAGE_OPUS),y) TVHEADEND_CONF_OPTS += --enable-libopus TVHEADEND_DEPENDENCIES += opus@@ -45,6 +51,7 @@ else TVHEADEND_CONF_OPTS += \ --disable-libav \ --disable-libopus \ + --disable-vaapi \ --disable-libx264 \ --disable-libx265 endifSignature · 6 lines
2.11.0 _______________________________________________ buildroot mailing list buildroot at busybox.net http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 4/4 package/tvheadend: add optional support for rpi-userland
In reply to Bernd Kuhls--- package/tvheadend/tvheadend.mk | 7 +++++++ 1 file changed, 7 insertions(+)
package/tvheadend/tvheadend.mk +7 -0
@@ -41,6 +41,12 @@ TVHEADEND_DEPENDENCIES += opus else TVHEADEND_CONF_OPTS += --disable-libopus endif +ifeq ($(BR2_PACKAGE_RPI_USERLAND),y) +TVHEADEND_CONF_OPTS += --enable-omx +TVHEADEND_DEPENDENCIES += rpi-userland +else +TVHEADEND_CONF_OPTS += --disable-omx +endif ifeq ($(BR2_PACKAGE_X265),y) TVHEADEND_CONF_OPTS += --enable-libx265 TVHEADEND_DEPENDENCIES += x265
@@ -51,6 +57,7 @@ else TVHEADEND_CONF_OPTS += \ --disable-libav \ --disable-libopus \ + --disable-omx \ --disable-vaapi \ --disable-libx264 \ --disable-libx265
Signature · 1 line
2.11.0
PATCH 4/4 package/tvheadend: add optional support for rpi-userland
Bernd, All,
On 2017-09-06 22:49 +0200, Bernd Kuhls spake thusly:
Quoted 1 line
Signed-off-by Bernd Kuhls <[email protected]>
Regards,
Yann E. MORIN.
Quoted 32 lines
--- package/tvheadend/tvheadend.mk | 7 +++++++ 1 file changed, 7 insertions(+)package/tvheadend/tvheadend.mk +7
-0@@ -41,6 +41,12 @@ TVHEADEND_DEPENDENCIES += opus else TVHEADEND_CONF_OPTS += --disable-libopus endif +ifeq ($(BR2_PACKAGE_RPI_USERLAND),y) +TVHEADEND_CONF_OPTS += --enable-omx +TVHEADEND_DEPENDENCIES += rpi-userland +else +TVHEADEND_CONF_OPTS += --disable-omx +endif ifeq ($(BR2_PACKAGE_X265),y) TVHEADEND_CONF_OPTS += --enable-libx265 TVHEADEND_DEPENDENCIES += x265@@ -51,6 +57,7 @@ else TVHEADEND_CONF_OPTS += \ --disable-libav \ --disable-libopus \ + --disable-omx \ --disable-vaapi \ --disable-libx264 \ --disable-libx265Signature · 1 line
2.11.0
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 1/4 package/tvheadend: add option to en-/disable transcoding support
In reply to Bernd KuhlsBernd, All,
On 2017-09-06 22:49 +0200, Bernd Kuhls spake thusly:
Quoted 11 lines
https://github.com/tvheadend/tvheadend/commit/014bb9505e1d7eb6e37e10931dd89ab3b1a0dc01
extended the already present transcoding support and included vaapi- accelerated transcoding.In order to support these new options and their numerous dependencies we add a new
Kconfigoption for transcoding support to allow users to disable transcoding support, because they use tvheadend for recording or by its internal hts protocol, for example with the kodi-pvr-hts addon.Signed-off-by Bernd Kuhls <[email protected]>
Regards,
Yann E. MORIN.
Quoted 54 lines
--- package/tvheadend/Config.in | 18 ++++++++++++++---- package/tvheadend/tvheadend.mk | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-)package/tvheadend/Config.in +14
-4@@ -10,10 +10,6 @@ config BR2_PACKAGE_TVHEADEND depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_2 depends on BR2_TOOLCHAIN_HAS_SYNC_4 select BR2_PACKAGE_DTV_SCAN_TABLES - select BR2_PACKAGE_FFMPEG_AVRESAMPLE if BR2_PACKAGE_FFMPEG - select BR2_PACKAGE_FFMPEG_SWSCALE if BR2_PACKAGE_FFMPEG - select BR2_PACKAGE_LIBVPX if BR2_PACKAGE_FFMPEG && !BR2_bfin # libvpx - select BR2_PACKAGE_X264 if BR2_PACKAGE_FFMPEG select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE select BR2_PACKAGE_OPENSSL help@@ -28,3 +24,17 @@ config BR2_PACKAGE_TVHEADEND is available on port 9981. - if you want Avahi support, you'll need to enable: Avahi, D-Bus, libdaemon + +if BR2_PACKAGE_TVHEADEND + +config BR2_PACKAGE_TVHEADEND_TRANSCODING + bool "transcoding support" + select BR2_PACKAGE_FFMPEG + select BR2_PACKAGE_FFMPEG_AVRESAMPLE + select BR2_PACKAGE_FFMPEG_SWSCALE + select BR2_PACKAGE_LIBVPX if !BR2_bfin # libvpx + select BR2_PACKAGE_X264 + help + Enable transcoding support. + +endifpackage/tvheadend/tvheadend.mk +1
-1@@ -26,7 +26,7 @@ else TVHEADEND_CONF_OPTS += --disable-dbus-1 endif -ifeq ($(BR2_PACKAGE_FFMPEG),y) +ifeq ($(BR2_PACKAGE_TVHEADEND_TRANSCODING),y) TVHEADEND_DEPENDENCIES += ffmpeg TVHEADEND_CONF_OPTS += --enable-libav elseSignature · 1 line
2.11.0
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'