/* * 21.04.2004 Original verion. davagin@udm.ru. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package davaguine.jmac.decoder; /** * Author: Dmitry Vaguine * Date: 04.03.2004 * Time: 14:51:31 */ public class AntiPredictorNormal3320To3800 extends AntiPredictor { public void AntiPredict(int[] pInputArray, int[] pOutputArray, int NumberOfElements) { //variable declares int q; //short frame handling if (NumberOfElements < 8) { System.arraycopy(pInputArray, 0, pOutputArray, 0, NumberOfElements); return; } //make the first five samples identical in both arrays System.arraycopy(pInputArray, 0, pOutputArray, 0, 5); //initialize values int m1 = 0; int m2 = 64; int m3 = 28; int OP0; int p3 = (3 * (pOutputArray[4] - pOutputArray[3])) + pOutputArray[2]; int p2 = pInputArray[4] + ((pInputArray[2] - pInputArray[3]) << 3) - pInputArray[1] + pInputArray[0]; int p1 = pOutputArray[4]; for (q = 5; q < NumberOfElements; q++) { OP0 = pInputArray[q] + ((p1 * m1) >> 8); if ((pInputArray[q] ^ p1) > 0) m1++; else m1--; p1 = OP0; pInputArray[q] = OP0 + ((p2 * m2) >> 11); if ((OP0 ^ p2) > 0) m2++; else m2--; p2 = pInputArray[q] + ((pInputArray[q - 2] - pInputArray[q - 1]) << 3) - pInputArray[q - 3] + pInputArray[q - 4]; pOutputArray[q] = pInputArray[q] + ((p3 * m3) >> 9); if ((pInputArray[q] ^ p3) > 0) m3++; else m3--; p3 = (3 * (pOutputArray[q] - pOutputArray[q - 1])) + pOutputArray[q - 2]; } int m4 = 370; int m5 = 3900; //pOutputArray[0] = pInputArray[0]; pOutputArray[1] = pInputArray[1] + pOutputArray[0]; pOutputArray[2] = pInputArray[2] + pOutputArray[1]; pOutputArray[3] = pInputArray[3] + pOutputArray[2]; pOutputArray[4] = pInputArray[4] + pOutputArray[3]; int p4 = (2 * pInputArray[4]) - pInputArray[3]; int p5 = pOutputArray[4]; int IP0, IP1; IP1 = pInputArray[4]; for (q = 5; q < NumberOfElements; q++) { IP0 = pOutputArray[q] + ((p4 * m4) >> 9); if ((pOutputArray[q] ^ p4) > 0) m4++; else m4--; p4 = (2 * IP0) - IP1; pOutputArray[q] = IP0 + ((p5 * m5) >> 12); if ((IP0 ^ p5) > 0) m5++; else m5--; p5 = pOutputArray[q]; IP1 = IP0; } } }