diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-backport-rkmppdec-fixes.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-backport-rkmppdec-fixes.patch new file mode 100644 index 0000000000..b4359c08e5 --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-backport-rkmppdec-fixes.patch @@ -0,0 +1,168 @@ +From ed4a91d4f4bd7ab99f2be901285b20a0cde52902 Mon Sep 17 00:00:00 2001 +From: LongChair +Date: Sat, 6 Jan 2018 09:36:58 +0100 +Subject: [PATCH] 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 +(cherry picked from commit c6f84106366c6f243a8b07dbffcc7880009aa904) +--- + configure | 6 ++---- + libavcodec/rkmppdec.c | 10 ++++++---- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/configure b/configure +index 1797c5dd4f..4db1c9b73f 100755 +--- a/configure ++++ b/configure +@@ -6077,10 +6077,8 @@ enabled openssl && { use_pkg_config openssl openssl openssl/ssl.h OPEN + 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 bdf4dc4208..ebc021e3d8 100644 +--- a/libavcodec/rkmppdec.c ++++ b/libavcodec/rkmppdec.c +@@ -39,6 +39,7 @@ + + #define RECEIVE_FRAME_TIMEOUT 100 + #define FRAMEGROUP_MAX_FRAMES 16 ++#define INPUT_MAX_PACKETS 4 + + typedef struct { + MppCtx ctx; +@@ -514,16 +515,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) { +@@ -540,7 +542,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); + } + + +From 617c895d27198bb9391a001932e288d1dfe4f728 Mon Sep 17 00:00:00 2001 +From: LongChair +Date: Tue, 2 Jan 2018 12:38:01 +0100 +Subject: [PATCH] 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 +(cherry picked from commit 2ca65fc7b74444edd51d5803a2c1e05a801a6023) +--- + libavcodec/rkmppdec.c | 24 +++--------------------- + 1 file changed, 3 insertions(+), 21 deletions(-) + +diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c +index ebc021e3d8..9dfeb742ab 100644 +--- a/libavcodec/rkmppdec.c ++++ b/libavcodec/rkmppdec.c +@@ -46,7 +46,6 @@ typedef struct { + MppApi *mpi; + MppBufferGroup frame_group; + +- char first_frame; + char first_packet; + char eos_reached; + +@@ -328,28 +327,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) { +@@ -365,7 +350,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); + +@@ -479,7 +463,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); +@@ -559,7 +542,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); diff --git a/packages/multimedia/rkmpp/package.mk b/packages/multimedia/rkmpp/package.mk index b53b27fb21..866643f131 100644 --- a/packages/multimedia/rkmpp/package.mk +++ b/packages/multimedia/rkmpp/package.mk @@ -17,8 +17,8 @@ ################################################################################ PKG_NAME="rkmpp" -PKG_VERSION="c6594ae" -PKG_SHA256="981f7bc04677ff5135cea92e9926d5521ed38b359514d3405dd8f01c9295d147" +PKG_VERSION="c8a41a6" +PKG_SHA256="01b84eecde7cae98035ecce866b48f903f9deaa7e19b048ff9cb87edf6446659" PKG_ARCH="arm aarch64" PKG_LICENSE="APL" PKG_SITE="https://github.com/rockchip-linux/mpp" diff --git a/packages/multimedia/rkmpp/patches/rkmpp-0002-fix-32-bit-mmap-issue-on-64-bit-kernels.patch b/packages/multimedia/rkmpp/patches/rkmpp-0001-fix-32-bit-mmap-issue-on-64-bit-kernels.patch similarity index 87% rename from packages/multimedia/rkmpp/patches/rkmpp-0002-fix-32-bit-mmap-issue-on-64-bit-kernels.patch rename to packages/multimedia/rkmpp/patches/rkmpp-0001-fix-32-bit-mmap-issue-on-64-bit-kernels.patch index c200be05ab..5851923135 100644 --- a/packages/multimedia/rkmpp/patches/rkmpp-0002-fix-32-bit-mmap-issue-on-64-bit-kernels.patch +++ b/packages/multimedia/rkmpp/patches/rkmpp-0001-fix-32-bit-mmap-issue-on-64-bit-kernels.patch @@ -1,7 +1,7 @@ -From ccb2128ace5c069ec1b904cc621bacaf82498929 Mon Sep 17 00:00:00 2001 +From e9c9f2619bb2344f9947ccbbdcf15be9d0f55b1f Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Mon, 29 May 2017 14:08:43 +0200 -Subject: [PATCH 2/2] fix 32-bit mmap issue on 64-bit kernels +Subject: [PATCH] fix 32-bit mmap issue on 64-bit kernels Running 32-bit userland on a 64-bit kernel resulted in the error: diff --git a/packages/multimedia/rkmpp/patches/rkmpp-0001-mpp-retrieve-available-input-packet-free-slots.patch b/packages/multimedia/rkmpp/patches/rkmpp-0001-mpp-retrieve-available-input-packet-free-slots.patch deleted file mode 100644 index 2dfd10df2c..0000000000 --- a/packages/multimedia/rkmpp/patches/rkmpp-0001-mpp-retrieve-available-input-packet-free-slots.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 0d5fc7b20b6997418935b422b3704b1a90ad584b Mon Sep 17 00:00:00 2001 -From: LongChair -Date: Wed, 26 Apr 2017 11:45:37 +0200 -Subject: [PATCH 1/2] [mpp]: retrieve available input packet free slots - -This is something that allows to know before putting a packet into -the decoder if it would accept it or if it is full. - -This patch also adds a constant define for the input buffer count -rather than having the 4 hardcoded. - -Change-Id: I876e5d4efd0b2e38619ab87d4147a40bedee5669 -Signed-off-by: LongChair -Reviewed-by: ayaka -Signed-off-by: Randy Li ---- - inc/rk_mpi_cmd.h | 1 + - mpp/mpp.cpp | 13 +++++++++---- - 2 files changed, 10 insertions(+), 4 deletions(-) - -diff --git a/inc/rk_mpi_cmd.h b/inc/rk_mpi_cmd.h -index 3f2c8d71..a9c58563 100644 ---- a/inc/rk_mpi_cmd.h -+++ b/inc/rk_mpi_cmd.h -@@ -97,6 +97,7 @@ typedef enum { - MPP_DEC_SET_VC1_EXTRA_DATA, - MPP_DEC_SET_OUTPUT_FORMAT, - MPP_DEC_SET_DISABLE_ERROR, /* When set it will disable sw/hw error (H.264 / H.265) */ -+ MPP_DEC_GET_FREE_PACKET_SLOT_COUNT, - MPP_DEC_CMD_END, - - MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC, -diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp -index 164cd60d..1357d1a0 100644 ---- a/mpp/mpp.cpp -+++ b/mpp/mpp.cpp -@@ -33,6 +33,7 @@ - - #define MPP_TEST_FRAME_SIZE SZ_1M - #define MPP_TEST_PACKET_SIZE SZ_512K -+#define MPP_MAX_INPUT_PACKETS 4 - - Mpp::Mpp() - : mPackets(NULL), -@@ -102,8 +103,8 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) - - mpp_task_queue_init(&mInputTaskQueue); - mpp_task_queue_init(&mOutputTaskQueue); -- mpp_task_queue_setup(mInputTaskQueue, 4); -- mpp_task_queue_setup(mOutputTaskQueue, 4); -+ mpp_task_queue_setup(mInputTaskQueue, MPP_MAX_INPUT_PACKETS); -+ mpp_task_queue_setup(mOutputTaskQueue, MPP_MAX_INPUT_PACKETS); - } else { - mThreadCodec = new MppThread(mpp_dec_advanced_thread, this, "mpp_dec_parser"); - -@@ -258,7 +259,7 @@ MPP_RET Mpp::put_packet(MppPacket packet) - AutoMutex autoLock(mPackets->mutex()); - RK_U32 eos = mpp_packet_get_eos(packet); - -- if (mPackets->list_size() < 4 || eos) { -+ if (mPackets->list_size() < MPP_MAX_INPUT_PACKETS || eos) { - MppPacket pkt; - if (MPP_OK != mpp_packet_copy_init(&pkt, packet)) - return MPP_NOK; -@@ -742,7 +743,11 @@ MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param) - case MPP_DEC_SET_OUTPUT_FORMAT: - case MPP_DEC_SET_DISABLE_ERROR: { - ret = mpp_dec_control(mDec, cmd, param); -- } -+ } break; -+ case MPP_DEC_GET_FREE_PACKET_SLOT_COUNT: { -+ *((RK_S32 *)param) = MPP_MAX_INPUT_PACKETS - mPackets->list_size(); -+ ret = MPP_OK; -+ } break; - default : { - } break; - } diff --git a/packages/multimedia/rkmpp/patches/rkmpp-0002-mpp_dec-sleep-when-there-is-nothing-to-parse.patch b/packages/multimedia/rkmpp/patches/rkmpp-0002-mpp_dec-sleep-when-there-is-nothing-to-parse.patch new file mode 100644 index 0000000000..10ee3bae40 --- /dev/null +++ b/packages/multimedia/rkmpp/patches/rkmpp-0002-mpp_dec-sleep-when-there-is-nothing-to-parse.patch @@ -0,0 +1,25 @@ +From 322efafd1f760c73accda1a7025b007f211916f7 Mon Sep 17 00:00:00 2001 +From: Jonas Karlman +Date: Sat, 3 Mar 2018 10:10:01 +0100 +Subject: [PATCH] [mpp_dec]: sleep when there is nothing to parse + +--- + mpp/codec/mpp_dec.cpp | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp +index 424604e1..dded58c6 100644 +--- a/mpp/codec/mpp_dec.cpp ++++ b/mpp/codec/mpp_dec.cpp +@@ -600,8 +600,10 @@ void *mpp_dec_parser_thread(void *data) + } + parser->unlock(); + +- if (try_proc_dec_task(mpp, &task)) ++ if (try_proc_dec_task(mpp, &task)) { ++ msleep(1); + continue; ++ } + + } + diff --git a/packages/multimedia/rkmpp/patches/rkmpp-1000-hevc.patch b/packages/multimedia/rkmpp/patches/rkmpp-1000-hevc.patch index 397b1bec94..ff6a60d363 100644 --- a/packages/multimedia/rkmpp/patches/rkmpp-1000-hevc.patch +++ b/packages/multimedia/rkmpp/patches/rkmpp-1000-hevc.patch @@ -1,16 +1,3 @@ -diff --git a/mpp/hal/rkdec/h265d/hal_h265d_reg.c b/mpp/hal/rkdec/h265d/hal_h265d_reg.c -index a60d6c2..3d4265b 100644 ---- a/mpp/hal/rkdec/h265d/hal_h265d_reg.c -+++ b/mpp/hal/rkdec/h265d/hal_h265d_reg.c -@@ -1468,8 +1468,6 @@ MPP_RET hal_h265d_gen_regs(void *hal, HalTaskInfo *syn) - } - hw_regs->sw_interrupt.sw_dec_e = 1; - hw_regs->sw_interrupt.sw_dec_timeout_e = 1; -- hw_regs->sw_interrupt.sw_wr_ddr_align_en = dxva_cxt->pp.tiles_enabled_flag -- ? 0 : 1; - - - ///find s->rps_model[i] position, and set register diff --git a/mpp/hal/rkdec/h265d/hal_h265d_reg.h b/mpp/hal/rkdec/h265d/hal_h265d_reg.h index 1bccb02..432b8db 100644 --- a/mpp/hal/rkdec/h265d/hal_h265d_reg.h