[vlc-commits] [Git][videolan/vlc][master] vlc_subpicture: rework cache/priv

Steve Lhomme (@robUx4) gitlab at videolan.org
Tue Feb 4 09:04:04 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
f2f31340 by François Cartegnie at 2025-02-04T08:46:11+00:00
vlc_subpicture: rework cache/priv

- - - - -


4 changed files:

- include/vlc_subpicture.h
- src/misc/subpicture.c
- src/misc/subpicture.h
- src/video_output/vout_subpictures.c


Changes:

=====================================
include/vlc_subpicture.h
=====================================
@@ -47,7 +47,6 @@
 /**
  * Video subtitle region spu core private
  */
-typedef struct subpicture_region_private_t subpicture_region_private_t;
 typedef struct vlc_spu_highlight_t vlc_spu_highlight_t;
 typedef struct filter_t vlc_blender_t;
 
@@ -85,7 +84,6 @@ struct subpicture_region_t
     int             i_max_height;    /** vertical rendering/cropping target/limit */
 
     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/misc/subpicture.c
=====================================
@@ -199,43 +199,62 @@ void subpicture_Update( subpicture_t *p_subpicture,
     video_format_Copy( &p_private->dst, p_fmt_dst );
 }
 
+typedef struct subpicture_region_private_t
+{
+    subpicture_region_t region;
+    video_format_t fmt;
+    picture_t *p_picture;
+} subpicture_region_private_t;
 
-subpicture_region_private_t *subpicture_region_private_New( video_format_t *p_fmt )
+const video_format_t * subpicture_region_cache_GetFormat( const subpicture_region_t *p_region )
 {
-    subpicture_region_private_t *p_private = malloc( sizeof(*p_private) );
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+    return &p_priv->fmt;
+}
 
-    if( !p_private )
-        return NULL;
+picture_t * subpicture_region_cache_GetPicture( subpicture_region_t *p_region )
+{
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+    return p_priv->p_picture;
+}
 
-    if ( video_format_Copy( &p_private->fmt, p_fmt ) != VLC_SUCCESS )
+bool subpicture_region_cache_IsValid(const subpicture_region_t *p_region)
+{
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+    return p_priv->fmt.i_chroma;
+}
+void subpicture_region_cache_Invalidate( subpicture_region_t *p_region )
+{
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+    if( p_priv->p_picture )
     {
-        free( p_private );
-        return NULL;
+        picture_Release( p_priv->p_picture );
+        p_priv->p_picture = NULL;
     }
-
-    p_private->p_picture = NULL;
-    return p_private;
+    video_format_Clean( &p_priv->fmt );
+    video_format_Init( &p_priv->fmt, 0 );
 }
 
-void subpicture_region_private_Delete( subpicture_region_private_t *p_private )
+int subpicture_region_cache_Assign( subpicture_region_t *p_region, picture_t *p_picture )
 {
-    if( p_private->p_picture )
-        picture_Release( p_private->p_picture );
-    video_format_Clean( &p_private->fmt );
-    free( p_private );
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+    if ( video_format_Copy( &p_priv->fmt, &p_picture->format ) != VLC_SUCCESS )
+        return VLC_EGENERIC;
+    p_priv->p_picture = p_picture;
+    return VLC_SUCCESS;
 }
 
 static subpicture_region_t * subpicture_region_NewInternal( void )
 {
-    subpicture_region_t *p_region = calloc( 1, sizeof(*p_region ) );
+    subpicture_region_private_t *p_region = calloc( 1, sizeof(subpicture_region_private_t) );
     if( unlikely(p_region == NULL) )
         return NULL;
 
-    p_region->i_alpha = 0xff;
-    p_region->i_x = INT_MAX;
-    p_region->i_y = INT_MAX;
+    p_region->region.i_alpha = 0xff;
+    p_region->region.i_x = INT_MAX;
+    p_region->region.i_y = INT_MAX;
 
-    return p_region;
+    return &p_region->region;
 }
 
 subpicture_region_t *subpicture_region_New( const video_format_t *p_fmt )
@@ -333,15 +352,16 @@ 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 );
+    subpicture_region_private_t *p_priv = container_of(p_region, subpicture_region_private_t, region);
+
+    subpicture_region_cache_Invalidate( p_region );
 
     if( p_region->p_picture )
         picture_Release( p_region->p_picture );
 
     text_segment_ChainDelete( p_region->p_text );
     video_format_Clean( &p_region->fmt );
-    free( p_region );
+    free( p_priv );
 }
 
 void vlc_spu_regions_Clear( vlc_spu_regions *regions )


=====================================
src/misc/subpicture.h
=====================================
@@ -20,11 +20,8 @@
  * 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 *);
-
+picture_t * subpicture_region_cache_GetPicture( subpicture_region_t * );
+void subpicture_region_cache_Invalidate( subpicture_region_t * );
+const video_format_t * subpicture_region_cache_GetFormat( const subpicture_region_t * );
+int subpicture_region_cache_Assign( subpicture_region_t *p_region, picture_t * );
+bool subpicture_region_cache_IsValid(const subpicture_region_t *);


=====================================
src/video_output/vout_subpictures.c
=====================================
@@ -1119,30 +1119,30 @@ static struct subpicture_region_rendered *SpuRenderRegion(spu_t *spu,
     if ((apply_scale && (scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT)) || convert_chroma)
     {
         /* Destroy the cache if unusable */
-        if (region->p_private) {
-            subpicture_region_private_t *private = region->p_private;
+        if (!subpicture_region_cache_IsValid(region)) {
+            const video_format_t *cachefmt = subpicture_region_cache_GetFormat(region);
             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  != cachefmt->i_visible_width ||
+                dst_height != cachefmt->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 && cachefmt->i_chroma != chroma_list[0])
                 is_changed = true;
 
             if (is_changed) {
-                subpicture_region_private_Delete(private);
-                region->p_private = NULL;
+                subpicture_region_cache_Invalidate(region);
             }
         }
 
         /* Scale if needed into cache */
-        if (!region->p_private) {
+        if (!subpicture_region_cache_IsValid(region)) {
+
             picture_t *picture = region->p_picture;
             picture_Hold(picture);
 
@@ -1201,19 +1201,15 @@ static struct subpicture_region_rendered *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(subpicture_region_cache_Assign(region, picture) != VLC_SUCCESS)
                     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;
+        if (subpicture_region_cache_IsValid(region)) {
+            region_fmt     = *subpicture_region_cache_GetFormat(region);
+            region_picture = subpicture_region_cache_GetPicture(region);
         }
     }
 
@@ -2130,7 +2126,7 @@ void spu_PutSubpicture(spu_t *spu, subpicture_t *subpic)
     /* 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);
+        assert(!subpicture_region_cache_IsValid(r));
 
     /* */
     vlc_mutex_lock(&sys->lock);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/f2f31340bb5e6718fbf3a73361e2f2e3503a5399

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/f2f31340bb5e6718fbf3a73361e2f2e3503a5399
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