media: venus: Fix reported frame intervals
authorLoic Poulain <loic.poulain@linaro.org>
Tue, 4 Aug 2020 12:21:57 +0000 (14:21 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 1 Sep 2020 12:13:29 +0000 (14:13 +0200)
On dragonboard-410c (apq8016) with HFI_VERSION_1XX, the reported
framerate is in unit of 1/65535 fps (for fine grained control).
So the current reported supported frame intervals is wrong (max
is 1/65535 fps), leading to encoding issues or format negotiation
failures with gstreamer.

Fix that by setting the framerate denominator to coherent value
based on the the framerate factor.

The factor is not always the same, e.g. with db820c (apq8096) HFI
reports framerate in fps unit. So only apply that for HFI_VERSION_1XX.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/venc.c

index a4a92c2a3a281516c08394043d471ccc00bfb689..80cb9fad73686c858f31e62e84321fae6794729d 100644 (file)
@@ -584,6 +584,7 @@ static int venc_enum_frameintervals(struct file *file, void *fh,
 {
        struct venus_inst *inst = to_inst(file);
        const struct venus_format *fmt;
+       unsigned int framerate_factor = 1;
 
        fival->type = V4L2_FRMIVAL_TYPE_STEPWISE;
 
@@ -608,12 +609,17 @@ static int venc_enum_frameintervals(struct file *file, void *fh,
            fival->height < frame_height_min(inst))
                return -EINVAL;
 
+       if (IS_V1(inst->core)) {
+               /* framerate is reported in 1/65535 fps unit */
+               framerate_factor = (1 << 16);
+       }
+
        fival->stepwise.min.numerator = 1;
-       fival->stepwise.min.denominator = frate_max(inst);
+       fival->stepwise.min.denominator = frate_max(inst) / framerate_factor;
        fival->stepwise.max.numerator = 1;
-       fival->stepwise.max.denominator = frate_min(inst);
+       fival->stepwise.max.denominator = frate_min(inst) / framerate_factor;
        fival->stepwise.step.numerator = 1;
-       fival->stepwise.step.denominator = frate_max(inst);
+       fival->stepwise.step.denominator = frate_max(inst) / framerate_factor;
 
        return 0;
 }