diff options
-rw-r--r-- | libavcodec/v210_template.c | 10 | ||||
-rw-r--r-- | libavcodec/v210enc.c | 47 | ||||
-rw-r--r-- | libavcodec/v210enc.h | 2 | ||||
-rw-r--r-- | libavcodec/v210enc_init.h | 90 | ||||
-rw-r--r-- | tests/checkasm/v210enc.c | 2 |
5 files changed, 92 insertions, 59 deletions
diff --git a/libavcodec/v210_template.c b/libavcodec/v210_template.c index 9e1d9f9cd3..9f40bfe97c 100644 --- a/libavcodec/v210_template.c +++ b/libavcodec/v210_template.c @@ -22,16 +22,6 @@ #include "bytestream.h" #include "internal.h" -#define CLIP(v, depth) av_clip(v, 1<<(depth-8), ((1<<depth)-(1<<(depth-8))-1)) -#define WRITE_PIXELS(a, b, c, depth) \ - do { \ - val = CLIP(*a++, depth) << (10-depth); \ - val |= (CLIP(*b++, depth) << (20-depth)) | \ - (CLIP(*c++, depth) << (30-depth)); \ - AV_WL32(dst, val); \ - dst += 4; \ - } while (0) - static void RENAME(v210_enc)(AVCodecContext *avctx, uint8_t *dst, const AVFrame *pic) { diff --git a/libavcodec/v210enc.c b/libavcodec/v210enc.c index 9ac923571c..de2e405efc 100644 --- a/libavcodec/v210enc.c +++ b/libavcodec/v210enc.c @@ -27,6 +27,7 @@ #include "encode.h" #include "internal.h" #include "v210enc.h" +#include "v210enc_init.h" #define TYPE uint8_t #define DEPTH 8 @@ -48,52 +49,6 @@ #undef BYTES_PER_PIXEL #undef TYPE -static void v210_planar_pack_8_c(const uint8_t *y, const uint8_t *u, - const uint8_t *v, uint8_t *dst, - ptrdiff_t width) -{ - uint32_t val; - int i; - - /* unroll this to match the assembly */ - for (i = 0; i < width - 11; i += 12) { - WRITE_PIXELS(u, y, v, 8); - WRITE_PIXELS(y, u, y, 8); - WRITE_PIXELS(v, y, u, 8); - WRITE_PIXELS(y, v, y, 8); - WRITE_PIXELS(u, y, v, 8); - WRITE_PIXELS(y, u, y, 8); - WRITE_PIXELS(v, y, u, 8); - WRITE_PIXELS(y, v, y, 8); - } -} - -static void v210_planar_pack_10_c(const uint16_t *y, const uint16_t *u, - const uint16_t *v, uint8_t *dst, - ptrdiff_t width) -{ - uint32_t val; - int i; - - for (i = 0; i < width - 5; i += 6) { - WRITE_PIXELS(u, y, v, 10); - WRITE_PIXELS(y, u, y, 10); - WRITE_PIXELS(v, y, u, 10); - WRITE_PIXELS(y, v, y, 10); - } -} - -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; - s->sample_factor_8 = 2; - s->sample_factor_10 = 1; - - if (ARCH_X86) - ff_v210enc_init_x86(s); -} - static av_cold int encode_init(AVCodecContext *avctx) { V210EncContext *s = avctx->priv_data; diff --git a/libavcodec/v210enc.h b/libavcodec/v210enc.h index 51305c1a20..b74fd33db5 100644 --- a/libavcodec/v210enc.h +++ b/libavcodec/v210enc.h @@ -32,8 +32,6 @@ typedef struct V210EncContext { int sample_factor_10; } V210EncContext; -void ff_v210enc_init(V210EncContext *s); - void ff_v210enc_init_x86(V210EncContext *s); #endif /* AVCODEC_V210ENC_H */ diff --git a/libavcodec/v210enc_init.h b/libavcodec/v210enc_init.h new file mode 100644 index 0000000000..6d81cac319 --- /dev/null +++ b/libavcodec/v210enc_init.h @@ -0,0 +1,90 @@ +/* + * V210 encoder DSP init + * + * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at> + * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_V210ENC_INIT_H +#define AVCODEC_V210ENC_INIT_H + +#include <stddef.h> +#include <stdint.h> + +#include "config.h" +#include "libavutil/attributes.h" +#include "libavutil/common.h" +#include "libavutil/intreadwrite.h" +#include "v210enc.h" + +#define CLIP(v, depth) av_clip(v, 1<<(depth-8), ((1<<depth)-(1<<(depth-8))-1)) +#define WRITE_PIXELS(a, b, c, depth) \ + do { \ + val = CLIP(*a++, depth) << (10-depth); \ + val |= (CLIP(*b++, depth) << (20-depth)) | \ + (CLIP(*c++, depth) << (30-depth)); \ + AV_WL32(dst, val); \ + dst += 4; \ + } while (0) + +static void v210_planar_pack_8_c(const uint8_t *y, const uint8_t *u, + const uint8_t *v, uint8_t *dst, + ptrdiff_t width) +{ + uint32_t val; + + /* unroll this to match the assembly */ + for (int i = 0; i < width - 11; i += 12) { + WRITE_PIXELS(u, y, v, 8); + WRITE_PIXELS(y, u, y, 8); + WRITE_PIXELS(v, y, u, 8); + WRITE_PIXELS(y, v, y, 8); + WRITE_PIXELS(u, y, v, 8); + WRITE_PIXELS(y, u, y, 8); + WRITE_PIXELS(v, y, u, 8); + WRITE_PIXELS(y, v, y, 8); + } +} + +static void v210_planar_pack_10_c(const uint16_t *y, const uint16_t *u, + const uint16_t *v, uint8_t *dst, + ptrdiff_t width) +{ + uint32_t val; + + for (int i = 0; i < width - 5; i += 6) { + WRITE_PIXELS(u, y, v, 10); + WRITE_PIXELS(y, u, y, 10); + WRITE_PIXELS(v, y, u, 10); + WRITE_PIXELS(y, v, y, 10); + } +} + +static av_cold av_unused void ff_v210enc_init(V210EncContext *s) +{ + s->pack_line_8 = v210_planar_pack_8_c; + s->pack_line_10 = v210_planar_pack_10_c; + s->sample_factor_8 = 2; + s->sample_factor_10 = 1; + + if (ARCH_X86) + ff_v210enc_init_x86(s); +} + +#endif /* AVCODEC_V210ENC_INIT_H */ diff --git a/tests/checkasm/v210enc.c b/tests/checkasm/v210enc.c index c3d5cc5145..9942e08137 100644 --- a/tests/checkasm/v210enc.c +++ b/tests/checkasm/v210enc.c @@ -20,7 +20,7 @@ #include <string.h> #include "checkasm.h" -#include "libavcodec/v210enc.h" +#include "libavcodec/v210enc_init.h" #include "libavutil/common.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" |