* [FFmpeg-devel] [PATCH v3] avformat/fifo: Check for keyframe video type before stop dropping
@ 2025-04-10 22:59 Arthur Grillo
2025-04-15 23:43 ` Michael Niedermayer
0 siblings, 1 reply; 2+ messages in thread
From: Arthur Grillo @ 2025-04-10 22:59 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Michael Niedermayer, lingjiujianke, Arthur Grillo
The current behavior when using restart_with_keyframe is that it will
recover if it also encounters any audio packet, as they are flagged as a
keyframe.
The expectation is that packets are dropped until the next _video_
keyframe.
To fix that, check if exists a video stream, if it exists check the
packet stream codec type, only letting it recover when it is a video
one. If there is no video stream, resume to the original behavior, not
checking the codec type.
Fixes ticket: #11467
Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
Changes in v3:
- Terminate `has_video_stream` description comment with a space
- Fix indentation (Michael Niedermayer)
- Link to v2: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20250405-video-only-kf-recover-v2-1-000e71a29ccb@riseup.net
Changes in v2:
- Check for the presence of a video stream (Michael Niedermayer)
- Link to v1: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20250312-video-only-kf-recover-v1-1-1e0e340da663@riseup.net
---
libavformat/fifo.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/libavformat/fifo.c b/libavformat/fifo.c
index 23e4149ad606b201aade77e28057afe8e5fe2b71..03c1822a9066df5571c72ff2dfd941791595ec83 100644
--- a/libavformat/fifo.c
+++ b/libavformat/fifo.c
@@ -106,6 +106,9 @@ typedef struct FifoThreadContext {
uint8_t header_written;
int64_t last_received_dts;
+
+ /* If > 0 at least one of the streams is a video stream */
+ uint8_t has_video_stream;
} FifoThreadContext;
typedef enum FifoMessageType {
@@ -185,14 +188,26 @@ static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt)
AVRational src_tb, dst_tb;
int ret, s_idx;
int64_t orig_pts, orig_dts, orig_duration;
+ enum AVMediaType stream_codec_type = avf->streams[pkt->stream_index]->codecpar->codec_type;
if (fifo->timeshift && pkt->dts != AV_NOPTS_VALUE)
atomic_fetch_sub_explicit(&fifo->queue_duration, next_duration(avf, pkt, &ctx->last_received_dts), memory_order_relaxed);
if (ctx->drop_until_keyframe) {
if (pkt->flags & AV_PKT_FLAG_KEY) {
- ctx->drop_until_keyframe = 0;
- av_log(avf, AV_LOG_VERBOSE, "Keyframe received, recovering...\n");
+ if (!ctx->has_video_stream) {
+ ctx->drop_until_keyframe = 0;
+ av_log(avf, AV_LOG_VERBOSE, "Keyframe received, recovering...\n");
+ } else {
+ if (stream_codec_type == AVMEDIA_TYPE_VIDEO) {
+ ctx->drop_until_keyframe = 0;
+ av_log(avf, AV_LOG_VERBOSE, "Video keyframe received, recovering...\n");
+ } else {
+ av_log(avf, AV_LOG_VERBOSE, "Dropping non-video keyframe\n");
+ av_packet_unref(pkt);
+ return 0;
+ }
+ }
} else {
av_log(avf, AV_LOG_VERBOSE, "Dropping non-keyframe packet\n");
av_packet_unref(pkt);
@@ -425,7 +440,7 @@ static void *fifo_consumer_thread(void *data)
FifoContext *fifo = avf->priv_data;
AVThreadMessageQueue *queue = fifo->queue;
FifoMessage msg = {fifo->timeshift ? FIFO_NOOP : FIFO_WRITE_HEADER, {0}};
- int ret;
+ int ret, i;
FifoThreadContext fifo_thread_ctx;
memset(&fifo_thread_ctx, 0, sizeof(FifoThreadContext));
@@ -434,6 +449,13 @@ static void *fifo_consumer_thread(void *data)
ff_thread_setname("fifo-consumer");
+ for (i = 0; i < avf->nb_streams; i++) {
+ if (avf->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+ fifo_thread_ctx.has_video_stream = 1;
+ break;
+ }
+ }
+
while (1) {
uint8_t just_flushed = 0;
---
base-commit: 3165fe5ecf4917d9f7d7f27d4fa3af31bc604515
change-id: 20250312-video-only-kf-recover-18816009f240
Best regards,
--
Arthur Grillo <arthurgrillo@riseup.net>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [FFmpeg-devel] [PATCH v3] avformat/fifo: Check for keyframe video type before stop dropping
2025-04-10 22:59 [FFmpeg-devel] [PATCH v3] avformat/fifo: Check for keyframe video type before stop dropping Arthur Grillo
@ 2025-04-15 23:43 ` Michael Niedermayer
0 siblings, 0 replies; 2+ messages in thread
From: Michael Niedermayer @ 2025-04-15 23:43 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 1723 bytes --]
On Thu, Apr 10, 2025 at 07:59:15PM -0300, Arthur Grillo wrote:
> The current behavior when using restart_with_keyframe is that it will
> recover if it also encounters any audio packet, as they are flagged as a
> keyframe.
>
> The expectation is that packets are dropped until the next _video_
> keyframe.
>
> To fix that, check if exists a video stream, if it exists check the
> packet stream codec type, only letting it recover when it is a video
> one. If there is no video stream, resume to the original behavior, not
> checking the codec type.
>
> Fixes ticket: #11467
>
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
> Changes in v3:
> - Terminate `has_video_stream` description comment with a space
> - Fix indentation (Michael Niedermayer)
> - Link to v2: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20250405-video-only-kf-recover-v2-1-000e71a29ccb@riseup.net
>
> Changes in v2:
> - Check for the presence of a video stream (Michael Niedermayer)
> - Link to v1: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20250312-video-only-kf-recover-v1-1-1e0e340da663@riseup.net
> ---
> libavformat/fifo.c | 28 +++++++++++++++++++++++++---
> 1 file changed, 25 insertions(+), 3 deletions(-)
will apply
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Modern terrorism, a quick summary: Need oil, start war with country that
has oil, kill hundread thousand in war. Let country fall into chaos,
be surprised about raise of fundamantalists. Drop more bombs, kill more
people, be surprised about them taking revenge and drop even more bombs
and strip your own citizens of their rights and freedoms. to be continued
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-04-15 23:43 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-10 22:59 [FFmpeg-devel] [PATCH v3] avformat/fifo: Check for keyframe video type before stop dropping Arthur Grillo
2025-04-15 23:43 ` Michael Niedermayer
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git