diff options
Diffstat (limited to 'ffmpeg-full-rkmpp-remove-stream-start.patch')
-rw-r--r-- | ffmpeg-full-rkmpp-remove-stream-start.patch | 83 |
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); |