From 267f056e4940358a63557b97fa724b330dd7f58b Mon Sep 17 00:00:00 2001 From: Joo Aun Saw Date: Thu, 15 Jun 2017 15:51:01 +1000 Subject: [PATCH] Enable hwaccel h264 encoding on raspberry pi Enable hardware accelerated H264 and MPEG4 video encoding on raspberry pi via libopenmax. --- board/raspberrypi/overlay/opt/vc/lib | 1 + board/raspberrypi2/overlay/opt/vc/lib | 1 + board/raspberrypi3/overlay/opt/vc/lib | 1 + configs/raspberrypi_defconfig | 1 + package/ffmpeg/Config.in | 6 +++++ package/ffmpeg/ffmpeg.mk | 5 ++++ package/motion/0003-prefer-omx-encoders.patch | 19 ++++++++++++++ .../motion/0004-h264-best-crf-quality.patch | 25 +++++++++++++++++++ 8 files changed, 59 insertions(+) create mode 120000 board/raspberrypi/overlay/opt/vc/lib create mode 120000 board/raspberrypi2/overlay/opt/vc/lib create mode 120000 board/raspberrypi3/overlay/opt/vc/lib create mode 100644 package/motion/0003-prefer-omx-encoders.patch create mode 100644 package/motion/0004-h264-best-crf-quality.patch diff --git a/board/raspberrypi/overlay/opt/vc/lib b/board/raspberrypi/overlay/opt/vc/lib new file mode 120000 index 0000000000..2e9ebb527e --- /dev/null +++ b/board/raspberrypi/overlay/opt/vc/lib @@ -0,0 +1 @@ +../../usr/lib \ No newline at end of file diff --git a/board/raspberrypi2/overlay/opt/vc/lib b/board/raspberrypi2/overlay/opt/vc/lib new file mode 120000 index 0000000000..2e9ebb527e --- /dev/null +++ b/board/raspberrypi2/overlay/opt/vc/lib @@ -0,0 +1 @@ +../../usr/lib \ No newline at end of file diff --git a/board/raspberrypi3/overlay/opt/vc/lib b/board/raspberrypi3/overlay/opt/vc/lib new file mode 120000 index 0000000000..2e9ebb527e --- /dev/null +++ b/board/raspberrypi3/overlay/opt/vc/lib @@ -0,0 +1 @@ +../../usr/lib \ No newline at end of file diff --git a/configs/raspberrypi_defconfig b/configs/raspberrypi_defconfig index bbf9509333..7d17de0d7a 100644 --- a/configs/raspberrypi_defconfig +++ b/configs/raspberrypi_defconfig @@ -29,6 +29,7 @@ BR2_PACKAGE_FFMPEG=y BR2_PACKAGE_FFMPEG_GPL=y BR2_PACKAGE_FFMPEG_NONFREE=y BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_FFMPEG_RPI_HW_CODECS=y BR2_PACKAGE_LIBWEBCAM=y BR2_PACKAGE_MOTION=y BR2_PACKAGE_STREAMEYE=y diff --git a/package/ffmpeg/Config.in b/package/ffmpeg/Config.in index b5850db722..187432d49a 100644 --- a/package/ffmpeg/Config.in +++ b/package/ffmpeg/Config.in @@ -167,6 +167,12 @@ config BR2_PACKAGE_FFMPEG_OUTDEVS bool "Enable output devices" default y +config BR2_PACKAGE_FFMPEG_RPI_HW_CODECS + bool "Enable rpi hardware accelerated codecs" + depends on BR2_PACKAGE_RPI_USERLAND + help + Enable HW accelerated codecs on Raspberry pi. + config BR2_PACKAGE_FFMPEG_EXTRACONF string "Additional parameters for ./configure" default "" diff --git a/package/ffmpeg/ffmpeg.mk b/package/ffmpeg/ffmpeg.mk index 6540d41c52..d9c140d965 100644 --- a/package/ffmpeg/ffmpeg.mk +++ b/package/ffmpeg/ffmpeg.mk @@ -473,6 +473,11 @@ else ifneq ($(call qstrip,$(BR2_GCC_TARGET_ARCH)),) FFMPEG_CONF_OPTS += --cpu=$(BR2_GCC_TARGET_ARCH) endif +ifeq ($(BR2_PACKAGE_FFMPEG_RPI_HW_CODECS),y) +FFMPEG_DEPENDENCIES += rpi-userland +FFMPEG_CONF_OPTS += --enable-omx --enable-omx-rpi --enable-mmal --extra-cflags=-I../../staging/usr/include/IL/ +endif + FFMPEG_CONF_OPTS += $(call qstrip,$(BR2_PACKAGE_FFMPEG_EXTRACONF)) diff --git a/package/motion/0003-prefer-omx-encoders.patch b/package/motion/0003-prefer-omx-encoders.patch new file mode 100644 index 0000000000..73d41b63d5 --- /dev/null +++ b/package/motion/0003-prefer-omx-encoders.patch @@ -0,0 +1,19 @@ +diff --git a/ffmpeg.c b/ffmpeg.c +index e7cab9f..3f48db8 100644 +--- a/ffmpeg.c ++++ b/ffmpeg.c +@@ -380,7 +380,13 @@ struct ffmpeg *ffmpeg_open(const char *ffmpeg_video_codec, char *filename, + ffmpeg->video_st = NULL; + if (ffmpeg->oc->oformat->video_codec != MY_CODEC_ID_NONE) { + +- codec = avcodec_find_encoder(ffmpeg->oc->oformat->video_codec); ++ codec = NULL; ++ if (ffmpeg->oc->oformat->video_codec == AV_CODEC_ID_H264) ++ codec = avcodec_find_encoder_by_name("h264_omx"); ++ else if (ffmpeg->oc->oformat->video_codec == AV_CODEC_ID_MPEG4) ++ codec = avcodec_find_encoder_by_name("mpeg4_omx"); ++ if (!codec) ++ codec = avcodec_find_encoder(ffmpeg->oc->oformat->video_codec); + if (!codec) { + MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, "%s: Codec %s not found", ffmpeg_video_codec); + ffmpeg_cleanups(ffmpeg); diff --git a/package/motion/0004-h264-best-crf-quality.patch b/package/motion/0004-h264-best-crf-quality.patch new file mode 100644 index 0000000000..d41b32ce59 --- /dev/null +++ b/package/motion/0004-h264-best-crf-quality.patch @@ -0,0 +1,25 @@ +diff --git a/ffmpeg.c b/ffmpeg.c +index 3f48db8..1819e35 100644 +--- a/ffmpeg.c ++++ b/ffmpeg.c +@@ -419,6 +419,8 @@ struct ffmpeg *ffmpeg_open(const char *ffmpeg_video_codec, char *filename, + c->codec_id = ffmpeg->oc->oformat->video_codec; + c->codec_type = AVMEDIA_TYPE_VIDEO; + c->bit_rate = bps; ++ if (ffmpeg->oc->oformat->video_codec == AV_CODEC_ID_H264) ++ av_opt_set(c->priv_data, "crf", "1", AV_OPT_SEARCH_CHILDREN); + c->width = width; + c->height = height; + c->time_base.num = 1; +diff --git a/ffmpeg.h b/ffmpeg.h +index ccdc0f1..7067569 100644 +--- a/ffmpeg.h ++++ b/ffmpeg.h +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + + #if (LIBAVFORMAT_VERSION_MAJOR >= 56) +