package com.twilight.h264.decoder; public class Rectangle { // Assume 1 vp is 1 uint_8 = 1 int, which infact represents 1 byte of data in C++ public static void fill_rectangle_unsign(int[] vp, int vp_offset, int w, int h, int stride, int val, int size){ int p_offset = vp_offset; w = w * size; stride *= size; if(w == 2) { int v1; int v2; if(size == 4) { v1 = val & 0x0ff; v2 = (val >> 8) & 0x0ff; } else { v1 = val & 0x0ff; v2 = v1; } // if vp[p_offset + 0*stride]= v1; vp[p_offset + 0*stride + 1]= v2; if(h==1) return; vp[p_offset + 1*stride]= v1; vp[p_offset + 1*stride + 1]= v2; if(h==2) return; vp[p_offset + 2*stride]= v1; vp[p_offset + 2*stride + 1]= v2; vp[p_offset + 3*stride]= v1; vp[p_offset + 3*stride + 1]= v2; } else if(w==4) { int v1; int v2; int v3; int v4 ; if(size == 4) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } else if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val & 0x0ff; v2 = v1; v3 = v1; v4 = v1; } vp[p_offset + 0*stride] = v1; vp[p_offset + 0*stride + 1] = v2; vp[p_offset + 0*stride + 2] = v3; vp[p_offset + 0*stride + 3] = v4; if(h==1) return; vp[p_offset + 1*stride] = v1; vp[p_offset + 1*stride + 1] = v2; vp[p_offset + 1*stride + 2] = v3; vp[p_offset + 1*stride + 3] = v4; if(h==2) return; vp[p_offset + 2*stride] = v1; vp[p_offset + 2*stride + 1] = v2; vp[p_offset + 2*stride + 2] = v3; vp[p_offset + 2*stride + 3] = v4; vp[p_offset + 3*stride] = v1; vp[p_offset + 3*stride + 1] = v2; vp[p_offset + 3*stride + 2] = v3; vp[p_offset + 3*stride + 3] = v4; } else if(w==8) { int v1; int v2; int v3; int v4; if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } // if vp[p_offset + 0*stride] = v1; vp[p_offset + 0*stride + 1] = v2; vp[p_offset + 0*stride + 2] = v3; vp[p_offset + 0*stride + 3] = v4; vp[p_offset + 0*stride +4] = v1; vp[p_offset + 0*stride +4 + 1] = v2; vp[p_offset + 0*stride +4 + 2] = v3; vp[p_offset + 0*stride +4 + 3] = v4; if(h==1) return; vp[p_offset + 1*stride] = v1; vp[p_offset + 1*stride + 1] = v2; vp[p_offset + 1*stride + 2] = v3; vp[p_offset + 1*stride + 3] = v4; vp[p_offset + 1*stride +4] = v1; vp[p_offset + 1*stride +4 + 1] = v2; vp[p_offset + 1*stride +4 + 2] = v3; vp[p_offset + 1*stride +4 + 3] = v4; if(h==2) return; vp[p_offset + 2*stride] = v1; vp[p_offset + 2*stride + 1] = v2; vp[p_offset + 2*stride + 2] = v3; vp[p_offset + 2*stride + 3] = v4; vp[p_offset + 2*stride +4] = v1; vp[p_offset + 2*stride +4 + 1] = v2; vp[p_offset + 2*stride +4 + 2] = v3; vp[p_offset + 2*stride +4 + 3] = v4; vp[p_offset + 3*stride] = v1; vp[p_offset + 3*stride + 1] = v2; vp[p_offset + 3*stride + 2] = v3; vp[p_offset + 3*stride + 3] = v4; vp[p_offset + 3*stride +4] = v1; vp[p_offset + 3*stride +4 + 1] = v2; vp[p_offset + 3*stride +4 + 2] = v3; vp[p_offset + 3*stride +4 + 3] = v4; } else if(w==16) { int v1 = val & 0x0ff; int v2 = (val & 0x0ff00) >>> 8; int v3 = (val & 0x0ff0000) >>> 16; int v4 = (val & 0xff000000) >>> 24; for(int i=0;i<4;i++) { vp[p_offset + i*4 + 0*stride] = v1; vp[p_offset + i*4 + 0*stride + 1] = v2; vp[p_offset + i*4 + 0*stride + 2] = v3; vp[p_offset + i*4 + 0*stride + 3] = v4; vp[p_offset + i*4 + 1*stride] = v1; vp[p_offset + i*4 + 1*stride + 1] = v2; vp[p_offset + i*4 + 1*stride + 2] = v3; vp[p_offset + i*4 + 1*stride + 3] = v4; } // for if(h==2) return; for(int i=0;i<4;i++) { vp[p_offset + i*4 + 2*stride] = v1; vp[p_offset + i*4 + 2*stride + 1] = v2; vp[p_offset + i*4 + 2*stride + 2] = v3; vp[p_offset + i*4 + 2*stride + 3] = v4; vp[p_offset + i*4 + 3*stride] = v1; vp[p_offset + i*4 + 3*stride + 1] = v2; vp[p_offset + i*4 + 3*stride + 2] = v3; vp[p_offset + i*4 + 3*stride + 3] = v4; } // for } // if } // Assume 1 vp is 1 int_8 = 1 int, which infact represents 1 byte of data in C++ public static void fill_rectangle_sign(int[] vp, int vp_offset, int w, int h, int stride, int val, int size){ int p_offset = vp_offset; w = w * size; stride *= size; if(w == 2) { int v1; int v2; if(size == 4) { v1 = val & 0x0ff; v2 = (val >> 8) & 0x0ff; } else { v1 = val; v2 = v1; } // if vp[p_offset + 0*stride]= v1; vp[p_offset + 0*stride + 1]= v2; if(h==1) return; vp[p_offset + 1*stride]= v1; vp[p_offset + 1*stride + 1]= v2; if(h==2) return; vp[p_offset + 2*stride]= v1; vp[p_offset + 2*stride + 1]= v2; vp[p_offset + 3*stride]= v1; vp[p_offset + 3*stride + 1]= v2; } else if(w==4) { int v1; int v2; int v3; int v4 ; if(size == 4) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } else if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val; v2 = v1; v3 = v1; v4 = v1; } vp[p_offset + 0*stride] = v1; vp[p_offset + 0*stride + 1] = v2; vp[p_offset + 0*stride + 2] = v3; vp[p_offset + 0*stride + 3] = v4; if(h==1) return; vp[p_offset + 1*stride] = v1; vp[p_offset + 1*stride + 1] = v2; vp[p_offset + 1*stride + 2] = v3; vp[p_offset + 1*stride + 3] = v4; if(h==2) return; vp[p_offset + 2*stride] = v1; vp[p_offset + 2*stride + 1] = v2; vp[p_offset + 2*stride + 2] = v3; vp[p_offset + 2*stride + 3] = v4; vp[p_offset + 3*stride] = v1; vp[p_offset + 3*stride + 1] = v2; vp[p_offset + 3*stride + 2] = v3; vp[p_offset + 3*stride + 3] = v4; } else if(w==8) { int v1; int v2; int v3; int v4; if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } // if vp[p_offset + 0*stride] = v1; vp[p_offset + 0*stride + 1] = v2; vp[p_offset + 0*stride + 2] = v3; vp[p_offset + 0*stride + 3] = v4; vp[p_offset + 0*stride +4] = v1; vp[p_offset + 0*stride +4 + 1] = v2; vp[p_offset + 0*stride +4 + 2] = v3; vp[p_offset + 0*stride +4 + 3] = v4; if(h==1) return; vp[p_offset + 1*stride] = v1; vp[p_offset + 1*stride + 1] = v2; vp[p_offset + 1*stride + 2] = v3; vp[p_offset + 1*stride + 3] = v4; vp[p_offset + 1*stride +4] = v1; vp[p_offset + 1*stride +4 + 1] = v2; vp[p_offset + 1*stride +4 + 2] = v3; vp[p_offset + 1*stride +4 + 3] = v4; if(h==2) return; vp[p_offset + 2*stride] = v1; vp[p_offset + 2*stride + 1] = v2; vp[p_offset + 2*stride + 2] = v3; vp[p_offset + 2*stride + 3] = v4; vp[p_offset + 2*stride +4] = v1; vp[p_offset + 2*stride +4 + 1] = v2; vp[p_offset + 2*stride +4 + 2] = v3; vp[p_offset + 2*stride +4 + 3] = v4; vp[p_offset + 3*stride] = v1; vp[p_offset + 3*stride + 1] = v2; vp[p_offset + 3*stride + 2] = v3; vp[p_offset + 3*stride + 3] = v4; vp[p_offset + 3*stride +4] = v1; vp[p_offset + 3*stride +4 + 1] = v2; vp[p_offset + 3*stride +4 + 2] = v3; vp[p_offset + 3*stride +4 + 3] = v4; } else if(w==16) { int v1 = val & 0x0ff; int v2 = (val & 0x0ff00) >>> 8; int v3 = (val & 0x0ff0000) >>> 16; int v4 = (val & 0xff000000) >>> 24; for(int i=0;i<4;i++) { vp[p_offset + i*4 + 0*stride] = v1; vp[p_offset + i*4 + 0*stride + 1] = v2; vp[p_offset + i*4 + 0*stride + 2] = v3; vp[p_offset + i*4 + 0*stride + 3] = v4; vp[p_offset + i*4 + 1*stride] = v1; vp[p_offset + i*4 + 1*stride + 1] = v2; vp[p_offset + i*4 + 1*stride + 2] = v3; vp[p_offset + i*4 + 1*stride + 3] = v4; } // for if(h==2) return; for(int i=0;i<4;i++) { vp[p_offset + i*4 + 2*stride] = v1; vp[p_offset + i*4 + 2*stride + 1] = v2; vp[p_offset + i*4 + 2*stride + 2] = v3; vp[p_offset + i*4 + 2*stride + 3] = v4; vp[p_offset + i*4 + 3*stride] = v1; vp[p_offset + i*4 + 3*stride + 1] = v2; vp[p_offset + i*4 + 3*stride + 2] = v3; vp[p_offset + i*4 + 3*stride + 3] = v4; } // for } // if } // For use with (*mv_cache) [][2] (int16_t) -- Note that it is considered to be signed. public static void fill_rectangle_mv_cache(int[][/*2*/] vp, int vp_offset, int w, int h, int stride, int val, int size){ int p_offset = vp_offset; w = w * size; stride *= size; if(w == 2) { int val16; if(size == 4) { val16 = (short)(val); } else { val16 = (short)((val & 0x0ff << 8) | (val & 0x0ff)); } // if vp[p_offset + 0*stride/4][0]= val16; if(h==1) return; vp[p_offset + 1*stride/4][0]= val16; if(h==2) return; vp[p_offset + 2*stride/4][0]= val16; } else if(w==4) { int v1; int v2; if(size == 4) { v1 = (short)(val & 0x0ffff); v2 = (short)((val & 0xffff0000) >>> 16); } else if(size == 2) { v1 = (short)(val & 0x0ffff); v2 = v1; } else { v1 = (short)((val & 0x0ff << 8) | (val & 0x0ff)); v2 = (short)(v1); } vp[p_offset + 0*stride/4][0] = v1; vp[p_offset + 0*stride/4][1] = v2; if(h==1) return; vp[p_offset + 1*stride/4][0] = v1; vp[p_offset + 1*stride/4][1] = v2; if(h==2) return; vp[p_offset + 2*stride/4][0] = v1; vp[p_offset + 2*stride/4][1] = v2; vp[p_offset + 3*stride/4][0] = v1; vp[p_offset + 3*stride/4][1] = v2; } else if(w==8) { int v1; int v2; if(size == 2) { v1 = (short)(val & 0x0ffff); v2 = v1; } else { v1 = (short)(val & 0x0ffff); v2 = (short)((val & 0xffff0000) >>> 16); } // if vp[p_offset + 0*stride/4][0] = v1; vp[p_offset + 0*stride/4][1] = v2; vp[p_offset + 0*stride/4 +1][0] = v1; vp[p_offset + 0*stride/4 +1][1] = v2; if(h==1) return; vp[p_offset + 1*stride/4][0] = v1; vp[p_offset + 1*stride/4][1] = v2; vp[p_offset + 1*stride/4 +1][0] = v1; vp[p_offset + 1*stride/4 +1][1] = v2; if(h==2) return; vp[p_offset + 2*stride/4][0] = v1; vp[p_offset + 2*stride/4][1] = v2; vp[p_offset + 2*stride/4 +1][0] = v1; vp[p_offset + 2*stride/4 +1][1] = v2; vp[p_offset + 3*stride/4][0] = v1; vp[p_offset + 3*stride/4][1] = v2; vp[p_offset + 3*stride/4 +1][0] = v1; vp[p_offset + 3*stride/4 +1][1] = v2; } else if(w==16) { int v1 = (short)(val & 0x0ffff); int v2 = (short)((val & 0xffff0000) >>> 16); for(int i=0;i<4;i++) { vp[p_offset + i + 0*stride/4][0] = v1; vp[p_offset + i + 0*stride/4][1] = v2; vp[p_offset + i + 1*stride/4][0] = v1; vp[p_offset + i + 1*stride/4][1] = v2; } // for if(h==2) return; for(int i=0;i<4;i++) { vp[p_offset + i + 2*stride/4][0] = v1; vp[p_offset + i + 2*stride/4][1] = v2; vp[p_offset + i + 3*stride/4][0] = v1; vp[p_offset + i + 3*stride/4][1] = v2; } // for } // if } // For use with (*mvd_cache) [][2] (uint8_t) -- Should it be signed? public static void fill_rectangle_mvd_cache(int[][/*2*/] vp, int vp_offset, int w, int h, int stride, int val, int size){ int p_offset = vp_offset; w = w * size; stride *= size; if(w == 2) { int v1; int v2; if(size == 4) { v1 = val & 0x0ff; v2 = (val >> 8) & 0x0ff; } else { v1 = val & 0x0ff; v2 = v1; } // if vp[p_offset + 0*stride/2][0]= v1; vp[p_offset + 0*stride/2][1]= v2; if(h==1) return; vp[p_offset + 1*stride/2][0]= v1; vp[p_offset + 1*stride/2][1]= v2; if(h==2) return; vp[p_offset + 2*stride/2][0]= v1; vp[p_offset + 2*stride/2][1]= v2; vp[p_offset + 3*stride/2][0]= v1; vp[p_offset + 3*stride/2][1]= v2; } else if(w==4) { int v1; int v2; int v3; int v4 ; if(size == 4) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } else if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val & 0x0ff; v2 = v1; v3 = v1; v4 = v1; } vp[p_offset + 0*stride/2][0] = v1; vp[p_offset + 0*stride/2][1] = v2; vp[p_offset + 0*stride/2 + 1][0] = v3; vp[p_offset + 0*stride/2 + 1][1] = v4; if(h==1) return; vp[p_offset + 1*stride/2][0] = v1; vp[p_offset + 1*stride/2][1] = v2; vp[p_offset + 1*stride/2 + 1][0] = v3; vp[p_offset + 1*stride/2 + 1][1] = v4; if(h==2) return; vp[p_offset + 2*stride/2][0] = v1; vp[p_offset + 2*stride/2][1] = v2; vp[p_offset + 2*stride/2 + 1][0] = v3; vp[p_offset + 2*stride/2 + 1][1] = v4; vp[p_offset + 3*stride/2][0] = v1; vp[p_offset + 3*stride/2][1] = v2; vp[p_offset + 3*stride/2 + 1][0] = v3; vp[p_offset + 3*stride/2 + 1][1] = v4; } else if(w==8) { int v1; int v2; int v3; int v4; if(size == 2) { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = v1; v4 = v2; } else { v1 = val & 0x0ff; v2 = (val & 0x0ff00) >>> 8; v3 = (val & 0x0ff0000) >>> 16; v4 = (val & 0xff000000) >>> 24; } // if vp[p_offset + 0*stride/2][0] = v1; vp[p_offset + 0*stride/2][1] = v2; vp[p_offset + 0*stride/2 + 1][0] = v3; vp[p_offset + 0*stride/2 + 1][1] = v4; vp[p_offset + 0*stride/2 + 2][0] = v1; vp[p_offset + 0*stride/2 + 2][1] = v2; vp[p_offset + 0*stride/2 + 3][0] = v3; vp[p_offset + 0*stride/2 + 3][1] = v4; if(h==1) return; vp[p_offset + 1*stride/2][0] = v1; vp[p_offset + 1*stride/2][1] = v2; vp[p_offset + 1*stride/2 + 1][0] = v3; vp[p_offset + 1*stride/2 + 1][1] = v4; vp[p_offset + 1*stride/2 + 2][0] = v1; vp[p_offset + 1*stride/2 + 2][1] = v2; vp[p_offset + 1*stride/2 + 3][0] = v3; vp[p_offset + 1*stride/2 + 3][1] = v4; if(h==2) return; vp[p_offset + 2*stride/2][0] = v1; vp[p_offset + 2*stride/2][1] = v2; vp[p_offset + 2*stride/2 + 1][0] = v3; vp[p_offset + 2*stride/2 + 1][1] = v4; vp[p_offset + 2*stride/2 + 2][0] = v1; vp[p_offset + 2*stride/2 + 2][1] = v2; vp[p_offset + 2*stride/2 + 3][0] = v3; vp[p_offset + 2*stride/2 + 3][1] = v4; vp[p_offset + 3*stride/2][0] = v1; vp[p_offset + 3*stride/2][1] = v2; vp[p_offset + 3*stride/2 + 1][0] = v3; vp[p_offset + 3*stride/2 + 1][1] = v4; vp[p_offset + 3*stride/2 + 2][0] = v1; vp[p_offset + 3*stride/2 + 2][1] = v2; vp[p_offset + 3*stride/2 + 3][0] = v3; vp[p_offset + 3*stride/2 + 3][1] = v4; } else if(w==16) { int v1 = val & 0x0ff; int v2 = (val & 0x0ff00) >>> 8; int v3 = (val & 0x0ff0000) >>> 16; int v4 = (val & 0xff000000) >>> 24; for(int i=0;i<4;i++) { vp[p_offset + i*2 + 0*stride/2][0] = v1; vp[p_offset + i*2 + 0*stride/2][1] = v2; vp[p_offset + i*2 + 0*stride/2 + 1][0] = v3; vp[p_offset + i*2 + 0*stride/2 + 1][1] = v4; vp[p_offset + i*2 + 1*stride/2][0] = v1; vp[p_offset + i*2 + 1*stride/2][1] = v2; vp[p_offset + i*2 + 1*stride/2 + 1][0] = v3; vp[p_offset + i*2 + 1*stride/2 + 1][1] = v4; } // for if(h==2) return; for(int i=0;i<4;i++) { vp[p_offset + i*2 + 2*stride/2][0] = v1; vp[p_offset + i*2 + 2*stride/2][1] = v2; vp[p_offset + i*2 + 2*stride/2 + 1][0] = v3; vp[p_offset + i*2 + 2*stride/2 + 1][1] = v4; vp[p_offset + i*2 + 3*stride/2][0] = v1; vp[p_offset + i*2 + 3*stride/2][1] = v2; vp[p_offset + i*2 + 3*stride/2 + 1][0] = v3; vp[p_offset + i*2 + 3*stride/2 + 1][1] = v4; } // for } // if } }