This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 47f89ea88b swscale: explicitly track if a context is "legacy" or not
47f89ea88b is described below

commit 47f89ea88ba1ae9a9ac5b1b9bfa6063dfbd8c73a
Author:     Niklas Haas <[email protected]>
AuthorDate: Thu Feb 26 18:46:04 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Fri Mar 6 19:06:33 2026 +0100

    swscale: explicitly track if a context is "legacy" or not
    
    The legacy API is defined by sws_init_context(), sws_scale() etc., whereas
    the "modern" API is defined by just using sws_scale_frame() without prior
    init call.
    
    This int allows us to cleanly distinguish the type of context, paving the
    way for some minor refactoring.
    
    As an immediate benefit, we now gain a bunch of explict error checks to
    ensure the API is used correctly (i.e. sws_scale() not called before
    sws_init_context()).
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/swscale.c          | 15 +++++++++++++--
 libswscale/swscale_internal.h |  2 ++
 libswscale/utils.c            |  6 ++++++
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 94d9102f97..e4dbef8098 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -1208,6 +1208,8 @@ static int scale_internal(SwsContext *sws,
 void sws_frame_end(SwsContext *sws)
 {
     SwsInternal *c = sws_internal(sws);
+    if (!c->is_legacy_init)
+        return;
     av_frame_unref(c->frame_src);
     av_frame_unref(c->frame_dst);
     c->src_ranges.nb_ranges = 0;
@@ -1217,6 +1219,8 @@ int sws_frame_start(SwsContext *sws, AVFrame *dst, const 
AVFrame *src)
 {
     SwsInternal *c = sws_internal(sws);
     int ret, allocated = 0;
+    if (!c->is_legacy_init)
+        return AVERROR(EINVAL);
 
     ret = av_frame_ref(c->frame_src, src);
     if (ret < 0)
@@ -1249,6 +1253,8 @@ int sws_send_slice(SwsContext *sws, unsigned int 
slice_start,
 {
     SwsInternal *c = sws_internal(sws);
     int ret;
+    if (!c->is_legacy_init)
+        return AVERROR(EINVAL);
 
     ret = ff_range_add(&c->src_ranges, slice_start, slice_height);
     if (ret < 0)
@@ -1272,6 +1278,8 @@ int sws_receive_slice(SwsContext *sws, unsigned int 
slice_start,
     SwsInternal *c = sws_internal(sws);
     unsigned int align = sws_receive_slice_alignment(sws);
     uint8_t *dst[4];
+    if (!c->is_legacy_init)
+        return AVERROR(EINVAL);
 
     /* wait until complete input has been received */
     if (!(c->src_ranges.nb_ranges == 1        &&
@@ -1345,9 +1353,9 @@ int sws_scale_frame(SwsContext *sws, AVFrame *dst, const 
AVFrame *src)
     if (!src || !dst)
         return AVERROR(EINVAL);
 
-    if (c->frame_src) {
+    if (c->is_legacy_init) {
         /* Context has been initialized with explicit values, fall back to
-         * legacy API */
+         * legacy API behavior. */
         ret = sws_frame_start(sws, dst, src);
         if (ret < 0)
             return ret;
@@ -1516,6 +1524,9 @@ int attribute_align_arg sws_scale(SwsContext *sws,
                                   const int dstStride[])
 {
     SwsInternal *c = sws_internal(sws);
+    if (!c->is_legacy_init)
+        return AVERROR(EINVAL);
+
     if (c->nb_slice_ctx) {
         sws = c->slice_ctx[0];
         c = sws_internal(sws);
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 5920f7ffad..7d5eeae203 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -697,6 +697,8 @@ struct SwsInternal {
 
     // Hardware specific private data
     void *hw_priv; /* refstruct */
+
+    int is_legacy_init;
 };
 //FIXME check init (where 0)
 
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 8a3462c4a3..b21e36df46 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -1885,6 +1885,7 @@ av_cold int sws_init_context(SwsContext *sws, SwsFilter 
*srcFilter,
     enum AVPixelFormat src_format, dst_format;
     int ret;
 
+    c->is_legacy_init = 1;
     c->frame_src = av_frame_alloc();
     c->frame_dst = av_frame_alloc();
     if (!c->frame_src || !c->frame_dst)
@@ -2254,6 +2255,11 @@ void sws_freeContext(SwsContext *sws)
     for (i = 0; i < FF_ARRAY_ELEMS(c->graph); i++)
         ff_sws_graph_free(&c->graph[i]);
 
+    if (!c->is_legacy_init) {
+        av_free(c);
+        return;
+    }
+
     for (i = 0; i < c->nb_slice_ctx; i++)
         sws_freeContext(c->slice_ctx[i]);
     av_freep(&c->slice_ctx);

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to