/*
 * Java port of parts of the ffmpeg Mpeg4 base decoder.
 * Copyright (c) 2003 Jonathan Hueber.
 *
 * Copyright (c) 2001 Fabrice Bellard.
 *
 * This library 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 of the License, or (at your option) any later version.
 *
 * This library 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 this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * See Credits file and Readme for details
 */
package net.sourceforge.jffmpeg.codecs.video.mpeg4.divx.tables;

/**
 * This class manages the scan table ordering 
 */
public class ScanTable {
    public final static int[] getAlternativeVScanTable() {
        return permutedVScanTable;
    }

    public final static int[] getAlternativeHScanTable() {
        return permutedHScanTable;
    }

    public final static int[] getZigZagDirectTable() {
        return permutedZigZagDirect;
    }

    /* Input permutation for the simple_idct_mmx *
    public static int[] block_permute_op = new int[] {
	0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, 
	0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, 
	0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, 
	0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, 
	0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, 
	0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, 
	0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, 
	0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
    };
*/
    /* Input permutation for the simple_idct_mmx 
    private static int[] simple_mmx_permutation = new int[] {
	0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, 
	0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, 
	0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, 
	0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, 
	0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, 
	0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, 
	0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, 
	0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
    };
    */
    
//    public static int[] block_permute_op = new int[64];
    private static int[] simple_mmx_permutation = new int[64];
    static {
        for ( int y = 0; y < 64; y++ ) {
//            block_permute_op[ y ] = y;
            simple_mmx_permutation[ y ] = y;
        }
    }
 
    /** ff_alternate_vertical_scan */
    private static int[] vScanTable = new int[] {
    0,  8, 16, 24,  1,  9,  2, 10, 
    17, 25, 32, 40, 48, 56, 57, 49,
    41, 33, 26, 18,  3, 11,  4, 12, 
    19, 27, 34, 42, 50, 58, 35, 43,
    51, 59, 20, 28,  5, 13,  6, 14, 
    21, 29, 36, 44, 52, 60, 37, 45,
    53, 61, 22, 30,  7, 15, 23, 31, 
    38, 46, 54, 62, 39, 47, 55, 63,
};

    /** ff_alternate_horizontal_scan */
    private static int[] hScanTable = new int[] {
    0,  1,  2,  3,  8,  9, 16, 17, 
    10, 11,  4,  5,  6,  7, 15, 14,
    13, 12, 19, 18, 24, 25, 32, 33, 
    26, 27, 20, 21, 22, 23, 28, 29,
    30, 31, 34, 35, 40, 41, 48, 49, 
    42, 43, 36, 37, 38, 39, 44, 45,
    46, 47, 50, 51, 56, 57, 58, 59, 
    52, 53, 54, 55, 60, 61, 62, 63,
};

    /** zipzag_direct */
    private static int[] ff_zigzag_direct = new int[] {
    0, 1, 8, 16, 9, 2, 3, 10,
    17, 24, 32, 25, 18, 11, 4, 5,
    12, 19, 26, 33, 40, 48, 41, 34,
    27, 20, 13, 6, 7, 14, 21, 28,
    35, 42, 49, 56, 57, 50, 43, 36,
    29, 22, 15, 23, 30, 37, 44, 51,
    58, 59, 52, 45, 38, 31, 39, 46,
    53, 60, 61, 54, 47, 55, 62, 63
    };

    private static int[] permutedZigZagDirect = null;
    private static int[] permutedHScanTable = null;
    private static int[] permutedVScanTable = null;

    static {
        permutedZigZagDirect = new int[ ff_zigzag_direct.length ];
	for ( int i = 0; i < ff_zigzag_direct.length; i++ ) {
	    permutedZigZagDirect[i] = simple_mmx_permutation[ ff_zigzag_direct[i] ];
        }
        permutedHScanTable = new int[ hScanTable.length ];
	for ( int i = 0; i < hScanTable.length; i++ ) {
	    permutedHScanTable[i] = simple_mmx_permutation[ hScanTable[i] ];
        }
        permutedVScanTable = new int[ vScanTable.length ];
	for ( int i = 0; i <vScanTable.length; i++ ) {
	    permutedVScanTable[i] = simple_mmx_permutation[ vScanTable[i] ];
        }
    }
}
