[FFmpeg-devel] [PATCH] qsv: fix the dangerous macro definitions
Li, Zhong
zhong.li at intel.com
Thu Mar 28 11:09:20 EET 2019
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Mark Thompson
> Sent: Thursday, March 28, 2019 6:23 AM
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH] qsv: fix the dangerous macro
> definitions
>
> On 27/03/2019 10:24, Zhong Li wrote:
> > Signed-off-by: Zhong Li <zhong.li at intel.com>
> > ---
> > libavcodec/qsv_internal.h | 8 ++++----
> > libavfilter/qsvvpp.h | 8 ++++----
> > 2 files changed, 8 insertions(+), 8 deletions(-)
> >
> > diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
> > index 394c558883..86a5dbad98 100644
> > --- a/libavcodec/qsv_internal.h
> > +++ b/libavcodec/qsv_internal.h
> > @@ -35,12 +35,12 @@
> > #define QSV_MAX_ENC_PAYLOAD 2 // # of mfxEncodeCtrl
> payloads supported
> >
> > #define QSV_VERSION_ATLEAST(MAJOR, MINOR) \
> > - (MFX_VERSION_MAJOR > (MAJOR) || \
> > - MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >=
> (MINOR))
> > + ((MFX_VERSION_MAJOR > (MAJOR) || \
> > + MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >=
> (MINOR)))
>
> I don't understand why this makes a difference?
>
> Removing the whitespace, I see:
>
> - (MFX_VERSION_MAJOR > (MAJOR) || MFX_VERSION_MAJOR == (MAJOR)
> && MFX_VERSION_MINOR >= (MINOR))
> + ((MFX_VERSION_MAJOR > (MAJOR) || MFX_VERSION_MAJOR == (MAJOR)
> &&
> + MFX_VERSION_MINOR >= (MINOR)))
>
> which looks like you've just added redundant parentheses around the whole
> thing which already had them?
>
> (Alternative question: what case is this trying to fix?
It is to fix the dangerous case of QSV_RUNTIME_VERSION_ATLEAST.
It is introducing a big issue, e:g
if ((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28))
it is equal to:
(avctx->codec_id != AV_CODEC_ID_HEVC) || (MFX_VERSION.Major > (MAJOR)) ||
(MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))
If (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)) is true, judgement above is always true.
But I forgot that QSV_VERSION_ATLEAST is different from QSV_RUNTIME_VERSION_ATLEAST, will update.
>I could see a problem if the MFX_VERSION_* fields were macros expanding to something
> containing operators with lower precedence than relationals, but that
> doesn't change with what you've done here.)
>
> - Mark
I couldn't see the problem you mentioned, will it happen in a real case?
But I see another case now:
MFX_VERSION_MAJOR > (MAJOR) || MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)
Actually it is equal to:
(MFX_VERSION_MAJOR > (MAJOR) || MFX_VERSION_MAJOR == (MAJOR)) && MFX_VERSION_MINOR >= (MINOR)
This is not expectation and will cause a big issue when MFX_VERSION_MAJOR > (MAJOR)
More information about the ffmpeg-devel
mailing list