summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Kharitonov2018-01-11 22:09:04 +0500
committerDmitry Kharitonov2018-01-11 22:09:04 +0500
commitf2c5cdf486990fabc35c2eb5af4cf37b67633324 (patch)
tree8a808334070bba66d0ede773228d86b8fcd2ad8b
parent25972e15e65ab8245777e8b3306beaf59ac1a839 (diff)
downloadaur-f2c5cdf486990fabc35c2eb5af4cf37b67633324.tar.gz
Added fixes for Rockchip MPP
-rw-r--r--.SRCINFO6
-rw-r--r--PKGBUILD16
-rw-r--r--ffmpeg-full-rkmpp-build-fix.patch78
-rw-r--r--ffmpeg-full-rkmpp-remove-stream-start.patch83
4 files changed, 179 insertions, 4 deletions
diff --git a/.SRCINFO b/.SRCINFO
index e6c710a02cd7..21692e3d5385 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = ffmpeg-full-nvenc
pkgdesc = Record, convert, and stream audio and video (all codecs including Nvidia NVENC)
pkgver = 3.4.1
- pkgrel = 2
+ pkgrel = 3
epoch = 1
url = http://ffmpeg.org/
arch = i686
@@ -110,10 +110,14 @@ pkgbase = ffmpeg-full-nvenc
conflicts = ffmpeg-full-extra
source = https://ffmpeg.org/releases/ffmpeg-3.4.1.tar.xz
source = https://ffmpeg.org/releases/ffmpeg-3.4.1.tar.xz.asc
+ source = ffmpeg-full-rkmpp-build-fix.patch
+ source = ffmpeg-full-rkmpp-remove-stream-start.patch
source = UNREDISTRIBUTABLE.txt
validpgpkeys = FCF986EA15E6E293A5644F10B4322F04D67658D8
sha256sums = 5a77278a63741efa74e26bf197b9bb09ac6381b9757391b922407210f0f991c0
sha256sums = SKIP
+ sha256sums = 142923fd02851343bfbfd31b201ba014dced8a8c8898373c72d71d30d59f5851
+ sha256sums = cac8577126c3e49f8c915fa289f3f5aa624dc55f897b8b7a5613191bcfa9c097
sha256sums = e0c1b126862072a71e18b9580a6b01afc76a54aa6e642d2c413ba0ac9d3010c4
depends_x86_64 = cuda
depends_x86_64 = nvidia-utils
diff --git a/PKGBUILD b/PKGBUILD
index a765119192b3..004e33a35325 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -19,7 +19,7 @@
pkgname=ffmpeg-full-nvenc
_pkgbasename=ffmpeg
pkgver=3.4.1
-pkgrel=2
+pkgrel=3
epoch=1
pkgdesc="Record, convert, and stream audio and video (all codecs including Nvidia NVENC)"
arch=('i686' 'x86_64')
@@ -47,14 +47,24 @@ provides=('libavcodec.so' 'libavdevice.so' 'libavfilter.so' 'libavformat.so'
'libavresample.so' 'libavutil.so' 'libpostproc.so' 'libswresample.so'
'libswscale.so' 'ffmpeg' 'qt-faststart')
source=(https://ffmpeg.org/releases/$_pkgbasename-$pkgver.tar.xz{,.asc}
+ 'ffmpeg-full-rkmpp-build-fix.patch'
+ 'ffmpeg-full-rkmpp-remove-stream-start.patch'
'UNREDISTRIBUTABLE.txt')
validpgpkeys=('FCF986EA15E6E293A5644F10B4322F04D67658D8')
sha256sums=('5a77278a63741efa74e26bf197b9bb09ac6381b9757391b922407210f0f991c0'
'SKIP'
+ '142923fd02851343bfbfd31b201ba014dced8a8c8898373c72d71d30d59f5851'
+ 'cac8577126c3e49f8c915fa289f3f5aa624dc55f897b8b7a5613191bcfa9c097'
'e0c1b126862072a71e18b9580a6b01afc76a54aa6e642d2c413ba0ac9d3010c4')
+prepare() {
+ cd "$_pkgbasename-$pkgver"
+ patch -Np1 -i "${srcdir}/ffmpeg-full-rkmpp-build-fix.patch"
+ patch -Np1 -i "${srcdir}/ffmpeg-full-rkmpp-remove-stream-start.patch"
+}
+
build() {
- cd $_pkgbasename-$pkgver
+ cd "$_pkgbasename-$pkgver"
# Add x86_64 (opt)depends to the build
if [ "$CARCH" = "x86_64" ]
@@ -204,7 +214,7 @@ build() {
}
package() {
- cd $_pkgbasename-$pkgver
+ cd "$_pkgbasename-$pkgver"
make DESTDIR="$pkgdir" install install-man
install -Dm 755 tools/qt-faststart "${pkgdir}"/usr/bin/
install -Dm 644 "$srcdir"/UNREDISTRIBUTABLE.txt "$pkgdir/usr/share/licenses/$pkgname/UNREDISTRIBUTABLE.txt"
diff --git a/ffmpeg-full-rkmpp-build-fix.patch b/ffmpeg-full-rkmpp-build-fix.patch
new file mode 100644
index 000000000000..938affa0e2c3
--- /dev/null
+++ b/ffmpeg-full-rkmpp-build-fix.patch
@@ -0,0 +1,78 @@
+From: LongChair <longchair@hotmail.com>
+Date: Sat, 6 Jan 2018 08:36:58 +0000 (+0100)
+Subject: avcodec/rkmpp : Fix broken build due to missing control operation
+X-Git-Url: http://git.videolan.org/?p=ffmpeg.git;a=commitdiff_plain;h=c6f84106366c6f243a8b07dbffcc7880009aa904
+
+avcodec/rkmpp : Fix broken build due to missing control operation
+
+This patch is taking care of https://trac.ffmpeg.org/ticket/6834.
+It seems that one of the control operations that was available to get
+the free decoders input slots was removed.
+
+There is another control operation to retrieve the used slots. Given
+that the input slot count is hardcoded to 4 in mpp at this point,
+replacing the old control operation by the other one.
+
+This was tested on Rockchip ROCK64.
+
+Signed-off-by: wm4 <nfxjfg@googlemail.com>
+---
+
+diff -Naurp a/configure b/configure
+--- a/configure 2017-12-10 19:35:18.000000000 -0200
++++ b/configure 2018-01-06 23:27:24.057673297 -0200
+@@ -6077,10 +6077,8 @@ enabled openssl && { use_pkg_c
+ check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
+ check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
+ die "ERROR: openssl not found"; }
+-enabled rkmpp && { { require_pkg_config rockchip_mpp rockchip_mpp rockchip/rk_mpi.h mpp_create ||
+- die "ERROR : Rockchip MPP was not found."; } &&
+- { check_func_headers rockchip/rk_mpi_cmd.h "MPP_DEC_GET_FREE_PACKET_SLOT_COUNT" ||
+- die "ERROR: Rockchip MPP is outdated, please get a more recent one."; } &&
++enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/rk_mpi.h mpp_create &&
++ require_pkg_config rockchip_mpp "rockchip_mpp >= 1.3.7" rockchip/rk_mpi.h mpp_create &&
+ { enabled libdrm ||
+ die "ERROR: rkmpp requires --enable-libdrm"; }
+ }
+diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c
+index c57a6ded38..946b827918 100644
+--- a/libavcodec/rkmppdec.c
++++ b/libavcodec/rkmppdec.c
+@@ -40,6 +40,7 @@
+
+ #define RECEIVE_FRAME_TIMEOUT 100
+ #define FRAMEGROUP_MAX_FRAMES 16
++#define INPUT_MAX_PACKETS 4
+
+ typedef struct {
+ MppCtx ctx;
+@@ -515,16 +516,17 @@ static int rkmpp_receive_frame(AVCodecContext *avctx, AVFrame *frame)
+ RKMPPDecoder *decoder = (RKMPPDecoder *)rk_context->decoder_ref->data;
+ int ret = MPP_NOK;
+ AVPacket pkt = {0};
+- RK_S32 freeslots;
++ RK_S32 usedslots, freeslots;
+
+ if (!decoder->eos_reached) {
+ // we get the available slots in decoder
+- ret = decoder->mpi->control(decoder->ctx, MPP_DEC_GET_FREE_PACKET_SLOT_COUNT, &freeslots);
++ ret = decoder->mpi->control(decoder->ctx, MPP_DEC_GET_STREAM_COUNT, &usedslots);
+ if (ret != MPP_OK) {
+- av_log(avctx, AV_LOG_ERROR, "Failed to get decoder free slots (code = %d).\n", ret);
++ av_log(avctx, AV_LOG_ERROR, "Failed to get decoder used slots (code = %d).\n", ret);
+ return ret;
+ }
+
++ freeslots = INPUT_MAX_PACKETS - usedslots;
+ if (freeslots > 0) {
+ ret = ff_decode_get_packet(avctx, &pkt);
+ if (ret < 0 && ret != AVERROR_EOF) {
+@@ -541,7 +543,7 @@ static int rkmpp_receive_frame(AVCodecContext *avctx, AVFrame *frame)
+ }
+
+ // make sure we keep decoder full
+- if (freeslots > 1 && decoder->first_frame)
++ if (freeslots > 1)
+ return AVERROR(EAGAIN);
+ }
+
diff --git a/ffmpeg-full-rkmpp-remove-stream-start.patch b/ffmpeg-full-rkmpp-remove-stream-start.patch
new file mode 100644
index 000000000000..febff8e34d15
--- /dev/null
+++ b/ffmpeg-full-rkmpp-remove-stream-start.patch
@@ -0,0 +1,83 @@
+From: LongChair <longchair@hotmail.com>
+Date: Tue, 2 Jan 2018 11:38:01 +0000 (+0100)
+Subject: avcodec/rkmpp : remove stream start retries before first frame.
+X-Git-Url: http://git.videolan.org/?p=ffmpeg.git;a=commitdiff_plain;h=2ca65fc7b74444edd51d5803a2c1e05a801a6023
+
+avcodec/rkmpp : remove stream start retries before first frame.
+
+those were needed because of some odd mpp behavior that seems to have
+been fixed.
+
+Makes the code cleaner.
+
+Signed-off-by: wm4 <nfxjfg@googlemail.com>
+---
+
+diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c
+index 946b827918..143d05bd51 100644
+--- a/libavcodec/rkmppdec.c
++++ b/libavcodec/rkmppdec.c
+@@ -47,7 +47,6 @@ typedef struct {
+ MppApi *mpi;
+ MppBufferGroup frame_group;
+
+- char first_frame;
+ char first_packet;
+ char eos_reached;
+
+@@ -329,28 +328,14 @@ static int rkmpp_retrieve_frame(AVCodecContext *avctx, AVFrame *frame)
+ MppBuffer buffer = NULL;
+ AVDRMFrameDescriptor *desc = NULL;
+ AVDRMLayerDescriptor *layer = NULL;
+- int retrycount = 0;
+ int mode;
+ MppFrameFormat mppformat;
+ uint32_t drmformat;
+
+- // on start of decoding, MPP can return -1, which is supposed to be expected
+- // this is due to some internal MPP init which is not completed, that will
+- // only happen in the first few frames queries, but should not be interpreted
+- // as an error, Therefore we need to retry a couple times when we get -1
+- // in order to let it time to complete it's init, then we sleep a bit between retries.
+-retry_get_frame:
+ ret = decoder->mpi->decode_get_frame(decoder->ctx, &mppframe);
+- if (ret != MPP_OK && ret != MPP_ERR_TIMEOUT && !decoder->first_frame) {
+- if (retrycount < 5) {
+- av_log(avctx, AV_LOG_DEBUG, "Failed to get a frame, retrying (code = %d, retrycount = %d)\n", ret, retrycount);
+- usleep(10000);
+- retrycount++;
+- goto retry_get_frame;
+- } else {
+- av_log(avctx, AV_LOG_ERROR, "Failed to get a frame from MPP (code = %d)\n", ret);
+- goto fail;
+- }
++ if (ret != MPP_OK && ret != MPP_ERR_TIMEOUT) {
++ av_log(avctx, AV_LOG_ERROR, "Failed to get a frame from MPP (code = %d)\n", ret);
++ goto fail;
+ }
+
+ if (mppframe) {
+@@ -366,7 +351,6 @@ retry_get_frame:
+ avctx->height = mpp_frame_get_height(mppframe);
+
+ decoder->mpi->control(decoder->ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
+- decoder->first_frame = 1;
+
+ av_buffer_unref(&decoder->frames_ref);
+
+@@ -480,7 +464,6 @@ retry_get_frame:
+ goto fail;
+ }
+
+- decoder->first_frame = 0;
+ return 0;
+ } else {
+ av_log(avctx, AV_LOG_ERROR, "Failed to retrieve the frame buffer, frame is dropped (code = %d)\n", ret);
+@@ -560,7 +543,6 @@ static void rkmpp_flush(AVCodecContext *avctx)
+
+ ret = decoder->mpi->reset(decoder->ctx);
+ if (ret == MPP_OK) {
+- decoder->first_frame = 1;
+ decoder->first_packet = 1;
+ } else
+ av_log(avctx, AV_LOG_ERROR, "Failed to reset MPI (code = %d)\n", ret);