You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
media: venus: vdec: Make decoder return LAST flag for sufficient event
[ Upstream commit a4ca67af8b ]
This makes the decoder to behaives equally for sufficient and
insufficient events. After this change the LAST buffer flag will be set
when the new resolution (in dynamic-resolution-change state) is smaller
then the old bitstream resolution.
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Stable-dep-of: 50248ad9f190 ("media: venus: dec: Fix handling of the start cmd")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a30297bff8
commit
4c1239274f
@@ -636,6 +636,7 @@ static int vdec_output_conf(struct venus_inst *inst)
|
||||
{
|
||||
struct venus_core *core = inst->core;
|
||||
struct hfi_enable en = { .enable = 1 };
|
||||
struct hfi_buffer_requirements bufreq;
|
||||
u32 width = inst->out_width;
|
||||
u32 height = inst->out_height;
|
||||
u32 out_fmt, out2_fmt;
|
||||
@@ -711,6 +712,23 @@ static int vdec_output_conf(struct venus_inst *inst)
|
||||
}
|
||||
|
||||
if (IS_V3(core) || IS_V4(core)) {
|
||||
ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT, &bufreq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (bufreq.size > inst->output_buf_size)
|
||||
return -EINVAL;
|
||||
|
||||
if (inst->dpb_fmt) {
|
||||
ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT2,
|
||||
&bufreq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (bufreq.size > inst->output2_buf_size)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (inst->output2_buf_size) {
|
||||
ret = venus_helper_set_bufsize(inst,
|
||||
inst->output2_buf_size,
|
||||
@@ -1330,19 +1348,15 @@ static void vdec_event_change(struct venus_inst *inst,
|
||||
dev_dbg(dev, VDBGM "event %s sufficient resources (%ux%u)\n",
|
||||
sufficient ? "" : "not", ev_data->width, ev_data->height);
|
||||
|
||||
if (sufficient) {
|
||||
hfi_session_continue(inst);
|
||||
} else {
|
||||
switch (inst->codec_state) {
|
||||
case VENUS_DEC_STATE_INIT:
|
||||
inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
|
||||
break;
|
||||
case VENUS_DEC_STATE_DECODING:
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (inst->codec_state) {
|
||||
case VENUS_DEC_STATE_INIT:
|
||||
inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
|
||||
break;
|
||||
case VENUS_DEC_STATE_DECODING:
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1351,7 +1365,7 @@ static void vdec_event_change(struct venus_inst *inst,
|
||||
* itself doesn't mark the last decoder output buffer with HFI EOS flag.
|
||||
*/
|
||||
|
||||
if (!sufficient && inst->codec_state == VENUS_DEC_STATE_DRC) {
|
||||
if (inst->codec_state == VENUS_DEC_STATE_DRC) {
|
||||
int ret;
|
||||
|
||||
inst->next_buf_last = true;
|
||||
|
||||
Reference in New Issue
Block a user