diff --git a/doc/libvlc/QtGL/qtvlcwidget.cpp b/doc/libvlc/QtGL/qtvlcwidget.cpp index 8fbeae0bfe..1c79e6ef46 100644 --- a/doc/libvlc/QtGL/qtvlcwidget.cpp +++ b/doc/libvlc/QtGL/qtvlcwidget.cpp @@ -82,6 +82,7 @@ public: render_cfg->colorspace = libvlc_video_colorspace_BT709; render_cfg->primaries = libvlc_video_primaries_BT709; render_cfg->transfer = libvlc_video_transfer_func_SRGB; + render_cfg->orientation = libvlc_video_orient_top_left; return true; } diff --git a/doc/libvlc/d3d11_player.cpp b/doc/libvlc/d3d11_player.cpp index 9146b22f89..789a784283 100644 --- a/doc/libvlc/d3d11_player.cpp +++ b/doc/libvlc/d3d11_player.cpp @@ -426,6 +426,7 @@ static bool UpdateOutput_cb( void *opaque, const libvlc_video_render_cfg_t *cfg, out->colorspace = libvlc_video_colorspace_BT709; out->primaries = libvlc_video_primaries_BT709; out->transfer = libvlc_video_transfer_func_SRGB; + out->orientation = libvlc_video_orient_top_left; return true; } diff --git a/doc/libvlc/d3d9_player.c b/doc/libvlc/d3d9_player.c index 99f04ecd8b..a77e66888d 100644 --- a/doc/libvlc/d3d9_player.c +++ b/doc/libvlc/d3d9_player.c @@ -141,6 +141,7 @@ static bool Resize(struct render_context *ctx, unsigned width, unsigned height, out->colorspace = libvlc_video_colorspace_BT709; out->primaries = libvlc_video_primaries_BT709; out->transfer = libvlc_video_transfer_func_SRGB; + out->orientation = libvlc_video_orient_top_left; return true; } diff --git a/doc/libvlc/sdl_opengl_player.cpp b/doc/libvlc/sdl_opengl_player.cpp index 7a8297d658..7870647cf4 100644 --- a/doc/libvlc/sdl_opengl_player.cpp +++ b/doc/libvlc/sdl_opengl_player.cpp @@ -155,6 +155,7 @@ public: render_cfg->colorspace = libvlc_video_colorspace_BT709; render_cfg->primaries = libvlc_video_primaries_BT709; render_cfg->transfer = libvlc_video_transfer_func_SRGB; + render_cfg->orientation = libvlc_video_orient_top_left; return true; } diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 4d0f3c1d09..50eb651683 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -600,6 +600,8 @@ typedef struct libvlc_video_output_cfg_t libvlc_video_color_primaries_t primaries; /** video transfer function */ libvlc_video_transfer_func_t transfer; + /** video surface orientation */ + libvlc_video_orient_t orientation; } libvlc_video_output_cfg_t; /** diff --git a/modules/video_output/vgl.c b/modules/video_output/vgl.c index 7e45807197..a17dbe6bb2 100644 --- a/modules/video_output/vgl.c +++ b/modules/video_output/vgl.c @@ -98,6 +98,7 @@ static void Resize(vlc_gl_t * gl, unsigned w, unsigned h) assert(render_cfg.colorspace == libvlc_video_colorspace_BT709); assert(render_cfg.primaries == libvlc_video_primaries_BT709); assert(render_cfg.transfer == libvlc_video_transfer_func_SRGB); + assert(render_cfg.orientation == libvlc_video_orient_top_left); sys->width = w; sys->height = h; } diff --git a/modules/video_output/win32/d3d_shaders.h b/modules/video_output/win32/d3d_shaders.h index 8c97c4e8a9..9180f34650 100644 --- a/modules/video_output/win32/d3d_shaders.h +++ b/modules/video_output/win32/d3d_shaders.h @@ -43,6 +43,7 @@ typedef struct { bool b_full_range; unsigned luminance_peak; const d3d_format_t *pixelFormat; + video_orientation_t orientation; } display_info_t; /* structures passed to the pixel shader */ diff --git a/modules/video_output/win32/direct3d11.cpp b/modules/video_output/win32/direct3d11.cpp index 9553c6d3c1..fc335fc119 100644 --- a/modules/video_output/win32/direct3d11.cpp +++ b/modules/video_output/win32/direct3d11.cpp @@ -216,6 +216,7 @@ static int UpdateDisplayFormat(vout_display_t *vd, const video_format_t *fmt) new_display.transfer = (video_transfer_func_t) out.transfer; new_display.primaries = (video_color_primaries_t) out.primaries; new_display.b_full_range = out.full_range; + new_display.orientation = (video_orientation_t) out.orientation; /* guestimate the display peak luminance */ switch (new_display.transfer) @@ -238,7 +239,8 @@ static int UpdateDisplayFormat(vout_display_t *vd, const video_format_t *fmt) sys->display.color != new_display.color || sys->display.transfer != new_display.transfer || sys->display.primaries != new_display.primaries || - sys->display.b_full_range != new_display.b_full_range )) + sys->display.b_full_range != new_display.b_full_range || + sys->display.orientation != new_display.orientation )) { sys->display = new_display; /* TODO release the pixel shaders if the format changed */ @@ -275,7 +277,7 @@ static void UpdateSize(vout_display_t *vd) d3d11_device_lock( sys->d3d_dev ); D3D11_UpdateQuadPosition(vd, sys->d3d_dev, &sys->picQuad, &source_rect, - video_format_GetTransform(vd->source->orientation, ORIENT_NORMAL)); + video_format_GetTransform(vd->source->orientation, sys->display.orientation)); D3D11_UpdateViewpoint( vd, sys->d3d_dev, &sys->picQuad, &vd->cfg->viewpoint, (float) vd->cfg->display.width / vd->cfg->display.height ); @@ -1068,7 +1070,7 @@ static int Direct3D11CreateFormatResources(vout_display_t *vd, const video_forma source_rect.top = fmt->i_y_offset; source_rect.bottom = fmt->i_y_offset + fmt->i_visible_height; if (!D3D11_UpdateQuadPosition(vd, sys->d3d_dev, &sys->picQuad, &source_rect, - video_format_GetTransform(vd->source->orientation, ORIENT_NORMAL))) + video_format_GetTransform(vd->source->orientation, sys->display.orientation))) { msg_Err(vd, "Could not set quad picture position."); return VLC_EGENERIC; @@ -1410,7 +1412,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co output.top = r->fmt.i_y_offset; output.bottom = r->fmt.i_y_offset + r->fmt.i_visible_height; - D3D11_UpdateQuadPosition(vd, sys->d3d_dev, quad, &output, TRANSFORM_IDENTITY); + D3D11_UpdateQuadPosition(vd, sys->d3d_dev, quad, &output, + video_format_GetTransform(ORIENT_NORMAL, sys->display.orientation)); RECT spuViewport; spuViewport.left = (FLOAT) r->i_x * sys->area.place.width / subpicture->i_original_picture_width; diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index ac528f53be..a04960754e 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -1753,6 +1753,7 @@ static bool LocalSwapchainUpdateOutput( void *opaque, const libvlc_video_render_ out->colorspace = libvlc_video_colorspace_BT709; out->primaries = libvlc_video_primaries_BT709; out->transfer = libvlc_video_transfer_func_SRGB; + out->orientation = libvlc_video_orient_top_left; return true; } diff --git a/modules/video_output/win32/dxgi_swapchain.cpp b/modules/video_output/win32/dxgi_swapchain.cpp index 9832d1de45..e09aaad20a 100644 --- a/modules/video_output/win32/dxgi_swapchain.cpp +++ b/modules/video_output/win32/dxgi_swapchain.cpp @@ -449,6 +449,7 @@ void DXGI_SwapchainUpdateOutput( dxgi_swapchain *display, libvlc_video_output_cf out->colorspace = (libvlc_video_color_space_t) display->colorspace->color; out->primaries = (libvlc_video_color_primaries_t) display->colorspace->primaries; out->transfer = (libvlc_video_transfer_func_t) display->colorspace->transfer; + out->orientation = libvlc_video_orient_top_left; } bool DXGI_UpdateSwapChain( dxgi_swapchain *display, IDXGIAdapter *dxgiadapter,