[vlc-commits] [Git][videolan/vlc][master] 2 commits: vout_subpicture: handle the scaled picture version of regions internally

Steve Lhomme (@robUx4) gitlab at videolan.org
Fri Nov 17 21:00:01 UTC 2023



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
f1c9a45b by Steve Lhomme at 2023-11-17T20:44:32+00:00
vout_subpicture: handle the scaled picture version of regions internally

- - - - -
fe424511 by Steve Lhomme at 2023-11-17T20:44:32+00:00
subpicture: remove unused subpicture_region_private

- - - - -


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,7 +85,6 @@ 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
=====================================
@@ -414,7 +414,6 @@ 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
=====================================
@@ -270,7 +270,6 @@ 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,7 +32,6 @@
 #include <vlc_common.h>
 #include <vlc_image.h>
 #include <vlc_subpicture.h>
-#include "subpicture.h"
 
 struct subpicture_private_t
 {
@@ -186,32 +185,6 @@ 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 ) );
@@ -315,9 +288,6 @@ 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 deleted
=====================================
@@ -1,30 +0,0 @@
-/*****************************************************************************
- * 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,7 +40,6 @@
 
 #include "../libvlc.h"
 #include "vout_internal.h"
-#include "../misc/subpicture.h"
 #include "../input/input_internal.h"
 #include "../clock/clock.h"
 
@@ -52,6 +51,7 @@
 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,6 +152,7 @@ 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,
@@ -166,6 +167,15 @@ static void spu_channel_Clean(spu_private_t *sys, struct spu_channel *channel)
     vlc_vector_foreach_ref(entry, &channel->entries)
     {
         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);
     }
@@ -751,6 +761,23 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
                     is_rejected = true;
             }
 
+            if (!is_rejected)
+            {
+                size_t region_count = 0;
+                const subpicture_region_t *r;
+                vlc_spu_regions_foreach(r, &current->regions)
+                    region_count++;
+
+                while (region_count > render_entry->scaled_region_pics.size)
+                {
+                    if (!vlc_vector_push(&render_entry->scaled_region_pics, NULL))
+                    {
+                        is_rejected = true;
+                        break;
+                    }
+                }
+            }
+
             if (is_rejected)
             {
                 spu_PrerenderCancel(sys, current);
@@ -782,7 +809,9 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
  */
 static subpicture_region_t *SpuRenderRegion(spu_t *spu,
                             spu_area_t *dst_area,
-                            const spu_render_entry_t *entry, subpicture_region_t *region,
+                            const spu_render_entry_t *entry,
+                            subpicture_region_t *region,
+                            picture_t **scaled_pic,
                             const spu_scale_t scale_size,
                             const vlc_fourcc_t *chroma_list,
                             const video_format_t *fmt,
@@ -959,30 +988,30 @@ static subpicture_region_t *SpuRenderRegion(spu_t *spu,
         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;
+        if (*scaled_pic) {
+            picture_t *private = *scaled_pic;
             bool is_changed = false;
 
             /* Check resize changes */
-            if (dst_width  != private->fmt.i_visible_width ||
-                dst_height != private->fmt.i_visible_height)
+            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->fmt.i_chroma != chroma_list[0])
+            if (convert_chroma && private->format.i_chroma != chroma_list[0])
                 is_changed = true;
 
             if (is_changed) {
-                subpicture_region_private_Delete(private);
-                region->p_private = NULL;
+                picture_Release(*scaled_pic);
+                *scaled_pic = NULL;
             }
         }
 
         /* Scale if needed into cache */
-        if (!region->p_private && dst_width > 0 && dst_height > 0) {
+        if (!*scaled_pic && dst_width > 0 && dst_height > 0) {
             filter_t *scale = sys->scale;
 
             picture_t *picture = region->p_picture;
@@ -1044,19 +1073,16 @@ static subpicture_region_t *SpuRenderRegion(spu_t *spu,
 
             /* */
             if (picture) {
-                region->p_private = subpicture_region_private_New(&picture->format);
-                if (region->p_private) {
-                    region->p_private->p_picture = picture;
-                } else {
+                if (*scaled_pic)
                     picture_Release(picture);
-                }
+                *scaled_pic = picture;
             }
         }
 
         /* And use the scaled picture */
-        if (region->p_private) {
-            region_fmt     = region->p_private->fmt;
-            region_picture = region->p_private->p_picture;
+        if (*scaled_pic) {
+            region_fmt     = (*scaled_pic)->format;
+            region_picture = *scaled_pic;
         }
     }
 
@@ -1208,12 +1234,15 @@ 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;
+            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) {
@@ -1259,7 +1288,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
 
             /* */
             output_last_ptr = SpuRenderRegion(spu, &area,
-                            entry, region, virtual_scale,
+                            entry, region, scaled_region_pic, virtual_scale,
                             chroma_list, fmt_dst,
                             i_original_width, i_original_height,
                             subtitle_area, subtitle_area_count,
@@ -1896,11 +1925,6 @@ 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);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/4397478b7bca9395e70f41fbcbae8c0078429f60...fe424511854e2640fe746e411258b862284cd402

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/4397478b7bca9395e70f41fbcbae8c0078429f60...fe424511854e2640fe746e411258b862284cd402
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