Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def DCT4x4(d):
- tmp = np.zeros((16,), dtype=np.int32)
- result = np.zeros((16,), dtype=np.int32)
- for i in range(4):
- s03 = d[i * 4 + 0] + d[i * 4 + 3]
- s12 = d[i * 4 + 1] + d[i * 4 + 2]
- d03 = d[i * 4 + 0] - d[i * 4 + 3]
- d12 = d[i * 4 + 1] - d[i * 4 + 2]
- tmp[0 * 4 + i] = s03 + s12
- tmp[1 * 4 + i] = 2 * d03 + d12
- tmp[2 * 4 + i] = s03 - s12
- tmp[3 * 4 + i] = d03 - 2 * d12
- for i in range(4):
- s03 = tmp[i * 4 + 0] + tmp[i * 4 + 3]
- s12 = tmp[i * 4 + 1] + tmp[i * 4 + 2]
- d03 = tmp[i * 4 + 0] - tmp[i * 4 + 3]
- d12 = tmp[i * 4 + 1] - tmp[i * 4 + 2]
- result[i * 4 + 0] = s03 + s12
- result[i * 4 + 1] = 2 * d03 + d12
- result[i * 4 + 2] = s03 - s12
- result[i * 4 + 3] = d03 - 2 * d12
- return result
- def IDCT4x4(data):
- tmp = np.zeros((16,),dtype=np.int32)
- d = np.zeros((16,), dtype=np.int32)
- for i in range(4):
- s02 = data[0 * 4 + i] + data[2 * 4 + i]
- d02 = data[0 * 4 + i] - data[2 * 4 + i]
- s13 = data[1 * 4 + i] + (data[3 * 4 + i] >> 1)
- d13 = (data[1 * 4 + i] >> 1) - data[3 * 4 + i]
- tmp[i * 4 + 0] = s02 + s13
- tmp[i * 4 + 1] = d02 + d13
- tmp[i * 4 + 2] = d02 - d13
- tmp[i * 4 + 3] = s02 - s13
- for i in range(4):
- s02 = tmp[0 * 4 + i] + tmp[2 * 4 + i]
- d02 = tmp[0 * 4 + i] - tmp[2 * 4 + i]
- s13 = tmp[1 * 4 + i] + (tmp[3 * 4 + i] >> 1)
- d13 = (tmp[1 * 4 + i] >> 1) - tmp[3 * 4 + i]
- d[0 * 4 + i] = ((s02 + s13 + 32) >> 6)
- d[1 * 4 + i] = ((d02 + d13 + 32) >> 6)
- d[2 * 4 + i] = ((d02 - d13 + 32) >> 6)
- d[3 * 4 + i] = ((s02 - s13 + 32) >> 6)
- d = d.clip(0,255)
- return d
- def DCT8x8(data):
- tmp = np.zeros((64,),dtype=np.int32)
- result = np.zeros((64,),dtype=np.int32)
- for i in range(8):
- p0 = data[i * 8 + 0]
- p1 = data[i * 8 + 1]
- p2 = data[i * 8 + 2]
- p3 = data[i * 8 + 3]
- p4 = data[i * 8 + 4]
- p5 = data[i * 8 + 5]
- p6 = data[i * 8 + 6]
- p7 = data[i * 8 + 7]
- a0 = p0 + p7
- a1 = p1 + p6
- a2 = p2 + p5
- a3 = p3 + p4
- b0 = a0 + a3
- b1 = a1 + a2
- b2 = a0 - a3
- b3 = a1 - a2
- a0 = p0 - p7
- a1 = p1 - p6
- a2 = p2 - p5
- a3 = p3 - p4
- b4 = a1 + a2 + ((a0 >> 1) + a0)
- b5 = a0 - a3 - ((a2 >> 1) + a2)
- b6 = a0 + a3 - ((a1 >> 1) + a1)
- b7 = a1 - a2 + ((a3 >> 1) + a3)
- tmp[i * 8 + 0] = b0 + b1
- tmp[i * 8 + 1] = b4 + (b7 >> 2)
- tmp[i * 8 + 2] = b2 + (b3 >> 1)
- tmp[i * 8 + 3] = b5 + (b6 >> 2)
- tmp[i * 8 + 4] = b0 - b1
- tmp[i * 8 + 5] = b6 - (b5 >> 2)
- tmp[i * 8 + 6] = (b2 >> 1) - b3
- tmp[i * 8 + 7] = (b4 >> 2) - b7
- for i in range(8):
- p0 = tmp[0 * 8 + i]
- p1 = tmp[1 * 8 + i]
- p2 = tmp[2 * 8 + i]
- p3 = tmp[3 * 8 + i]
- p4 = tmp[4 * 8 + i]
- p5 = tmp[5 * 8 + i]
- p6 = tmp[6 * 8 + i]
- p7 = tmp[7 * 8 + i]
- a0 = p0 + p7
- a1 = p1 + p6
- a2 = p2 + p5
- a3 = p3 + p4
- b0 = a0 + a3
- b1 = a1 + a2
- b2 = a0 - a3
- b3 = a1 - a2
- a0 = p0 - p7
- a1 = p1 - p6
- a2 = p2 - p5
- a3 = p3 - p4
- b4 = a1 + a2 + ((a0 >> 1) + a0)
- b5 = a0 - a3 - ((a2 >> 1) + a2)
- b6 = a0 + a3 - ((a1 >> 1) + a1)
- b7 = a1 - a2 + ((a3 >> 1) + a3)
- result[0 * 8 + i] = b0 + b1
- result[1 * 8 + i] = b4 + (b7 >> 2)
- result[2 * 8 + i] = b2 + (b3 >> 1)
- result[3 * 8 + i] = b5 + (b6 >> 2)
- result[4 * 8 + i] = b0 - b1
- result[5 * 8 + i] = b6 - (b5 >> 2)
- result[6 * 8 + i] = (b2 >> 1) - b3
- result[7 * 8 + i] = (b4 >> 2) - b7
- return result
- def IDCT8x8(data):
- tmp = np.zeros((64,), dtype=np.int32)
- result = np.zeros((64,), dtype=np.int32)
- for i in range(8):
- p0 = data[i * 8 + 0]
- p1 = data[i * 8 + 1]
- p2 = data[i * 8 + 2]
- p3 = data[i * 8 + 3]
- p4 = data[i * 8 + 4]
- p5 = data[i * 8 + 5]
- p6 = data[i * 8 + 6]
- p7 = data[i * 8 + 7]
- a0 = p0 + p4
- a1 = p0 - p4
- a2 = p6 - (p2 >> 1)
- a3 = p2 + (p6 >> 1)
- b0 = a0 + a3
- b2 = a1 - a2
- b4 = a1 + a2
- b6 = a0 - a3
- a0 = -p3 + p5 - p7 - (p7 >> 1)
- a1 = p1 + p7 - p3 - (p3 >> 1)
- a2 = -p1 + p7 + p5 + (p5 >> 1)
- a3 = p3 + p5 + p1 + (p1 >> 1)
- b1 = a0 + (a3 >> 2)
- b3 = a1 + (a2 >> 2)
- b5 = a2 - (a1 >> 2)
- b7 = a3 - (a0 >> 2)
- tmp[i * 8 + 0] = b0 + b7
- tmp[i * 8 + 1] = b2 - b5
- tmp[i * 8 + 2] = b4 + b3
- tmp[i * 8 + 3] = b6 + b1
- tmp[i * 8 + 4] = b6 - b1
- tmp[i * 8 + 5] = b4 - b3
- tmp[i * 8 + 6] = b2 + b5
- tmp[i * 8 + 7] = b0 - b7
- for i in range(8):
- p0 = tmp[0 * 8 + i]
- p1 = tmp[1 * 8 + i]
- p2 = tmp[2 * 8 + i]
- p3 = tmp[3 * 8 + i]
- p4 = tmp[4 * 8 + i]
- p5 = tmp[5 * 8 + i]
- p6 = tmp[6 * 8 + i]
- p7 = tmp[7 * 8 + i]
- a0 = p0 + p4
- a1 = p0 - p4
- a2 = p6 - (p2 >> 1)
- a3 = p2 + (p6 >> 1)
- b0 = a0 + a3
- b2 = a1 - a2
- b4 = a1 + a2
- b6 = a0 - a3
- a0 = -p3 + p5 - p7 - (p7 >> 1)
- a1 = p1 + p7 - p3 - (p3 >> 1)
- a2 = -p1 + p7 + p5 + (p5 >> 1)
- a3 = p3 + p5 + p1 + (p1 >> 1)
- b1 = a0 + (a3 >> 2)
- b7 = a3 - (a0 >> 2)
- b3 = a1 + (a2 >> 2)
- b5 = a2 - (a1 >> 2)
- result[0 * 8 + i] = ((b0 + b7) >> 6)
- result[1 * 8 + i] = ((b2 - b5) >> 6)
- result[2 * 8 + i] = ((b4 + b3) >> 6)
- result[3 * 8 + i] = ((b6 + b1) >> 6)
- result[4 * 8 + i] = ((b6 - b1) >> 6)
- result[5 * 8 + i] = ((b4 - b3) >> 6)
- result[6 * 8 + i] = ((b2 + b5) >> 6)
- result[7 * 8 + i] = ((b0 - b7) >> 6)
- result = result.clip(0,255)
- return result
Add Comment
Please, Sign In to add comment