[vlc-commits] [Git][videolan/vlc][master] 8 commits: Revert "vout_subpictures: ensure we have enough room for scaled SPU's"

Steve Lhomme (@robUx4) gitlab at videolan.org
Thu Jan 11 19:06:39 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
202d4ec3 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpictures: ensure we have enough room for scaled SPU's"

This reverts commit 89e14f1a03d3b9ac4a870a4b633ece47bad8995f.

- - - - -
ec5a5230 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpictures: ensure there's enough room for scaled pics after update"

This reverts commit 11ca3b2ad64256a817ad6c350f89d9051f7a80aa.

- - - - -
e52b9aa4 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpicture: use a function to ensure there's enough room for scaled pics"

This reverts commit e07d09b04a542e29fdcd5c0d22b7617b92a94443.

- - - - -
2c74cc18 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpictures: pass the region to render/scale as const"

This reverts commit dec4389e42ff9316cd70e12403080f5627565844.

- - - - -
67d4e972 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpicture: handle external scaling on all regions"

This reverts commit c3a0446270fd036605de4cf4597a0ef4bffb3b63.

- - - - -
6acdaa8d by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpicture: use a function to rescale a picture region"

This reverts commit 4df34d78c84dbb8a1135ec113ba1ebfe43e5fa78.

- - - - -
77e80d74 by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "subpicture: remove unused subpicture_region_private"

This reverts commit fe424511854e2640fe746e411258b862284cd402.

- - - - -
058ded5a by Steve Lhomme at 2024-01-11T10:16:01+00:00
Revert "vout_subpicture: handle the scaled picture version of regions internally"

This reverts commit f1c9a45bd4bcdbfd1092ee00bd233eaa0f20c249.

- - - - -


6 changed files:

- include/vlc_subpicture.h
- src/Makefile.am
- src/meson.build
- src/misc/subpicture.c
- + src/misc/subpicture.h
- src/video_output/vout_subpictures.c


Changes:

=====================================
include/vlc_subpicture.h
=====================================
@@ -85,6 +85,7 @@ struct subpicture_region_t
     vlc_rational_t  zoom_v;
 
     struct vlc_list node;             /**< for inclusion in a vlc_spu_regions */
+    subpicture_region_private_t *p_private;  /**< Private data for spu_t *only* */
 };
 
 typedef struct vlc_list vlc_spu_regions;


=====================================
src/Makefile.am
=====================================
@@ -413,6 +413,7 @@ libvlccore_la_SOURCES = \
 	misc/text_style.c \
 	misc/sort.c \
 	misc/subpicture.c \
+	misc/subpicture.h \
 	misc/medialibrary.c \
 	misc/viewpoint.c
 libvlccore_la_LIBADD = $(LIBS_libvlccore) \


