From 6b91f13d5ded1fbc7f83ca9b6e63ab09aa0473d2 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Thu, 6 Mar 2025 16:50:10 +0100 Subject: [PATCH] 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 0ee4506c3aaf4e024748c91fbda9ea77c215bc4a. Cc: mesa-stable Reviewed-by: Ruijing Dong Part-of: --- src/gallium/frontends/vdpau/decode.c | 85 ++++++++++++---------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/src/gallium/frontends/vdpau/decode.c b/src/gallium/frontends/vdpau/decode.c index 4f2ed40484b..5779edc0b05 100644 --- a/src/gallium/frontends/vdpau/decode.c +++ b/src/gallium/frontends/vdpau/decode.c @@ -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) {