On 06/09/15 01:06, Henrik Gramner wrote:
> ---
> libavcodec/v210enc.c | 15 +++++---
> libavcodec/v210enc.h | 2 +
> tests/checkasm/Makefile | 1 +
> tests/checkasm/checkasm.c | 3 ++
> tests/checkasm/checkasm.h | 1 +
> tests/checkasm/v210enc.c | 94
> +++++++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 111 insertions(+), 5 deletions(-)
> create mode 100644 tests/checkasm/v210enc.c
>
> diff --git a/libavcodec/v210enc.c b/libavcodec/v210enc.c
> index 42cbb86..ca6ad2e 100644
> --- a/libavcodec/v210enc.c
> +++ b/libavcodec/v210enc.c
> @@ -82,6 +82,15 @@ static void v210_planar_pack_10_c(const uint16_t *y, const
> uint16_t *u,
> }
> }
>
> +av_cold void ff_v210enc_init(V210EncContext *s)
> +{
> + s->pack_line_8 = v210_planar_pack_8_c;
> + s->pack_line_10 = v210_planar_pack_10_c;
> +
> + if (ARCH_X86)
> + ff_v210enc_init_x86(s);
> +}
> +
> static av_cold int encode_init(AVCodecContext *avctx)
> {
> V210EncContext *s = avctx->priv_data;
> @@ -97,11 +106,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
> FF_ENABLE_DEPRECATION_WARNINGS
> #endif
>
> - s->pack_line_8 = v210_planar_pack_8_c;
> - s->pack_line_10 = v210_planar_pack_10_c;
> -
> - if (ARCH_X86)
> - ff_v210enc_init_x86(s);
> + ff_v210enc_init(s);
>
> return 0;
> }
> diff --git a/libavcodec/v210enc.h b/libavcodec/v210enc.h
> index be9b66d..81a3531 100644
> --- a/libavcodec/v210enc.h
> +++ b/libavcodec/v210enc.h
> @@ -30,6 +30,8 @@ typedef struct V210EncContext {
> const uint16_t *v, uint8_t *dst, ptrdiff_t width);
> } V210EncContext;
>
> +void ff_v210enc_init(V210EncContext *s);
> +
> void ff_v210enc_init_x86(V210EncContext *s);
>
> #endif /* AVCODEC_V210ENC_H */
> diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile
> index ff57aa8..5fccad9 100644
> --- a/tests/checkasm/Makefile
> +++ b/tests/checkasm/Makefile
> @@ -2,6 +2,7 @@
> AVCODECOBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o
> AVCODECOBJS-$(CONFIG_H264PRED) += h264pred.o
> AVCODECOBJS-$(CONFIG_H264QPEL) += h264qpel.o
> +AVCODECOBJS-$(CONFIG_V210_ENCODER) += v210enc.o
>
> CHECKASMOBJS-$(CONFIG_AVCODEC) += $(AVCODECOBJS-yes)
>
> diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c
> index a120bc3..3d47a43 100644
> --- a/tests/checkasm/checkasm.c
> +++ b/tests/checkasm/checkasm.c
> @@ -66,6 +66,9 @@ static const struct {
> #if CONFIG_H264QPEL
> { "h264qpel", checkasm_check_h264qpel },
> #endif
> +#if CONFIG_V210_ENCODER
> + { "v210enc", checkasm_check_v210enc },
> +#endif
> { NULL }
> };
>
> diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h
> index cbf3dca..aa32655 100644
> --- a/tests/checkasm/checkasm.h
> +++ b/tests/checkasm/checkasm.h
> @@ -32,6 +32,7 @@
> void checkasm_check_bswapdsp(void);
> void checkasm_check_h264pred(void);
> void checkasm_check_h264qpel(void);
> +void checkasm_check_v210enc(void);
>
> void *checkasm_check_func(void *func, const char *name, ...)
> av_printf_format(2, 3);
> int checkasm_bench_func(void);
> diff --git a/tests/checkasm/v210enc.c b/tests/checkasm/v210enc.c
> new file mode 100644
> index 0000000..08c79e4
> --- /dev/null
> +++ b/tests/checkasm/v210enc.c
> @@ -0,0 +1,94 @@
> +/*
> + * Copyright (c) 2015 Henrik Gramner
> + *
> + * This file is part of Libav.
> + *
> + * Libav is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * Libav is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with Libav; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include <string.h>
> +#include "checkasm.h"
> +#include "libavcodec/v210enc.h"
> +#include "libavutil/common.h"
> +#include "libavutil/internal.h"
> +#include "libavutil/intreadwrite.h"
> +
> +#define BUF_SIZE 512
> +
> +#define randomize_buffers(mask) \
> + do { \
> + int i, size = sizeof(*y0); \
> + for (i = 0; i < BUF_SIZE; i += 4/size) { \
> + uint32_t r = rnd() & mask; \
> + AV_WN32A(y0+i, r); \
> + AV_WN32A(y1+i, r); \
> + } \
> + for (i = 0; i < BUF_SIZE/2; i += 4/size) { \
> + uint32_t r = rnd() & mask; \
> + AV_WN32A(u0+i, r); \
> + AV_WN32A(u1+i, r); \
> + r = rnd() & mask; \
> + AV_WN32A(v0+i, r); \
> + AV_WN32A(v1+i, r); \
> + } \
> + for (i = 0; i < BUF_SIZE*8/3; i += 4) { \
> + uint32_t r = rnd(); \
> + AV_WN32A(dst0+i, r); \
> + AV_WN32A(dst1+i, r); \
> + } \
> + } while (0)
> +
> +#define check_pack_line(type, mask)
> \
> + do {
> \
> + LOCAL_ALIGNED_16(type, y0, [BUF_SIZE]);
> \
> + LOCAL_ALIGNED_16(type, y1, [BUF_SIZE]);
> \
> + LOCAL_ALIGNED_16(type, u0, [BUF_SIZE/2]);
> \
> + LOCAL_ALIGNED_16(type, u1, [BUF_SIZE/2]);
> \
> + LOCAL_ALIGNED_16(type, v0, [BUF_SIZE/2]);
> \
> + LOCAL_ALIGNED_16(type, v1, [BUF_SIZE/2]);
> \
> + LOCAL_ALIGNED_16(uint8_t, dst0, [BUF_SIZE*8/3]);
> \
> + LOCAL_ALIGNED_16(uint8_t, dst1, [BUF_SIZE*8/3]);
> \
> +
> \
> + declare_func(void, const type *y, const type *u, const type *v,
> \
> + uint8_t *dst, ptrdiff_t width);
> \
> + ptrdiff_t width, step = 12 / sizeof(type);
> \
> +
> \
> + for (width = step; width < BUF_SIZE - 15; width += step) {
> \
> + int y_offset = rnd() & 15;
> \
> + int uv_offset = y_offset / 2;
> \
> + randomize_buffers(mask);
> \
> + call_ref(y0+y_offset, u0+uv_offset, v0+uv_offset, dst0, width);
> \
> + call_new(y1+y_offset, u1+uv_offset, v1+uv_offset, dst1, width);
> \
> + if (memcmp(y0, y1, BUF_SIZE) || memcmp(u0, u1, BUF_SIZE/2) ||
> \
> + memcmp(v0, v1, BUF_SIZE/2) || memcmp(dst0, dst1, width*8/3))
> \
> + fail();
> \
> + bench_new(y1+y_offset, u1+uv_offset, v1+uv_offset, dst1, width);
> \
> + }
> \
> + } while (0)
> +
> +void checkasm_check_v210enc(void)
> +{
> + V210EncContext h;
> +
> + ff_v210enc_init(&h);
> +
> + if (check_func(h.pack_line_8, "v210_planar_pack_8"))
> + check_pack_line(uint8_t, 0xffffffff);
> +
> + if (check_func(h.pack_line_10, "v210_planar_pack_10"))
> + check_pack_line(uint16_t, 0x03ff03ff);
> +
> + report("planar_pack");
> +}
>
Looks Ok.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel