frontends/va: remove private member and update target buffer

use update_decoder_target to update the target buffer to
let decoder obtain correct reference frame.

remove the previous logic which failed to update reference
info in time.

fixes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8996
fixes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8387
Cc: mesa-stable

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Signed-off-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23061>
This commit is contained in:
Ruijing Dong 2023-05-16 11:47:09 -04:00 committed by Marge Bot
parent a89f740e28
commit 799665c9ba
4 changed files with 3 additions and 30 deletions

View file

@ -30,23 +30,9 @@
#include "util/u_handle_table.h"
#include "va_private.h"
static void vlVaGetPastReferenceFrame(vlVaDriver *drv, VASurfaceID surface_id,
struct pipe_video_buffer **ref_frame)
{
vlVaSurface *surf = handle_table_get(drv->htab, surface_id);
if (surf) {
*ref_frame = surf->obsolete_buf;
surf->obsolete_buf = NULL;
}
else
*ref_frame = NULL;
}
static void resetReferencePictureDesc(struct pipe_h264_picture_desc *h264,
unsigned int i)
{
struct h264_private *private = h264->priv;
h264->ref[i] = NULL;
h264->frame_num_list[i] = 0;
h264->is_long_term[i] = 0;
@ -54,21 +40,17 @@ static void resetReferencePictureDesc(struct pipe_h264_picture_desc *h264,
h264->bottom_is_reference[i] = 0;
h264->field_order_cnt_list[i][0] = 0;
h264->field_order_cnt_list[i][1] = 0;
private->past_ref[i] = NULL;
}
void vlVaHandlePictureParameterBufferH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
{
VAPictureParameterBufferH264 *h264 = buf->data;
struct h264_private *private = &context->h264;
unsigned int top_or_bottom_field;
bool is_ref;
unsigned i;
assert(buf->size >= sizeof(VAPictureParameterBufferH264) && buf->num_elements == 1);
context->desc.h264.slice_count = 0;
context->desc.h264.priv = private;
/*CurrPic*/
context->desc.h264.field_order_cnt[0] = h264->CurrPic.TopFieldOrderCnt;
context->desc.h264.field_order_cnt[1] = h264->CurrPic.BottomFieldOrderCnt;
@ -148,7 +130,6 @@ void vlVaHandlePictureParameterBufferH264(vlVaDriver *drv, vlVaContext *context,
}
vlVaGetReferenceFrame(drv, h264->ReferenceFrames[i].picture_id, &context->desc.h264.ref[i]);
vlVaGetPastReferenceFrame(drv, h264->ReferenceFrames[i].picture_id, &private->past_ref[i]);
context->desc.h264.frame_num_list[i] = h264->ReferenceFrames[i].frame_idx;
top_or_bottom_field = h264->ReferenceFrames[i].flags &

View file

@ -1525,7 +1525,6 @@ vlVaExportSurfaceHandle(VADriverContextP ctx,
struct u_rect src_rect, dst_rect;
surf->templat.interlaced = false;
surf->obsolete_buf = surf->buffer;
ret = vlVaHandleSurfaceAllocate(drv, surf, &surf->templat, NULL, 0);
if (ret != VA_STATUS_SUCCESS) {
@ -1542,10 +1541,11 @@ vlVaExportSurfaceHandle(VADriverContextP ctx,
interlaced, surf->buffer,
&src_rect, &dst_rect,
VL_COMPOSITOR_WEAVE);
if (interlaced->codec && interlaced->codec->update_decoder_target)
interlaced->codec->update_decoder_target(interlaced->codec, interlaced, surf->buffer);
interlaced->destroy(interlaced);
} else
surf->obsolete_buf = NULL;
}
surfaces = surf->buffer->get_surfaces(surf->buffer);

View file

@ -364,7 +364,6 @@ typedef struct {
unsigned int slice_header_size;
} mjpeg;
struct h264_private h264;
struct vl_deint_filter *deint;
vlVaBuffer *coded_buf;
int target_id;

View file

@ -375,10 +375,6 @@ struct pipe_h264_pps
int8_t second_chroma_qp_index_offset;
};
struct h264_private {
struct pipe_video_buffer *past_ref[16];
};
struct pipe_h264_picture_desc
{
struct pipe_picture_desc base;
@ -405,9 +401,6 @@ struct pipe_h264_picture_desc
struct pipe_video_buffer *ref[16];
/* using private as a parameter name conflicts with C++ keywords */
void *priv;
struct
{
bool slice_info_present;