⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 son_gc_compensate.c

📁 MPEG2/MPEG4编解码参考程序(实现了MPEG4的部分功能)
💻 C
字号:
/*******************************************************************This software module was originally developed byYoshiaki Oikawa (Sony Corporation) andMitsuyuki Hatanaka (Sony Corporation)and edited byTakashi Koike (Sony Corporation)in the course of development of the MPEG-2 NBC/MPEG-4 System/MPEG-4Video/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 3. Thissoftware module is an implementation of a part of one or more MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio tools as specified by theMPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio standard. ISO/IECgives users of the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards free license to this software module or modificationsthereof for use in hardware or software products claiming conformanceto the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existingpatents. The original developer of this software module and his/hercompany, the subsequent editors and their companies, and ISO/IEC haveno liability for use of this software module or modifications thereofin an implementation. Copyright is not released for non MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio conforming products.Theoriginal developer retains full right to use the code for his/her ownpurpose, assign or donate the code to a third party and to inhibitthird party from using the code for non MPEG-2 NBC/MPEG-4System/MPEG-4 Video/MPEG-4 Audio conforming products. This copyrightnotice must be included in all copies or derivative works.Copyright (C) 1996.*******************************************************************/#include <stdio.h>#include <stdlib.h>#include "buffersHandle.h"       /* handler, defines, enums */#include "resilienceHandle.h"    /* handler, defines, enums */#include "tf_mainHandle.h"       /* handler, defines, enums */#include "common_m4a.h"#include "sony_local.h"void son_gainc_window(int, GAINC, GAINC, GAINC, double *, int);void	son_gc_compensate_sub(	double	input[],	GAINC	*gain_data[],	int	block_size_samples,	int	window_sequence,	int	ch,	int	band,	double	*gcOverlapBufferCh[],	double	*out[]	){	int	i,j,k;	/* These parameter will be removed outside */	static 	GAINC	gain_data_prev[MAX_TIME_CHANNELS][NBANDS];	static	int init_flag = 0;	double	*a_gcwind;	a_gcwind = (double *)calloc(block_size_samples/NBANDS*2,					sizeof(double));	if(init_flag == 0){		for(i = 0; i < NBANDS ; i++){			gain_data_prev[ch][i].natks = 0;		}		init_flag = 1;	}		switch(window_sequence){	case ONLY_LONG_SEQUENCE:		/* Gain function making routine */		son_gainc_window(block_size_samples/NBANDS*2,				gain_data_prev[ch][band],				gain_data[band][0], gain_data[band][0],				a_gcwind, ONLY_LONG_SEQUENCE);		/* Gain compensating routine */		for( j = 0; j < block_size_samples/NBANDS*2; j++){			input[band*block_size_samples/NBANDS*2+j] *=a_gcwind[j];		}		/* Overlapping routine */		for( j = 0; j < block_size_samples/NBANDS; j++){			out[band][j] = gcOverlapBufferCh[band][j]+input[band*block_size_samples/NBANDS*2+j];		}		/* Shift Previous data */		for( j = 0; j < block_size_samples/NBANDS; j++){			gcOverlapBufferCh[band][j] =					input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j];		}		gain_data_prev[ch][band] = gain_data[band][0];		break;	case LONG_START_SEQUENCE:		/* Gain function making routine */		son_gainc_window(block_size_samples/NBANDS*2,				gain_data_prev[ch][band],				gain_data[band][0], gain_data[band][1],				a_gcwind, LONG_START_SEQUENCE);		/* Gain compensating routine */		for( j = 0; j < block_size_samples/NBANDS*2; j++){			input[band*block_size_samples/NBANDS*2+j] *=a_gcwind[j];		}		/* Overlapping routine */		for( j = 0; j < block_size_samples/NBANDS; j++){			out[band][j] = gcOverlapBufferCh[band][j] +					input[band*block_size_samples/NBANDS*2+j];		}		/* Shift Previous data */		for( j = 0; j < block_size_samples/NBANDS; j++){			gcOverlapBufferCh[band][j] =				input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j];		}		gain_data_prev[ch][band] = gain_data[band][1];		break;	case LONG_STOP_SEQUENCE:		/* Gain function making routine */		son_gainc_window(block_size_samples/NBANDS*2,				gain_data_prev[ch][band],				gain_data[band][0], gain_data[band][1],				a_gcwind, LONG_STOP_SEQUENCE);		/* Gain compensating routine */		for( j = 0; j < block_size_samples/NBANDS*2; j++){			input[band*block_size_samples/NBANDS*2+j] *= a_gcwind[j];		}		/* Overlapping rouitne */		for( j = 0; j < block_size_samples/NBANDS; j++){			out[band][j] = gcOverlapBufferCh[band][j] +					input[band*block_size_samples/NBANDS*2+j];		}		/* Shift Previous data */		for( j = 0; j < block_size_samples/NBANDS; j++){			gcOverlapBufferCh[band][j] =					input[band*block_size_samples/NBANDS*2+block_size_samples/NBANDS+j];		}		gain_data_prev[ch][band] = gain_data[band][1];		break;	case EIGHT_SHORT_SEQUENCE:		for(k = 0; k < SHORT_WIN_IN_LONG; k++){			/* Gain function making routine */			son_gainc_window(block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2,					gain_data_prev[ch][band],					gain_data[band][k], gain_data[band][k],					a_gcwind, EIGHT_SHORT_SEQUENCE);			/* Gain compensating routine */			for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2; j++){				input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+j] *= a_gcwind[j];			}			/* Overlapping rouitne */			for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS; j++){				gcOverlapBufferCh[band][j+block_size_samples/NBANDS*7/16+block_size_samples/SHORT_WIN_IN_LONG/NBANDS*k] += input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+j];			}			/* Shift Previous data */			for( j = 0; j < block_size_samples/SHORT_WIN_IN_LONG/NBANDS; j++){				gcOverlapBufferCh[band][j+block_size_samples/NBANDS*7/16+block_size_samples/SHORT_WIN_IN_LONG/NBANDS*(k+1)] = input[band*block_size_samples/NBANDS*2+k*block_size_samples/SHORT_WIN_IN_LONG/NBANDS*2+block_size_samples/SHORT_WIN_IN_LONG/NBANDS+j];			}			gain_data_prev[ch][band] = gain_data[band][k];		}		for(j = 0; j < block_size_samples/NBANDS; j++){			out[band][j] = gcOverlapBufferCh[band][j];		}		for(j = 0; j < block_size_samples/NBANDS; j++){			gcOverlapBufferCh[band][j] =					gcOverlapBufferCh[band][j+block_size_samples/NBANDS];		}		break;	default:		CommonExit(1, "gc_compensate: ERROR! Illegal Window Type \n");		break;	}	free(a_gcwind);}void	son_gc_compensate(	double	timeSigChWithGC[],	GAINC	*gainInfoCh[],	int	block_size_samples,	int	window_sequence,	int	ch,	double	*gcOverlapBufferCh[],	double	*bandSigCh[],	int ssr_decoder_band	){  int i;	for ( i = 0; i < ssr_decoder_band; i++) { 		son_gc_compensate_sub(timeSigChWithGC,				gainInfoCh, block_size_samples,				window_sequence, ch, i,				gcOverlapBufferCh,				bandSigCh);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -