1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-03 01:31:53 +02:00

libvlc: add the possibility to flip the rendered textures

Only supported by the D3D11 renderer for now.
This commit is contained in:
Steve Lhomme 2022-03-01 16:14:34 +01:00 committed by Jean-Baptiste Kempf
parent c28d1e024a
commit 553f6091c0
10 changed files with 17 additions and 4 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
/**

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;

View File

@ -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;
}

View File

@ -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,