diff options
author | Dmitry Kharitonov | 2018-01-11 22:09:04 +0500 |
---|---|---|
committer | Dmitry Kharitonov | 2018-01-11 22:09:04 +0500 |
commit | f2c5cdf486990fabc35c2eb5af4cf37b67633324 (patch) | |
tree | 8a808334070bba66d0ede773228d86b8fcd2ad8b | |
parent | 25972e15e65ab8245777e8b3306beaf59ac1a839 (diff) | |
download | aur-f2c5cdf486990fabc35c2eb5af4cf37b67633324.tar.gz |
Added fixes for Rockchip MPP
-rw-r--r-- | .SRCINFO | 6 | ||||
-rw-r--r-- | PKGBUILD | 16 | ||||
-rw-r--r-- | ffmpeg-full-rkmpp-build-fix.patch | 78 | ||||
-rw-r--r-- | ffmpeg-full-rkmpp-remove-stream-start.patch | 83 |
4 files changed, 179 insertions, 4 deletions
@@ -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 @@ -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); |