This makes the addition of arch optimized functions easier. Signed-off-by: James Almer <jamrial@gmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n2.5
| @@ -229,7 +229,7 @@ OBJS-$(CONFIG_INDEO4_DECODER) += indeo4.o ivi_common.o ivi_dsp.o | |||||
| OBJS-$(CONFIG_INDEO5_DECODER) += indeo5.o ivi_common.o ivi_dsp.o | OBJS-$(CONFIG_INDEO5_DECODER) += indeo5.o ivi_common.o ivi_dsp.o | ||||
| OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o | OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o | ||||
| OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o | OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o | ||||
| OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o \ | |||||
| OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o jpeg2000dsp.o \ | |||||
| jpeg2000dwt.o mqcdec.o mqc.o | jpeg2000dwt.o mqcdec.o mqc.o | ||||
| OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o | OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o | ||||
| OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o | OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o | ||||
| @@ -35,6 +35,7 @@ | |||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "thread.h" | #include "thread.h" | ||||
| #include "jpeg2000.h" | #include "jpeg2000.h" | ||||
| #include "jpeg2000dsp.h" | |||||
| #define JP2_SIG_TYPE 0x6A502020 | #define JP2_SIG_TYPE 0x6A502020 | ||||
| #define JP2_SIG_VALUE 0x0D0A870A | #define JP2_SIG_VALUE 0x0D0A870A | ||||
| @@ -85,6 +86,7 @@ typedef struct Jpeg2000DecoderContext { | |||||
| int16_t curtileno; | int16_t curtileno; | ||||
| Jpeg2000Tile *tile; | Jpeg2000Tile *tile; | ||||
| Jpeg2000DSPContext dsp; | |||||
| /*options parameters*/ | /*options parameters*/ | ||||
| int reduction_factor; | int reduction_factor; | ||||
| @@ -1041,69 +1043,21 @@ static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk, | |||||
| } | } | ||||
| } | } | ||||
| /* Inverse ICT parameters in float and integer. | |||||
| * int value = (float value) * (1<<16) */ | |||||
| static const float f_ict_params[4] = { | |||||
| 1.402f, | |||||
| 0.34413f, | |||||
| 0.71414f, | |||||
| 1.772f | |||||
| }; | |||||
| static const int i_ict_params[4] = { | |||||
| 91881, | |||||
| 22553, | |||||
| 46802, | |||||
| 116130 | |||||
| }; | |||||
| static void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | |||||
| static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | |||||
| { | { | ||||
| int i, csize = 1; | int i, csize = 1; | ||||
| int32_t *src[3], i0, i1, i2; | |||||
| float *srcf[3], i0f, i1f, i2f; | |||||
| void *src[3]; | |||||
| for (i = 0; i < 3; i++) | for (i = 0; i < 3; i++) | ||||
| if (tile->codsty[0].transform == FF_DWT97) | if (tile->codsty[0].transform == FF_DWT97) | ||||
| srcf[i] = tile->comp[i].f_data; | |||||
| src[i] = tile->comp[i].f_data; | |||||
| else | else | ||||
| src [i] = tile->comp[i].i_data; | |||||
| src[i] = tile->comp[i].i_data; | |||||
| for (i = 0; i < 2; i++) | for (i = 0; i < 2; i++) | ||||
| csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0]; | csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0]; | ||||
| switch (tile->codsty[0].transform) { | |||||
| case FF_DWT97: | |||||
| for (i = 0; i < csize; i++) { | |||||
| i0f = *srcf[0] + (f_ict_params[0] * *srcf[2]); | |||||
| i1f = *srcf[0] - (f_ict_params[1] * *srcf[1]) | |||||
| - (f_ict_params[2] * *srcf[2]); | |||||
| i2f = *srcf[0] + (f_ict_params[3] * *srcf[1]); | |||||
| *srcf[0]++ = i0f; | |||||
| *srcf[1]++ = i1f; | |||||
| *srcf[2]++ = i2f; | |||||
| } | |||||
| break; | |||||
| case FF_DWT97_INT: | |||||
| for (i = 0; i < csize; i++) { | |||||
| i0 = *src[0] + (((i_ict_params[0] * *src[2]) + (1 << 15)) >> 16); | |||||
| i1 = *src[0] - (((i_ict_params[1] * *src[1]) + (1 << 15)) >> 16) | |||||
| - (((i_ict_params[2] * *src[2]) + (1 << 15)) >> 16); | |||||
| i2 = *src[0] + (((i_ict_params[3] * *src[1]) + (1 << 15)) >> 16); | |||||
| *src[0]++ = i0; | |||||
| *src[1]++ = i1; | |||||
| *src[2]++ = i2; | |||||
| } | |||||
| break; | |||||
| case FF_DWT53: | |||||
| for (i = 0; i < csize; i++) { | |||||
| i1 = *src[0] - (*src[2] + *src[1] >> 2); | |||||
| i0 = i1 + *src[2]; | |||||
| i2 = i1 + *src[1]; | |||||
| *src[0]++ = i0; | |||||
| *src[1]++ = i1; | |||||
| *src[2]++ = i2; | |||||
| } | |||||
| break; | |||||
| } | |||||
| s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize); | |||||
| } | } | ||||
| static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, | static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, | ||||
| @@ -1406,6 +1360,15 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static av_cold int jpeg2000_decode_init(AVCodecContext *avctx) | |||||
| { | |||||
| Jpeg2000DecoderContext *s = avctx->priv_data; | |||||
| ff_jpeg2000dsp_init(&s->dsp); | |||||
| return 0; | |||||
| } | |||||
| static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data, | static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data, | ||||
| int *got_frame, AVPacket *avpkt) | int *got_frame, AVPacket *avpkt) | ||||
| { | { | ||||
| @@ -1510,6 +1473,7 @@ AVCodec ff_jpeg2000_decoder = { | |||||
| .capabilities = CODEC_CAP_FRAME_THREADS, | .capabilities = CODEC_CAP_FRAME_THREADS, | ||||
| .priv_data_size = sizeof(Jpeg2000DecoderContext), | .priv_data_size = sizeof(Jpeg2000DecoderContext), | ||||
| .init_static_data = jpeg2000_init_static_data, | .init_static_data = jpeg2000_init_static_data, | ||||
| .init = jpeg2000_decode_init, | |||||
| .decode = jpeg2000_decode_frame, | .decode = jpeg2000_decode_frame, | ||||
| .priv_class = &class, | .priv_class = &class, | ||||
| .profiles = NULL_IF_CONFIG_SMALL(profiles) | .profiles = NULL_IF_CONFIG_SMALL(profiles) | ||||
| @@ -0,0 +1,98 @@ | |||||
| /* | |||||
| * JPEG 2000 DSP functions | |||||
| * Copyright (c) 2007 Kamil Nowosad | |||||
| * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav 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. | |||||
| * | |||||
| * 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 | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser 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 "config.h" | |||||
| #include "libavutil/attributes.h" | |||||
| #include "jpeg2000dsp.h" | |||||
| /* Inverse ICT parameters in float and integer. | |||||
| * int value = (float value) * (1<<16) */ | |||||
| static const float f_ict_params[4] = { | |||||
| 1.402f, | |||||
| 0.34413f, | |||||
| 0.71414f, | |||||
| 1.772f | |||||
| }; | |||||
| static const int i_ict_params[4] = { | |||||
| 91881, | |||||
| 22553, | |||||
| 46802, | |||||
| 116130 | |||||
| }; | |||||
| static void ict_float(void *_src0, void *_src1, void *_src2, int csize) | |||||
| { | |||||
| float *src0 = _src0, *src1 = _src1, *src2 = _src2; | |||||
| float i0f, i1f, i2f; | |||||
| int i; | |||||
| for (i = 0; i < csize; i++) { | |||||
| i0f = *src0 + (f_ict_params[0] * *src2); | |||||
| i1f = *src0 - (f_ict_params[1] * *src1) | |||||
| - (f_ict_params[2] * *src2); | |||||
| i2f = *src0 + (f_ict_params[3] * *src1); | |||||
| *src0++ = i0f; | |||||
| *src1++ = i1f; | |||||
| *src2++ = i2f; | |||||
| } | |||||
| } | |||||
| static void ict_int(void *_src0, void *_src1, void *_src2, int csize) | |||||
| { | |||||
| int32_t *src0 = _src0, *src1 = _src1, *src2 = _src2; | |||||
| int32_t i0, i1, i2; | |||||
| int i; | |||||
| for (i = 0; i < csize; i++) { | |||||
| i0 = *src0 + (((i_ict_params[0] * *src2) + (1 << 15)) >> 16); | |||||
| i1 = *src0 - (((i_ict_params[1] * *src1) + (1 << 15)) >> 16) | |||||
| - (((i_ict_params[2] * *src2) + (1 << 15)) >> 16); | |||||
| i2 = *src0 + (((i_ict_params[3] * *src1) + (1 << 15)) >> 16); | |||||
| *src0++ = i0; | |||||
| *src1++ = i1; | |||||
| *src2++ = i2; | |||||
| } | |||||
| } | |||||
| static void rct_int(void *_src0, void *_src1, void *_src2, int csize) | |||||
| { | |||||
| int32_t *src0 = _src0, *src1 = _src1, *src2 = _src2; | |||||
| int32_t i0, i1, i2; | |||||
| int i; | |||||
| for (i = 0; i < csize; i++) { | |||||
| i1 = *src0 - (*src2 + *src1 >> 2); | |||||
| i0 = i1 + *src2; | |||||
| i2 = i1 + *src1; | |||||
| *src0++ = i0; | |||||
| *src1++ = i1; | |||||
| *src2++ = i2; | |||||
| } | |||||
| } | |||||
| av_cold void ff_jpeg2000dsp_init(Jpeg2000DSPContext *c) | |||||
| { | |||||
| c->mct_decode[FF_DWT97] = ict_float; | |||||
| c->mct_decode[FF_DWT53] = rct_int; | |||||
| c->mct_decode[FF_DWT97_INT] = ict_int; | |||||
| } | |||||
| @@ -0,0 +1,35 @@ | |||||
| /* | |||||
| * JPEG 2000 DSP functions | |||||
| * Copyright (c) 2007 Kamil Nowosad | |||||
| * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com> | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav 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. | |||||
| * | |||||
| * 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 | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser 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 | |||||
| */ | |||||
| #ifndef AVCODEC_JPEG2000DSP_H | |||||
| #define AVCODEC_JPEG2000DSP_H | |||||
| #include <stdint.h> | |||||
| #include "jpeg2000dwt.h" | |||||
| typedef struct Jpeg2000DSPContext { | |||||
| void (*mct_decode[FF_DWT_NB])(void *src0, void *src1, void *src2, int csize); | |||||
| } Jpeg2000DSPContext; | |||||
| void ff_jpeg2000dsp_init(Jpeg2000DSPContext *c); | |||||
| #endif /* AVCODEC_JPEG2000DSP_H */ | |||||
| @@ -34,7 +34,8 @@ | |||||
| enum DWTType { | enum DWTType { | ||||
| FF_DWT97, | FF_DWT97, | ||||
| FF_DWT53, | FF_DWT53, | ||||
| FF_DWT97_INT | |||||
| FF_DWT97_INT, | |||||
| FF_DWT_NB | |||||
| }; | }; | ||||
| typedef struct DWTContext { | typedef struct DWTContext { | ||||