[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