[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, ¤t->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