Re: [PATCH v4] venus: venc: Fix enum frameintervals

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Stanimir,

On Thu, 3 Oct 2019 at 12:15, Stanimir Varbanov
<stanimir.varbanov@xxxxxxxxxx> wrote:
>
> I have tested this on db410c with following gst pipeline:
>
> gst-launch-1.0 -v videotestsrc !
> video/x-raw,format=NV12,width=1280,height=960,framerate=24/1 !
> v4l2h264enc
> extra-controls="controls,h264_profile=4,h264_level="5",video_bitrate=10000000;"
> ! filesink location=gstenc.h264
>
> Loic, could you give it a try on db820c too?
>
> Here is the info on the bug which I try to fix with current patch:
>
> https://bugs.96boards.org/show_bug.cgi?id=513
>
> On 10/3/19 1:10 PM, Stanimir Varbanov wrote:
> > This fixes an issue when setting the encoder framerate because of
> > missing precision. Now the frameinterval type is changed to
> > TYPE_CONTINUOUS and step = 1. Also the math is changed when
> > framerate property is called - the firmware side expects the
> > framerate in Q16 values.
> >
> > Signed-off-by: Stanimir Varbanov <stanimir.varbanov@xxxxxxxxxx>
> > ---
> >
> > Changes since v3:
> > Keep min/max numerator one, and divide frate(max/min) to frame
> > factor (returned framerate max/min capabilities are in range
> > 1 to 120fps but in Q16 i.e. 65536 to 7864320).
> >
> >  drivers/media/platform/qcom/venus/venc.c | 17 ++++++++++++-----
> >  1 file changed, 12 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
> > index 1b7fb2d5887c..133ff7eceb83 100644
> > --- a/drivers/media/platform/qcom/venus/venc.c
> > +++ b/drivers/media/platform/qcom/venus/venc.c
> > @@ -22,6 +22,7 @@
> >  #include "venc.h"
> >
> >  #define NUM_B_FRAMES_MAX     4
> > +#define FRAMERATE_FACTOR     BIT(16)
> >
> >  /*
> >   * Three resons to keep MPLANE formats (despite that the number of planes
> > @@ -576,7 +577,7 @@ static int venc_enum_frameintervals(struct file *file, void *fh,
> >       struct venus_inst *inst = to_inst(file);
> >       const struct venus_format *fmt;
> >
> > -     fival->type = V4L2_FRMIVAL_TYPE_STEPWISE;
> > +     fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
> >
> >       fmt = find_format(inst, fival->pixel_format,
> >                         V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
> > @@ -600,11 +601,11 @@ static int venc_enum_frameintervals(struct file *file, void *fh,
> >               return -EINVAL;
> >
> >       fival->stepwise.min.numerator = 1;
> > -     fival->stepwise.min.denominator = frate_max(inst);
> > +     fival->stepwise.min.denominator = frate_max(inst) / FRAMERATE_FACTOR;

On 820c frate_max() returns 120 set denominator to 0, and causes
gstreamer failure.

Regards,
Loic



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux