Browse Source

vout_subpictures: place rendered regions in display coordinates

Only for display modules that render regions separately.
pull/162/head
Steve Lhomme 2 years ago
parent
commit
301cc26428
  1. 2
      include/vlc_subpicture.h
  2. 6
      modules/video_output/android/display.c
  3. 12
      modules/video_output/apple/VLCSampleBufferDisplay.m
  4. 2
      modules/video_output/caopengllayer.m
  5. 18
      modules/video_output/libplacebo/display.c
  6. 2
      modules/video_output/macosx.m
  7. 4
      modules/video_output/opengl/display.c
  8. 2
      modules/video_output/opengl/sub_renderer.c
  9. 6
      modules/video_output/win32/direct3d11.cpp
  10. 5
      modules/video_output/win32/direct3d9.c
  11. 8
      modules/video_output/win32/glwin32.c
  12. 9
      modules/video_output/xcb/render.c
  13. 4
      src/video_output/vout_subpictures.c

2
include/vlc_subpicture.h

@ -208,7 +208,7 @@ typedef struct subpicture_private_t subpicture_private_t;
struct subpicture_region_rendered
{
picture_t *p_picture; /**< picture comprising this region */
vout_display_place_t place; // position of region, relative to alignment
vout_display_place_t place; /**< visible area in display coordinates */
int i_alpha; /**< transparency */
};

6
modules/video_output/android/display.c

