You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	tta: split off hybrid filter processing as ttadsp
Signed-off-by: James Almer <jamrial@gmail.com> Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
				
					committed by
					
						 Michael Niedermayer
						Michael Niedermayer
					
				
			
			
				
	
			
			
			
						parent
						
							9c3478c234
						
					
				
				
					commit
					429f742a61
				
			| @@ -445,7 +445,7 @@ OBJS-$(CONFIG_TRUEMOTION2_DECODER)     += truemotion2.o | ||||
| OBJS-$(CONFIG_TRUESPEECH_DECODER)      += truespeech.o | ||||
| OBJS-$(CONFIG_TSCC_DECODER)            += tscc.o msrledec.o | ||||
| OBJS-$(CONFIG_TSCC2_DECODER)           += tscc2.o | ||||
| OBJS-$(CONFIG_TTA_DECODER)             += tta.o ttadata.o | ||||
| OBJS-$(CONFIG_TTA_DECODER)             += tta.o ttadata.o ttadsp.o | ||||
| OBJS-$(CONFIG_TTA_ENCODER)             += ttaenc.o ttadata.o | ||||
| OBJS-$(CONFIG_TWINVQ_DECODER)          += twinvqdec.o twinvq.o | ||||
| OBJS-$(CONFIG_TXD_DECODER)             += txd.o s3tc.o | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
| #define BITSTREAM_READER_LE | ||||
| #include <limits.h> | ||||
| #include "ttadata.h" | ||||
| #include "ttadsp.h" | ||||
| #include "avcodec.h" | ||||
| #include "get_bits.h" | ||||
| #include "thread.h" | ||||
| @@ -56,39 +57,9 @@ typedef struct TTAContext { | ||||
|     uint8_t crc_pass[8]; | ||||
|     uint8_t *pass; | ||||
|     TTAChannel *ch_ctx; | ||||
|     TTADSPContext dsp; | ||||
| } TTAContext; | ||||
|  | ||||
| static inline void ttafilter_process(TTAFilter *c, int32_t *in) | ||||
| { | ||||
|     register int32_t *dl = c->dl, *qm = c->qm, *dx = c->dx, sum = c->round; | ||||
|  | ||||
|     if (c->error < 0) { | ||||
|         qm[0] -= dx[0]; qm[1] -= dx[1]; qm[2] -= dx[2]; qm[3] -= dx[3]; | ||||
|         qm[4] -= dx[4]; qm[5] -= dx[5]; qm[6] -= dx[6]; qm[7] -= dx[7]; | ||||
|     } else if (c->error > 0) { | ||||
|         qm[0] += dx[0]; qm[1] += dx[1]; qm[2] += dx[2]; qm[3] += dx[3]; | ||||
|         qm[4] += dx[4]; qm[5] += dx[5]; qm[6] += dx[6]; qm[7] += dx[7]; | ||||
|     } | ||||
|  | ||||
|     sum += dl[0] * qm[0] + dl[1] * qm[1] + dl[2] * qm[2] + dl[3] * qm[3] + | ||||
|            dl[4] * qm[4] + dl[5] * qm[5] + dl[6] * qm[6] + dl[7] * qm[7]; | ||||
|  | ||||
|     dx[0] = dx[1]; dx[1] = dx[2]; dx[2] = dx[3]; dx[3] = dx[4]; | ||||
|     dl[0] = dl[1]; dl[1] = dl[2]; dl[2] = dl[3]; dl[3] = dl[4]; | ||||
|  | ||||
|     dx[4] = ((dl[4] >> 30) | 1); | ||||
|     dx[5] = ((dl[5] >> 30) | 2) & ~1; | ||||
|     dx[6] = ((dl[6] >> 30) | 2) & ~1; | ||||
|     dx[7] = ((dl[7] >> 30) | 4) & ~3; | ||||
|  | ||||
|     c->error = *in; | ||||
|     *in += (sum >> c->shift); | ||||
|  | ||||
|     dl[4] = -dl[5]; dl[5] = -dl[6]; | ||||
|     dl[6] = *in - dl[7]; dl[7] = *in; | ||||
|     dl[5] += dl[6]; dl[4] += dl[5]; | ||||
| } | ||||
|  | ||||
| static const int64_t tta_channel_layouts[7] = { | ||||
|     AV_CH_LAYOUT_STEREO, | ||||
|     AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY, | ||||
| @@ -234,6 +205,8 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) | ||||
|         return AVERROR_INVALIDDATA; | ||||
|     } | ||||
|  | ||||
|     ff_ttadsp_init(&s->dsp); | ||||
|  | ||||
|     return allocate_buffers(avctx); | ||||
| } | ||||
|  | ||||
| @@ -335,7 +308,8 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, | ||||
|         *p = 1 + ((value >> 1) ^ ((value & 1) - 1)); | ||||
|  | ||||
|         // run hybrid filter | ||||
|         ttafilter_process(filter, p); | ||||
|         s->dsp.ttafilter_process_dec(filter->qm, filter->dx, filter->dl, &filter->error, p, | ||||
|                                      filter->shift, filter->round); | ||||
|  | ||||
|         // fixed order prediction | ||||
| #define PRED(x, k) (int32_t)((((uint64_t)x << k) - x) >> k) | ||||
|   | ||||
							
								
								
									
										54
									
								
								libavcodec/ttadsp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								libavcodec/ttadsp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| /* | ||||
|  * 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 "ttadsp.h" | ||||
|  | ||||
| static void ttafilter_process_dec_c(int32_t *qm, int32_t *dx, int32_t *dl, | ||||
|                                     int32_t *error, int32_t *in, int32_t shift, | ||||
|                                     int32_t round) { | ||||
|     if (*error < 0) { | ||||
|         qm[0] -= dx[0]; qm[1] -= dx[1]; qm[2] -= dx[2]; qm[3] -= dx[3]; | ||||
|         qm[4] -= dx[4]; qm[5] -= dx[5]; qm[6] -= dx[6]; qm[7] -= dx[7]; | ||||
|     } else if (*error > 0) { | ||||
|         qm[0] += dx[0]; qm[1] += dx[1]; qm[2] += dx[2]; qm[3] += dx[3]; | ||||
|         qm[4] += dx[4]; qm[5] += dx[5]; qm[6] += dx[6]; qm[7] += dx[7]; | ||||
|     } | ||||
|  | ||||
|     round +=    dl[0] * qm[0] + dl[1] * qm[1] + dl[2] * qm[2] + dl[3] * qm[3] + | ||||
|                 dl[4] * qm[4] + dl[5] * qm[5] + dl[6] * qm[6] + dl[7] * qm[7]; | ||||
|  | ||||
|     dx[0] = dx[1]; dx[1] = dx[2]; dx[2] = dx[3]; dx[3] = dx[4]; | ||||
|     dl[0] = dl[1]; dl[1] = dl[2]; dl[2] = dl[3]; dl[3] = dl[4]; | ||||
|  | ||||
|     dx[4] = ((dl[4] >> 30) | 1); | ||||
|     dx[5] = ((dl[5] >> 30) | 2) & ~1; | ||||
|     dx[6] = ((dl[6] >> 30) | 2) & ~1; | ||||
|     dx[7] = ((dl[7] >> 30) | 4) & ~3; | ||||
|  | ||||
|     *error = *in; | ||||
|     *in += (round >> shift); | ||||
|  | ||||
|     dl[4] = -dl[5]; dl[5] = -dl[6]; | ||||
|     dl[6] = *in - dl[7]; dl[7] = *in; | ||||
|     dl[5] += dl[6]; dl[4] += dl[5]; | ||||
| } | ||||
|  | ||||
| av_cold void ff_ttadsp_init(TTADSPContext *c) | ||||
| { | ||||
|     c->ttafilter_process_dec = ttafilter_process_dec_c; | ||||
| } | ||||
							
								
								
									
										33
									
								
								libavcodec/ttadsp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								libavcodec/ttadsp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * 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_TTADSP_H | ||||
| #define AVCODEC_TTADSP_H | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include "ttadata.h" | ||||
|  | ||||
| typedef struct TTADSPContext { | ||||
|     void (*ttafilter_process_dec)(int32_t *qm, int32_t *dx, int32_t *dl, | ||||
|                                   int32_t *error, int32_t *in, int32_t shift, | ||||
|                                   int32_t round); | ||||
| } TTADSPContext; | ||||
|  | ||||
| void ff_ttadsp_init(TTADSPContext *c); | ||||
|  | ||||
| #endif /* AVCODEC_TTADSP_H */ | ||||
		Reference in New Issue
	
	Block a user