[FFmpeg-devel] [PATCH V2] lavfi/showinfo: support regions of interest sidedata

mypopy at gmail.com mypopy at gmail.com
Mon Mar 11 05:04:47 EET 2019


On Mon, Mar 11, 2019 at 10:51 AM Guo, Yejun <yejun.guo at intel.com> wrote:
>
>
>
> > -----Original Message-----
> > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> > Of Jun Zhao
> > Sent: Sunday, March 10, 2019 9:17 PM
> > To: ffmpeg-devel at ffmpeg.org
> > Cc: Jun Zhao <barryjzhao at tencent.com>
> > Subject: [FFmpeg-devel] [PATCH V2] lavfi/showinfo: support regions of
> > interest sidedata
> >
> > From: Jun Zhao <barryjzhao at tencent.com>
> >
> > support regions of interest sidedata
> >
> > Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
> > ---
> >  libavfilter/vf_showinfo.c |   33 +++++++++++++++++++++++++++++++++
> >  1 files changed, 33 insertions(+), 0 deletions(-)
> >
> > diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
> > index e41c330..d0e140f 100644
> > --- a/libavfilter/vf_showinfo.c
> > +++ b/libavfilter/vf_showinfo.c
> > @@ -111,6 +111,36 @@ static void dump_stereo3d(AVFilterContext *ctx,
> > AVFrameSideData *sd)
> >          av_log(ctx, AV_LOG_INFO, " (inverted)");
> >  }
> >
> > +static void dump_roi(AVFilterContext *ctx, AVFrameSideData *sd)
> > +{
> > +    AVRegionOfInterest *roi;
> > +    int nb_rois;
> > +
> > +    if (sd->size < sizeof(*roi)) {
> > +        av_log(ctx, AV_LOG_INFO, "invalid data");
> > +        return;
> > +    }
>
> it is possible.
It's a surprised behavior for me, how to check the corrupted side data
for this case? I don't like the self_size field in this case in fact.
>
> > +
> > +    roi = (AVRegionOfInterest *)sd->data;
> > +    if (roi->self_size == 0 || sd->size % roi->self_size != 0) {
> > +        av_log(ctx, AV_LOG_INFO, "invalid ROI side data");
> > +        return;
> > +    }
> > +    nb_rois = sd->size / roi->self_size;
> > +
> > +    av_log(ctx, AV_LOG_INFO, "Regions Of Interest(RoI) information: ");
> > +    for (int index = 0; index < nb_rois; index++) {
> > +        av_log(ctx, AV_LOG_INFO, "index: %d, region: (%d %d)/(%d %d), qp
> > offset: %d/%d",
> > +               index, roi->left, roi->top, roi->right, roi->bottom, roi->qoffset.num,
> > roi->qoffset.den);
> > +
> > +        if (roi->self_size == 0)
> > +            av_log(ctx, AV_LOG_INFO,
> > +                   "AVRegionOfInterest.self_size must be set to
> > sizeof(AVRegionOfInterest).\n");
>
> we can skip this since the first roi->self_size is tested.
>
If we have N ROIs, we just need to check the first roi entry for
roi->self_size? It's the other surprised behavior for me
> > +
> > +        roi = (AVRegionOfInterest *)((char *)roi + roi->self_size);
> > +    }
> > +}
> > +
> >  static void dump_color_property(AVFilterContext *ctx, AVFrame *frame)
> >  {
> >      const char *color_range_str     = av_color_range_name(frame-
> > >color_range);
> > @@ -246,6 +276,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> > *frame)
> >          case AV_FRAME_DATA_AFD:
> >              av_log(ctx, AV_LOG_INFO, "afd: value of %"PRIu8, sd->data[0]);
> >              break;
> > +        case AV_FRAME_DATA_REGIONS_OF_INTEREST:
> > +            dump_roi(ctx, sd);
> > +            break;
> >          default:
> >              av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d
> > bytes)",
> >                     sd->type, sd->size);
> > --
> > 1.7.1
> >


More information about the ffmpeg-devel mailing list