[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