summarylogtreecommitdiffstats
path: root/ffmpeg-full-rkmpp-remove-stream-start.patch
diff options
context:
space:
mode:
Diffstat (limited to 'ffmpeg-full-rkmpp-remove-stream-start.patch')
-rw-r--r--ffmpeg-full-rkmpp-remove-stream-start.patch83
1 files changed, 83 insertions, 0 deletions
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);