media: venus: vdec: Make decoder return LAST flag for sufficient event
authorStanimir Varbanov <stanimir.varbanov@linaro.org>
Mon, 28 Sep 2020 16:44:30 +0000 (18:44 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 17:32:02 +0000 (18:32 +0100)
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>
drivers/media/platform/qcom/venus/vdec.c

index 3aa740a..a3e64d1 100644 (file)
@@ -637,6 +637,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;
@@ -712,6 +713,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,
@@ -1346,19 +1364,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;
        }
 
        /*
@@ -1367,7 +1381,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;