You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	jpeg2000: split off inverse MCT decoding as Jpeg2000DSP
This makes the addition of arch optimized functions easier. Reviewed-by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
		| @@ -275,7 +275,7 @@ OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER)  += dpcm.o | ||||
| OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o | ||||
| OBJS-$(CONFIG_JACOSUB_DECODER)         += jacosubdec.o ass.o | ||||
| OBJS-$(CONFIG_JPEG2000_ENCODER)        += j2kenc.o mqcenc.o mqc.o jpeg2000.o \ | ||||
|                                           jpeg2000dwt.o | ||||
|                                           jpeg2000dwt.o jpeg2000dsp.o | ||||
| OBJS-$(CONFIG_JPEG2000_DECODER)        += jpeg2000dec.o jpeg2000.o      \ | ||||
|                                           jpeg2000dwt.o mqcdec.o mqc.o | ||||
| OBJS-$(CONFIG_JPEGLS_DECODER)          += jpeglsdec.o jpegls.o | ||||
|   | ||||
| @@ -37,6 +37,7 @@ | ||||
| #include "internal.h" | ||||
| #include "thread.h" | ||||
| #include "jpeg2000.h" | ||||
| #include "jpeg2000dsp.h" | ||||
|  | ||||
| #define JP2_SIG_TYPE    0x6A502020 | ||||
| #define JP2_SIG_VALUE   0x0D0A870A | ||||
| @@ -93,6 +94,7 @@ typedef struct Jpeg2000DecoderContext { | ||||
|     int             curtileno; | ||||
|  | ||||
|     Jpeg2000Tile    *tile; | ||||
|     Jpeg2000DSPContext dsp; | ||||
|  | ||||
|     /*options parameters*/ | ||||
|     int             reduction_factor; | ||||
| @@ -1141,26 +1143,10 @@ 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 = 1; i < 3; i++) | ||||
|         if (tile->codsty[0].transform != tile->codsty[i].transform) { | ||||
| @@ -1170,47 +1156,14 @@ static void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | ||||
|  | ||||
|     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, | ||||
| @@ -1621,6 +1574,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) | ||||
| { | ||||
| @@ -1731,6 +1693,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       = &jpeg2000_class, | ||||
|     .max_lowres       = 5, | ||||
|   | ||||
							
								
								
									
										98
									
								
								libavcodec/jpeg2000dsp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								libavcodec/jpeg2000dsp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -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 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 | ||||
|  */ | ||||
|  | ||||
| #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; | ||||
| } | ||||
							
								
								
									
										35
									
								
								libavcodec/jpeg2000dsp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								libavcodec/jpeg2000dsp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 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_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 { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user