From 9b42a3c7f1230d001743099e9930f26a06ca6cf5 Mon Sep 17 00:00:00 2001
From: LongChair <longchair@hotmail.com>
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.
---
libavcodec/rkmppdec.c | 24 +++---------------------
1 file changed, 3 insertions(+), 21 deletions(-)
@@ -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);
--
2.14.1