Revert "frontends/vdpau: Alloc interlaced surface for interlaced pics"

This is not needed now when deinterlace can handle non-interlaced
buffers. Also this forces the buffer as interlaced which doesn't work
on radeonsi anymore.

This reverts commit 0ee4506c3a.

Cc: mesa-stable
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33927>
This commit is contained in:
David Rosca
2025-03-06 16:50:10 +01:00
committed by Marge Bot
parent 244cfac143
commit 6b91f13d5d
+36 -49
View File
@@ -986,16 +986,6 @@ vlVdpDecoderFixVC1Startcode(uint32_t *num_buffers, const void *buffers[], unsign
sizes[0] = 4;
}
static bool
vlVdpQueryInterlacedH264(struct pipe_h264_picture_desc *h264)
{
if (h264->pps->sps->frame_mbs_only_flag)
return false;
return h264->field_pic_flag || /* PAFF */
h264->pps->sps->mb_adaptive_frame_field_flag; /* MBAFF */
}
/**
* Decode a compressed field/frame and render the result into a VdpVideoSurface.
*/
@@ -1028,7 +1018,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
struct pipe_h265_picture_desc h265;
struct pipe_av1_picture_desc av1;
} desc;
bool picture_interlaced = false;
struct pipe_video_buffer *target_buf;
if (!(picture_info && bitstream_buffers))
@@ -1052,6 +1041,42 @@ vlVdpDecoderRender(VdpDecoder decoder,
// TODO: Recreate decoder with correct chroma
return VDP_STATUS_INVALID_CHROMA_TYPE;
buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
if (vlsurf->video_buffer == NULL ||
!screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format,
dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
!buffer_support[vlsurf->video_buffer->interlaced]) {
mtx_lock(&vlsurf->device->mutex);
/* destroy the old one */
if (vlsurf->video_buffer)
vlsurf->video_buffer->destroy(vlsurf->video_buffer);
/* set the buffer format to the prefered one */
vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_PREFERRED_FORMAT);
/* also set interlacing to decoders preferences */
vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_PREFERS_INTERLACED);
/* and recreate the video buffer */
vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
/* still no luck? get me out of here... */
if (!vlsurf->video_buffer) {
mtx_unlock(&vlsurf->device->mutex);
return VDP_STATUS_NO_IMPLEMENTATION;
}
vlVdpVideoSurfaceClear(vlsurf);
mtx_unlock(&vlsurf->device->mutex);
}
for (i = 0; i < bitstream_buffer_count; ++i) {
buffers[i] = bitstream_buffers[i].bitstream;
sizes[i] = bitstream_buffers[i].bitstream_bytes;
@@ -1074,7 +1099,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
desc.h264.pps = &pps_h264;
ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info, dec->level);
picture_interlaced = vlVdpQueryInterlacedH264(&desc.h264);
break;
case PIPE_VIDEO_FORMAT_HEVC:
desc.h265.pps = &pps_h265;
@@ -1090,43 +1114,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
if (ret != VDP_STATUS_OK)
return ret;
buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
if (vlsurf->video_buffer == NULL ||
!screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format,
dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
!buffer_support[vlsurf->video_buffer->interlaced] ||
(picture_interlaced && !vlsurf->video_buffer->interlaced && buffer_support[1])) {
mtx_lock(&vlsurf->device->mutex);
/* destroy the old one */
if (vlsurf->video_buffer)
vlsurf->video_buffer->destroy(vlsurf->video_buffer);
/* set the buffer format to the preferred one */
vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_PREFERRED_FORMAT);
/* also set interlacing to decoders preferences */
vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_PREFERS_INTERLACED) || picture_interlaced;
/* and recreate the video buffer */
vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
/* still no luck? get me out of here... */
if (!vlsurf->video_buffer) {
mtx_unlock(&vlsurf->device->mutex);
return VDP_STATUS_NO_IMPLEMENTATION;
}
vlVdpVideoSurfaceClear(vlsurf);
mtx_unlock(&vlsurf->device->mutex);
}
target_buf = vlsurf->video_buffer;
if (u_reduce_video_profile(dec->profile) == PIPE_VIDEO_FORMAT_AV1) {