=====================================
src/meson.build
=====================================
@@ -269,6 +269,7 @@ libvlccore_sources_base = files(
     'misc/text_style.c',
     'misc/sort.c',
     'misc/subpicture.c',
+    'misc/subpicture.h',
     'misc/medialibrary.c',
     'misc/viewpoint.c',
     'misc/rcu.c',


=====================================
src/misc/subpicture.c
=====================================
@@ -32,6 +32,7 @@
 #include <vlc_common.h>
 #include <vlc_image.h>
 #include <vlc_subpicture.h>
+#include "subpicture.h"
 
 struct subpicture_private_t
 {
@@ -185,6 +186,32 @@ void subpicture_Update( subpicture_t *p_subpicture,
     video_format_Copy( &p_private->dst, p_fmt_dst );
 }
 
+
+subpicture_region_private_t *subpicture_region_private_New( video_format_t *p_fmt )
+{
+    subpicture_region_private_t *p_private = malloc( sizeof(*p_private) );
+
+    if( !p_private )
+        return NULL;
+
+    if ( video_format_Copy( &p_private->fmt, p_fmt ) != VLC_SUCCESS )
+    {
+        free( p_private );
+        return NULL;
+    }
+
+    p_private->p_picture = NULL;
+    return p_private;
+}
+
+void subpicture_region_private_Delete( subpicture_region_private_t *p_private )
+{
+    if( p_private->p_picture )
+        picture_Release( p_private->p_picture );
+    video_format_Clean( &p_private->fmt );
+    free( p_private );
+}
+
 static subpicture_region_t * subpicture_region_NewInternal( void )
 {
     subpicture_region_t *p_region = calloc( 1, sizeof(*p_region ) );
@@ -288,6 +315,9 @@ void subpicture_region_Delete( subpicture_region_t *p_region )
     if( !p_region )
         return;
 
+    if( p_region->p_private )
+        subpicture_region_private_Delete( p_region->p_private );
+
     if( p_region->p_picture )
         picture_Release( p_region->p_picture );
 


=====================================
src/misc/subpicture.h
=====================================
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ * subpicture.h: Private subpicture definitions
+ *****************************************************************************
+ * Copyright (C) 2010 Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+struct subpicture_region_private_t {
+    video_format_t fmt;
+    picture_t      *p_picture;
+};
+
+subpicture_region_private_t *subpicture_region_private_New(video_format_t *);
+void subpicture_region_private_Delete(subpicture_region_private_t *);
+


=====================================
src/video_output/vout_subpictures.c
=====================================
@@ -40,6 +40,7 @@
 
 #include "../libvlc.h"
 #include "vout_internal.h"
+#include "../misc/subpicture.h"
 #include "../input/input_internal.h"
 #include "../clock/clock.h"
 
@@ -51,7 +52,6 @@
 typedef struct {
     /* Shared with prerendering thread */
     subpicture_t *subpic; /* picture to be rendered */
-    struct VLC_VECTOR(picture_t *) scaled_region_pics;
     /* */
     vlc_tick_t orgstart; /* original picture timestamp, for conversion updates */
     vlc_tick_t orgstop;
@@ -152,7 +152,6 @@ static int spu_channel_Push(struct spu_channel *channel, subpicture_t *subpic,
 {
     const spu_render_entry_t entry = {
         .subpic = subpic,
-        .scaled_region_pics = VLC_VECTOR_INITIALIZER,
         .orgstart = orgstart,
         .orgstop = orgstop,
         .start = subpic->i_start,
@@ -165,14 +164,6 @@ static void spu_Channel_CleanEntry(spu_private_t *sys, spu_render_entry_t *entry
 {
     assert(entry->subpic);
 
-    picture_t *pic;
-    vlc_vector_foreach(pic, &entry->scaled_region_pics)
-    {
-        if (pic != NULL)
-            picture_Release(pic);
-    }
-    vlc_vector_clear(&entry->scaled_region_pics);
-
     spu_PrerenderCancel(sys, entry->subpic);
     subpicture_Delete(entry->subpic);
 }
@@ -683,22 +674,6 @@ spu_render_entry_IsSelected(spu_render_entry_t *render_entry, size_t channel_id,
     return true;
 }
 
-static int spu_entry_EnsureScaledSize(spu_render_entry_t *render_entry)
-{
-    const subpicture_t *subpic = render_entry->subpic;
-    size_t region_count = 0;
-    const subpicture_region_t *r;
-    vlc_spu_regions_foreach_const(r, &subpic->regions)
-        region_count++;
-
-    while (region_count > render_entry->scaled_region_pics.size)
-    {
-        if (unlikely(!vlc_vector_push(&render_entry->scaled_region_pics, NULL)))
-            return VLC_ENOMEM;
-    }
-    return VLC_SUCCESS;
-}
-
 /*****************************************************************************
  * spu_SelectSubpictures: find the subpictures to display
  *****************************************************************************
@@ -811,12 +786,6 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
                     is_rejected = true;
             }
 
-            if (!is_rejected)
-            {
-                if (unlikely(spu_entry_EnsureScaledSize(render_entry) != VLC_SUCCESS))
-                    is_rejected = true;
-            }
-
             if (is_rejected)
             {
                 spu_Channel_CleanEntry(sys, render_entry);
@@ -840,129 +809,14 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
     return subpicture_array;
 }
 
-static void SpuRescaleRegion(spu_t *spu,
-                             const subpicture_region_t *region,
-                             picture_t **scaled_pic,
-                             const spu_scale_t scale_size,
-                             bool changed_palette, bool using_palette,
-                             const vlc_fourcc_t *chroma_list)
-{
-    spu_private_t *sys = spu->p;
 
-    bool convert_chroma = true;
-    for (int i = 0; chroma_list[i] && convert_chroma; i++) {
-        if (region->fmt.i_chroma == chroma_list[i])
-            convert_chroma = false;
-    }
-
-    /* Scale from rendered size to destination size */
-    if (scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT || convert_chroma)
-    {
-        const unsigned dst_width  = spu_scale_w(region->fmt.i_visible_width,  scale_size);
-        const unsigned dst_height = spu_scale_h(region->fmt.i_visible_height, scale_size);
-
-        /* Destroy the cache if unusable */
-        if (*scaled_pic) {
-            picture_t *private = *scaled_pic;
-            bool is_changed = false;
-
-            /* Check resize changes */
-            if (dst_width  != private->format.i_visible_width ||
-                dst_height != private->format.i_visible_height)
-                is_changed = true;
-
-            /* Check forced palette changes */
-            if (changed_palette)
-                is_changed = true;
-
-            if (convert_chroma && private->format.i_chroma != chroma_list[0])
-                is_changed = true;
-
-            if (is_changed) {
-                picture_Release(*scaled_pic);
-                *scaled_pic = NULL;
-            }
-        }
-
-        /* Scale if needed into cache */
-        if (!*scaled_pic && dst_width > 0 && dst_height > 0) {
-            filter_t *scale = sys->scale;
-
-            picture_t *picture = region->p_picture;
-            picture_Hold(picture);
-
-            /* Convert YUVP to YUVA/RGBA first for better scaling quality */
-            if (using_palette) {
-                filter_t *scale_yuvp = sys->scale_yuvp;
-
-                scale_yuvp->fmt_in.video = region->fmt;
-
-                scale_yuvp->fmt_out.video = region->fmt;
-                scale_yuvp->fmt_out.video.i_chroma = chroma_list[0];
-                scale_yuvp->fmt_out.video.p_palette = NULL;
-
-                picture = scale_yuvp->ops->filter_video(scale_yuvp, picture);
-
-                scale_yuvp->fmt_in.video.p_palette = NULL;
-                assert(picture == NULL || !picture_HasChainedPics(picture)); // no chaining
-                if (!picture) {
-                    /* Well we will try conversion+scaling */
-                    msg_Warn(spu, "%4.4s to %4.4s conversion failed",
-                             (const char*)&scale_yuvp->fmt_in.video.i_chroma,
-                             (const char*)&scale_yuvp->fmt_out.video.i_chroma);
-                }
-            }
-
-            /* Conversion(except from YUVP)/Scaling */
-            if (picture &&
-                (picture->format.i_visible_width  != dst_width ||
-                 picture->format.i_visible_height != dst_height ||
-                 (convert_chroma && !using_palette)))
-            {
-                scale->fmt_in.video  = picture->format;
-                scale->fmt_out.video = picture->format;
-                if (using_palette)
-                {
-                    scale->fmt_in.video.i_chroma = chroma_list[0];
-                }
-                if (convert_chroma)
-                {
-                    scale->fmt_out.i_codec        =
-                    scale->fmt_out.video.i_chroma = chroma_list[0];
-                }
-
-                scale->fmt_out.video.i_width  = dst_width;
-                scale->fmt_out.video.i_height = dst_height;
-
-                scale->fmt_out.video.i_visible_width =
-                    spu_scale_w(region->fmt.i_visible_width, scale_size);
-                scale->fmt_out.video.i_visible_height =
-                    spu_scale_h(region->fmt.i_visible_height, scale_size);
-
-                picture = scale->ops->filter_video(scale, picture);
-                assert(picture == NULL || !picture_HasChainedPics(picture)); // no chaining
-                if (!picture)
-                    msg_Err(spu, "scaling failed");
-            }
-
-            /* */
-            if (picture) {
-                if (*scaled_pic)
-                    picture_Release(picture);
-                *scaled_pic = picture;
-            }
-        }
-    }
-}
 
 /**
  * It will transform the provided region into another region suitable for rendering.
  */
 static subpicture_region_t *SpuRenderRegion(spu_t *spu,
                             spu_area_t *dst_area,
-                            const spu_render_entry_t *entry,
-                            const subpicture_region_t *region,
-                            picture_t **scaled_pic,
+                            const spu_render_entry_t *entry, subpicture_region_t *region,
                             const spu_scale_t scale_size,
                             const vlc_fourcc_t *chroma_list,
                             const video_format_t *fmt,
@@ -1106,19 +960,121 @@ static subpicture_region_t *SpuRenderRegion(spu_t *spu,
     }
 
     /* */
-    SpuRescaleRegion( spu, region, scaled_pic, scale_size,
-                      changed_palette, using_palette,
-                      chroma_list );
+    region_fmt = region->fmt;
+    region_picture = region->p_picture;
 
-    if (*scaled_pic == NULL)
-    {
-        region_fmt = region->fmt;
-        region_picture = region->p_picture;
+    bool convert_chroma = true;
+    for (int i = 0; chroma_list[i] && convert_chroma; i++) {
+        if (region_fmt.i_chroma == chroma_list[i])
+            convert_chroma = false;
     }
-    else
+
+    /* Scale from rendered size to destination size */
+    if (scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT || convert_chroma)
     {
-        region_picture = *scaled_pic;
-        region_fmt = region_picture->format;
+        const unsigned dst_width  = spu_scale_w(region->fmt.i_visible_width,  scale_size);
+        const unsigned dst_height = spu_scale_h(region->fmt.i_visible_height, scale_size);
+
+        /* Destroy the cache if unusable */
+        if (region->p_private) {
+            subpicture_region_private_t *private = region->p_private;
+            bool is_changed = false;
+
+            /* Check resize changes */
+            if (dst_width  != private->fmt.i_visible_width ||
+                dst_height != private->fmt.i_visible_height)
+                is_changed = true;
+
+            /* Check forced palette changes */
+            if (changed_palette)
+                is_changed = true;
+
+            if (convert_chroma && private->fmt.i_chroma != chroma_list[0])
+                is_changed = true;
+
+            if (is_changed) {
+                subpicture_region_private_Delete(private);
+                region->p_private = NULL;
+            }
+        }
+
+        /* Scale if needed into cache */
+        if (!region->p_private && dst_width > 0 && dst_height > 0) {
+            filter_t *scale = sys->scale;
+
+            picture_t *picture = region->p_picture;
+            picture_Hold(picture);
+
+            /* Convert YUVP to YUVA/RGBA first for better scaling quality */
+            if (using_palette) {
+                filter_t *scale_yuvp = sys->scale_yuvp;
+
+                scale_yuvp->fmt_in.video = region->fmt;
+
+                scale_yuvp->fmt_out.video = region->fmt;
+                scale_yuvp->fmt_out.video.i_chroma = chroma_list[0];
+                scale_yuvp->fmt_out.video.p_palette = NULL;
+
+                picture = scale_yuvp->ops->filter_video(scale_yuvp, picture);
+
+                scale_yuvp->fmt_in.video.p_palette = NULL;
+                assert(picture == NULL || !picture_HasChainedPics(picture)); // no chaining
+                if (!picture) {
+                    /* Well we will try conversion+scaling */
+                    msg_Warn(spu, "%4.4s to %4.4s conversion failed",
+                             (const char*)&scale_yuvp->fmt_in.video.i_chroma,
+                             (const char*)&scale_yuvp->fmt_out.video.i_chroma);
+                }
+            }
+
+            /* Conversion(except from YUVP)/Scaling */
+            if (picture &&
+                (picture->format.i_visible_width  != dst_width ||
+                 picture->format.i_visible_height != dst_height ||
+                 (convert_chroma && !using_palette)))
+            {
+                scale->fmt_in.video  = picture->format;
+                scale->fmt_out.video = picture->format;
+                if (using_palette)
+                {
+                    scale->fmt_in.video.i_chroma = chroma_list[0];
+                }
+                if (convert_chroma)
+                {
+                    scale->fmt_out.i_codec        =
+                    scale->fmt_out.video.i_chroma = chroma_list[0];
+                }
+
+                scale->fmt_out.video.i_width  = dst_width;
+                scale->fmt_out.video.i_height = dst_height;
+
+                scale->fmt_out.video.i_visible_width =
+                    spu_scale_w(region->fmt.i_visible_width, scale_size);
+                scale->fmt_out.video.i_visible_height =
+                    spu_scale_h(region->fmt.i_visible_height, scale_size);
+
+                picture = scale->ops->filter_video(scale, picture);
+                assert(picture == NULL || !picture_HasChainedPics(picture)); // no chaining
+                if (!picture)
+                    msg_Err(spu, "scaling failed");
+            }
+
+            /* */
+            if (picture) {
+                region->p_private = subpicture_region_private_New(&picture->format);
+                if (region->p_private) {
+                    region->p_private->p_picture = picture;
+                } else {
+                    picture_Release(picture);
+                }
+            }
+        }
+
+        /* And use the scaled picture */
+        if (region->p_private) {
+            region_fmt     = region->p_private->fmt;
+            region_picture = region->p_private->p_picture;
+        }
     }
 
     /* Force cropping if requested */
@@ -1275,16 +1231,12 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
         vlc_spu_regions_foreach(region, &subpic->regions)
             region_FixFmt(region);
 
-        size_t region_idx = 0;
         /* Render all regions
          * We always transform non absolute subtitle into absolute one on the
          * first rendering to allow good subtitle overlap support.
          */
         vlc_spu_regions_foreach(region, &subpic->regions) {
             spu_area_t area;
-            assert(region_idx < entry->scaled_region_pics.size);
-            picture_t **scaled_region_pic = &entry->scaled_region_pics.data[region_idx];
-            region_idx++;
 
             /* Compute region scale AR */
             vlc_rational_t region_sar = (vlc_rational_t) {
@@ -1340,11 +1292,12 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
                 region_FixFmt(rendered_text);
             }
 
+            const bool do_external_scale = external_scale && !subpicture_region_IsText( region );
             spu_scale_t virtual_scale = external_scale ? (spu_scale_t){ SCALE_UNIT, SCALE_UNIT } : scale;
 
             /* */
             output_last_ptr = SpuRenderRegion(spu, &area,
-                            entry, rendered_region, scaled_region_pic, virtual_scale,
+                            entry, rendered_region, virtual_scale,
                             chroma_list, fmt_dst,
                             subtitle_area, subtitle_area_count,
                             subpic->b_subtitle ? render_subtitle_date : system_now);
@@ -1353,7 +1306,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
             if (unlikely(output_last_ptr == NULL))
                 continue;
 
-            if (external_scale)
+            if (do_external_scale)
             {
                 if (scale.h != SCALE_UNIT)
                 {
@@ -1969,6 +1922,11 @@ void spu_PutSubpicture(spu_t *spu, subpicture_t *subpic)
     if (subpic->i_channel == VOUT_SPU_CHANNEL_OSD)
         spu_ClearChannel(spu, VOUT_SPU_CHANNEL_OSD);
 
+    /* p_private is for spu only and cannot be non NULL here */
+    subpicture_region_t *r;
+    vlc_spu_regions_foreach(r, &subpic->regions)
+        assert(r->p_private == NULL);
+
     /* */
     vlc_mutex_lock(&sys->lock);
     struct spu_channel *channel = spu_GetChannel(spu, subpic->i_channel, NULL);
@@ -2125,13 +2083,6 @@ vlc_render_subpicture *spu_Render(spu_t *spu,
         subpicture_Update(subpic,
                           fmt_src, fmt_dst,
                           subpic->b_subtitle ? render_subtitle_date : system_now);
-
-        if (unlikely(spu_entry_EnsureScaledSize(entry) != VLC_SUCCESS))
-        {
-            free(subpicture_array);
-            vlc_mutex_unlock(&sys->lock);
-            return NULL;
-        }
     }
 
     /* Now order the subpicture array



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e3bcd78b3d6c7eb024863357440b325add0c9ebf...058ded5ac0047935724fab69aac0f04699cfd6da

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e3bcd78b3d6c7eb024863357440b325add0c9ebf...058ded5ac0047935724fab69aac0f04699cfd6da
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list