diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c index b5e1d728a7..6c10ef6a7c 100644 --- a/libavcodec/v210dec.c +++ b/libavcodec/v210dec.c @@ -24,45 +24,18 @@ #include "avcodec.h" #include "codec_internal.h" #include "v210dec.h" +#include "v210dec_init.h" #include "libavutil/bswap.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" #include "thread.h" -#define READ_PIXELS(a, b, c) \ - do { \ - val = av_le2ne32(*src++); \ - *a++ = val & 0x3FF; \ - *b++ = (val >> 10) & 0x3FF; \ - *c++ = (val >> 20) & 0x3FF; \ - } while (0) - typedef struct ThreadData { AVFrame *frame; uint8_t *buf; int stride; } ThreadData; -static void v210_planar_unpack_c(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width) -{ - uint32_t val; - int i; - - for( i = 0; i < width-5; i += 6 ){ - READ_PIXELS(u, y, v); - READ_PIXELS(y, u, y); - READ_PIXELS(v, y, u); - READ_PIXELS(y, v, y); - } -} - -av_cold void ff_v210dec_init(V210DecContext *s) -{ - s->unpack_frame = v210_planar_unpack_c; - if (ARCH_X86) - ff_v210_x86_init(s); -} - static av_cold int decode_init(AVCodecContext *avctx) { V210DecContext *s = avctx->priv_data; diff --git a/libavcodec/v210dec.h b/libavcodec/v210dec.h index 662e266315..87ba38e151 100644 --- a/libavcodec/v210dec.h +++ b/libavcodec/v210dec.h @@ -32,7 +32,6 @@ typedef struct { void (*unpack_frame)(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width); } V210DecContext; -void ff_v210dec_init(V210DecContext *s); void ff_v210_x86_init(V210DecContext *s); #endif /* AVCODEC_V210DEC_H */ diff --git a/libavcodec/v210dec_init.h b/libavcodec/v210dec_init.h new file mode 100644 index 0000000000..305ab3911e --- /dev/null +++ b/libavcodec/v210dec_init.h @@ -0,0 +1,61 @@ +/* + * V210 decoder DSP init + * + * Copyright (C) 2009 Michael Niedermayer + * Copyright (c) 2009 Baptiste Coudurier + * + * 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_V210DEC_INIT_H +#define AVCODEC_V210DEC_INIT_H + +#include + +#include "config.h" +#include "libavutil/attributes.h" +#include "libavutil/bswap.h" +#include "v210dec.h" + +#define READ_PIXELS(a, b, c) \ + do { \ + val = av_le2ne32(*src++); \ + *a++ = val & 0x3FF; \ + *b++ = (val >> 10) & 0x3FF; \ + *c++ = (val >> 20) & 0x3FF; \ + } while (0) + +static void v210_planar_unpack_c(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width) +{ + uint32_t val; + + for (int i = 0; i < width - 5; i += 6) { + READ_PIXELS(u, y, v); + READ_PIXELS(y, u, y); + READ_PIXELS(v, y, u); + READ_PIXELS(y, v, y); + } +} + +static av_unused av_cold void ff_v210dec_init(V210DecContext *s) +{ + s->unpack_frame = v210_planar_unpack_c; + if (ARCH_X86) + ff_v210_x86_init(s); +} + +#endif /* AVCODEC_V210DEC_INIT_H */ diff --git a/tests/checkasm/v210dec.c b/tests/checkasm/v210dec.c index 7dd50a8271..6aef519cc5 100644 --- a/tests/checkasm/v210dec.c +++ b/tests/checkasm/v210dec.c @@ -20,7 +20,7 @@ #include #include "checkasm.h" -#include "libavcodec/v210dec.h" +#include "libavcodec/v210dec_init.h" static uint32_t get_v210(void) {