diff options
author | Thong Thai <[email protected]> | 2019-12-18 17:02:02 -0500 |
---|---|---|
committer | Marge Bot <[email protected]> | 2019-12-19 15:49:09 +0000 |
commit | 2add63060b51ea2ae432d10e1bd52d6cc0a4dcbb (patch) | |
tree | 4001840b313706f032b05c04a138edc3e7f72d54 /src/gallium/state_trackers | |
parent | 5710250074a066288c0ed44fd796baa0c4d0f42b (diff) |
st/va: Convert interlaced NV12 to progressive
In vlVaDeriveImage, convert interlaced NV12 buffers to progressive.
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1193
Signed-off-by: Thong Thai <[email protected]>
Reviewed-by: Leo Liu <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3157>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3157>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/va/image.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c index 9e3a49f1996..1a0712c9761 100644 --- a/src/gallium/state_trackers/va/image.c +++ b/src/gallium/state_trackers/va/image.c @@ -223,7 +223,8 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) if (!surf || !surf->buffer) return VA_STATUS_ERROR_INVALID_SURFACE; - if (surf->buffer->interlaced) + if (surf->buffer->interlaced && + surf->buffer->buffer_format != PIPE_FORMAT_NV12) return VA_STATUS_ERROR_OPERATION_FAILED; surfaces = surf->buffer->get_surfaces(surf->buffer); @@ -260,6 +261,10 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) offset = 0; } + img->num_planes = 1; + img->offsets[0] = offset; + img->data_size = img->pitches[0] * h; + switch (img->format.fourcc) { case VA_FOURCC('U','Y','V','Y'): case VA_FOURCC('Y','U','Y','V'): @@ -274,6 +279,48 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) img->pitches[0] = stride > 0 ? stride : w * 4; assert(img->pitches[0] >= (w * 4)); break; + case VA_FOURCC('N','V','1','2'): + if (surf->buffer->interlaced) { + struct pipe_video_buffer *new_buffer; + struct u_rect src_rect, dst_rect; + + surf->templat.interlaced = false; + new_buffer = drv->pipe->create_video_buffer(drv->pipe, &surf->templat); + + /* convert the interlaced to the progressive */ + src_rect.x0 = dst_rect.x0 = 0; + src_rect.x1 = dst_rect.x1 = surf->templat.width; + src_rect.y0 = dst_rect.y0 = 0; + src_rect.y1 = dst_rect.y1 = surf->templat.height; + + vl_compositor_yuv_deint_full(&drv->cstate, &drv->compositor, + surf->buffer, new_buffer, + &src_rect, &dst_rect, + VL_COMPOSITOR_WEAVE); + + surf->buffer->destroy(surf->buffer); + surf->buffer = new_buffer; + + /* recalculate the values now that we have a new surface */ + surfaces = surf->buffer->get_surfaces(surf->buffer); + if (screen->resource_get_info) { + screen->resource_get_info(screen, surfaces[0]->texture, &stride, + &offset); + if (!stride) + offset = 0; + } + + w = align(surf->buffer->width, 2); + h = align(surf->buffer->height, 2); + } + + img->num_planes = 2; + img->pitches[0] = stride > 0 ? stride : w; + img->offsets[0] = 0; + img->pitches[1] = stride > 0 ? stride : w; + img->offsets[1] = (stride > 0 ? stride : w) * h; + img->data_size = (stride > 0 ? stride : w) * h * 3 / 2; + break; default: /* VaDeriveImage only supports contiguous planes. But there is now a @@ -283,9 +330,6 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) return VA_STATUS_ERROR_OPERATION_FAILED; } - img->num_planes = 1; - img->offsets[0] = offset; - img->data_size = img->pitches[0] * h; img_buf = CALLOC(1, sizeof(vlVaBuffer)); if (!img_buf) { |