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_INTERPLAY_DPCM_DECODER) += dpcm.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 | |||
| OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o | |||
| OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o | |||
| @@ -35,6 +35,7 @@ | |||
| #include "internal.h" | |||
| #include "thread.h" | |||
| #include "jpeg2000.h" | |||
| #include "jpeg2000dsp.h" | |||
| #define JP2_SIG_TYPE 0x6A502020 | |||
| #define JP2_SIG_VALUE 0x0D0A870A | |||
| @@ -85,6 +86,7 @@ typedef struct Jpeg2000DecoderContext { | |||
| int16_t curtileno; | |||
| Jpeg2000Tile *tile; | |||
| Jpeg2000DSPContext dsp; | |||
| /*options parameters*/ | |||
| 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; | |||
| int32_t *src[3], i0, i1, i2; | |||
| float *srcf[3], i0f, i1f, i2f; | |||
| void *src[3]; | |||
| for (i = 0; i < 3; i++) | |||
| if (tile->codsty[0].transform == FF_DWT97) | |||
| srcf[i] = tile->comp[i].f_data; | |||
| src[i] = tile->comp[i].f_data; | |||
| else | |||
| src [i] = tile->comp[i].i_data; | |||
| src[i] = tile->comp[i].i_data; | |||
| for (i = 0; i < 2; i++) | |||
| 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, | |||
| @@ -1406,6 +1360,15 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s) | |||
| 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, | |||
| int *got_frame, AVPacket *avpkt) | |||
| { | |||
| @@ -1510,6 +1473,7 @@ AVCodec ff_jpeg2000_decoder = { | |||
| .capabilities = CODEC_CAP_FRAME_THREADS, | |||
| .priv_data_size = sizeof(Jpeg2000DecoderContext), | |||
| .init_static_data = jpeg2000_init_static_data, | |||
| .init = jpeg2000_decode_init, | |||
| .decode = jpeg2000_decode_frame, | |||
| .priv_class = &class, | |||
| .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 { | |||
| FF_DWT97, | |||
| FF_DWT53, | |||
| FF_DWT97_INT | |||
| FF_DWT97_INT, | |||
| FF_DWT_NB | |||
| }; | |||
| typedef struct DWTContext { | |||