[vlc-commits] [Git][videolan/vlc][master] vout: invalidate spu cache if original params have changed
Steve Lhomme (@robUx4)
gitlab at videolan.org
Wed Jul 8 07:21:11 UTC 2026
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
ca9547fc by François Cartegnie at 2026-07-08T07:07:00+00:00
vout: invalidate spu cache if original params have changed
- - - - -
1 changed file:
- src/video_output/vout_subpictures.c
Changes:
=====================================
src/video_output/vout_subpictures.c
=====================================
@@ -81,6 +81,18 @@ struct subtitle_position_cache
const subpicture_region_t *region;
int x, y;
bool is_active;
+ struct {
+ unsigned original_width;
+ unsigned original_height;
+ unsigned visible_width;
+ unsigned visible_height;
+ bool b_in_window;
+ int i_x;
+ int i_y;
+ int i_align;
+ int i_max_width;
+ int i_max_height;
+ } key;
};
typedef struct VLC_VECTOR(struct subtitle_position_cache) subtitles_positions_vector;
@@ -636,14 +648,32 @@ static void subtitles_positions_FinishUpdate(subtitles_positions_vector *subs)
}
}
+static bool subtitle_position_cache_Matches(const struct subtitle_position_cache *pos,
+ const subpicture_t *subpic,
+ const subpicture_region_t *region)
+{
+ return pos->region == region &&
+ pos->key.original_width == subpic->i_original_picture_width &&
+ pos->key.original_height == subpic->i_original_picture_height &&
+ pos->key.visible_width == region->fmt.i_visible_width &&
+ pos->key.visible_height == region->fmt.i_visible_height &&
+ pos->key.b_in_window == region->b_in_window &&
+ pos->key.i_x == region->i_x &&
+ pos->key.i_y == region->i_y &&
+ pos->key.i_align == region->i_align &&
+ pos->key.i_max_width == region->i_max_width &&
+ pos->key.i_max_height == region->i_max_height;
+}
+
static struct subtitle_position_cache *subtitles_positions_FindRelativeRegion(
const subtitles_positions_vector *subs,
+ const subpicture_t *subpic,
const subpicture_region_t *region)
{
struct subtitle_position_cache *pos;
vlc_vector_foreach_ref(pos, subs)
{
- if (pos->region == region)
+ if (subtitle_position_cache_Matches(pos, subpic, region))
{
return pos;
}
@@ -652,6 +682,7 @@ static struct subtitle_position_cache *subtitles_positions_FindRelativeRegion(
}
static void subtitles_positions_AddRelativeRegion(subtitles_positions_vector *subs,
+ const subpicture_t *subpic,
const subpicture_region_t *region,
const spu_area_t *area,
struct subtitle_position_cache *write)
@@ -673,6 +704,17 @@ static void subtitles_positions_AddRelativeRegion(subtitles_positions_vector *su
write->is_active = true;
write->x = area->x;
write->y = area->y;
+ // Set cache invalidation key values
+ write->key.original_width = subpic->i_original_picture_width;
+ write->key.original_height = subpic->i_original_picture_height;
+ write->key.visible_width = region->fmt.i_visible_width;
+ write->key.visible_height = region->fmt.i_visible_height;
+ write->key.b_in_window = region->b_in_window;
+ write->key.i_x = region->i_x;
+ write->key.i_y = region->i_y;
+ write->key.i_align = region->i_align;
+ write->key.i_max_width = region->i_max_width;
+ write->key.i_max_height = region->i_max_height;
}
/**
@@ -1464,7 +1506,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
if (subpic->b_subtitle && !region->b_absolute)
{
cache_pos =
- subtitles_positions_FindRelativeRegion(&sys->subs_pos, region);
+ subtitles_positions_FindRelativeRegion(&sys->subs_pos, subpic, region);
if (cache_pos != NULL)
{
region->i_x = cache_pos->x;
@@ -1512,7 +1554,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
{
if (!external_scale)
area = spu_area_unscaled(area, scale);
- subtitles_positions_AddRelativeRegion(&sys->subs_pos, region, &area, cache_pos);
+ subtitles_positions_AddRelativeRegion(&sys->subs_pos, subpic, region, &area, cache_pos);
}
}
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/ca9547fc06003c58482fe5c2ee2844e09e2baf3d
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/ca9547fc06003c58482fe5c2ee2844e09e2baf3d
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help
More information about the vlc-commits
mailing list