lavc/mediacodec: rely on buffer flags to detect end of stream
This commit is contained in:
		
							parent
							
								
									30e3a27119
								
							
						
					
					
						commit
						b316ebf46d
					
				@ -396,7 +396,7 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
 | 
			
		||||
        need_flushing = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->flushing && need_flushing && s->queued_buffer_nb <= 0) {
 | 
			
		||||
    if (s->flushing && s->eos) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -443,10 +443,6 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
 | 
			
		||||
                av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
 | 
			
		||||
                return AVERROR_EXTERNAL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            s->queued_buffer_nb++;
 | 
			
		||||
            if (s->queued_buffer_nb > s->queued_buffer_max)
 | 
			
		||||
                s->queued_buffer_max = s->queued_buffer_nb;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -474,6 +470,10 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
 | 
			
		||||
                " flags=%" PRIu32 "\n", index, info.offset, info.size,
 | 
			
		||||
                info.presentationTimeUs, info.flags);
 | 
			
		||||
 | 
			
		||||
        if (info.flags & ff_AMediaCodec_getBufferFlagEndOfStream(codec)) {
 | 
			
		||||
            s->eos = 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (info.size) {
 | 
			
		||||
            data = ff_AMediaCodec_getOutputBuffer(codec, index, &size);
 | 
			
		||||
            if (!data) {
 | 
			
		||||
@ -487,7 +487,6 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            *got_frame = 1;
 | 
			
		||||
            s->queued_buffer_nb--;
 | 
			
		||||
            s->dequeued_buffer_nb++;
 | 
			
		||||
        } else {
 | 
			
		||||
            status = ff_AMediaCodec_releaseOutputBuffer(codec, index, 0);
 | 
			
		||||
@ -528,8 +527,8 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
 | 
			
		||||
    } else if (ff_AMediaCodec_infoTryAgainLater(codec, index)) {
 | 
			
		||||
        if (s->flushing) {
 | 
			
		||||
            av_log(avctx, AV_LOG_ERROR, "Failed to dequeue output buffer within %" PRIi64 "ms "
 | 
			
		||||
                                        "while flushing remaining frames, output will probably lack last %d frames\n",
 | 
			
		||||
                                        output_dequeue_timeout_us / 1000, s->queued_buffer_nb);
 | 
			
		||||
                                        "while flushing remaining frames, output will probably lack frames\n",
 | 
			
		||||
                                        output_dequeue_timeout_us / 1000);
 | 
			
		||||
        } else {
 | 
			
		||||
            av_log(avctx, AV_LOG_DEBUG, "No output buffer available, try again later\n");
 | 
			
		||||
        }
 | 
			
		||||
@ -546,10 +545,10 @@ int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
 | 
			
		||||
    FFAMediaCodec *codec = s->codec;
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    s->queued_buffer_nb = 0;
 | 
			
		||||
    s->dequeued_buffer_nb = 0;
 | 
			
		||||
 | 
			
		||||
    s->flushing = 0;
 | 
			
		||||
    s->eos = 0;
 | 
			
		||||
 | 
			
		||||
    status = ff_AMediaCodec_flush(codec);
 | 
			
		||||
    if (status < 0) {
 | 
			
		||||
 | 
			
		||||
@ -41,6 +41,7 @@ typedef struct MediaCodecDecContext {
 | 
			
		||||
 | 
			
		||||
    int started;
 | 
			
		||||
    int flushing;
 | 
			
		||||
    int eos;
 | 
			
		||||
 | 
			
		||||
    int width;
 | 
			
		||||
    int height;
 | 
			
		||||
@ -53,8 +54,6 @@ typedef struct MediaCodecDecContext {
 | 
			
		||||
    int crop_left;
 | 
			
		||||
    int crop_right;
 | 
			
		||||
 | 
			
		||||
    int queued_buffer_nb;
 | 
			
		||||
    int queued_buffer_max;
 | 
			
		||||
    uint64_t dequeued_buffer_nb;
 | 
			
		||||
 | 
			
		||||
    int first_buffer;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user