Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (8)
......@@ -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;
......
......@@ -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) \
......
......@@ -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',
......
......@@ -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 );
......
/*****************************************************************************
* 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 *);
......@@ -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
......