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
  • Thrillseekr/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
400 results
Show changes
Commits on Source (11)
......@@ -31,6 +31,8 @@
#include <vlc_picture.h>
#include <vlc_text_style.h>
#include <vlc_list.h>
#include <vlc_vector.h>
#include <vlc_vout_display.h>
/**
* \defgroup subpicture Video sub-pictures
......@@ -81,9 +83,6 @@ struct subpicture_region_t
int i_max_width; /** horizontal rendering/cropping target/limit */
int i_max_height; /** vertical rendering/cropping target/limit */
vlc_rational_t zoom_h;
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* */
};
......@@ -206,9 +205,21 @@ typedef struct
typedef struct subpicture_private_t subpicture_private_t;
struct subpicture_region_rendered
{
picture_t *p_picture; /**< picture comprising this region */
unsigned source_offset_x;
unsigned source_offset_y;
vout_display_place_t place; // position of region, relative to alignment
int i_alpha; /**< transparency */
vlc_rational_t zoom_h;
vlc_rational_t zoom_v;
};
struct vlc_render_subpicture
{
vlc_spu_regions regions; /**< list of regions to render */
struct VLC_VECTOR(struct subpicture_region_rendered *) regions; /**< list of regions to render */
int64_t i_order; /** an increasing unique number */
unsigned i_original_picture_width; /**< original width of the movie */
unsigned i_original_picture_height;/**< original height of the movie */
......
......@@ -1670,8 +1670,6 @@ static void subpictureUpdaterUpdate(subpicture_t *p_subpic,
// fields not modified on the source
p_dst->i_align = p_src->i_align;
p_dst->i_alpha = p_src->i_alpha;
p_dst->zoom_h = p_src->zoom_h;
p_dst->zoom_v = p_src->zoom_v;
vlc_spu_regions_push(&p_subpic->regions, p_dst);
}
......
......@@ -744,17 +744,17 @@ static int attach_subpics(vout_display_t * const vd, vout_display_sys_t * const
}
// Attempt to import the subpics
const subpicture_region_t *sreg;
vlc_spu_regions_foreach_const(sreg, &spic->regions) {
picture_t *const src = sreg->p_picture;
const struct subpicture_region_rendered *r;
vlc_vector_foreach(r, &spic->regions) {
picture_t *const src = r->p_picture;
// At this point I think the subtitles are being placed in the
// coord space of the cfg rectangle
if ((sys->subpic_bufs[n] = hw_mmal_vzc_buf_from_pic(sys->vzc,
src,
(MMAL_RECT_T){.width = vd->cfg->display.width, .height=vd->cfg->display.height},
sreg->i_x, sreg->i_y,
sreg->i_alpha,
r->place.x, r->place.y,
r->i_alpha,
n == 0)) == NULL)
{
msg_Err(vd, "Failed to allocate vzc buffer for subpic");
......
......@@ -132,10 +132,8 @@ static bool subpicture_NeedDraw(vout_display_t *vd,
sub->clear = true;
const subpicture_region_t *r;
size_t count = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
count++;
size_t count = subpicture->regions.size;
const struct subpicture_region_rendered *r;
if (subpicture->i_order != sub->last_order)
{
......@@ -149,12 +147,12 @@ static bool subpicture_NeedDraw(vout_display_t *vd,
if (count == sub->regions.size)
{
size_t i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
vlc_vector_foreach(r, &subpicture->regions)
{
struct sub_region *cmp = &sub->regions.data[i++];
if (cmp->x != r->i_x || cmp->y != r->i_y
|| cmp->width != r->fmt.i_visible_width
|| cmp->height != r->fmt.i_visible_height)
if (cmp->x != r->place.x || cmp->y != r->place.y
|| cmp->width != r->place.width
|| cmp->height != r->place.height)
{
/* Subpicture regions are different */
draw = true;
......@@ -179,13 +177,13 @@ end:
sub->regions.size = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
vlc_vector_foreach(r, &subpicture->regions)
{
struct sub_region reg = {
.x = r->i_x,
.y = r->i_y,
.width = r->fmt.i_visible_width,
.height = r->fmt.i_visible_height,
.x = r->place.x,
.y = r->place.y,
.width = r->place.width,
.height = r->place.height,
};
bool res = vlc_vector_push(&sub->regions, reg);
/* Already checked with vlc_vector_reserve */
......
......@@ -405,19 +405,19 @@ static void RenderPicture(vout_display_t *vd, picture_t *pic, vlc_tick_t date) {
static CGRect RegionBackingFrame(VLCSampleBufferDisplay* sys,
const vlc_render_subpicture *subpicture,
const subpicture_region_t *r)
const struct subpicture_region_rendered *r)
{
const float scale_w = (float)(sys->place.width) / subpicture->i_original_picture_width;
const float scale_h = (float)(sys->place.height) / subpicture->i_original_picture_height;
// Invert y coords for CoreGraphics
const float y = subpicture->i_original_picture_height - r->fmt.i_visible_height - r->i_y;
const float y = subpicture->i_original_picture_height - r->place.height - r->place.y;
return CGRectMake(
scale_w * r->i_x + sys->place.x,
scale_w * r->place.x + sys->place.x,
scale_h * y + sys->place.y,
scale_w * r->fmt.i_visible_width,
scale_h * r->fmt.i_visible_height
scale_w * r->place.width,
scale_h * r->place.height
);
}
......@@ -432,12 +432,12 @@ static void UpdateSubpictureRegions(vout_display_t *vd,
NSMutableArray *regions = [NSMutableArray new];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions) {
const struct subpicture_region_rendered *r;
vlc_vector_foreach(r, &subpicture->regions) {
CFIndex length = r->p_picture->format.i_height * r->p_picture->p->i_pitch;
const size_t pixels_offset =
r->fmt.i_y_offset * r->p_picture->p->i_pitch +
r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
r->source_offset_y * r->p_picture->p->i_pitch +
r->source_offset_x * r->p_picture->p->i_pixel_pitch;
CFDataRef data = CFDataCreate(
NULL,
......@@ -445,7 +445,7 @@ static void UpdateSubpictureRegions(vout_display_t *vd,
length - pixels_offset);
CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
CGImageRef image = CGImageCreate(
r->fmt.i_visible_width, r->fmt.i_visible_height,
r->place.width, r->place.height,
8, 32, r->p_picture->p->i_pitch,
space, kCGImageAlphaFirst,
provider, NULL, true, kCGRenderingIntentDefault
......@@ -479,10 +479,8 @@ static bool IsSubpictureDrawNeeded(vout_display_t *vd, const vlc_render_subpictu
return true;
}
size_t count = 0;
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
count++;
size_t count = subpicture->regions.size;
const struct subpicture_region_rendered *r;
if (!sys.subpicture || subpicture->i_order != sys.subpicture.order)
{
......@@ -499,7 +497,7 @@ static bool IsSubpictureDrawNeeded(vout_display_t *vd, const vlc_render_subpictu
if (count == sys.subpicture.regions.count)
{
size_t i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
vlc_vector_foreach(r, &subpicture->regions)
{
VLCSampleBufferSubpictureRegion *region =
sys.subpicture.regions[i++];
......
......@@ -365,10 +365,8 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
}
if (subpicture) {
int num_regions = 0;
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
num_regions++;
int num_regions = subpicture->regions.size;
const struct subpicture_region_rendered *r;
// Grow the overlays array if needed
if (num_regions > sys->num_overlays) {
......@@ -389,7 +387,7 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
// Upload all of the regions
int i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions) {
vlc_vector_foreach(r, &subpicture->regions) {
assert(r->p_picture->i_planes == 1);
struct pl_plane_data subdata[4];
if (!vlc_placebo_PlaneData(r->p_picture, subdata, NULL))
......@@ -413,14 +411,14 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
sys->overlay_parts[i] = (struct pl_overlay_part) {
.src = {
.x1 = r->fmt.i_visible_width,
.y1 = r->fmt.i_visible_height,
.x1 = r->place.width,
.y1 = r->place.height,
},
.dst = {
.x0 = place.x + r->i_x,
.y0 = place.y + r->i_y * ysign,
.x1 = place.x + r->i_x + r->fmt.i_visible_width,
.y1 = place.y + (r->i_y + r->fmt.i_visible_height) * ysign,
.x0 = place.x + r->place.x,
.y0 = place.y + r->place.y * ysign,
.x1 = place.x + r->place.x + r->place.width,
.y1 = place.y + (r->place.y + r->place.height) * ysign,
},
};
i++;
......
......@@ -235,10 +235,8 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
gl_region_t *last = sr->regions;
if (subpicture) {
int count = 0;
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
count++;
int count = subpicture->regions.size;
const struct subpicture_region_rendered *r;
gl_region_t *regions = calloc(count, sizeof(*regions));
if (!regions)
......@@ -248,25 +246,25 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
sr->regions = regions;
int i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions) {
vlc_vector_foreach(r, &subpicture->regions) {
gl_region_t *glr = &sr->regions[i];
glr->width = r->fmt.i_visible_width;
glr->height = r->fmt.i_visible_height;
glr->width = r->p_picture->format.i_visible_width;
glr->height = r->p_picture->format.i_visible_height;
if (!sr->api->supports_npot) {
glr->width = stdc_bit_ceil((unsigned)glr->width);
glr->height = stdc_bit_ceil((unsigned)glr->height);
glr->tex_width = (float) r->fmt.i_visible_width / glr->width;
glr->tex_height = (float) r->fmt.i_visible_height / glr->height;
glr->width = stdc_bit_ceil(r->p_picture->format.i_visible_width);
glr->height = stdc_bit_ceil(r->p_picture->format.i_visible_height);
glr->tex_width = (float) r->p_picture->format.i_visible_width / glr->width;
glr->tex_height = (float) r->p_picture->format.i_visible_height / glr->height;
} else {
glr->tex_width = 1.0;
glr->tex_height = 1.0;
}
glr->alpha = (float)r->i_alpha / 255;
glr->left = 2.0 * (r->i_x ) / subpicture->i_original_picture_width - 1.0;
glr->top = -2.0 * (r->i_y ) / subpicture->i_original_picture_height + 1.0;
glr->right = 2.0 * (r->i_x + r->fmt.i_visible_width ) / subpicture->i_original_picture_width - 1.0;
glr->bottom = -2.0 * (r->i_y + r->fmt.i_visible_height) / subpicture->i_original_picture_height + 1.0;
glr->left = 2.0 * (r->place.x ) / subpicture->i_original_picture_width - 1.0;
glr->top = -2.0 * (r->place.y ) / subpicture->i_original_picture_height + 1.0;
glr->right = 2.0 * (r->place.x + r->place.width ) / subpicture->i_original_picture_width - 1.0;
glr->bottom = -2.0 * (r->place.y + r->place.height) / subpicture->i_original_picture_height + 1.0;
glr->texture = 0;
/* Try to recycle the textures allocated by the previous
......@@ -282,8 +280,8 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
}
const size_t pixels_offset =
r->fmt.i_y_offset * r->p_picture->p->i_pitch +
r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
r->source_offset_y * r->p_picture->p->i_pitch +
r->source_offset_x * r->p_picture->p->i_pixel_pitch;
if (!glr->texture)
{
/* Could not recycle a previous texture, generate a new one. */
......@@ -294,11 +292,11 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
break;
}
/* Use the visible pitch of the region */
r->p_picture->p[0].i_visible_pitch = r->fmt.i_visible_width
r->p_picture->p[0].i_visible_pitch = r->p_picture->format.i_visible_width
* r->p_picture->p[0].i_pixel_pitch;
GLsizei width = r->fmt.i_visible_width;
GLsizei height = r->fmt.i_visible_height;
GLsizei width = r->p_picture->format.i_visible_width;
GLsizei height = r->p_picture->format.i_visible_height;
int ret = interop->ops->update_textures(interop, &glr->texture,
&width, &height,
r->p_picture, &pixels_offset);
......
......@@ -1332,10 +1332,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
if (sys->regionQuad.generic.textureFormat == NULL)
return VLC_EGENERIC;
int count = 0;
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
count++;
size_t count = subpicture->regions.size;
const struct subpicture_region_rendered *r;
*region = static_cast<picture_t**>(calloc(count, sizeof(picture_t *)));
if (unlikely(*region==NULL))
......@@ -1343,8 +1341,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
*subpicture_region_count = count;
int i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions) {
if (!r->fmt.i_visible_width || !r->fmt.i_visible_height)
vlc_vector_foreach(r, &subpicture->regions) {
if (!r->place.width || !r->place.height)
{
i++;
continue; // won't render anything, keep the cache for later
......@@ -1380,7 +1378,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
if (AllocateTextures(vd, sys->d3d_dev, sys->regionQuad.generic.textureFormat, &r->p_picture->format,
false, d3dquad->picSys.texture, NULL)) {
msg_Err(vd, "Failed to allocate %dx%d texture for OSD",
r->fmt.i_visible_width, r->fmt.i_visible_height);
r->p_picture->format.i_width, r->p_picture->format.i_height);
for (int j=0; j<DXGI_MAX_SHADER_VIEW; j++)
if (d3dquad->picSys.texture[j])
d3dquad->picSys.texture[j]->Release();
......@@ -1393,7 +1391,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
d3dquad->picSys.texture, 0,
d3dquad->picSys.renderSrc)) {
msg_Err(vd, "Failed to create %dx%d shader view for OSD",
r->fmt.i_visible_width, r->fmt.i_visible_height);
r->p_picture->format.i_width, r->p_picture->format.i_height);
delete d3dquad;
i++;
continue;
......@@ -1406,7 +1404,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
if (err != VLC_SUCCESS)
{
msg_Err(vd, "Failed to allocate %dx%d quad for OSD",
r->fmt.i_visible_width, r->fmt.i_visible_height);
r->p_picture->format.i_width, r->p_picture->format.i_height);
delete d3dquad;
i++;
continue;
......@@ -1415,7 +1413,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
err = D3D11_SetupQuad( vd, sys->d3d_dev, &r->p_picture->format, d3dquad, &sys->display );
if (err != VLC_SUCCESS) {
msg_Err(vd, "Failed to setup %dx%d quad for OSD",
r->fmt.i_visible_width, r->fmt.i_visible_height);
r->p_picture->format.i_width, r->p_picture->format.i_height);
delete d3dquad;
i++;
continue;
......@@ -1426,7 +1424,11 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
res.pf_destroy = DestroyPictureQuad;
return res;
}((picture_sys_d3d11_t *) d3dquad);
(*region)[i] = picture_NewFromResource(&r->p_picture->format, &picres);
video_format_t no_crop = r->p_picture->format;
no_crop.i_x_offset = no_crop.i_y_offset = 0;
no_crop.i_visible_width = no_crop.i_width;
no_crop.i_visible_height = no_crop.i_height;
(*region)[i] = picture_NewFromResource(&no_crop, &picres);
if ((*region)[i] == NULL) {
msg_Err(vd, "Failed to create %dx%d picture for OSD",
r->p_picture->format.i_width, r->p_picture->format.i_height);
......@@ -1462,19 +1464,19 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
}
RECT output;
output.left = r->fmt.i_x_offset;
output.right = r->fmt.i_x_offset + r->fmt.i_visible_width;
output.top = r->fmt.i_y_offset;
output.bottom = r->fmt.i_y_offset + r->fmt.i_visible_height;
output.left = r->source_offset_x;
output.right = r->source_offset_x + r->place.width;
output.top = r->source_offset_y;
output.bottom = r->source_offset_y + r->place.height;
D3D11_UpdateQuadPosition(vd, sys->d3d_dev, quad, &output,
video_format_GetTransform(ORIENT_NORMAL, sys->display.orientation));
RECT spuViewport;
spuViewport.left = (FLOAT) r->i_x * sys->area.place.width / subpicture->i_original_picture_width;
spuViewport.top = (FLOAT) r->i_y * sys->area.place.height / subpicture->i_original_picture_height;
spuViewport.right = (FLOAT) (r->i_x + r->fmt.i_visible_width) * sys->area.place.width / subpicture->i_original_picture_width;
spuViewport.bottom = (FLOAT) (r->i_y + r->fmt.i_visible_height) * sys->area.place.height / subpicture->i_original_picture_height;
spuViewport.left = (FLOAT) r->place.x * sys->area.place.width / subpicture->i_original_picture_width;
spuViewport.top = (FLOAT) r->place.y * sys->area.place.height / subpicture->i_original_picture_height;
spuViewport.right = (FLOAT) (r->place.x + r->place.width) * sys->area.place.width / subpicture->i_original_picture_width;
spuViewport.bottom = (FLOAT) (r->place.y + r->place.height) * sys->area.place.height / subpicture->i_original_picture_height;
if (r->zoom_h.num != 0 && r->zoom_h.den != 0)
{
......
......@@ -866,10 +866,8 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
{
vout_display_sys_t *sys = vd->sys;
size_t count = 0;
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpicture->regions)
count++;
size_t count = subpicture->regions.size;
const struct subpicture_region_rendered *r;
*count_ptr = count;
*region = calloc(count, sizeof(**region));
......@@ -879,7 +877,7 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
}
int i = 0;
vlc_spu_regions_foreach_const(r, &subpicture->regions) {
vlc_vector_foreach(r, &subpicture->regions) {
d3d_region_t *d3dr = &(*region)[i];
HRESULT hr;
......@@ -960,10 +958,10 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
const float scale_h = (float)(sys->area.place.height) / subpicture->i_original_picture_height;
RECT rect_in_display;
rect_in_display.left = scale_w * r->i_x,
rect_in_display.right = rect_in_display.left + scale_w * r->fmt.i_visible_width,
rect_in_display.top = scale_h * r->i_y,
rect_in_display.bottom = rect_in_display.top + scale_h * r->fmt.i_visible_height;
rect_in_display.left = scale_w * r->place.x,
rect_in_display.right = rect_in_display.left + scale_w * r->place.width,
rect_in_display.top = scale_h * r->place.y,
rect_in_display.bottom = rect_in_display.top + scale_h * r->place.height;
rect_in_display.left += sys->area.place.x;
rect_in_display.right += sys->area.place.x;
......@@ -977,10 +975,10 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
texture_rect.bottom = r->p_picture->format.i_height;
RECT texture_visible_rect;
texture_visible_rect.left = r->fmt.i_x_offset;
texture_visible_rect.right = r->fmt.i_x_offset + r->fmt.i_visible_width;
texture_visible_rect.top = r->fmt.i_y_offset;
texture_visible_rect.bottom = r->fmt.i_y_offset + r->fmt.i_visible_height;
texture_visible_rect.left = r->source_offset_x;
texture_visible_rect.right = r->source_offset_x + r->place.width;
texture_visible_rect.top = r->source_offset_y;
texture_visible_rect.bottom = r->source_offset_y + r->place.height;
Direct3D9SetupVertices(d3dr->vertex, &texture_rect, &texture_visible_rect,
&rect_in_display, r->i_alpha, ORIENT_NORMAL);
......
......@@ -112,7 +112,7 @@ static void PictureDetach(vout_display_t *vd)
}
static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture *subpic,
const subpicture_region_t *reg)
const struct subpicture_region_rendered *reg)
{
vout_display_sys_t *sys = vd->sys;
xcb_connection_t *conn = sys->conn;
......@@ -162,20 +162,20 @@ static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture *subpic
/* Mask in the original alpha channel then renver over the scaled pixmap.
* Mask (pre)multiplies RGB channels and restores the alpha channel.
*/
int_fast16_t dx = place->x + reg->i_x * place->width
int_fast16_t dx = place->x + reg->place.x * place->width
/ subpic->i_original_picture_width;
int_fast16_t dy = place->y + reg->i_y * place->height
int_fast16_t dy = place->y + reg->place.y * place->height
/ subpic->i_original_picture_height;
uint_fast16_t dw = (reg->i_x + reg->fmt.i_visible_width) * place->width
uint_fast16_t dw = (reg->place.x + reg->place.width) * place->width
/ subpic->i_original_picture_width;
uint_fast16_t dh = (reg->i_y + reg->fmt.i_visible_height) * place->height
uint_fast16_t dh = (reg->place.y + reg->place.height) * place->height
/ subpic->i_original_picture_height;
xcb_render_composite(conn, XCB_RENDER_PICT_OP_OVER,
sys->picture.subpic, sys->picture.alpha,
sys->picture.scale,
reg->fmt.i_x_offset, reg->fmt.i_y_offset,
reg->fmt.i_x_offset, reg->fmt.i_y_offset,
reg->source_offset_x, reg->source_offset_y,
reg->source_offset_x, reg->source_offset_y,
dx, dy, dw, dh);
xcb_render_free_picture(conn, sys->picture.alpha);
......@@ -236,8 +236,8 @@ static void Prepare(vout_display_t *vd, picture_t *pic,
/* Blend subpictures */
if (subpic != NULL)
{
const subpicture_region_t *r;
vlc_spu_regions_foreach_const(r, &subpic->regions)
const struct subpicture_region_rendered *r;
vlc_vector_foreach(r, &subpic->regions)
RenderRegion(vd, subpic, r);
}
......
......@@ -105,13 +105,19 @@ vlc_render_subpicture *vlc_render_subpicture_New( void )
return NULL;
p_subpic->i_original_picture_width = 0;
p_subpic->i_original_picture_height = 0;
vlc_spu_regions_init(&p_subpic->regions);
vlc_vector_init(&p_subpic->regions);
return p_subpic;
}
void vlc_render_subpicture_Delete( vlc_render_subpicture *p_subpic )
{
vlc_spu_regions_Clear( &p_subpic->regions );
struct subpicture_region_rendered *p_region;
vlc_vector_foreach(p_region, &p_subpic->regions)
{
picture_Release( p_region->p_picture );
free( p_region );
}
vlc_vector_clear( &p_subpic->regions );
free( p_subpic );
}
......@@ -220,8 +226,6 @@ static subpicture_region_t * subpicture_region_NewInternal( void )
if( unlikely(p_region == NULL) )
return NULL;
p_region->zoom_h.den = p_region->zoom_h.num = 1;
p_region->zoom_v.den = p_region->zoom_v.num = 1;
p_region->i_alpha = 0xff;
p_region->i_x = INT_MAX;
p_region->i_y = INT_MAX;
......@@ -354,21 +358,19 @@ unsigned picture_BlendSubpicture(picture_t *dst,
assert(src);
subpicture_region_t *r;
vlc_spu_regions_foreach(r, &src->regions) {
assert(r->p_picture && r->i_align == 0);
struct subpicture_region_rendered *r;
vlc_vector_foreach(r, &src->regions) {
assert(r->p_picture);
video_format_t blend_fmt = r->p_picture->format;
blend_fmt.i_x_offset = r->fmt.i_x_offset;
blend_fmt.i_y_offset = r->fmt.i_y_offset;
blend_fmt.i_visible_width = r->fmt.i_visible_width;
blend_fmt.i_visible_height = r->fmt.i_visible_height;
blend_fmt.i_sar_num = r->fmt.i_sar_num;
blend_fmt.i_sar_den = r->fmt.i_sar_den;
blend_fmt.i_x_offset = r->source_offset_x;
blend_fmt.i_y_offset = r->source_offset_y;
blend_fmt.i_visible_width = r->place.width;
blend_fmt.i_visible_height = r->place.height;
if (filter_ConfigureBlend(blend, dst->format.i_width,
dst->format.i_height, &blend_fmt)
|| filter_Blend(blend, dst, r->i_x, r->i_y, r->p_picture, r->i_alpha))
|| filter_Blend(blend, dst, r->place.x, r->place.y, r->p_picture, r->i_alpha))
msg_Err(blend, "blending %4.4s to %4.4s failed",
(char *)&blend->fmt_in.video.i_chroma,
(char *)&blend->fmt_out.video.i_chroma );
......
......@@ -862,7 +862,7 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
/**
* It will transform the provided region into another region suitable for rendering.
*/
static subpicture_region_t *SpuRenderRegion(spu_t *spu,
static struct subpicture_region_rendered *SpuRenderRegion(spu_t *spu,
spu_area_t *dst_area,
const spu_render_entry_t *entry, subpicture_region_t *region,
const spu_scale_t scale_size,
......@@ -1173,13 +1173,23 @@ static subpicture_region_t *SpuRenderRegion(spu_t *spu,
y_offset = __MAX(y, 0);
}
subpicture_region_t *dst = subpicture_region_ForPicture(&region_fmt, region_picture);
if (dst == NULL)
struct subpicture_region_rendered *dst = calloc(1, sizeof(*dst));
if (unlikely(dst == NULL))
return NULL;
dst->i_x = x_offset;
dst->i_y = y_offset;
dst->i_align = 0;
dst->p_picture = picture_Hold(region_picture);
if (unlikely(dst->p_picture == NULL))
{
free(dst);
return NULL;
}
dst->source_offset_x = region_fmt.i_x_offset;
dst->source_offset_y = region_fmt.i_y_offset;
dst->place.x = x_offset;
dst->place.y = y_offset;
dst->place.width = region_fmt.i_visible_width;
dst->place.height = region_fmt.i_visible_height;
dst->zoom_h.den = dst->zoom_h.num = 1;
dst->zoom_v.den = dst->zoom_v.num = 1;
int fade_alpha = 255;
if (subpic->b_fade) {
vlc_tick_t fade_start = subpic->i_start + 3 * (subpic->i_stop - subpic->i_start) / 4;
......@@ -1245,7 +1255,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
output->i_order = p_entries[i_subpicture - 1].subpic->i_order;
output->i_original_picture_width = fmt_dst->i_visible_width;
output->i_original_picture_height = fmt_dst->i_visible_height;
subpicture_region_t *output_last_ptr;
struct subpicture_region_rendered *output_last_ptr;
/* Allocate area array for subtitle overlap */
spu_area_t subtitle_area_buffer[100];
......@@ -1348,7 +1358,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
}
}
vlc_spu_regions_push(&output->regions, output_last_ptr);
vlc_vector_push(&output->regions, output_last_ptr);
if (subpic->b_subtitle) {
area = spu_area_unscaled(area, scale);
......
......@@ -178,9 +178,15 @@ static void test_opengl_offscreen(
subpicture->i_original_picture_width = 4;
subpicture->i_original_picture_height = 4;
subpicture_region_t *p_region = subpicture_region_ForPicture(NULL, picture);
struct subpicture_region_rendered *p_region = calloc(1, sizeof(*p_region));
assert(p_region != NULL);
vlc_spu_regions_push( &subpicture->regions, p_region );
p_region->p_picture = picture_Hold(picture);
p_region->place.width = picture->format.i_visible_width;
p_region->place.height = picture->format.i_visible_height;
p_region->i_alpha = 255;
p_region->zoom_h.num = p_region->zoom_h.num = 1;
p_region->zoom_v.num = p_region->zoom_v.num = 1;
vlc_vector_push( &subpicture->regions, p_region );
ret = vlc_gl_sub_renderer_Prepare(sr, subpicture);
assert(ret == VLC_SUCCESS);
......