> Please write BGRA rather than RGB32.  I doubt this will ever run on a
> big-endian machine, but it would be clearer.

Agree, will update.

> > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> > index 5018a05..0db446b 100644
> > --- a/libavutil/hwcontext_qsv.c
> > +++ b/libavutil/hwcontext_qsv.c
> > @@ -90,6 +90,7 @@ static const struct {
> >      uint32_t           fourcc;
> >  } supported_pixel_formats[] = {
> >      { AV_PIX_FMT_NV12, MFX_FOURCC_NV12 },
> > +    { AV_PIX_FMT_RGB32,MFX_FOURCC_RGB4 },
> >      { AV_PIX_FMT_P010, MFX_FOURCC_P010 },
> >      { AV_PIX_FMT_PAL8, MFX_FOURCC_P8   },
> >  };
> > @@ -730,6 +731,36 @@ static int
> qsv_transfer_data_child(AVHWFramesContext *ctx, AVFrame *dst,
> >      return ret;
> >  }
> >
> > +static int map_frame_to_surface(const AVFrame *frame,
> > +mfxFrameSurface1 *surface) {
> > +    switch (frame->format) {
> > +        case AV_PIX_FMT_NV12:
> 
> Indentation - case labels should be at the same level as switch.

Sure, thanks for remind. Will update.
> 
> > +            surface->Data.Y  = frame->data[0];
> > +            surface->Data.UV = frame->data[1];
> > +            break;
> > +
> > +        case AV_PIX_FMT_YUV420P:
> > +            surface->Data.Y = frame->data[0];
> > +            surface->Data.U = frame->data[1];
> > +            surface->Data.V = frame->data[2];
> > +            break;
> > +
> > +        case AV_PIX_FMT_RGB32:
> > +            surface->Data.B = frame->data[0];
> > +            surface->Data.G = frame->data[0] + 1;
> > +            surface->Data.R = frame->data[0] + 2;
> > +            surface->Data.A = frame->data[0] + 3;
> > +            break;
> > +
> > +        default:
> > +            return MFX_ERR_UNSUPPORTED;
> > +    }
> > +    surface->Data.Pitch     = frame->linesize[0];
> 
> What happens if linesize[0] != linesize[1]?  (You aren't introducing that
> problem, but I hadn't seen it before.)

I don't think MSDK can handle this case perfectly since there is only one pitch.
Take YUV420p as example, IMHO it is required linesize of Y must be twice of U 
and V.

> 
> > +    surface->Data.TimeStamp = frame->pts;
> > +
> > +    return 0;
> > +}
> > +
> >  static int qsv_transfer_data_from(AVHWFramesContext *ctx, AVFrame
> *dst,
> >                                    const AVFrame *src)  { @@
> -749,11
> > +780,7 @@ static int qsv_transfer_data_from(AVHWFramesContext *ctx,
> AVFrame *dst,
> >      }
> >
> >      out.Info = in->Info;
> > -    out.Data.PitchLow = dst->linesize[0];
> > -    out.Data.Y        = dst->data[0];
> > -    out.Data.U        = dst->data[1];
> > -    out.Data.V        = dst->data[2];
> > -    out.Data.A        = dst->data[3];
> > +    map_frame_to_surface(dst, &out);
> >
> >      do {
> >          err = MFXVideoVPP_RunFrameVPPAsync(s->session_download,
> in,
> > &out, NULL, &sync); @@ -796,11 +823,7 @@ static int
> qsv_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
> >      }
> >
> >      in.Info = out->Info;
> > -    in.Data.PitchLow = src->linesize[0];
> > -    in.Data.Y        = src->data[0];
> > -    in.Data.U        = src->data[1];
> > -    in.Data.V        = src->data[2];
> > -    in.Data.A        = src->data[3];
> > +    map_frame_to_surface(src, &in);
> >
> >      do {
> >          err = MFXVideoVPP_RunFrameVPPAsync(s->session_upload,
> &in,
> > out, NULL, &sync);
> >
> 
> This has slightly changed what gets passed for YUV420P and NV12 - it no
> longer sets the unused pointers to NULL.  Presumably that's always ok,
> even with old versions?

Yes, it is. But as you can see there were still other unused pointers hadn't 
been set to NULL before this patch. 
Since it is UNUSED, IMHO it is not necessary to memset them.

> Thanks,
> 
> - Mark

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to