[vlc-commits] [Git][videolan/vlc][master] 13 commits: display: provide a read-only version of the picture placement
Steve Lhomme (@robUx4)
gitlab at videolan.org
Tue Sep 24 08:39:28 UTC 2024
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
b087f2d2 by Steve Lhomme at 2024-09-24T08:22:20+00:00
display: provide a read-only version of the picture placement
It could avoid a lot of display modules to compute it themselves.
- - - - -
e1910b82 by Steve Lhomme at 2024-09-24T08:22:20+00:00
video_output: use already computed placement
Whenever vd->source changes of display configuration changes, the placement
is updated.
- - - - -
9239e881 by Steve Lhomme at 2024-09-24T08:22:20+00:00
libplacebo: use already computed placement
When flipping, the only values that would change in the placement is the
place.y
- - - - -
d84ae556 by Steve Lhomme at 2024-09-24T08:22:20+00:00
kva: use already computed placement
- - - - -
577803cd by Steve Lhomme at 2024-09-24T08:22:20+00:00
xcb/render: move the output update in a function
- - - - -
e1da981b by Steve Lhomme at 2024-09-24T08:22:20+00:00
xcb/render: use already computed placement
Prepare and CreateBuffers are always called in the vout thread,
so they are always in sync.
The original placement is set when the module is opened.
- - - - -
e424ae06 by Steve Lhomme at 2024-09-24T08:22:20+00:00
x11: use already computed placement
Display, ResetPictures and Control are always called in the vout thread,
so they are always in sync.
- - - - -
72e572b5 by Steve Lhomme at 2024-09-24T08:22:20+00:00
wayland/shm: move the viewport update in a function
- - - - -
c2a37fe3 by Steve Lhomme at 2024-09-24T08:22:20+00:00
wayland/shm: use already computed placement
ResetPictures and Control are always called in the vout thread,
so they are always in sync.
- - - - -
fca84e8a by Steve Lhomme at 2024-09-24T08:22:20+00:00
drm: use already computed placement
- - - - -
f811042d by Steve Lhomme at 2024-09-24T08:22:20+00:00
glwin32: use already computed placement
Vertically swapping the position of the video keeps the place "height".
The vertical position use the inverted position of the bottom position
rather than the top position of the video.
- - - - -
7d59735e by Steve Lhomme at 2024-09-24T08:22:20+00:00
mmal/vout: use already computed placement
- - - - -
8a912baa by Steve Lhomme at 2024-09-24T08:22:20+00:00
VLCSampleBufferDisplay: use already computed placement
It doesn't seem to be using the placement values, which is wrong.
- - - - -
12 changed files:
- include/vlc_vout_display.h
- modules/hw/mmal/vout.c
- modules/video_output/apple/VLCSampleBufferDisplay.m
- modules/video_output/drm/display.c
- modules/video_output/kva.c
- modules/video_output/libplacebo/display.c
- modules/video_output/wayland/shm.c
- modules/video_output/win32/glwin32.c
- modules/video_output/xcb/render.c
- modules/video_output/xcb/x11.c
- src/video_output/display.c
- src/video_output/video_output.c
Changes:
=====================================
include/vlc_vout_display.h
=====================================
@@ -325,6 +325,18 @@ struct vlc_display_operations
vlc_video_context *ctx);
};
+/**
+ * Video placement.
+ *
+ * This structure stores the result of a vout_display_PlacePicture() call.
+ */
+typedef struct vout_display_place_t {
+ int x; /*< Relative pixel offset from the display left edge */
+ int y; /*< Relative pixel offset from the display top edge */
+ unsigned width; /*< Picture pixel width */
+ unsigned height; /*< Picture pixel height */
+} vout_display_place_t;
+
struct vout_display_t {
struct vlc_object_t obj;
@@ -346,6 +358,14 @@ struct vout_display_t {
*/
const video_format_t *source;
+ /**
+ * Placement of the source picture in the display. (cannot be NULL)
+ *
+ * This cannot be modified directly and cannot be NULL.
+ * It reflects the current values.
+ */
+ const vout_display_place_t *place;
+
/**
* Picture format.
*
@@ -483,18 +503,6 @@ void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
const video_format_t *source,
const struct vout_display_placement *);
-/**
- * Video placement.
- *
- * This structure stores the result of a vout_display_PlacePicture() call.
- */
-typedef struct vout_display_place_t {
- int x; /*< Relative pixel offset from the display left edge */
- int y; /*< Relative pixel offset from the display top edge */
- unsigned width; /*< Picture pixel width */
- unsigned height; /*< Picture pixel height */
-} vout_display_place_t;
-
/**
* Compares two \ref vout_display_place_t.
*/
=====================================
modules/hw/mmal/vout.c
=====================================
@@ -488,11 +488,7 @@ static void
place_dest(vout_display_t *vd)
{
vout_display_sys_t * const sys = vd->sys;
- vout_display_place_t place;
-
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
-
- sys->dest_rect = place_to_mmal_rect(place);
+ sys->dest_rect = place_to_mmal_rect(*vd->place);
}
static int configure_display(vout_display_t *vd)
=====================================
modules/video_output/apple/VLCSampleBufferDisplay.m
=====================================
@@ -745,9 +745,7 @@ shouldInheritContentsScale:(CGFloat)newScale
[displayView setFrame:[window bounds]];
[spuView setFrame:[window bounds]];
- vout_display_PlacePicture(
- &sys->place, sys.vd->source, &sys.vd->cfg->display
- );
+ sys->place = *sys.vd->place;
sys.displayView = displayView;
sys.spuView = spuView;
=====================================
modules/video_output/drm/display.c
=====================================
@@ -102,18 +102,15 @@ static void Display(vout_display_t *vd, picture_t *picture)
vlc_window_t *wnd = vd->cfg->window;
const video_format_t *fmt = vd->fmt;
picture_t *pic = sys->buffers[sys->front_buf];
- vout_display_place_t place;
-
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
struct drm_mode_set_plane sp = {
.plane_id = sys->plane_id,
.crtc_id = wnd->handle.crtc,
.fb_id = vlc_drm_dumb_get_fb_id(pic),
- .crtc_x = place.x,
- .crtc_y = place.y,
- .crtc_w = place.width,
- .crtc_h = place.height,
+ .crtc_x = vd->place->x,
+ .crtc_y = vd->place->y,
+ .crtc_w = vd->place->width,
+ .crtc_h = vd->place->height,
/* Source values as U16.16 fixed point */
.src_x = fmt->i_x_offset << 16,
.src_y = fmt->i_y_offset << 16,
=====================================
modules/video_output/kva.c
=====================================
@@ -409,11 +409,8 @@ static int Control( vout_display_t *vd, int query )
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
- vout_display_place_t place;
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
-
- sys->kvas.ulAspectWidth = place.width;
- sys->kvas.ulAspectHeight = place.height;
+ sys->kvas.ulAspectWidth = vd->place->width;
+ sys->kvas.ulAspectHeight = vd->place->height;
kvaSetup( &sys->kvas );
return VLC_SUCCESS;
}
=====================================
modules/video_output/libplacebo/display.c
=====================================
@@ -296,8 +296,7 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
}
// Set the target crop dynamically based on the swapchain flip state
- vout_display_place_t place;
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
+ vout_display_place_t place = *vd->place;
if (need_vflip)
{
place.y = place.height + place.y;
=====================================
modules/video_output/wayland/shm.c
=====================================
@@ -152,27 +152,46 @@ static void Display(vout_display_t *vd, picture_t *pic)
static int ResetPictures(vout_display_t *vd, video_format_t *fmt)
{
- vout_display_place_t place;
video_format_t src;
vout_display_sys_t *sys = vd->sys;
assert(sys->viewport == NULL);
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
video_format_ApplyRotation(&src, vd->source);
- fmt->i_width = src.i_width * place.width
+ fmt->i_width = src.i_width * vd->place->width
/ src.i_visible_width;
- fmt->i_height = src.i_height * place.height
+ fmt->i_height = src.i_height * vd->place->height
/ src.i_visible_height;
- fmt->i_visible_width = place.width;
- fmt->i_visible_height = place.height;
- fmt->i_x_offset = src.i_x_offset * place.width
+ fmt->i_visible_width = vd->place->width;
+ fmt->i_visible_height = vd->place->height;
+ fmt->i_x_offset = src.i_x_offset * vd->place->width
/ src.i_visible_width;
- fmt->i_y_offset = src.i_y_offset * place.height
+ fmt->i_y_offset = src.i_y_offset * vd->place->height
/ src.i_visible_height;
return VLC_SUCCESS;
}
+static int UpdateViewport(vout_display_t *vd)
+{
+ vout_display_sys_t *sys = vd->sys;
+
+ if (sys->viewport == NULL)
+ return VLC_EGENERIC;
+
+ video_format_t fmt;
+
+ video_format_ApplyRotation(&fmt, vd->source);
+
+ wp_viewport_set_source(sys->viewport,
+ wl_fixed_from_int(fmt.i_x_offset),
+ wl_fixed_from_int(fmt.i_y_offset),
+ wl_fixed_from_int(fmt.i_visible_width),
+ wl_fixed_from_int(fmt.i_visible_height));
+ wp_viewport_set_destination(sys->viewport,
+ vd->place->width, vd->place->height);
+ return VLC_SUCCESS;
+}
+
static int Control(vout_display_t *vd, int query)
{
vout_display_sys_t *sys = vd->sys;
@@ -183,28 +202,7 @@ static int Control(vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
- {
- if (sys->viewport != NULL)
- {
- video_format_t fmt;
- vout_display_place_t place;
-
- video_format_ApplyRotation(&fmt, vd->source);
- vout_display_PlacePicture(&place, vd->source,
- &vd->cfg->display);
-
- wp_viewport_set_source(sys->viewport,
- wl_fixed_from_int(fmt.i_x_offset),
- wl_fixed_from_int(fmt.i_y_offset),
- wl_fixed_from_int(fmt.i_visible_width),
- wl_fixed_from_int(fmt.i_visible_height));
- wp_viewport_set_destination(sys->viewport,
- place.width, place.height);
- }
- else
- return VLC_EGENERIC;
- break;
- }
+ return UpdateViewport(vd);
default:
msg_Err(vd, "unknown request %d", query);
return VLC_EGENERIC;
=====================================
modules/video_output/win32/glwin32.c
=====================================
@@ -245,9 +245,8 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
return;
if (sys->area.place_changed)
{
- vout_display_place_t place;
+ vout_display_place_t place = *vd->place;
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
/* Reverse vertical alignment as the GL tex are Y inverted */
place.y = vd->cfg->display.height - (place.y + place.height);
=====================================
modules/video_output/xcb/render.c
=====================================
@@ -75,7 +75,6 @@ typedef struct vout_display_sys_t {
xcb_window_t root;
char *filter;
- vout_display_place_t place;
int32_t src_x;
int32_t src_y;
vlc_fourcc_t spu_chromas[2];
@@ -220,6 +219,7 @@ static void Prepare(vout_display_t *vd, picture_t *pic,
vlc_tick_t date)
{
const video_format_t *fmt = vd->source;
+ const vout_display_place_t *place = vd->place;
vout_display_sys_t *sys = vd->sys;
xcb_connection_t *conn = sys->conn;
@@ -259,8 +259,8 @@ static void Prepare(vout_display_t *vd, picture_t *pic,
xcb_render_composite(conn, XCB_RENDER_PICT_OP_SRC,
sys->picture.crop, XCB_RENDER_PICTURE_NONE,
sys->picture.scale, sys->src_x, sys->src_y, 0, 0,
- sys->place.x, sys->place.y,
- sys->place.width, sys->place.height);
+ place->x, place->y,
+ place->width, place->height);
if (offset != (size_t)-1)
PictureDetach(vd);
@@ -318,8 +318,7 @@ static void CreateBuffers(vout_display_t *vd)
xcb_render_create_picture(conn, sys->picture.scale, sys->drawable.scale,
sys->format.argb, 0, NULL);
- vout_display_place_t *place = &sys->place;
- vout_display_PlacePicture(place, vd->source, &vd->cfg->display);
+ const vout_display_place_t *place = vd->place;
/* Homogeneous coordinates transform from destination(place)
* to source(fmt) */
@@ -388,6 +387,23 @@ static void DeleteBuffers(vout_display_t *vd)
xcb_free_pixmap(conn, sys->drawable.crop);
}
+static int UpdateOutput(vout_display_t *vd)
+{
+ vout_display_sys_t *sys = vd->sys;
+
+ /* Update the window size */
+ uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+ const uint32_t values[] = {
+ vd->cfg->display.width, vd->cfg->display.height
+ };
+
+ xcb_configure_window(sys->conn, sys->drawable.dest, mask, values);
+ DeleteBuffers(vd);
+ CreateBuffers(vd);
+ xcb_flush(sys->conn);
+ return VLC_SUCCESS;
+}
+
static int Control(vout_display_t *vd, int query)
{
vout_display_sys_t *sys = vd->sys;
@@ -397,19 +413,7 @@ static int Control(vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
- {
- /* Update the window size */
- uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
- const uint32_t values[] = {
- vd->cfg->display.width, vd->cfg->display.height
- };
-
- xcb_configure_window(sys->conn, sys->drawable.dest, mask, values);
- DeleteBuffers(vd);
- CreateBuffers(vd);
- xcb_flush(sys->conn);
- return VLC_SUCCESS;
- }
+ return UpdateOutput(vd);
default:
msg_Err(vd, "Unknown request in XCB RENDER display");
=====================================
modules/video_output/xcb/x11.c
=====================================
@@ -48,7 +48,6 @@ typedef struct vout_display_sys_t
bool attached;
uint8_t depth; /* useful bits per pixel */
video_format_t fmt;
- vout_display_place_t place;
} vout_display_sys_t;
static void Prepare(vout_display_t *vd, picture_t *pic,
@@ -99,32 +98,32 @@ static void Display (vout_display_t *vd, picture_t *pic)
xcb_rectangle_t rectv[4], *rect;
unsigned int rectc = 0;
- if (sys->place.x > 0) {
+ if (vd->place->x > 0) {
rect = &rectv[rectc++];
rect->x = 0;
rect->y = 0;
- rect->width = sys->place.x;
+ rect->width = vd->place->x;
rect->height = vd->cfg->display.height;
}
- if (sys->place.x + sys->place.width < vd->cfg->display.width) {
+ if (vd->place->x + vd->place->width < vd->cfg->display.width) {
rect = &rectv[rectc++];
- rect->x = sys->place.x + sys->place.width;
+ rect->x = vd->place->x + vd->place->width;
rect->y = 0;
rect->width = vd->cfg->display.width - rect->x;
rect->height = vd->cfg->display.height;
}
- if (sys->place.y > 0) {
+ if (vd->place->y > 0) {
rect = &rectv[rectc++];
- rect->x = sys->place.x;
+ rect->x = vd->place->x;
rect->y = 0;
- rect->width = sys->place.width;
- rect->height = sys->place.y;
+ rect->width = vd->place->width;
+ rect->height = vd->place->y;
}
- if (sys->place.y + sys->place.height < vd->cfg->display.height) {
+ if (vd->place->y + vd->place->height < vd->cfg->display.height) {
rect = &rectv[rectc++];
- rect->x = sys->place.x;
- rect->y = sys->place.y + sys->place.height;
- rect->width = sys->place.width;
+ rect->x = vd->place->x;
+ rect->y = vd->place->y + vd->place->height;
+ rect->width = vd->place->width;
rect->height = vd->cfg->display.height - rect->y;
}
@@ -139,7 +138,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
/* y */ sys->fmt.i_y_offset,
/* width */ sys->fmt.i_visible_width,
/* height */ sys->fmt.i_visible_height,
- sys->place.x, sys->place.y, sys->depth,
+ vd->place->x, vd->place->y, sys->depth,
XCB_IMAGE_FORMAT_Z_PIXMAP, 0,
segment, buf->offset);
else {
@@ -155,7 +154,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
lines--;
xcb_put_image(conn, XCB_IMAGE_FORMAT_Z_PIXMAP, sys->window,
sys->gc, pic->p->i_visible_pitch, 1,
- sys->place.x, sys->place.y + sys->place.height - 1,
+ vd->place->x, vd->place->y + vd->place->height - 1,
0, sys->depth, pic->p->i_visible_pitch,
pic->p->p_pixels + offset + lines * pic->p->i_pitch);
}
@@ -163,7 +162,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
ck = xcb_put_image_checked(conn, XCB_IMAGE_FORMAT_Z_PIXMAP,
sys->window, sys->gc,
pic->p->i_pitch / pic->p->i_pixel_pitch,
- lines, sys->place.x, sys->place.y,
+ lines, vd->place->x, vd->place->y,
0, sys->depth, pic->p->i_pitch * lines,
pic->p->p_pixels + offset);
@@ -193,16 +192,14 @@ static int ResetPictures(vout_display_t *vd, video_format_t *fmt)
vout_display_sys_t *sys = vd->sys;
video_format_t src;
- vout_display_PlacePicture(&sys->place, vd->source, &vd->cfg->display);
-
video_format_ApplyRotation(&src, vd->source);
- sys->fmt.i_width = src.i_width * sys->place.width / src.i_visible_width;
- sys->fmt.i_height = src.i_height * sys->place.height / src.i_visible_height;
+ sys->fmt.i_width = src.i_width * vd->place->width / src.i_visible_width;
+ sys->fmt.i_height = src.i_height * vd->place->height / src.i_visible_height;
- sys->fmt.i_visible_width = sys->place.width;
- sys->fmt.i_visible_height = sys->place.height;
- sys->fmt.i_x_offset = src.i_x_offset * sys->place.width / src.i_visible_width;
- sys->fmt.i_y_offset = src.i_y_offset * sys->place.height / src.i_visible_height;
+ sys->fmt.i_visible_width = vd->place->width;
+ sys->fmt.i_visible_height = vd->place->height;
+ sys->fmt.i_x_offset = src.i_x_offset * vd->place->width / src.i_visible_width;
+ sys->fmt.i_y_offset = src.i_y_offset * vd->place->height / src.i_visible_height;
*fmt = sys->fmt;
return VLC_SUCCESS;
@@ -226,12 +223,8 @@ static int Control(vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
- vout_display_place_t place;
-
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
-
- if (place.width != sys->fmt.i_visible_width
- || place.height != sys->fmt.i_visible_height)
+ if (vd->place->width != sys->fmt.i_visible_width
+ || vd->place->height != sys->fmt.i_visible_height)
return VLC_EGENERIC;
return VLC_SUCCESS;
@@ -376,9 +369,7 @@ static int Open (vout_display_t *vd,
/* XCB_CW_COLORMAP */
cmap,
};
- vout_display_place_t *place = &sys->place;
- vout_display_PlacePicture(place, vd->source, &vd->cfg->display);
sys->window = xcb_generate_id (conn);
sys->gc = xcb_generate_id (conn);
xcb_create_window(conn, sys->depth, sys->window,
=====================================
src/video_output/display.c
=====================================
@@ -810,6 +810,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
vd->owner = *owner;
PlaceVideoInDisplay(osys);
+ vd->place = &osys->src_place;
if (module == NULL || module[0] == '\0')
module = "any";
=====================================
src/video_output/video_output.c
=====================================
@@ -1210,12 +1210,10 @@ static int PrerenderPicture(vout_thread_sys_t *sys, picture_t *filtered,
// otherwise it's done in the display chroma
const bool blending_before_converter = vd->source->orientation == ORIENT_NORMAL;
- vout_display_place_t place;
const vout_display_place_t *video_place = NULL; // default to fit the video
video_format_t fmt_spu;
if (vd_does_blending) {
- video_place = &place;
- vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
+ video_place = vd->place;
fmt_spu = *vd->source;
fmt_spu.i_sar_num = vd->cfg->display.sar.num;
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/f183f08c104649213e1d99baf43affacaab590d5...8a912baa5ab2d4fb0241f893b7fe263ddc27dcec
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/f183f08c104649213e1d99baf43affacaab590d5...8a912baa5ab2d4fb0241f893b7fe263ddc27dcec
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