[vlc-devel] [PATCH 04/15] display: make vd->fmt a const pointer
Steve Lhomme
robux4 at ycbcr.xyz
Thu Sep 3 07:52:21 CEST 2020
This will prevent display modules from modifying it anytime they want.
They can modify the format on open and maybe later when a new format is pushed.
The storage of the display video_format_t is in vout_display_priv_t.display_fmt.
---
include/vlc_vout_display.h | 2 +-
modules/hw/mmal/vout.c | 36 ++++++++++++-------------
modules/hw/vdpau/display.c | 4 +--
modules/video_output/decklink.cpp | 4 +--
modules/video_output/fb.c | 2 +-
modules/video_output/kms.c | 2 +-
modules/video_output/kva.c | 2 +-
modules/video_output/vmem.c | 2 +-
modules/video_output/wayland/shm.c | 8 +++---
modules/video_output/win32/direct3d11.c | 2 +-
modules/video_output/win32/direct3d9.c | 4 +--
modules/video_output/yuv.c | 6 ++---
src/video_output/display.c | 28 ++++++++++---------
src/video_output/video_output.c | 2 +-
src/video_output/vout_wrapper.c | 2 +-
15 files changed, 54 insertions(+), 52 deletions(-)
diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index d5fc96a9193..830275b1e30 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -302,7 +302,7 @@ struct vout_display_t {
* By default, it is equal to ::source except for the aspect ratio
* which is undefined(0) and is ignored.
*/
- video_format_t fmt;
+ const video_format_t *fmt;
/* Information
*
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index d471971461f..d96328fc63d 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -177,12 +177,12 @@ static MMAL_FOURCC_T vout_vlc_to_mmal_pic_fourcc(const unsigned int fcc)
static void display_set_format(const vout_display_t * const vd, MMAL_ES_FORMAT_T *const es_fmt, const bool is_intermediate)
{
- const unsigned int w = is_intermediate ? vd->fmt.i_visible_width : vd->fmt.i_width ;
- const unsigned int h = is_intermediate ? vd->fmt.i_visible_height : vd->fmt.i_height;
+ const unsigned int w = is_intermediate ? vd->fmt->i_visible_width : vd->fmt->i_width ;
+ const unsigned int h = is_intermediate ? vd->fmt->i_visible_height : vd->fmt->i_height;
MMAL_VIDEO_FORMAT_T * const v_fmt = &es_fmt->es->video;
es_fmt->type = MMAL_ES_TYPE_VIDEO;
- es_fmt->encoding = is_intermediate ? MMAL_ENCODING_I420 : vout_vlc_to_mmal_pic_fourcc(vd->fmt.i_chroma);
+ es_fmt->encoding = is_intermediate ? MMAL_ENCODING_I420 : vout_vlc_to_mmal_pic_fourcc(vd->fmt->i_chroma);
es_fmt->encoding_variant = 0;
v_fmt->width = (w + 31) & ~31;
@@ -191,25 +191,25 @@ static void display_set_format(const vout_display_t * const vd, MMAL_ES_FORMAT_T
v_fmt->crop.y = 0;
v_fmt->crop.width = w;
v_fmt->crop.height = h;
- if (vd->fmt.i_sar_num == 0 || vd->fmt.i_sar_den == 0) {
+ if (vd->fmt->i_sar_num == 0 || vd->fmt->i_sar_den == 0) {
v_fmt->par.num = 1;
v_fmt->par.den = 1;
} else {
- v_fmt->par.num = vd->fmt.i_sar_num;
- v_fmt->par.den = vd->fmt.i_sar_den;
+ v_fmt->par.num = vd->fmt->i_sar_num;
+ v_fmt->par.den = vd->fmt->i_sar_den;
}
- v_fmt->frame_rate.num = vd->fmt.i_frame_rate;
- v_fmt->frame_rate.den = vd->fmt.i_frame_rate_base;
- v_fmt->color_space = vlc_to_mmal_color_space(vd->fmt.space);
+ v_fmt->frame_rate.num = vd->fmt->i_frame_rate;
+ v_fmt->frame_rate.den = vd->fmt->i_frame_rate_base;
+ v_fmt->color_space = vlc_to_mmal_color_space(vd->fmt->space);
}
static void display_src_rect(const vout_display_t * const vd, MMAL_RECT_T *const rect)
{
const bool wants_isp = false;
- rect->x = wants_isp ? 0 : vd->fmt.i_x_offset;
- rect->y = wants_isp ? 0 : vd->fmt.i_y_offset;
- rect->width = vd->fmt.i_visible_width;
- rect->height = vd->fmt.i_visible_height;
+ rect->x = wants_isp ? 0 : vd->fmt->i_x_offset;
+ rect->y = wants_isp ? 0 : vd->fmt->i_y_offset;
+ rect->width = vd->fmt->i_visible_width;
+ rect->height = vd->fmt->i_visible_height;
}
static void isp_input_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buf)
@@ -830,7 +830,7 @@ static void vd_prepare(vout_display_t *vd, picture_t *p_pic,
}
// *****
- if (want_copy(&vd->fmt)) {
+ if (want_copy(vd->fmt)) {
if (sys->copy_buf != NULL) {
msg_Err(vd, "Copy buf not NULL");
mmal_buffer_header_release(sys->copy_buf);
@@ -931,8 +931,8 @@ static void adjust_refresh_rate(vout_display_t *vd, const video_format_t *fmt)
mode->scan_mode == HDMI_INTERLACED)
continue;
} else {
- if (mode->width != vd->fmt.i_visible_width ||
- mode->height != vd->fmt.i_visible_height)
+ if (mode->width != vd->fmt->i_visible_width ||
+ mode->height != vd->fmt->i_visible_height)
continue;
if (mode->scan_mode != sys->b_progressive ? HDMI_NONINTERLACED : HDMI_INTERLACED)
continue;
@@ -1105,9 +1105,9 @@ static int OpenMmalVout(vout_display_t *vd, const vout_display_cfg_t *cfg,
MMAL_STATUS_T status;
int ret = VLC_EGENERIC;
// At the moment all copy is via I420
- const bool needs_copy = !hw_mmal_chroma_is_mmal(vd->fmt.i_chroma);
+ const bool needs_copy = !hw_mmal_chroma_is_mmal(vd->fmt->i_chroma);
const MMAL_FOURCC_T enc_in = needs_copy ? MMAL_ENCODING_I420 :
- vout_vlc_to_mmal_pic_fourcc(vd->fmt.i_chroma);
+ vout_vlc_to_mmal_pic_fourcc(vd->fmt->i_chroma);
sys = calloc(1, sizeof(struct vout_display_sys_t));
if (!sys)
diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c
index 31e1164b4a7..e3484a72988 100644
--- a/modules/hw/vdpau/display.c
+++ b/modules/hw/vdpau/display.c
@@ -260,8 +260,8 @@ static int Control(vout_display_t *vd, int query, va_list ap)
vout_display_place_t place;
vout_display_PlacePicture(&place, vd->source, cfg);
- if (place.width != vd->fmt.i_visible_width
- || place.height != vd->fmt.i_visible_height)
+ if (place.width != vd->fmt->i_visible_width
+ || place.height != vd->fmt->i_visible_height)
return VLC_EGENERIC;
const uint32_t values[] = { place.x, place.y,
diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp
index cfe069c34ff..5007d5be7fe 100644
--- a/modules/video_output/decklink.cpp
+++ b/modules/video_output/decklink.cpp
@@ -667,8 +667,8 @@ static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *,
HRESULT result;
int w, h, stride, length;
- w = vd->fmt.i_width;
- h = vd->fmt.i_height;
+ w = vd->fmt->i_width;
+ h = vd->fmt->i_height;
IDeckLinkMutableVideoFrame *pDLVideoFrame;
result = sys->p_output->CreateVideoFrame(w, h, w*3,
diff --git a/modules/video_output/fb.c b/modules/video_output/fb.c
index d8dcf8646a6..c06700377f4 100644
--- a/modules/video_output/fb.c
+++ b/modules/video_output/fb.c
@@ -598,7 +598,7 @@ static int OpenDisplay(vout_display_t *vd, bool force_resolution)
picture_resource_t rsc = { 0 };
- sys->picture = picture_NewFromResource(&vd->fmt, &rsc);
+ sys->picture = picture_NewFromResource(vd->fmt, &rsc);
if (unlikely(sys->picture == NULL)) {
munmap(sys->video_ptr, sys->video_size);
ioctl(sys->fd, FBIOPUT_VSCREENINFO, &sys->old_info);
diff --git a/modules/video_output/kms.c b/modules/video_output/kms.c
index 3e686e1414a..f0b5d32ebcc 100644
--- a/modules/video_output/kms.c
+++ b/modules/video_output/kms.c
@@ -578,7 +578,7 @@ static int OpenDisplay(vout_display_t *vd)
picture_resource_t rsc = { 0 };
- sys->picture = picture_NewFromResource(&vd->fmt, &rsc);
+ sys->picture = picture_NewFromResource(vd->fmt, &rsc);
if (!sys->picture)
goto err_out;
diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c
index 821dcc46b3d..cda74bddabe 100644
--- a/modules/video_output/kva.c
+++ b/modules/video_output/kva.c
@@ -592,7 +592,7 @@ static int OpenDisplay( vout_display_t *vd, video_format_t *fmt )
char *title = var_InheritString( vd, "video-title" );
if (title != NULL
|| asprintf( &title, VOUT_TITLE " (%4.4s to %4.4s - %s mode KVA output)",
- (char *)&vd->fmt.i_chroma, (char *)&sys->kvas.fccSrcColor,
+ (char *)&vd->fmt->i_chroma, (char *)&sys->kvas.fccSrcColor,
psz_video_mode[sys->kvac.ulMode - 1] ) >= 0)
{
WinSetWindowText( sys->frame, title );
diff --git a/modules/video_output/vmem.c b/modules/video_output/vmem.c
index 7463fb1a7b9..2de886284ee 100644
--- a/modules/video_output/vmem.c
+++ b/modules/video_output/vmem.c
@@ -244,7 +244,7 @@ static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic,
sys->pic_opaque = sys->lock(sys->opaque, planes);
- picture_t *locked = picture_NewFromResource(&vd->fmt, &rsc);
+ picture_t *locked = picture_NewFromResource(vd->fmt, &rsc);
if (likely(locked != NULL)) {
for (unsigned i = 0; i < PICTURE_PLANE_MAX; i++) {
locked->p[i].p_pixels = planes[i];
diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c
index 1d84ec27fe0..10a9cf3d022 100644
--- a/modules/video_output/wayland/shm.c
+++ b/modules/video_output/wayland/shm.c
@@ -115,11 +115,11 @@ static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic,
}
if (sys->viewport == NULL) /* Poor man's crop */
- offset += 4 * vd->fmt.i_x_offset
- + pic->p->i_pitch * vd->fmt.i_y_offset;
+ offset += 4 * vd->fmt->i_x_offset
+ + pic->p->i_pitch * vd->fmt->i_y_offset;
- buf = wl_shm_pool_create_buffer(pool, offset, vd->fmt.i_visible_width,
- vd->fmt.i_visible_height, stride,
+ buf = wl_shm_pool_create_buffer(pool, offset, vd->fmt->i_visible_width,
+ vd->fmt->i_visible_height, stride,
WL_SHM_FORMAT_XRGB8888);
wl_shm_pool_destroy(pool);
if (buf == NULL)
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index f67b677d201..e116fff9c76 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -257,7 +257,7 @@ static void UpdateSize(vout_display_t *vd)
msg_Dbg(vd, "Detected size change %dx%d", sys->area.place.width,
sys->area.place.height);
- UpdateDisplayFormat(vd, &vd->fmt);
+ UpdateDisplayFormat(vd, vd->fmt);
RECT rect_dst = {
.left = sys->area.place.x,
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 01581ed0f7f..60217fe3e59 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -1162,7 +1162,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
return VLC_EGENERIC;
}
#endif
- UpdateOutput(vd, &vd->fmt, NULL);
+ UpdateOutput(vd, vd->fmt, NULL);
sys->clear_scene = true;
sys->area.place_changed = false;
@@ -1176,7 +1176,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) {
sys->reset_device = true;
/* FIXME what to do here in case of failure */
- if (Direct3D9Reset(vd, &vd->fmt)) {
+ if (Direct3D9Reset(vd, vd->fmt)) {
msg_Err(vd, "Failed to reset device");
return;
}
diff --git a/modules/video_output/yuv.c b/modules/video_output/yuv.c
index 6667a63fe05..6d7003e863a 100644
--- a/modules/video_output/yuv.c
+++ b/modules/video_output/yuv.c
@@ -175,7 +175,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
vout_display_sys_t *sys = vd->sys;
/* */
- video_format_t fmt = vd->fmt;
+ video_format_t fmt = *vd->fmt;
if (ORIENT_IS_SWAP(vd->source->orientation))
{
@@ -232,8 +232,8 @@ static void Display(vout_display_t *vd, picture_t *picture)
const plane_t *plane = &picture->p[i];
const uint8_t *pixels = plane->p_pixels;
- pixels += (vd->fmt.i_x_offset * plane->i_visible_pitch)
- / vd->fmt.i_visible_height;
+ pixels += (vd->fmt->i_x_offset * plane->i_visible_pitch)
+ / vd->fmt->i_visible_height;
for( int y = 0; y < plane->i_visible_lines; y++) {
const size_t written = fwrite(pixels, 1, plane->i_visible_pitch,
diff --git a/src/video_output/display.c b/src/video_output/display.c
index a394ad30e27..ea7fd7ae5aa 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -51,9 +51,9 @@ static picture_t *VideoBufferNew(filter_t *filter)
vout_display_t *vd = filter->owner.sys;
const video_format_t *fmt = &filter->fmt_out.video;
- assert(vd->fmt.i_chroma == fmt->i_chroma &&
- vd->fmt.i_width == fmt->i_width &&
- vd->fmt.i_height == fmt->i_height);
+ assert(vd->fmt->i_chroma == fmt->i_chroma &&
+ vd->fmt->i_width == fmt->i_width &&
+ vd->fmt->i_height == fmt->i_height);
picture_pool_t *pool = vout_GetPool(vd, 3);
if (!pool)
@@ -281,6 +281,7 @@ typedef struct {
/* */
video_format_t source;
+ video_format_t display_fmt;
vlc_video_context *src_vctx;
/* filters to convert the vout source to fmt, NULL means no conversion
* can be done and nothing will be displayed */
@@ -297,14 +298,14 @@ static int vout_display_start(void *func, bool forced, va_list ap)
vlc_video_context *context = osys->src_vctx;
/* Picture buffer does not have the concept of aspect ratio */
- video_format_Copy(&vd->fmt, vd->source);
- vd->fmt.i_sar_num = 0;
- vd->fmt.i_sar_den = 0;
+ video_format_Copy(&osys->display_fmt, vd->source);
+ osys->display_fmt.i_sar_num = 0;
+ osys->display_fmt.i_sar_den = 0;
vd->obj.force = forced; /* TODO: pass to activate() instead? */
- int ret = activate(vd, cfg, &vd->fmt, context);
+ int ret = activate(vd, cfg, &osys->display_fmt, context);
if (ret != VLC_SUCCESS) {
- video_format_Clean(&vd->fmt);
+ video_format_Clean(&osys->display_fmt);
vlc_objres_clear(VLC_OBJECT(vd));
}
return ret;
@@ -338,7 +339,7 @@ static int VoutDisplayCreateRender(vout_display_t *vd)
v_src.i_sar_num = 0;
v_src.i_sar_den = 0;
- video_format_t v_dst = vd->fmt;
+ video_format_t v_dst = *vd->fmt;
v_dst.i_sar_num = 0;
v_dst.i_sar_den = 0;
@@ -412,7 +413,7 @@ picture_pool_t *vout_GetPool(vout_display_t *vd, unsigned count)
vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display);
if (osys->pool == NULL)
- osys->pool = picture_pool_NewFromFormat(&vd->fmt, count);
+ osys->pool = picture_pool_NewFromFormat(vd->fmt, count);
return osys->pool;
}
@@ -469,7 +470,7 @@ static void vout_display_Reset(vout_display_t *vd)
}
if (vout_display_Control(vd, VOUT_DISPLAY_RESET_PICTURES, &osys->cfg,
- &vd->fmt)
+ &osys->display_fmt)
|| VoutDisplayCreateRender(vd))
msg_Err(vd, "Failed to adjust render format");
}
@@ -737,6 +738,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
/* */
vout_display_t *vd = &osys->display;
vd->source = &osys->source;
+ vd->fmt = &osys->display_fmt;
vd->owner = &osys->display_owner;
vd->info = (vout_display_info_t){ };
vd->cfg = &osys->cfg;
@@ -766,7 +768,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
if (vd->close != NULL)
vd->close(vd);
vlc_objres_clear(VLC_OBJECT(vd));
- video_format_Clean(&vd->fmt);
+ video_format_Clean(&osys->display_fmt);
goto error;
}
return vd;
@@ -797,6 +799,6 @@ void vout_display_Delete(vout_display_t *vd)
vlc_objres_clear(VLC_OBJECT(vd));
video_format_Clean(&osys->source);
- video_format_Clean(&vd->fmt);
+ video_format_Clean(&osys->display_fmt);
vlc_object_delete(vd);
}
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 1f2e3243887..769fed2a442 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1297,7 +1297,7 @@ static int ThreadDisplayRenderPicture(vout_thread_sys_t *vout, bool is_forced)
if (do_early_spu) {
fmt_spu = *vd->source;
} else {
- fmt_spu = vd->fmt;
+ fmt_spu = *vd->fmt;
fmt_spu.i_sar_num = vd->cfg->display.sar.num;
fmt_spu.i_sar_den = vd->cfg->display.sar.den;
}
diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
index 78c6ec8f27a..9d819f8a2df 100644
--- a/src/video_output/vout_wrapper.c
+++ b/src/video_output/vout_wrapper.c
@@ -117,7 +117,7 @@ vout_display_t *vout_OpenWrapper(vout_thread_t *vout, vout_thread_private_t *sys
var_AddCallback(vout, "video-wallpaper", Forward, vd);
#endif
var_SetBool(VLC_OBJECT(vout), "viewpoint-changeable",
- vd->fmt.projection_mode != PROJECTION_MODE_RECTANGULAR);
+ vd->fmt->projection_mode != PROJECTION_MODE_RECTANGULAR);
return vd;
error:
--
2.26.2
More information about the vlc-devel
mailing list