diff --git a/ffmpeg.c b/ffmpeg.c index a19c81667b5ff..d4c6ec8420f8f 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -3507,7 +3507,6 @@ static void *input_thread(void *arg) av_thread_message_queue_set_err_recv(f->in_thread_queue, ret); break; } - av_dup_packet(&pkt); ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags); if (flags && ret == AVERROR(EAGAIN)) { flags = 0; diff --git a/ffplay.c b/ffplay.c index 37db374b6706a..e0bcc7c392a75 100644 --- a/ffplay.c +++ b/ffplay.c @@ -427,10 +427,6 @@ static int packet_queue_put(PacketQueue *q, AVPacket *pkt) { int ret; - /* duplicate the packet */ - if (pkt != &flush_pkt && av_dup_packet(pkt) < 0) - return -1; - SDL_LockMutex(q->mutex); ret = packet_queue_put_private(q, pkt); SDL_UnlockMutex(q->mutex); diff --git a/libavformat/utils.c b/libavformat/utils.c index 689473e9fb5a0..3b6530f4ca0df 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -683,6 +683,14 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) continue; } + if (!pkt->buf) { + AVPacket tmp = { 0 }; + ret = av_packet_ref(&tmp, pkt); + if (ret < 0) + return ret; + *pkt = tmp; + } + if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) && (pkt->flags & AV_PKT_FLAG_CORRUPT)) { av_log(s, AV_LOG_WARNING,