vlc | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Wed Aug 26 09:37:25 2020 +0200| [72abadaaa8199c332ed8bada442a0653628cc5f4] | committer: Steve Lhomme
display: make vd->fmt a const pointer This will prevent display modules from modifying it anytime they want. They can modify the format on open, RESET PICTURES 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. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=72abadaaa8199c332ed8bada442a0653628cc5f4 --- 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 a5433c79ab..e34f8cd65e 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 d471971461..d96328fc63 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 31e1164b4a..e3484a7298 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 cfe069c34f..5007d5be7f 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 d8dcf8646a..c06700377f 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 3e686e1414..f0b5d32ebc 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 821dcc46b3..cda74bddab 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 7463fb1a7b..2de886284e 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 1d84ec27fe..10a9cf3d02 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 f67b677d20..e116fff9c7 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 01581ed0f7..60217fe3e5 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 6667a63fe0..6d7003e863 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 a1f2773e9e..4e3548cdb5 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) @@ -280,6 +280,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 */ @@ -296,14 +297,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; @@ -337,7 +338,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; @@ -411,7 +412,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; } @@ -468,7 +469,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"); } @@ -735,6 +736,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->info = (vout_display_info_t){ }; vd->cfg = &osys->cfg; vd->prepare = NULL; @@ -765,7 +767,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; @@ -796,6 +798,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 1f2e324388..769fed2a44 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 78c6ec8f27..9d819f8a2d 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: _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits