[FFmpeg-devel] [FFmpeg-cvslog] avcodec/magicyuv: add vlc multi support

Paul B Mahol onemda at gmail.com
Sun Oct 22 12:21:28 EEST 2023


On Sun, Oct 22, 2023 at 9:06 AM Michael Niedermayer <michael at niedermayer.cc>
wrote:

> On Sun, Oct 22, 2023 at 12:56:40AM +0200, Michael Niedermayer wrote:
> > On Sat, Oct 21, 2023 at 11:00:19AM +0200, Paul B Mahol wrote:
> > > On Sat, Oct 21, 2023 at 2:13 AM Michael Niedermayer <
> michael at niedermayer.cc>
> > > wrote:
> > >


You have enough skills to fix this,

Good luck!



>
> > > > On Wed, Sep 06, 2023 at 10:19:27PM +0000, Paul B Mahol wrote:
> > > > > ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon
> Aug 28
> > > > 12:20:15 2023 +0200| [8b7391cb5ff94ce94612fda69392a95d7ab1ffd0] |
> > > > committer: Paul B Mahol
> > > > >
> > > > > avcodec/magicyuv: add vlc multi support
> > > > >
> > > > > Gives nice speed boost, depending on encoded content it goes from
> > > > > 30% to 60% faster.
> > > > >
> > > > > >
> > > >
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8b7391cb5ff94ce94612fda69392a95d7ab1ffd0
> > > > > ---
> > > > >
> > > > >  libavcodec/magicyuv.c | 65
> > > > +++++++++++++++++++++++++++------------------------
> > > > >  1 file changed, 34 insertions(+), 31 deletions(-)
> > > > >
> > > > > diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c
> > > > > index 7898cd5be4..bbaf14d0e0 100644
> > > > > --- a/libavcodec/magicyuv.c
> > > > > +++ b/libavcodec/magicyuv.c
> > > > > @@ -34,6 +34,8 @@
> > > > >  #include "lossless_videodsp.h"
> > > > >  #include "thread.h"
> > > > >
> > > > > +#define VLC_BITS 12
> > > > > +
> > > > >  typedef struct Slice {
> > > > >      uint32_t start;
> > > > >      uint32_t size;
> > > > > @@ -67,13 +69,14 @@ typedef struct MagicYUVContext {
> > > > >      Slice            *slices[4];      // slice bitstream
> positions for
> > > > each plane
> > > > >      unsigned int      slices_size[4]; // slice sizes for each
> plane
> > > > >      VLC               vlc[4];         // VLC for each plane
> > > > > +    VLC_MULTI         multi[4];       // Buffer for joint VLC data
> > > > >      int (*magy_decode_slice)(AVCodecContext *avctx, void *tdata,
> > > > >                               int j, int threadnr);
> > > > >      LLVidDSPContext   llviddsp;
> > > > >  } MagicYUVContext;
> > > > >
> > > > >  static int huff_build(const uint8_t len[], uint16_t codes_pos[33],
> > > > > -                      VLC *vlc, int nb_elems, void *logctx)
> > > > > +                      VLC *vlc, VLC_MULTI *multi, int nb_elems,
> void
> > > > *logctx)
> > > > >  {
> > > > >      HuffEntry he[4096];
> > > > >
> > > > > @@ -84,7 +87,8 @@ static int huff_build(const uint8_t len[],
> uint16_t
> > > > codes_pos[33],
> > > > >          he[--codes_pos[len[i]]] = (HuffEntry){ len[i], i };
> > > > >
> > > > >      ff_free_vlc(vlc);
> > > > > -    return ff_init_vlc_from_lengths(vlc, FFMIN(he[0].len, 12),
> nb_elems,
> > > > > +    ff_free_vlc_multi(multi);
> > > > > +    return ff_init_vlc_multi_from_lengths(vlc, multi,
> FFMIN(he[0].len,
> > > > VLC_BITS), nb_elems, nb_elems,
> > > > >                                      &he[0].len, sizeof(he[0]),
> > > > >                                      &he[0].sym, sizeof(he[0]),
> > > > sizeof(he[0].sym),
> > > > >                                      0, 0, logctx);
> > > > > @@ -111,6 +115,22 @@ static void magicyuv_median_pred16(uint16_t
> *dst,
> > > > const uint16_t *src1,
> > > > >      *left_top = lt;
> > > > >  }
> > > > >
> > > > > +#define READ_PLANE(dst, plane, b, c) \
> > > > > +{ \
> > > > > +    x = 0; \
> > > > > +    for (; CACHED_BITSTREAM_READER && x < width-c &&
> get_bits_left(&gb)
> > > > > 0;) {\
> > > > > +        ret = get_vlc_multi(&gb, (uint8_t *)dst + x * b, multi, \
> > > > > +                            vlc, vlc_bits, 3); \
> > > > > +        if (ret > 0) \
> > > > > +            x += ret; \
> > > > > +        if (ret <= 0) \
> > > > > +            return AVERROR_INVALIDDATA; \
> > > > > +    } \
> > > > > +    for (; x < width && get_bits_left(&gb) > 0; x++) \
> > > > > +        dst[x] = get_vlc2(&gb, vlc, vlc_bits, 3); \
> > > > > +    dst += stride; \
> > > > > +}
> > > > > +
> > > > >  static int magy_decode_slice10(AVCodecContext *avctx, void *tdata,
> > > > >                                 int j, int threadnr)
> > > > >  {
> > > > > @@ -130,6 +150,9 @@ static int magy_decode_slice10(AVCodecContext
> > > > *avctx, void *tdata,
> > > > >          int sheight = AV_CEIL_RSHIFT(s->slice_height,
> s->vshift[i]);
> > > > >          ptrdiff_t fake_stride = (p->linesize[i] / 2) * (1 +
> interlaced);
> > > > >          ptrdiff_t stride = p->linesize[i] / 2;
> > > > > +        const VLC_MULTI_ELEM *const multi = s->multi[i].table;
> > > > > +        const VLCElem *const vlc = s->vlc[i].table;
> > > > > +        const int vlc_bits = s->vlc[i].bits;
> > > > >          int flags, pred;
> > > > >          int ret = init_get_bits8(&gb, s->buf +
> s->slices[i][j].start,
> > > > >                                   s->slices[i][j].size);
> > > > > @@ -151,20 +174,8 @@ static int magy_decode_slice10(AVCodecContext
> > > > *avctx, void *tdata,
> > > > >                  dst += stride;
> > > > >              }
> > > > >          } else {
> > > > > -            for (k = 0; k < height; k++) {
> > > > > -                for (x = 0; x < width; x++) {
> > > > > -                    int pix;
> > > > > -                    if (get_bits_left(&gb) <= 0)
> > > > > -                        return AVERROR_INVALIDDATA;
> > > > > -
> > > > > -                    pix = get_vlc2(&gb, s->vlc[i].table,
> > > > s->vlc[i].bits, 3);
> > > > > -                    if (pix < 0)
> > > > > -                        return AVERROR_INVALIDDATA;
> > > > > -
> > > > > -                    dst[x] = pix;
> > > > > -                }
> > > > > -                dst += stride;
> > > > > -            }
> > > > > +            for (k = 0; k < height; k++)
> > > > > +                READ_PLANE(dst, i, 2, 3)
> > > > >          }
> > > > >
> > > > >          switch (pred) {
> > > > > @@ -261,6 +272,9 @@ static int magy_decode_slice(AVCodecContext
> *avctx,
> > > > void *tdata,
> > > > >          ptrdiff_t fake_stride = p->linesize[i] * (1 + interlaced);
> > > > >          ptrdiff_t stride = p->linesize[i];
> > > > >          const uint8_t *slice = s->buf + s->slices[i][j].start;
> > > > > +        const VLC_MULTI_ELEM *const multi = s->multi[i].table;
> > > > > +        const VLCElem *const vlc = s->vlc[i].table;
> > > > > +        const int vlc_bits = s->vlc[i].bits;
> > > > >          int flags, pred;
> > > > >
> > > > >          flags = bytestream_get_byte(&slice);
> > > > > @@ -280,20 +294,8 @@ static int magy_decode_slice(AVCodecContext
> *avctx,
> > > > void *tdata,
> > > > >              if (ret < 0)
> > > > >                  return ret;
> > > > >
> > > > > -            for (k = 0; k < height; k++) {
> > > > > -                for (x = 0; x < width; x++) {
> > > > > -                    int pix;
> > > > > -                    if (get_bits_left(&gb) <= 0)
> > > > > -                        return AVERROR_INVALIDDATA;
> > > > > -
> > > > > -                    pix = get_vlc2(&gb, s->vlc[i].table,
> > > > s->vlc[i].bits, 3);
> > > > > -                    if (pix < 0)
> > > > > -                        return AVERROR_INVALIDDATA;
> > > > > -
> > > > > -                    dst[x] = pix;
> > > > > -                }
> > > > > -                dst += stride;
> > > > > -            }
> > > > > +            for (k = 0; k < height; k++)
> > > > > +                READ_PLANE(dst, i, 1, 5)
> > > > >          }
> > > > >
> > > > >          switch (pred) {
> > > >
> > > > Who reviewed this ?
> > > >
> > > > This is a straight out of array write
> > > > writing 8 bytes while the check assumes its max 5
> > > >
> > >
> > > Why are you becoming so aggressive?
> >
> > I objected to this patchset because of copy and pasted (duplicated) code,
>
> as it was disputed, heres the link:
> https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2023-September/314414.html
>
>
> > you ignored this objection and pushed it anyway. Now its found out that
> > it contains a out of array write. After a DOS vulnerability was found
> > previosuly in it.
>
> [...]
>
> thx
>
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Many that live deserve death. And some that die deserve life. Can you give
> it to them? Then do not be too eager to deal out death in judgement. For
> even the very wise cannot see all ends. -- Gandalf
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list