Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Indeo Video Interactive 4 compatible decoder
  3.  * Copyright (c) 2009-2010 Maxim Poliakovski
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * @file
  24.  * This file contains data needed for the Indeo 4 decoder.
  25.  */
  26.  
  27. #ifndef AVCODEC_INDEO4DATA_H
  28. #define AVCODEC_INDEO4DATA_H
  29.  
  30. #include <stdint.h>
  31. #include "dsputil.h"
  32. #include "ivi_common.h"
  33.  
  34. /**
  35.  *  standard picture dimensions
  36.  */
  37. static const uint16_t ivi4_common_pic_sizes[14] = {
  38.     640, 480, 320, 240, 160, 120, 704, 480, 352, 240, 352, 288, 176, 144
  39. };
  40.  
  41. /**
  42.  *  Indeo 4 8x8 scan (zigzag) patterns
  43.  */
  44. static const uint8_t ivi4_alternate_scan_8x8[64] = {
  45.      0,  8,  1,  9, 16, 24,  2,  3, 17, 25, 10, 11, 32, 40, 48, 56,
  46.      4,  5,  6,  7, 33, 41, 49, 57, 18, 19, 26, 27, 12, 13, 14, 15,
  47.     34, 35, 43, 42, 50, 51, 59, 58, 20, 21, 22, 23, 31, 30, 29, 28,
  48.     36, 37, 38, 39, 47, 46, 45, 44, 52, 53, 54, 55, 63, 62, 61, 60
  49. };
  50.  
  51. static const uint8_t ivi4_alternate_scan_4x4[16] = {
  52.     0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15
  53. };
  54.  
  55. static const uint8_t ivi4_vertical_scan_4x4[16] = {
  56.     0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15
  57. };
  58.  
  59. static const uint8_t ivi4_horizontal_scan_4x4[16] = {
  60.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  61. };
  62.  
  63. static const uint8_t *scan_index_to_tab[15] = {
  64.     // for 8x8 transforms
  65.     ff_zigzag_direct,
  66.     ivi4_alternate_scan_8x8,
  67.     ff_ivi_horizontal_scan_8x8,
  68.     ff_ivi_vertical_scan_8x8,
  69.     ff_zigzag_direct,
  70.  
  71.     // for 4x4 transforms
  72.     ff_ivi_direct_scan_4x4,
  73.     ivi4_alternate_scan_4x4,
  74.     ivi4_vertical_scan_4x4,
  75.     ivi4_horizontal_scan_4x4,
  76.     ff_ivi_direct_scan_4x4,
  77.  
  78.     // TODO: check if those are needed
  79.     ff_ivi_horizontal_scan_8x8,
  80.     ff_ivi_horizontal_scan_8x8,
  81.     ff_ivi_horizontal_scan_8x8,
  82.     ff_ivi_horizontal_scan_8x8,
  83.     ff_ivi_horizontal_scan_8x8
  84. };
  85.  
  86. /**
  87.  *  Indeo 4 dequant tables
  88.  */
  89. static const uint16_t ivi4_quant_8x8_intra[9][64] = {
  90.   {
  91.       43,  342,  385,  470,  555,  555,  598,  726,
  92.      342,  342,  470,  513,  555,  598,  726,  769,
  93.      385,  470,  555,  555,  598,  726,  726,  811,
  94.      470,  470,  555,  555,  598,  726,  769,  854,
  95.      470,  555,  555,  598,  683,  726,  854, 1025,
  96.      555,  555,  598,  683,  726,  854, 1025, 1153,
  97.      555,  555,  598,  726,  811,  982, 1195, 1451,
  98.      555,  598,  726,  811,  982, 1195, 1451, 1793
  99.   },
  100.   {
  101.       86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
  102.     1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
  103.     2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
  104.     2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
  105.     4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
  106.     4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
  107.     4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
  108.     4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
  109.   },
  110.   {
  111.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  112.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  113.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  114.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  115.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  116.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  117.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
  118.      235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
  119.   },
  120.   {
  121.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  122.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  123.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  124.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  125.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  126.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  127.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
  128.     1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
  129.   },
  130.   {
  131.      897,  897,  897,  897,  897,  897,  897,  897,
  132.     1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
  133.     1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
  134.     1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
  135.     1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
  136.     1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
  137.     1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
  138.     2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
  139.   },
  140.   {
  141.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  142.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  143.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  144.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  145.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  146.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  147.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  148.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
  149.   },
  150.   {
  151.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  152.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  153.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  154.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  155.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  156.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  157.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
  158.     2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
  159.   },
  160.   {
  161.       22,  171,  214,  257,  257,  299,  299,  342,
  162.      171,  171,  257,  257,  299,  299,  342,  385,
  163.      214,  257,  257,  299,  299,  342,  342,  385,
  164.      257,  257,  257,  299,  299,  342,  385,  427,
  165.      257,  257,  299,  299,  342,  385,  427,  513,
  166.      257,  299,  299,  342,  385,  427,  513,  598,
  167.      299,  299,  299,  385,  385,  470,  598,  726,
  168.      299,  299,  385,  385,  470,  598,  726,  897
  169.   },
  170.   {
  171.       86,  598, 1195, 1195, 2390, 2390, 2390, 2390,
  172.      598,  598, 1195, 1195, 2390, 2390, 2390, 2390,
  173.     1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
  174.     1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
  175.     2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
  176.     2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
  177.     2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
  178.     2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
  179.   }
  180. };
  181.  
  182. static const uint16_t ivi4_quant_8x8_inter[9][64] = {
  183.   {
  184.      427,  427,  470,  427,  427,  427,  470,  470,
  185.      427,  427,  470,  427,  427,  427,  470,  470,
  186.      470,  470,  470,  470,  470,  470,  470,  470,
  187.      427,  427,  470,  470,  427,  427,  470,  470,
  188.      427,  427,  470,  427,  427,  427,  470,  470,
  189.      427,  427,  470,  427,  427,  427,  470,  470,
  190.      470,  470,  470,  470,  470,  470,  470,  470,
  191.      470,  470,  470,  470,  470,  470,  470,  470
  192.   },
  193.   {
  194.     1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
  195.     1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
  196.     2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
  197.     2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
  198.     3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
  199.     3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
  200.     3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
  201.     3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
  202.   },
  203.   {
  204.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  205.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  206.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  207.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  208.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  209.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  210.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
  211.     1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
  212.   },
  213.   {
  214.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  215.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  216.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  217.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  218.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  219.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  220.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
  221.     2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
  222.   },
  223.   {
  224.     1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
  225.     1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
  226.     1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
  227.     1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
  228.     1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
  229.     1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
  230.     1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
  231.     1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
  232.   },
  233.   {
  234.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
  235.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
  236.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  237.     3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
  238.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
  239.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
  240.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
  241.     2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
  242.   },
  243.   {
  244.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  245.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  246.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  247.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  248.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  249.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  250.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
  251.     1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
  252.   },
  253.   {
  254.       86,  171,  171,  214,  214,  214,  214,  257,
  255.      171,  171,  214,  214,  214,  214,  257,  257,
  256.      171,  214,  214,  214,  214,  257,  257,  257,
  257.      214,  214,  214,  214,  257,  257,  257,  299,
  258.      214,  214,  214,  257,  257,  257,  299,  299,
  259.      214,  214,  257,  257,  257,  299,  299,  299,
  260.      214,  257,  257,  257,  299,  299,  299,  342,
  261.      257,  257,  257,  299,  299,  299,  342,  342
  262.   },
  263.   {
  264.      854,  854, 1195, 1195, 1707, 1707, 1707, 1707,
  265.      854,  854, 1195, 1195, 1707, 1707, 1707, 1707,
  266.     1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
  267.     1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
  268.     1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
  269.     1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
  270.     1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
  271.     1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
  272.   }
  273. };
  274.  
  275. static const uint16_t ivi4_quant_4x4_intra[5][16] = {
  276.   {
  277.       22,  214,  257,  299,
  278.      214,  257,  299,  342,
  279.      257,  299,  342,  427,
  280.      299,  342,  427,  513
  281.   },
  282.   {
  283.      129, 1025, 1451, 1451,
  284.     1025, 1025, 1451, 1451,
  285.     1451, 1451, 2049, 2049,
  286.     1451, 1451, 2049, 2049
  287.   },
  288.   {
  289.       43,  171,  171,  171,
  290.       43,  171,  171,  171,
  291.       43,  171,  171,  171,
  292.       43,  171,  171,  171
  293.   },
  294.   {
  295.       43,   43,   43,   43,
  296.      171,  171,  171,  171,
  297.      171,  171,  171,  171,
  298.      171,  171,  171,  171
  299.   },
  300.   {
  301.       43,   43,   43,   43,
  302.       43,   43,   43,   43,
  303.       43,   43,   43,   43,
  304.       43,   43,   43,   43
  305.   }
  306. };
  307.  
  308. static const uint16_t ivi4_quant_4x4_inter[5][16] = {
  309.   {
  310.      107,  214,  257,  299,
  311.      214,  257,  299,  299,
  312.      257,  299,  299,  342,
  313.      299,  299,  342,  342
  314.   },
  315.   {
  316.      513, 1025, 1238, 1238,
  317.     1025, 1025, 1238, 1238,
  318.     1238, 1238, 1451, 1451,
  319.     1238, 1238, 1451, 1451
  320.   },
  321.   {
  322.       43,  171,  171,  171,
  323.       43,  171,  171,  171,
  324.       43,  171,  171,  171,
  325.       43,  171,  171,  171
  326.   },
  327.   {
  328.       43,   43,   43,   43,
  329.      171,  171,  171,  171,
  330.      171,  171,  171,  171,
  331.      171,  171,  171,  171
  332.   },
  333.   {
  334.       43,   43,   43,   43,
  335.       43,   43,   43,   43,
  336.       43,   43,   43,   43,
  337.       43,   43,   43,   43
  338.   }
  339. };
  340.  
  341. /**
  342.  *  Table for mapping quant matrix index from the bitstream
  343.  *  into internal quant table number.
  344.  */
  345. static const uint8_t quant_index_to_tab[22] = {
  346.     0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8, // for 8x8 quant matrixes
  347.     0, 1, 2, 2, 3, 3, 4                          // for 4x4 quant matrixes
  348. };
  349.  
  350. #endif /* AVCODEC_INDEO4DATA_H */
  351.