Browse Source

vout_subpictures: set the rendered region placement dimensions using the region format

So we have all placement fields set for the display modules.
pull/162/head
Steve Lhomme 2 years ago
parent
commit
f4247dcedb
  1. 8
      modules/video_output/android/display.c
  2. 8
      modules/video_output/apple/VLCSampleBufferDisplay.m
  3. 8
      modules/video_output/libplacebo/display.c
  4. 8
      modules/video_output/opengl/sub_renderer.c
  5. 10
      modules/video_output/win32/direct3d11.cpp
  6. 8
      modules/video_output/win32/direct3d9.c
  7. 4
      modules/video_output/xcb/render.c
  8. 4
      src/misc/subpicture.c
  9. 2
      src/video_output/vout_subpictures.c
  10. 3
      test/modules/video_output/opengl/sub_renderer.c

8
modules/video_output/android/display.c

@ -151,8 +151,8 @@ static bool subpicture_NeedDraw(vout_display_t *vd,
{
struct sub_region *cmp = &sub->regions.data[i++];
if (cmp->x != r->place.x || cmp->y != r->place.y
|| cmp->width != r->fmt.i_visible_width
|| cmp->height != r->fmt.i_visible_height)
|| cmp->width != r->place.width
|| cmp->height != r->place.height)
{
/* Subpicture regions are different */
draw = true;
@ -182,8 +182,8 @@ end:
struct sub_region reg = {
.x = r->place.x,
.y = r->place.y,
.width = r->fmt.i_visible_width,
.height = r->fmt.i_visible_height,
.width = r->place.width,
.height = r->place.height,
};
bool res = vlc_vector_push(&sub->regions, reg);
/* Already checked with vlc_vector_reserve */

8
modules/video_output/apple/VLCSampleBufferDisplay.m

@ -411,13 +411,13 @@ static CGRect RegionBackingFrame(VLCSampleBufferDisplay* sys,
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->place.y;
const float y = subpicture->i_original_picture_height - r->place.height - r->place.y;
return CGRectMake(
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
);
}
@ -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

8
modules/video_output/libplacebo/display.c

@ -411,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->place.x,
.y0 = place.y + r->place.y * ysign,
.x1 = place.x + r->place.x + r->fmt.i_visible_width,
.y1 = place.y + (r->place.y + r->fmt.i_visible_height) * ysign,
.x1 = place.x + r->place.x + r->place.width,
.y1 = place.y + (r->place.y + r->place.height) * ysign,
},
};
i++;

8
modules/video_output/opengl/sub_renderer.c

@ -261,10 +261,10 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
glr->tex_height = 1.0;
}
glr->alpha = (float)r->i_alpha / 255;
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->fmt.i_visible_width ) / subpicture->i_original_picture_width - 1.0;
glr->bottom = -2.0 * (r->place.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

10
modules/video_output/win32/direct3d11.cpp

@ -1342,7 +1342,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
int i = 0;
vlc_vector_foreach(r, &subpicture->regions) {
if (!r->fmt.i_visible_width || !r->fmt.i_visible_height)
if (!r->place.width || !r->place.height)
{
i++;
continue; // won't render anything, keep the cache for later
@ -1465,9 +1465,9 @@ 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.right = r->fmt.i_x_offset + r->place.width;
output.top = r->fmt.i_y_offset;
output.bottom = r->fmt.i_y_offset + r->fmt.i_visible_height;
output.bottom = r->fmt.i_y_offset + r->place.height;
D3D11_UpdateQuadPosition(vd, sys->d3d_dev, quad, &output,
video_format_GetTransform(ORIENT_NORMAL, sys->display.orientation));
@ -1475,8 +1475,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
RECT spuViewport;
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->fmt.i_visible_width) * sys->area.place.width / subpicture->i_original_picture_width;
spuViewport.bottom = (FLOAT) (r->place.y + r->fmt.i_visible_height) * 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)
{

8
modules/video_output/win32/direct3d9.c

@ -959,9 +959,9 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
RECT rect_in_display;
rect_in_display.left = scale_w * r->place.x,
rect_in_display.right = rect_in_display.left + scale_w * r->fmt.i_visible_width,
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->fmt.i_visible_height;
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;
@ -976,9 +976,9 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
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.right = r->fmt.i_x_offset + r->place.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.bottom = r->fmt.i_y_offset + r->place.height;
Direct3D9SetupVertices(d3dr->vertex, &texture_rect, &texture_visible_rect,
&rect_in_display, r->i_alpha, ORIENT_NORMAL);

4
modules/video_output/xcb/render.c

@ -166,9 +166,9 @@ static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture *subpic
/ subpic->i_original_picture_width;
int_fast16_t dy = place->y + reg->place.y * place->height
/ subpic->i_original_picture_height;
uint_fast16_t dw = (reg->place.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->place.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,

4
src/misc/subpicture.c

@ -365,8 +365,8 @@ unsigned picture_BlendSubpicture(picture_t *dst,
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_visible_width = r->place.width;
blend_fmt.i_visible_height = r->place.height;
blend_fmt.i_sar_num = r->fmt.i_sar_num;
blend_fmt.i_sar_den = r->fmt.i_sar_den;

2
src/video_output/vout_subpictures.c

@ -1185,6 +1185,8 @@ static struct subpicture_region_rendered *SpuRenderRegion(spu_t *spu,
dst->fmt = region_fmt;
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;

3
test/modules/video_output/opengl/sub_renderer.c

@ -180,8 +180,9 @@ static void test_opengl_offscreen(
struct subpicture_region_rendered *p_region = calloc(1, sizeof(*p_region));
assert(p_region != NULL);
p_region->fmt = picture->format;
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;

Loading…
Cancel
Save