1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/******************************************************************************* 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard File: ms_stereo.c 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Content: MS stereo processing function 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "oper_32b.h" 25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h" 26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "ms_stereo.h" 27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************** 30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: MsStereoProcessing 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: detect use ms stereo or not 33b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn)) 34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo 35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid MsStereoProcessing(Word32 *sfbEnergyLeft, 38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *sfbEnergyRight, 39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word32 *sfbEnergyMid, 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word32 *sfbEnergySide, 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *mdctSpectrumLeft, 42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *mdctSpectrumRight, 43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *sfbThresholdLeft, 44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *sfbThresholdRight, 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *sfbSpreadedEnLeft, 46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *sfbSpreadedEnRight, 47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *msDigest, 48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *msMask, 49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word16 sfbCnt, 50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word16 sfbPerGroup, 51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word16 maxSfbPerGroup, 52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const Word16 *sfbOffset) { 53b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word32 sfb,sfboffs, j; 54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 msMaskTrueSomewhere = 0; 55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 msMaskFalseSomewhere = 0; 56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (sfb=0; sfb<sfbCnt; sfb+=sfbPerGroup) { 58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (sfboffs=0;sfboffs<maxSfbPerGroup;sfboffs++) { 59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 temp; 61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 pnlr,pnms; 62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 minThreshold; 63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 thrL, thrR, nrgL, nrgR; 64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 idx, shift; 65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 66b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard idx = sfb + sfboffs; 67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard thrL = sfbThresholdLeft[idx]; 69b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard thrR = sfbThresholdRight[idx]; 70b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard nrgL = sfbEnergyLeft[idx]; 71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard nrgR = sfbEnergyRight[idx]; 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minThreshold = min(thrL, thrR); 74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgL = max(nrgL,thrL) + 1; 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard shift = norm_l(nrgL); 77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgL = Div_32(thrL << shift, nrgL << shift); 78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgR = max(nrgR,thrR) + 1; 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard shift = norm_l(nrgR); 80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgR = Div_32(thrR << shift, nrgR << shift); 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong pnlr = fixmul(nrgL, nrgR); 83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 84b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard nrgL = sfbEnergyMid[idx]; 85b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard nrgR = sfbEnergySide[idx]; 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgL = max(nrgL,minThreshold) + 1; 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard shift = norm_l(nrgL); 89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgL = Div_32(minThreshold << shift, nrgL << shift); 90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgR = max(nrgR,minThreshold) + 1; 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard shift = norm_l(nrgR); 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong nrgR = Div_32(minThreshold << shift, nrgR << shift); 94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong pnms = fixmul(nrgL, nrgR); 96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong temp = (pnlr + 1) / ((pnms >> 8) + 1); 98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 99b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard temp = pnms - pnlr; 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if( temp > 0 ){ 101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard msMask[idx] = 1; 103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard msMaskTrueSomewhere = 1; 104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) { 106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 left, right; 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong left = (mdctSpectrumLeft[j] >> 1); 108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong right = (mdctSpectrumRight[j] >> 1); 109b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard mdctSpectrumLeft[j] = left + right; 110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard mdctSpectrumRight[j] = left - right; 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 112b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbThresholdLeft[idx] = minThreshold; 114b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbThresholdRight[idx] = minThreshold; 115b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbEnergyLeft[idx] = sfbEnergyMid[idx]; 116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbEnergyRight[idx] = sfbEnergySide[idx]; 117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 118b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1; 119b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx]; 120b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong else { 123b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard msMask[idx] = 0; 124b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard msMaskFalseSomewhere = 1; 125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 126b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard } 127b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if ( msMaskTrueSomewhere ) { 128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if(msMaskFalseSomewhere ) { 129b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *msDigest = SI_MS_MASK_SOME; 130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } else { 131b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *msDigest = SI_MS_MASK_ALL; 132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } else { 134b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *msDigest = SI_MS_MASK_NONE; 135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 139