> From: libav-devel [mailto:libav-devel-boun...@libav.org] On Behalf Of Mark
> Thompson
> Sent: Wednesday, January 31, 2018 6:17 AM
> To: libav-devel@libav.org
> Subject: Re: [libav-devel] [PATCH] hwcontext_qsv: Fix qsv hwupload failure
> issue
> 
> On 30/01/18 03:35, Song, Ruiling wrote:
> >> -----Original Message-----
> >> From: libav-devel [mailto:libav-devel-boun...@libav.org] On Behalf Of
> >> wm4
> >> Sent: Friday, January 26, 2018 5:15 PM
> >> To: libav-devel@libav.org
> >> Subject: Re: [libav-devel] [PATCH] hwcontext_qsv: Fix qsv hwupload
> >> failure issue
> >>
> >> On Fri, 26 Jan 2018 05:56:46 +0000
> >> "Li, Zhong" <zhong...@intel.com> wrote:
> >>
> >>>> From: libav-devel [mailto:libav-devel-boun...@libav.org] On Behalf
> >>>> Of Ruiling Song
> >>>> Sent: Friday, January 26, 2018 9:17 AM
> >>>> To: libav-devel@libav.org
> >>>> Subject: [libav-devel] [PATCH] hwcontext_qsv: Fix qsv hwupload
> >>>> failure issue
> >>>>
> >>>> From: "Ruiling, Song" <ruiling.s...@intel.com>
> >>>>
> >>>> 1.) the initial_pool_size need to be set instead of zero.
> >>>> 2.) the PicStruct is required by MediaSDK, so give a default value.
> >>>>
> >>>> A simple command to reproduce the issue:
> >>>> avconv -i INPUT -init_hw_device qsv=foo -filter_hw_device foo -vf
> >>>> format=nv12,hwupload -c:v h264_qsv ... OUTPUT
> >>>>
> >>>> Signed-off-by: Ruiling Song <ruiling.s...@intel.com>
> >>>> ---
> >>>>  libavutil/hwcontext_qsv.c | 4 ++--
> >>>>  1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> >>>> index
> >>>> 9270b22..14f26c6 100644
> >>>> --- a/libavutil/hwcontext_qsv.c
> >>>> +++ b/libavutil/hwcontext_qsv.c
> >>>> @@ -313,6 +313,7 @@ static int
> qsv_init_surface(AVHWFramesContext
> >>>> *ctx,
> >>>> mfxFrameSurface1 *surf)
> >>>>      surf->Info.CropH          = ctx->height;
> >>>>      surf->Info.FrameRateExtN  = 25;
> >>>>      surf->Info.FrameRateExtD  = 1;
> >>>> +    surf->Info.PicStruct      = MFX_PICSTRUCT_PROGRESSIVE;
> >>>>
> >>>>      return 0;
> >>>>  }
> >>>> @@ -325,8 +326,7 @@ static int qsv_init_pool(AVHWFramesContext
> >>>> *ctx, uint32_t fourcc)
> >>>>      int i, ret = 0;
> >>>>
> >>>>      if (ctx->initial_pool_size <= 0) {
> >>>> -        av_log(ctx, AV_LOG_ERROR, "QSV requires a fixed frame
> pool
> >>>> size\n");
> >>>
> >>> Should keep this log message as a warning be better?
> >>>
> >>>> -        return AVERROR(EINVAL);
> >>>> +        ctx->initial_pool_size = 64;
> >>
> >> That doesn't really feel appropriate. If a fixed size pool is
> >> required, the user should simply be forced to specify a size. Making
> >> it use a random value doesn't make too much sense to me, and the
> >> required size is going to depend on the caller's use cases. In
> >> addition 64 by default sounds like a huge waste of memory.
> >
> > Thanks for your comment!
> > But I think it is better if we don't force the user to explicitly setup a 
> > value to
> get it work.
> > Less parameters means less burden for end-users. If this rule is not
> applicable here, please correct me.
> > I am not sure why a default workable value is not as good here. Could you
> share me more thought?
> > And there are more places that set default values to initial_pool_size:
> > Inside libavfilter/qsvvpp.c it also sets initial_pool_size to 64.
> > Inside avtools/avcov_qsv.c, it sets initial_pool_size to 32.
> > I am not sure do you have any comment on this? Will be 32 looks a little
> better?
> 
> IMO any fixed number is a problem.  The user can always break it by
> holding on to more frames - the lookahead option in the libmfx encoder is
> the easiest way to eat lots of frames, but there is nothing stopping the user
> just not giving the frames back for a long time.  The advantage of the
> extra_hw_frames option is that it actually codifies how many frames the
> user is allowed to hold, so that if they do hold more it is clear where the
> error is rather than the answer being "um, that doesn't work, sorry".
> 
> It is unclear what the default should be before that number is applied, but
> probably not something particularly large because it is very
> memory-wasteful if you have 64 surfaces and only ever use 2 (currently a
> common problem when chaining filters together - it's only the encoder
> which wants many).  Obviously that can all solved by some sort of magic
> autonegotiation, but noone has yet offered a plan of how that could work.
> 
> - Mark

I think it is a good idea to add the extra_hw_frames option to make it more 
flexible.
But I see default value is -1. IMHO it is equal to forcing user to set this 
option else it will fail. It becomes a burden for user and they have to know 
what's the exact number of extra_hw_frames should be set.
So I think it is a good idea to set a default value (though I also don't know 
why it is 64) when user hasn't set it.
Yes it will waste memory but IMHO it is not a big problem because it only takes 
effect when extra_hw_frames is unset and better than pipeline crash.


_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to