[FFmpeg-devel] [PATCH] avcodec: change type of ff_square_tab from uint32_t to uint16_t
Clément Bœsch
u at pkh.me
Tue Feb 17 10:04:10 CET 2015
On Tue, Feb 17, 2015 at 10:03:29AM +0100, Clément Bœsch wrote:
> On Tue, Feb 17, 2015 at 04:31:07PM +0800, Zhaoxiu Zeng wrote:
> > From bf2964c07fde48c633ca4d8276282010e7c7f084 Mon Sep 17 00:00:00 2001
> > From: "zhaoxiu.zeng" <zhaoxiu.zeng at gmail.com>
> > Date: Tue, 17 Feb 2015 16:03:47 +0800
> > Subject: [PATCH 1/1] avcodec: change type of ff_square_tab from uint32_t to
> > uint16_t
> >
> > uint16_t is big enough except the first element, but the first element
> > is never used.
> > This also macroize nsse function, and use ff_square_tab when possible.
> >
> > Signed-off-by: zhaoxiu.zeng <zhaoxiu.zeng at gmail.com>
> > ---
> > libavcodec/me_cmp.c | 94 ++++++++++++++++++----------------------------
> > libavcodec/me_cmp.h | 3 +-
> > libavcodec/mpegvideo_enc.c | 2 +-
> > libavcodec/snowenc.c | 2 +-
> > 4 files changed, 41 insertions(+), 60 deletions(-)
> >
> [...]
> > -static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
> > - ptrdiff_t stride, int h)
> > -{
> > - int score1 = 0, score2 = 0, x, y;
> > -
> > - for (y = 0; y < h; y++) {
> > - for (x = 0; x < 16; x++)
> > - score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
> > - if (y + 1 < h) {
> > - for (x = 0; x < 15; x++)
> > - score2 += FFABS(s1[x] - s1[x + stride] -
> > - s1[x + 1] + s1[x + stride + 1]) -
> > - FFABS(s2[x] - s2[x + stride] -
> > - s2[x + 1] + s2[x + stride + 1]);
> > - }
> > - s1 += stride;
> > - s2 += stride;
> > - }
> > -
> > - if (c)
> > - return score1 + FFABS(score2) * c->avctx->nsse_weight;
> > - else
> > - return score1 + FFABS(score2) * 8;
> > -}
> > -
> > -static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
> > - ptrdiff_t stride, int h)
> > -{
> > - int score1 = 0, score2 = 0, x, y;
> > -
> > - for (y = 0; y < h; y++) {
> > - for (x = 0; x < 8; x++)
> > - score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
> > - if (y + 1 < h) {
> > - for (x = 0; x < 7; x++)
> > - score2 += FFABS(s1[x] - s1[x + stride] -
> > - s1[x + 1] + s1[x + stride + 1]) -
> > - FFABS(s2[x] - s2[x + stride] -
> > - s2[x + 1] + s2[x + stride + 1]);
> > - }
> > - s1 += stride;
> > - s2 += stride;
> > - }
> > -
> > - if (c)
> > - return score1 + FFABS(score2) * c->avctx->nsse_weight;
> > - else
> > - return score1 + FFABS(score2) * 8;
> > -}
> > +#define NSSE(size) \
> > +static int nsse ## size ## _c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, \
> > + ptrdiff_t stride, int h) \
> > +{ \
> > + int score1 = 0, score2 = 0, x, y; \
> > + uint16_t *sq = ff_square_tab + 256; \
> > + \
> > + for (y = 0; y < h; y++) { \
> > + for (x = 0; x < size; x++) \
> > + score1 += sq[s1[x] - s2[x]]; \
> > + if (y + 1 < h) { \
> > + for (x = 0; x < size - 1; x++) \
> > + score2 += FFABS(s1[x] - s1[x + stride] - \
> > + s1[x + 1] + s1[x + stride + 1]) - \
> > + FFABS(s2[x] - s2[x + stride] - \
> > + s2[x + 1] + s2[x + stride + 1]); \
> > + } \
> > + s1 += stride; \
> > + s2 += stride; \
> > + } \
> > + \
> > + if (c) \
> > + return score1 + FFABS(score2) * c->avctx->nsse_weight; \
> > + else \
> > + return score1 + FFABS(score2) * 8; \
> > +}
> > +NSSE(8)
> > +NSSE(16)
> >
>
> You can do better than this:
>
> static inline int nsse_base(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
> ptrdiff_t stride, int h, const int size)
> {
> int score1 = 0, score2 = 0, x, y;
>
> for (y = 0; y < h; y++) {
> for (x = 0; x < size; x++)
> score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
> if (y + 1 < h) {
> for (x = 0; x < size - 1; x++)
> score2 += FFABS(s1[x] - s1[x + stride] -
> s1[x + 1] + s1[x + stride + 1]) -
> FFABS(s2[x] - s2[x + stride] -
> s2[x + 1] + s2[x + stride + 1]);
> }
> s1 += stride;
> s2 += stride;
> }
>
> if (c)
> return score1 + FFABS(score2) * c->avctx->nsse_weight;
> else
> return score1 + FFABS(score2) * 8;
> }
>
> #define DEFINE_NSSE_FUNC(s) \
> static nsse_##s##_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, \
> ptrdiff_t stride, int h) \
add int here
> { \
> nsse_base(c, s1, s2, stride, h, s); \
and return here
anyway, you get the idea.
[...]
--
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150217/ecbf0041/attachment.asc>
More information about the ffmpeg-devel
mailing list