@ -201,8 +201,8 @@ static void subpicture_Prepare(vout_display_t *vd, const vlc_render_subpicture *
if (sub->place_changed)
{
sub->api.vt.Viewport(sub->place.x, sub->place.y,
sub->place.width, sub->place.height);
sub->api.vt.Viewport(0, 0,
vd->cfg->display.width, vd->cfg->display.height);
sub->place_changed = false;
}
@ -322,7 +322,7 @@ static int subpicture_OpenDisplay(vout_display_t *vd)
FlipVerticalAlign(&dp);
vout_display_PlacePicture(&sub->place, vd->source, &dp);
sub->place_changed = true;
vlc_gl_Resize(sub->gl, dp.width, dp.height);
vlc_gl_Resize(sub->gl, vd->cfg->display.width, vd->cfg->display.height);
if (vlc_gl_MakeCurrent(sub->gl))
goto delete_gl;

12
modules/video_output/apple/VLCSampleBufferDisplay.m

@ -403,15 +403,15 @@ static void RenderPicture(vout_display_t *vd, picture_t *pic, vlc_tick_t date) {
CFRelease(sampleBuffer);
}
static CGRect RegionBackingFrame(VLCSampleBufferDisplay* sys,
static CGRect RegionBackingFrame(unsigned display_height,
const struct subpicture_region_rendered *r)
{
// Invert y coords for CoreGraphics
const float y = sys->place.height - r->place.height - r->place.y;
const int y = display_height - r->place.height - r->place.y;
return CGRectMake(
r->place.x + sys->place.x,
y + sys->place.y,
r->place.x,
y,
r->place.width,
r->place.height
);
@ -451,7 +451,7 @@ static void UpdateSubpictureRegions(vout_display_t *vd,
region.subpicture = sys.subpicture;
region.image = image;
region.backingFrame = RegionBackingFrame(sys, r);
region.backingFrame = RegionBackingFrame(vd->cfg->display.height, r);
[regions addObject:region];
CGDataProviderRelease(provider);
CFRelease(data);
@ -498,7 +498,7 @@ static bool IsSubpictureDrawNeeded(vout_display_t *vd, const vlc_render_subpictu
VLCSampleBufferSubpictureRegion *region =
sys.subpicture.regions[i++];
CGRect newRegion = RegionBackingFrame(sys, r);
CGRect newRegion = RegionBackingFrame(vd->cfg->display.height, r);
if ( !CGRectEqualToRect(region.backingFrame, newRegion) )
{

2
modules/video_output/caopengllayer.m

@ -792,7 +792,7 @@ shouldInheritContentsScale:(CGFloat)newScale
// Ensure viewport and aspect ratio is correct
vout_display_opengl_Viewport(sys->vgl, sys->place.x, sys->place.y,
sys->place.width, sys->place.height);
vout_display_opengl_SetOutputSize(sys->vgl, sys->place.width, sys->place.height);
vout_display_opengl_SetOutputSize(sys->vgl, sys->cfg.display.width, sys->cfg.display.height);
vout_display_opengl_Display(sys->vgl);
vlc_gl_ReleaseCurrent(sys->gl);

18
modules/video_output/libplacebo/display.c

@ -414,10 +414,10 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
.y1 = r->p_picture->format.i_visible_height,
},
.dst = {
.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,
.x0 = r->place.x,
.y0 = r->place.y * ysign,
.x1 = (r->place.x + r->place.width ),
.y1 = (r->place.y + r->place.height) * ysign,
},
};
i++;
@ -429,13 +429,13 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
}
// If we don't cover the entire output, clear it first
struct pl_rect2d full = {0, 0, frame.fbo->params.w, frame.fbo->params.h };
struct pl_rect2d norm = {place.x, place.y, place.x + place.width, place.y + place.height };
pl_rect2d_normalize(&norm);
if (!pl_rect2d_eq(norm, full)) {
// struct pl_rect2d full = {0, 0, frame.fbo->params.w, frame.fbo->params.h };
// struct pl_rect2d norm = {place.x, place.y, place.x + place.width, place.y + place.height };
// pl_rect2d_normalize(&norm);
// if (!pl_rect2d_eq(norm, full)) {
// TODO: make background color configurable?
pl_tex_clear(gpu, frame.fbo, (float[4]){ 0.0, 0.0, 0.0, 0.0 });
}
// }
switch (sys->lut_mode) {
case LUT_DECODING:

2
modules/video_output/macosx.m

@ -565,7 +565,7 @@ static void OpenglSwap (vlc_gl_t *gl)
vout_display_opengl_Viewport(sys->vgl, sys->place.x, sys->place.y,
sys->place.width, sys->place.height);
vout_display_opengl_SetOutputSize(sys->vgl, sys->place.width, sys->place.height);
vout_display_opengl_SetOutputSize(sys->vgl, sys->cfg.display.width, sys->cfg.display.height);
if (sys->has_first_frame)
vout_display_opengl_Display (sys->vgl);

4
modules/video_output/opengl/display.c

@ -302,8 +302,8 @@ static void PictureRender (vout_display_t *vd, picture_t *pic,
sys->vt.Flush();
if (sys->place_changed)
{
vout_display_opengl_SetOutputSize(sys->vgl, sys->place.width,
sys->place.height);
vout_display_opengl_SetOutputSize(sys->vgl, vd->cfg->display.width,
vd->cfg->display.height);
vout_display_opengl_Viewport(sys->vgl, sys->place.x, sys->place.y,
sys->place.width, sys->place.height);
sys->place_changed = false;

2
modules/video_output/opengl/sub_renderer.c

@ -350,6 +350,8 @@ vlc_gl_sub_renderer_Draw(struct vlc_gl_sub_renderer *sr)
vt->Enable(GL_BLEND);
vt->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vt->Viewport(0, 0, sr->output_width, sr->output_height);
/* We need two buffer objects for each region: for vertex and texture coordinates. */
if (2 * sr->region_count > sr->buffer_object_count) {
if (sr->buffer_object_count > 0)

6
modules/video_output/win32/direct3d11.cpp

@ -1651,12 +1651,6 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
spuViewport.right = r->place.x + r->place.width;
spuViewport.bottom = r->place.y + r->place.height;
/* move the SPU inside the video area */
spuViewport.left += sys->area.place.x;
spuViewport.right += sys->area.place.x;
spuViewport.top += sys->area.place.y;
spuViewport.bottom += sys->area.place.y;
quad->UpdateViewport( &spuViewport, sys->display.pixelFormat );
D3D11_UpdateQuadOpacity(vd, sys->d3d_dev, quad, r->i_alpha / 255.0f );

5
modules/video_output/win32/direct3d9.c

@ -960,11 +960,6 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
rect_in_display.top = r->place.y;
rect_in_display.bottom = r->place.y + r->place.height;
rect_in_display.left += sys->area.place.x;
rect_in_display.right += sys->area.place.x;
rect_in_display.top += sys->area.place.y;
rect_in_display.bottom += sys->area.place.y;
RECT texture_rect;
texture_rect.left = 0;
texture_rect.right = r->p_picture->format.i_width;

8
modules/video_output/win32/glwin32.c

@ -256,11 +256,9 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
vout_display_PlacePicture(&place, vd->source, &place_cfg);
const int width = place.width;
const int height = place.height;
vlc_gl_Resize (sys->gl, width, height);
vout_display_opengl_SetOutputSize(sys->vgl, width, height);
vout_display_opengl_Viewport(sys->vgl, place.x, place.y, width, height);
vlc_gl_Resize (sys->gl, place.width, place.height);
vout_display_opengl_SetOutputSize(sys->vgl, vd->cfg->display.width, vd->cfg->display.height);
vout_display_opengl_Viewport(sys->vgl, place.x, place.y, place.width, place.height);
sys->area.place_changed = false;
}
vout_display_opengl_Prepare (sys->vgl, picture, subpicture);

9
modules/video_output/xcb/render.c

@ -118,13 +118,12 @@ static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture *subpic
{
vout_display_sys_t *sys = vd->sys;
xcb_connection_t *conn = sys->conn;
const vout_display_place_t *place = &sys->place;
picture_t *pic = reg->p_picture;
unsigned sw = reg->place.width;
unsigned sh = reg->place.height;
xcb_rectangle_t rects[] = { { 0, 0, sw, sh }, };
xcb_create_pixmap(conn, 32, sys->drawable.subpic, sys->root,
xcb_create_pixmap(conn, 32, sys->drawable.subpic, sys->root,
pic->format.i_width, pic->format.i_height);
xcb_create_pixmap(conn, 32, sys->drawable.subpic_crop, sys->root, sw, sh);
xcb_create_pixmap(conn, 8, sys->drawable.alpha, sys->root, sw, sh);
@ -175,8 +174,8 @@ 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->place.x;
int_fast16_t dy = place->y + reg->place.y;
int_fast16_t dx = reg->place.x;
int_fast16_t dy = reg->place.y;
uint_fast16_t dw = reg->place.width;
uint_fast16_t dh = reg->place.height;
@ -200,7 +199,7 @@ static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture *subpic
xcb_render_set_picture_filter(conn, sys->picture.alpha,
strlen(sys->filter), sys->filter,
0, NULL);
}
}
xcb_render_composite(conn, XCB_RENDER_PICT_OP_OVER,
sys->picture.subpic_crop, sys->picture.alpha,

4
src/video_output/vout_subpictures.c

@ -1361,6 +1361,10 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t *spu,
if (unlikely(output_last_ptr == NULL))
continue;
// place the region inside the video area
output_last_ptr->place.x += video_position->x;
output_last_ptr->place.y += video_position->y;
vlc_vector_push(&output->regions, output_last_ptr);
if (subpic->b_subtitle) {

Loading…
Cancel
Save