Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] avcodec/libdav1d: honor the requested skip_frame level
@ 2022-12-08 16:31 James Almer
  2022-12-14 23:51 ` [FFmpeg-devel] [PATCH v2] " James Almer
  0 siblings, 1 reply; 2+ messages in thread
From: James Almer @ 2022-12-08 16:31 UTC (permalink / raw)
  To: ffmpeg-devel

This supports dropping non-intra, non-key, or all frames.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/libdav1d.c | 51 +++++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 19 deletions(-)

diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index 028929404e..2f83a963e9 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -369,6 +369,37 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
         return res;
     }
 
+#if FF_DAV1D_VERSION_AT_LEAST(5,1)
+    dav1d_get_event_flags(dav1d->c, &event_flags);
+    if (c->pix_fmt == AV_PIX_FMT_NONE ||
+        event_flags & DAV1D_EVENT_FLAG_NEW_SEQUENCE)
+#endif
+    libdav1d_init_params(c, p->seq_hdr);
+    if (c->width != p->p.w || c->height != p->p.h) {
+        res = ff_set_dimensions(c, p->p.w, p->p.h);
+        if (res < 0) {
+            dav1d_picture_unref(p);
+            return 0;
+        }
+    }
+
+    av_reduce(&c->sample_aspect_ratio.num,
+              &c->sample_aspect_ratio.den,
+              p->p.h * (int64_t)p->frame_hdr->render_width,
+              p->p.w * (int64_t)p->frame_hdr->render_height,
+              INT_MAX);
+    ff_set_sar(c, c->sample_aspect_ratio);
+
+    if ((c->skip_frame >= AVDISCARD_NONINTRA &&
+            (p->frame_hdr->frame_type != DAV1D_FRAME_TYPE_KEY &&
+             p->frame_hdr->frame_type != DAV1D_FRAME_TYPE_INTRA)) ||
+        (c->skip_frame >= AVDISCARD_NONKEY   &&
+             p->frame_hdr->frame_type != DAV1D_FRAME_TYPE_KEY) ||
+        c->skip_frame >= AVDISCARD_ALL) {
+        dav1d_picture_unref(p);
+        return 0;
+    }
+
     av_assert0(p->data[0] && p->allocator_data);
 
     // This requires the custom allocator above
@@ -385,30 +416,12 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
     frame->linesize[1] = p->stride[1];
     frame->linesize[2] = p->stride[1];
 
-#if FF_DAV1D_VERSION_AT_LEAST(5,1)
-    dav1d_get_event_flags(dav1d->c, &event_flags);
-    if (c->pix_fmt == AV_PIX_FMT_NONE ||
-        event_flags & DAV1D_EVENT_FLAG_NEW_SEQUENCE)
-#endif
-    libdav1d_init_params(c, p->seq_hdr);
     res = ff_decode_frame_props(c, frame);
     if (res < 0)
         goto fail;
 
     frame->width = p->p.w;
     frame->height = p->p.h;
-    if (c->width != p->p.w || c->height != p->p.h) {
-        res = ff_set_dimensions(c, p->p.w, p->p.h);
-        if (res < 0)
-            goto fail;
-    }
-
-    av_reduce(&frame->sample_aspect_ratio.num,
-              &frame->sample_aspect_ratio.den,
-              frame->height * (int64_t)p->frame_hdr->render_width,
-              frame->width  * (int64_t)p->frame_hdr->render_height,
-              INT_MAX);
-    ff_set_sar(c, frame->sample_aspect_ratio);
 
     if (p->m.user_data.data)
         memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque));
@@ -595,7 +608,7 @@ const FFCodec ff_libdav1d_decoder = {
     FF_CODEC_RECEIVE_FRAME_CB(libdav1d_receive_frame),
     .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS |
-                      FF_CODEC_CAP_AUTO_THREADS,
+                      FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_AUTO_THREADS,
     .p.priv_class   = &libdav1d_class,
     .p.wrapper_name = "libdav1d",
 };
-- 
2.38.1

_______________________________________________
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:[~2022-12-14 23:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-08 16:31 [FFmpeg-devel] [PATCH] avcodec/libdav1d: honor the requested skip_frame level James Almer
2022-12-14 23:51 ` [FFmpeg-devel] [PATCH v2] " James Almer

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