Filarius

dct idct for reddit

Sep 8th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.05 KB | None | 0 0
  1. def DCT4x4(d):
  2.     tmp = np.zeros((16,), dtype=np.int32)
  3.     result = np.zeros((16,), dtype=np.int32)
  4.     for i in range(4):
  5.         s03 = d[i * 4 + 0] + d[i * 4 + 3]
  6.         s12 = d[i * 4 + 1] + d[i * 4 + 2]
  7.         d03 = d[i * 4 + 0] - d[i * 4 + 3]
  8.         d12 = d[i * 4 + 1] - d[i * 4 + 2]
  9.  
  10.         tmp[0 * 4 + i] = s03 + s12
  11.         tmp[1 * 4 + i] = 2 * d03 + d12
  12.         tmp[2 * 4 + i] = s03 - s12
  13.         tmp[3 * 4 + i] = d03 - 2 * d12
  14.     for i in range(4):
  15.         s03 = tmp[i * 4 + 0] + tmp[i * 4 + 3]
  16.         s12 = tmp[i * 4 + 1] + tmp[i * 4 + 2]
  17.         d03 = tmp[i * 4 + 0] - tmp[i * 4 + 3]
  18.         d12 = tmp[i * 4 + 1] - tmp[i * 4 + 2]
  19.  
  20.         result[i * 4 + 0] = s03 + s12
  21.         result[i * 4 + 1] = 2 * d03 + d12
  22.         result[i * 4 + 2] = s03 - s12
  23.         result[i * 4 + 3] = d03 - 2 * d12
  24.  
  25.     return result
  26.  
  27.  
  28. def IDCT4x4(data):
  29.     tmp = np.zeros((16,),dtype=np.int32)
  30.     d = np.zeros((16,), dtype=np.int32)
  31.     for i in range(4):
  32.         s02 = data[0 * 4 + i] + data[2 * 4 + i]
  33.         d02 = data[0 * 4 + i] - data[2 * 4 + i]
  34.         s13 = data[1 * 4 + i] + (data[3 * 4 + i] >> 1)
  35.         d13 = (data[1 * 4 + i] >> 1) - data[3 * 4 + i]
  36.         tmp[i * 4 + 0] = s02 + s13
  37.         tmp[i * 4 + 1] = d02 + d13
  38.         tmp[i * 4 + 2] = d02 - d13
  39.         tmp[i * 4 + 3] = s02 - s13
  40.     for i in range(4):
  41.         s02 = tmp[0 * 4 + i] + tmp[2 * 4 + i]
  42.         d02 = tmp[0 * 4 + i] - tmp[2 * 4 + i]
  43.         s13 = tmp[1 * 4 + i] + (tmp[3 * 4 + i] >> 1)
  44.         d13 = (tmp[1 * 4 + i] >> 1) - tmp[3 * 4 + i]
  45.         d[0 * 4 + i] = ((s02 + s13 + 32) >> 6)
  46.         d[1 * 4 + i] = ((d02 + d13 + 32) >> 6)
  47.         d[2 * 4 + i] = ((d02 - d13 + 32) >> 6)
  48.         d[3 * 4 + i] = ((s02 - s13 + 32) >> 6)
  49.     d = d.clip(0,255)
  50.     return d
  51.  
  52. def  DCT8x8(data):
  53.     tmp = np.zeros((64,),dtype=np.int32)
  54.     result = np.zeros((64,),dtype=np.int32)
  55.     for i in range(8):
  56.         p0 = data[i * 8 + 0]
  57.         p1 = data[i * 8 + 1]
  58.         p2 = data[i * 8 + 2]
  59.         p3 = data[i * 8 + 3]
  60.         p4 = data[i * 8 + 4]
  61.         p5 = data[i * 8 + 5]
  62.         p6 = data[i * 8 + 6]
  63.         p7 = data[i * 8 + 7]
  64.         a0 = p0 + p7
  65.         a1 = p1 + p6
  66.         a2 = p2 + p5
  67.         a3 = p3 + p4
  68.         b0 = a0 + a3
  69.         b1 = a1 + a2
  70.         b2 = a0 - a3
  71.         b3 = a1 - a2
  72.         a0 = p0 - p7
  73.         a1 = p1 - p6
  74.         a2 = p2 - p5
  75.         a3 = p3 - p4
  76.         b4 = a1 + a2 + ((a0 >> 1) + a0)
  77.         b5 = a0 - a3 - ((a2 >> 1) + a2)
  78.         b6 = a0 + a3 - ((a1 >> 1) + a1)
  79.         b7 = a1 - a2 + ((a3 >> 1) + a3)
  80.         tmp[i * 8 + 0] = b0 + b1
  81.         tmp[i * 8 + 1] = b4 + (b7 >> 2)
  82.         tmp[i * 8 + 2] = b2 + (b3 >> 1)
  83.         tmp[i * 8 + 3] = b5 + (b6 >> 2)
  84.         tmp[i * 8 + 4] = b0 - b1
  85.         tmp[i * 8 + 5] = b6 - (b5 >> 2)
  86.         tmp[i * 8 + 6] = (b2 >> 1) - b3
  87.         tmp[i * 8 + 7] = (b4 >> 2) - b7
  88.     for i in range(8):
  89.         p0 = tmp[0 * 8 + i]
  90.         p1 = tmp[1 * 8 + i]
  91.         p2 = tmp[2 * 8 + i]
  92.         p3 = tmp[3 * 8 + i]
  93.         p4 = tmp[4 * 8 + i]
  94.         p5 = tmp[5 * 8 + i]
  95.         p6 = tmp[6 * 8 + i]
  96.         p7 = tmp[7 * 8 + i]
  97.         a0 = p0 + p7
  98.         a1 = p1 + p6
  99.         a2 = p2 + p5
  100.         a3 = p3 + p4
  101.         b0 = a0 + a3
  102.         b1 = a1 + a2
  103.         b2 = a0 - a3
  104.         b3 = a1 - a2
  105.         a0 = p0 - p7
  106.         a1 = p1 - p6
  107.         a2 = p2 - p5
  108.         a3 = p3 - p4
  109.         b4 = a1 + a2 + ((a0 >> 1) + a0)
  110.         b5 = a0 - a3 - ((a2 >> 1) + a2)
  111.         b6 = a0 + a3 - ((a1 >> 1) + a1)
  112.         b7 = a1 - a2 + ((a3 >> 1) + a3)
  113.         result[0 * 8 + i] = b0 + b1
  114.         result[1 * 8 + i] = b4 + (b7 >> 2)
  115.         result[2 * 8 + i] = b2 + (b3 >> 1)
  116.         result[3 * 8 + i] = b5 + (b6 >> 2)
  117.         result[4 * 8 + i] = b0 - b1
  118.         result[5 * 8 + i] = b6 - (b5 >> 2)
  119.         result[6 * 8 + i] = (b2 >> 1) - b3
  120.         result[7 * 8 + i] = (b4 >> 2) - b7
  121.     return result
  122.  
  123. def IDCT8x8(data):
  124.     tmp = np.zeros((64,), dtype=np.int32)
  125.     result = np.zeros((64,), dtype=np.int32)
  126.     for i in range(8):
  127.         p0 = data[i * 8 + 0]
  128.         p1 = data[i * 8 + 1]
  129.         p2 = data[i * 8 + 2]
  130.         p3 = data[i * 8 + 3]
  131.         p4 = data[i * 8 + 4]
  132.         p5 = data[i * 8 + 5]
  133.         p6 = data[i * 8 + 6]
  134.         p7 = data[i * 8 + 7]
  135.         a0 = p0 + p4
  136.         a1 = p0 - p4
  137.         a2 = p6 - (p2 >> 1)
  138.         a3 = p2 + (p6 >> 1)
  139.         b0 = a0 + a3
  140.         b2 = a1 - a2
  141.         b4 = a1 + a2
  142.         b6 = a0 - a3
  143.         a0 = -p3 + p5 - p7 - (p7 >> 1)
  144.         a1 = p1 + p7 - p3 - (p3 >> 1)
  145.         a2 = -p1 + p7 + p5 + (p5 >> 1)
  146.         a3 = p3 + p5 + p1 + (p1 >> 1)
  147.         b1 = a0 + (a3 >> 2)
  148.         b3 = a1 + (a2 >> 2)
  149.         b5 = a2 - (a1 >> 2)
  150.         b7 = a3 - (a0 >> 2)
  151.         tmp[i * 8 + 0] = b0 + b7
  152.         tmp[i * 8 + 1] = b2 - b5
  153.         tmp[i * 8 + 2] = b4 + b3
  154.         tmp[i * 8 + 3] = b6 + b1
  155.         tmp[i * 8 + 4] = b6 - b1
  156.         tmp[i * 8 + 5] = b4 - b3
  157.         tmp[i * 8 + 6] = b2 + b5
  158.         tmp[i * 8 + 7] = b0 - b7
  159.     for i in range(8):
  160.         p0 = tmp[0 * 8 + i]
  161.         p1 = tmp[1 * 8 + i]
  162.         p2 = tmp[2 * 8 + i]
  163.         p3 = tmp[3 * 8 + i]
  164.         p4 = tmp[4 * 8 + i]
  165.         p5 = tmp[5 * 8 + i]
  166.         p6 = tmp[6 * 8 + i]
  167.         p7 = tmp[7 * 8 + i]
  168.         a0 = p0 + p4
  169.         a1 = p0 - p4
  170.         a2 = p6 - (p2 >> 1)
  171.         a3 = p2 + (p6 >> 1)
  172.         b0 = a0 + a3
  173.         b2 = a1 - a2
  174.         b4 = a1 + a2
  175.         b6 = a0 - a3
  176.         a0 = -p3 + p5 - p7 - (p7 >> 1)
  177.         a1 = p1 + p7 - p3 - (p3 >> 1)
  178.         a2 = -p1 + p7 + p5 + (p5 >> 1)
  179.         a3 = p3 + p5 + p1 + (p1 >> 1)
  180.         b1 = a0 + (a3 >> 2)
  181.         b7 = a3 - (a0 >> 2)
  182.         b3 = a1 + (a2 >> 2)
  183.         b5 = a2 - (a1 >> 2)
  184.         result[0 * 8 + i] = ((b0 + b7) >> 6)
  185.         result[1 * 8 + i] = ((b2 - b5) >> 6)
  186.         result[2 * 8 + i] = ((b4 + b3) >> 6)
  187.         result[3 * 8 + i] = ((b6 + b1) >> 6)
  188.         result[4 * 8 + i] = ((b6 - b1) >> 6)
  189.         result[5 * 8 + i] = ((b4 - b3) >> 6)
  190.         result[6 * 8 + i] = ((b2 + b5) >> 6)
  191.         result[7 * 8 + i] = ((b0 - b7) >> 6)
  192.     result = result.clip(0,255)
  193.     return result
Add Comment
Please, Sign In to add comment