mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
st/va: force to submit two consecutive single jobs
The gop_size in rate control is the budget window for internal rate control calculation, and shouldn't always equal to idr period. Define a coefficient to let budget window contains a number of idr period for proper rate control calculation. Adjust the number of i/p frame remaining accordingly. v2: fixed regression issues introduced by previous version Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=98005 Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com> Acked-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
parent
7b811c362a
commit
8206882392
3 changed files with 27 additions and 7 deletions
|
|
@ -413,7 +413,6 @@ handleVAEncPictureParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlV
|
|||
context->desc.h264enc.quant_i_frames = h264->pic_init_qp;
|
||||
context->desc.h264enc.quant_b_frames = h264->pic_init_qp;
|
||||
context->desc.h264enc.quant_p_frames = h264->pic_init_qp;
|
||||
context->desc.h264enc.frame_num_cnt++;
|
||||
context->desc.h264enc.gop_cnt++;
|
||||
if (context->desc.h264enc.gop_cnt == context->desc.h264enc.gop_size)
|
||||
context->desc.h264enc.gop_cnt = 0;
|
||||
|
|
@ -569,18 +568,33 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
|
|||
if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
|
||||
coded_buf = context->coded_buf;
|
||||
getEncParamPreset(context);
|
||||
context->desc.h264enc.frame_num_cnt++;
|
||||
context->decoder->begin_frame(context->decoder, context->target, &context->desc.base);
|
||||
context->decoder->encode_bitstream(context->decoder, context->target,
|
||||
coded_buf->derived_surface.resource, &feedback);
|
||||
surf->frame_num_cnt = context->desc.h264enc.frame_num_cnt;
|
||||
surf->feedback = feedback;
|
||||
surf->coded_buf = coded_buf;
|
||||
}
|
||||
|
||||
context->decoder->end_frame(context->decoder, context->target, &context->desc.base);
|
||||
if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE &&
|
||||
context->desc.h264enc.p_remain == 1)
|
||||
context->decoder->flush(context->decoder);
|
||||
if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
|
||||
surf->frame_num_cnt = context->desc.h264enc.frame_num_cnt;
|
||||
surf->force_flushed = false;
|
||||
if (context->first_single_submitted) {
|
||||
context->decoder->flush(context->decoder);
|
||||
context->first_single_submitted = false;
|
||||
surf->force_flushed = true;
|
||||
}
|
||||
if (context->desc.h264enc.p_remain == 1) {
|
||||
if ((context->desc.h264enc.frame_num_cnt % 2) != 0) {
|
||||
context->decoder->flush(context->decoder);
|
||||
context->first_single_submitted = true;
|
||||
}
|
||||
else
|
||||
context->first_single_submitted = false;
|
||||
surf->force_flushed = true;
|
||||
}
|
||||
}
|
||||
pipe_mutex_unlock(drv->mutex);
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,12 +125,16 @@ vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target)
|
|||
|
||||
if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
|
||||
int frame_diff;
|
||||
if (context->desc.h264enc.frame_num_cnt > surf->frame_num_cnt)
|
||||
if (context->desc.h264enc.frame_num_cnt >= surf->frame_num_cnt)
|
||||
frame_diff = context->desc.h264enc.frame_num_cnt - surf->frame_num_cnt;
|
||||
else
|
||||
frame_diff = 0xFFFFFFFF - surf->frame_num_cnt + 1 + context->desc.h264enc.frame_num_cnt;
|
||||
if (frame_diff < 2)
|
||||
if ((frame_diff == 0) &&
|
||||
(surf->force_flushed == false) &&
|
||||
(context->desc.h264enc.frame_num_cnt % 2 != 0)) {
|
||||
context->decoder->flush(context->decoder);
|
||||
context->first_single_submitted = true;
|
||||
}
|
||||
context->decoder->get_feedback(context->decoder, surf->feedback, &(surf->coded_buf->coded_size));
|
||||
surf->feedback = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -244,6 +244,7 @@ typedef struct {
|
|||
struct vl_deint_filter *deint;
|
||||
struct vlVaBuffer *coded_buf;
|
||||
int target_id;
|
||||
bool first_single_submitted;
|
||||
} vlVaContext;
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -274,6 +275,7 @@ typedef struct {
|
|||
vlVaBuffer *coded_buf;
|
||||
void *feedback;
|
||||
unsigned int frame_num_cnt;
|
||||
bool force_flushed;
|
||||
} vlVaSurface;
|
||||
|
||||
// Public functions:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue