package com.twilight.h264.decoder;
import com.twilight.h264.util.*;
public class DSPContext {
public static final int FF_NO_IDCT_PERM = 1;
/**
* idct input permutation.
* several optimized IDCTs need a permutated input (relative to the normal order of the reference
* IDCT)
* this permutation must be performed before the idct_put/add, note, normally this can be merged
* with the zigzag/alternate scan<br>
* an example to avoid confusion:
* - (->decode coeffs -> zigzag reorder -> dequant -> reference idct ->...)
* - (x -> referece dct -> reference idct -> x)
* - (x -> referece dct -> simple_mmx_perm = idct_permutation -> simple_idct_mmx -> x)
* - (->decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant -> simple_idct_mmx ->...)
*/
/*uint8_t*/ public int[] idct_permutation = new int[64];
public int idct_permutation_type;
public static Ih264_qpel_mc_func[][] put_h264_qpel_pixels_tab = new Ih264_qpel_mc_func[4][16];
public static Ih264_qpel_mc_func[][] avg_h264_qpel_pixels_tab = new Ih264_qpel_mc_func[4][16];
/* draw the edges of width 'w' of an image of size width, height */
//FIXME check that this is ok for mpeg4 interlaced
public void draw_edges(/*uint8_t *buf,*/int[] buf_base, int buf_offset, int wrap, int width, int height, int w)
{
//uint8_t *ptr, *last_line;
int[] ptr_base;
int[] last_line_base;
int ptr_offset;
int last_line_offset;
int i;
last_line_base = buf_base;
last_line_offset = buf_offset + (height - 1) * wrap;
for(i=0;i<w;i++) {
/* top and bottom */
System.arraycopy(buf_base, buf_offset, buf_base, buf_offset - (i + 1) * wrap, width);
//memcpy(buf - (i + 1) * wrap, buf, width);
System.arraycopy(last_line_base, last_line_offset, last_line_base, last_line_offset + (i + 1) * wrap, width);
//memcpy(last_line + (i + 1) * wrap, last_line, width);
}
/* left and right */
ptr_base = buf_base;
ptr_offset = buf_offset;
for(i=0;i<height;i++) {
Arrays.fill(ptr_base, ptr_offset -w, ptr_offset -w +w, ptr_base[ptr_offset]);
//memset(ptr - w, ptr[0], w);
Arrays.fill(ptr_base, ptr_offset +width, ptr_offset +width +w, ptr_base[ptr_offset + width-1]);
//memset(ptr + width, ptr[width-1], w);
ptr_offset += wrap;
}
/* corners */
for(i=0;i<w;i++) {
Arrays.fill(buf_base, buf_offset - (i + 1) * wrap - w, buf_offset - (i + 1) * wrap - w +w, buf_base[buf_offset]);
//memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
Arrays.fill(buf_base, buf_offset - (i + 1) * wrap + width, buf_offset - (i + 1) * wrap + width +w, buf_base[buf_offset + width-1]);
//memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
Arrays.fill(last_line_base, last_line_offset + (i + 1) * wrap - w, last_line_offset + (i + 1) * wrap - w +w, last_line_base[last_line_offset]);
//memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
Arrays.fill(last_line_base, last_line_offset + (i + 1) * wrap + width, last_line_offset + (i + 1) * wrap + width +w, last_line_base[last_line_offset + width-1]);
//memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
}
}
/**
* Copy a rectangular area of samples to a temporary buffer and replicate the border samples.
* @param buf destination buffer
* @param src source buffer
* @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
* @param block_w width of block
* @param block_h height of block
* @param src_x x coordinate of the top left sample of the block in the source buffer
* @param src_y y coordinate of the top left sample of the block in the source buffer
* @param w width of the source buffer
* @param h height of the source buffer
*/
//void ff_emulated_edge_mc(uint8_t *buf, const uint8_t *src, int linesize, int block_w, int block_h,
// int src_x, int src_y, int w, int h){
public void ff_emulated_edge_mc(int[] buf_base, int buf_offset, int[] src_base, int src_offset, int linesize, int block_w, int block_h,
int src_x, int src_y, int w, int h){
int x, y;
int start_y, start_x, end_y, end_x;
if(src_y>= h){
src_offset += (h-1-src_y)*linesize;
src_y=h-1;
}else if(src_y<=-block_h){
src_offset += (1-block_h-src_y)*linesize;
src_y=1-block_h;
}
if(src_x>= w){
src_offset += (w-1-src_x);
src_x=w-1;
}else if(src_x<=-block_w){
src_offset += (1-block_w-src_x);
src_x=1-block_w;
}
start_y= Math.max(0, -src_y);
start_x= Math.max(0, -src_x);
end_y= Math.min(block_h, h-src_y);
end_x= Math.min(block_w, w-src_x);
// DebugTool.printDebugString("start_x="+start_x+", start_y="+start_y+", end_x="+end_x+", end_y="+end_y+"\n");
// copy existing part
for(y=start_y; y<end_y; y++){
for(x=start_x; x<end_x; x++){
buf_base[buf_offset + x + y*linesize]= src_base[src_offset + x + y*linesize];
}
}
//top
for(y=0; y<start_y; y++){
for(x=start_x; x<end_x; x++){
buf_base[buf_offset + x + y*linesize]= buf_base[buf_offset + x + start_y*linesize];
}
}
//bottom
for(y=end_y; y<block_h; y++){
for(x=start_x; x<end_x; x++){
buf_base[buf_offset + x + y*linesize]= buf_base[buf_offset + x + (end_y-1)*linesize];
}
}
for(y=0; y<block_h; y++){
//left
for(x=0; x<start_x; x++){
buf_base[buf_offset + x + y*linesize]= buf_base[buf_offset + start_x + y*linesize];
}
//right
for(x=end_x; x<block_w; x++){
buf_base[buf_offset + x + y*linesize]= buf_base[buf_offset + end_x - 1 + y*linesize];
}
}
}
// public void add_pixels8(uint8_t *restrict pixels, DCTELEM *block, int line_size)
public void add_pixels8(int[] pixels, int pixel_offset, short[] block, int block_offset, int line_size)
{
int i;
for(i=0;i<8;i++) {
pixels[pixel_offset + 0] += block[block_offset + 0];
pixels[pixel_offset + 1] += block[block_offset + 1];
pixels[pixel_offset + 2] += block[block_offset + 2];
pixels[pixel_offset + 3] += block[block_offset + 3];
pixels[pixel_offset + 4] += block[block_offset + 4];
pixels[pixel_offset + 5] += block[block_offset + 5];
pixels[pixel_offset + 6] += block[block_offset + 6];
pixels[pixel_offset + 7] += block[block_offset + 7];
pixel_offset += line_size;
block_offset += 8;
}
}
// public static void add_pixels4(uint8_t *restrict pixels, DCTELEM *block, int line_size)
public void add_pixels4(int[] pixels, int pixel_offset, short[] block, int block_offset, int line_size)
{
int i;
for(i=0;i<4;i++) {
pixels[pixel_offset + 0] += block[block_offset + 0];
pixels[pixel_offset + 1] += block[block_offset + 1];
pixels[pixel_offset + 2] += block[block_offset + 2];
pixels[pixel_offset + 3] += block[block_offset + 3];
pixel_offset += line_size;
block_offset += 4;
}
}
public void clear_block(short[] block)
{
Arrays.fill(block,0,64,(short)0);
//memset(block, 0, sizeof(DCTELEM)*64);
}
/**
* memset(blocks, 0, sizeof(DCTELEM)*6*64)
*/
public void clear_blocks(short[][]blocks, int first_block_index)
{
for(int i=0;i<6;i++)
Arrays.fill(blocks[first_block_index],0,64,(short)0);
//memset(blocks, 0, sizeof(DCTELEM)*6*64);
}
public void clear_blocks(short[] blocks)
{
Arrays.fill(blocks,0,6*64,(short)0);
//memset(blocks, 0, sizeof(DCTELEM)*6*64);
}
/**
* h264 Qpel MC
*/
public interface Ih264_qpel_mc_func {
//public void h264_qpel_mc_func(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride);
public void h264_qpel_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int stride);
}
/**
* h264 Chroma MC
*/
public interface Ih264_chroma_mc_func {
//public void h264_chroma_mc_func(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x, int y);
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y);
}
private static int OP_AVG(int a, int b) { return (((a)+(((b) + 32)>>6)+1)>>1); }
private static int OP_PUT(int a, int b) { return (((b) + 32)>>6); }
// static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
public void put_h264_chroma_mc2_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
// static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
public void put_h264_chroma_mc4_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_base[dst_offset + 2] = OP_PUT(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + B*src_base[src_offset + 3] + C*src_base[src_offset + stride+2] + D*src_base[src_offset + stride+3]));
dst_base[dst_offset + 3] = OP_PUT(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + B*src_base[src_offset + 4] + C*src_base[src_offset + stride+3] + D*src_base[src_offset + stride+4]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_base[dst_offset + 2] = OP_PUT(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + E*src_base[src_offset + step+2]));
dst_base[dst_offset + 3] = OP_PUT(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + E*src_base[src_offset + step+3]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
// public void put_h264_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
public void put_h264_chroma_mc8_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);\
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_base[dst_offset + 2] = OP_PUT(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + B*src_base[src_offset + 3] + C*src_base[src_offset + stride+2] + D*src_base[src_offset + stride+3]));
dst_base[dst_offset + 3] = OP_PUT(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + B*src_base[src_offset + 4] + C*src_base[src_offset + stride+3] + D*src_base[src_offset + stride+4]));
dst_base[dst_offset + 4] = OP_PUT(dst_base[dst_offset + 4], (A*src_base[src_offset + 4] + B*src_base[src_offset + 5] + C*src_base[src_offset + stride+4] + D*src_base[src_offset + stride+5]));
dst_base[dst_offset + 5] = OP_PUT(dst_base[dst_offset + 5], (A*src_base[src_offset + 5] + B*src_base[src_offset + 6] + C*src_base[src_offset + stride+5] + D*src_base[src_offset + stride+6]));
dst_base[dst_offset + 6] = OP_PUT(dst_base[dst_offset + 6], (A*src_base[src_offset + 6] + B*src_base[src_offset + 7] + C*src_base[src_offset + stride+6] + D*src_base[src_offset + stride+7]));
dst_base[dst_offset + 7] = OP_PUT(dst_base[dst_offset + 7], (A*src_base[src_offset + 7] + B*src_base[src_offset + 8] + C*src_base[src_offset + stride+7] + D*src_base[src_offset + stride+8]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_PUT(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_PUT(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_base[dst_offset + 2] = OP_PUT(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + E*src_base[src_offset + step+2]));
dst_base[dst_offset + 3] = OP_PUT(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + E*src_base[src_offset + step+3]));
dst_base[dst_offset + 4] = OP_PUT(dst_base[dst_offset + 4], (A*src_base[src_offset + 4] + E*src_base[src_offset + step+4]));
dst_base[dst_offset + 5] = OP_PUT(dst_base[dst_offset + 5], (A*src_base[src_offset + 5] + E*src_base[src_offset + step+5]));
dst_base[dst_offset + 6] = OP_PUT(dst_base[dst_offset + 6], (A*src_base[src_offset + 6] + E*src_base[src_offset + step+6]));
dst_base[dst_offset + 7] = OP_PUT(dst_base[dst_offset + 7], (A*src_base[src_offset + 7] + E*src_base[src_offset + step+7]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
// static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
public void avg_h264_chroma_mc2_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
// static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
public void avg_h264_chroma_mc4_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_base[dst_offset + 2] = OP_AVG(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + B*src_base[src_offset + 3] + C*src_base[src_offset + stride+2] + D*src_base[src_offset + stride+3]));
dst_base[dst_offset + 3] = OP_AVG(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + B*src_base[src_offset + 4] + C*src_base[src_offset + stride+3] + D*src_base[src_offset + stride+4]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_base[dst_offset + 2] = OP_AVG(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + E*src_base[src_offset + step+2]));
dst_base[dst_offset + 3] = OP_AVG(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + E*src_base[src_offset + step+3]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
// public void put_h264_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
public void avg_h264_chroma_mc8_c(int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y){
int A=(8-x)*(8-y);
int B=( x)*(8-y);
int C=(8-x)*( y);
int D=( x)*( y);
int i;
////assert(x<8 && y<8 && x>=0 && y>=0);\
if(D!=0){
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + B*src_base[src_offset + 1] + C*src_base[src_offset + stride+0] + D*src_base[src_offset + stride+1]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + B*src_base[src_offset + 2] + C*src_base[src_offset + stride+1] + D*src_base[src_offset + stride+2]));
dst_base[dst_offset + 2] = OP_AVG(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + B*src_base[src_offset + 3] + C*src_base[src_offset + stride+2] + D*src_base[src_offset + stride+3]));
dst_base[dst_offset + 3] = OP_AVG(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + B*src_base[src_offset + 4] + C*src_base[src_offset + stride+3] + D*src_base[src_offset + stride+4]));
dst_base[dst_offset + 4] = OP_AVG(dst_base[dst_offset + 4], (A*src_base[src_offset + 4] + B*src_base[src_offset + 5] + C*src_base[src_offset + stride+4] + D*src_base[src_offset + stride+5]));
dst_base[dst_offset + 5] = OP_AVG(dst_base[dst_offset + 5], (A*src_base[src_offset + 5] + B*src_base[src_offset + 6] + C*src_base[src_offset + stride+5] + D*src_base[src_offset + stride+6]));
dst_base[dst_offset + 6] = OP_AVG(dst_base[dst_offset + 6], (A*src_base[src_offset + 6] + B*src_base[src_offset + 7] + C*src_base[src_offset + stride+6] + D*src_base[src_offset + stride+7]));
dst_base[dst_offset + 7] = OP_AVG(dst_base[dst_offset + 7], (A*src_base[src_offset + 7] + B*src_base[src_offset + 8] + C*src_base[src_offset + stride+7] + D*src_base[src_offset + stride+8]));
dst_offset+= stride;
src_offset+= stride;
}
}else{
int E= B+C;
int step= (C!=0 ? stride : 1);
for(i=0; i<h; i++){
dst_base[dst_offset + 0] = OP_AVG(dst_base[dst_offset + 0], (A*src_base[src_offset + 0] + E*src_base[src_offset + step+0]));
dst_base[dst_offset + 1] = OP_AVG(dst_base[dst_offset + 1], (A*src_base[src_offset + 1] + E*src_base[src_offset + step+1]));
dst_base[dst_offset + 2] = OP_AVG(dst_base[dst_offset + 2], (A*src_base[src_offset + 2] + E*src_base[src_offset + step+2]));
dst_base[dst_offset + 3] = OP_AVG(dst_base[dst_offset + 3], (A*src_base[src_offset + 3] + E*src_base[src_offset + step+3]));
dst_base[dst_offset + 4] = OP_AVG(dst_base[dst_offset + 4], (A*src_base[src_offset + 4] + E*src_base[src_offset + step+4]));
dst_base[dst_offset + 5] = OP_AVG(dst_base[dst_offset + 5], (A*src_base[src_offset + 5] + E*src_base[src_offset + step+5]));
dst_base[dst_offset + 6] = OP_AVG(dst_base[dst_offset + 6], (A*src_base[src_offset + 6] + E*src_base[src_offset + step+6]));
dst_base[dst_offset + 7] = OP_AVG(dst_base[dst_offset + 7], (A*src_base[src_offset + 7] + E*src_base[src_offset + step+7]));
dst_offset+= stride;
src_offset+= stride;
}
}
}
public static void copy_block(int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int dstStride, int srcStride, int h)
{
int i;
switch(size) {
case 2:
for(i=0; i<h; i++)
{
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 2);
//AV_WN16(dst , AV_RN16(src ));
dst_offset+=dstStride;
src_offset+=srcStride;
}
break;
case 4:
for(i=0; i<h; i++)
{
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 4);
//AV_WN32(dst , AV_RN32(src ));
dst_offset+=dstStride;
src_offset+=srcStride;
}
break;
case 8:
for(i=0; i<h; i++)
{
//AV_WN32(dst , AV_RN32(src ));
//AV_WN32(dst+4 , AV_RN32(src+4 ));
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 8);
dst_offset+=dstStride;
src_offset+=srcStride;
}
break;
case 16:
for(i=0; i<h; i++)
{
//AV_WN32(dst , AV_RN32(src ));
//AV_WN32(dst+4 , AV_RN32(src+4 ));
//AV_WN32(dst+8 , AV_RN32(src+8 ));
//AV_WN32(dst+12, AV_RN32(src+12));
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 16);
dst_offset+=dstStride;
src_offset+=srcStride;
}
break;
} // switch
}
public static int rnd_avg32(int a, int b) {
//return (long)( ((a | b)&0xffffffffl) - (( ((a ^ b)&0xffffffffl) & ((~((0x01)*0xffffffff01010101l)) >>> 1))) );
long aa = a&0xffffffffl;
long bb = b&0xffffffffl;
long remainder = (a^b) & 0x01010101l;
aa = aa & (~remainder);
bb = bb & (~remainder);
long ret = ( (aa + bb) >>> 1 ) + remainder;
return (int) (ret & 0xFFFFFFFFL);
}
private static int makeU32(int b1, int b2, int b3, int b4) {
b1 &= 0xFF;
b2 &= 0xFF;
b3 &= 0xFF;
b4 &= 0xFF;
return b1 | (b2 << 8) | (b3 << 16) | (b4 << 24);
}
private static int makeU32(int[] b, int b_offset) {
return makeU32(b[b_offset], b[b_offset + 1], b[b_offset + 2], b[b_offset + 3]);
}
private static int makeU16(int b1, int b2) {
b1 &= 0xFF;
b2 &= 0xFF;
return b1 | (b2 << 8);
}
private static int makeU16(int[] b, int b_offset) {
return makeU16(b[b_offset], b[b_offset + 1]);
}
private static void storeU32(int[] b, int b_offset, int u32) {
b[b_offset ] = (u32 ) & 0xFF;
b[b_offset + 1] = (u32 >> 8) & 0xFF;
b[b_offset + 2] = (u32 >> 16) & 0xFF;
b[b_offset + 3] = (u32 >> 24) & 0xFF;
}
private static void storeU16(int[] b, int b_offset, int u16) {
b[b_offset ] = (u16 ) & 0xFF;
b[b_offset + 1] = (u16 >> 8) & 0xFF;
}
public static void pixels_l2(int opcode, int size, int[] dst_base, int dst_offset
, int[] src1_base, int src1_offset,
int[] src2_base, int src2_offset,
int dst_stride,
int src_stride1, int src_stride2, int h){
int i;
if(size==8) {
for(i=0; i<h; i++){
int a,b,c;
//a= AV_RN32(&src1[i*src_stride1 ]);
//b= AV_RN32(&src2[i*src_stride2 ]);
a = makeU32(src1_base, src1_offset + i*src_stride1);
b = makeU32(src2_base, src2_offset + i*src_stride2);
c = makeU32( dst_base, dst_offset + i*dst_stride);
if(opcode==0) // PUT
c = rnd_avg32(a, b);
else // AVG
c = rnd_avg32(c, rnd_avg32(a, b));
storeU32(dst_base, dst_offset + i*dst_stride, c);
//a= AV_RN32(&src1[i*src_stride1+4]);
//b= AV_RN32(&src2[i*src_stride2+4]);
a = makeU32(src1_base, 4+ src1_offset + i*src_stride1);
b = makeU32(src2_base, 4+ src2_offset + i*src_stride2);
c = makeU32( dst_base, 4+ dst_offset + i*dst_stride);
if(opcode==0) // PUT
c = rnd_avg32(a, b);
else // AVG
c = rnd_avg32(c, rnd_avg32(a, b));
storeU32(dst_base, 4+ dst_offset + i*dst_stride, c);
} // for
} // if
else if(size==4) {
for(i=0; i<h; i++){
int a,b,c;
//a= AV_RN32(&src1[i*src_stride1 ]);
//b= AV_RN32(&src2[i*src_stride2 ]);
a = makeU32(src1_base, src1_offset + i*src_stride1);
b = makeU32(src2_base, src2_offset + i*src_stride2);
c = makeU32( dst_base, dst_offset + i*dst_stride);
if(opcode==0) // PUT
c = rnd_avg32(a, b);
else // AVG
c = rnd_avg32(c, rnd_avg32(a, b));
storeU32(dst_base, dst_offset + i*dst_stride, c);
}
} // if
else if(size==2) {
for(i=0; i<h; i++){
int a,b,c;
//a= AV_RN16(&src1[i*src_stride1 ]);
//b= AV_RN16(&src2[i*src_stride2 ]);
a = makeU16(src1_base, src1_offset + i*src_stride1);
b = makeU16(src2_base, src2_offset + i*src_stride2);
c = makeU16( dst_base, dst_offset + i*dst_stride);
if(opcode==0) // PUT
c = rnd_avg32(a, b);
else // AVG
c = rnd_avg32(c, rnd_avg32(a, b));
storeU16(dst_base, dst_offset + i*dst_stride, c);
}
} // if
else if(size==16) {
pixels_l2(opcode, 8, dst_base, dst_offset , src1_base, src1_offset , src2_base, src2_offset , dst_stride, src_stride1, src_stride2, h);
pixels_l2(opcode, 8, dst_base, dst_offset+8, src1_base, src1_offset+8, src2_base, src2_offset+8, dst_stride, src_stride1, src_stride2, h);
} // if
}
//????????????????//
// JAVA should has no problem with alignment
public static void pixels_c(int opcode,int size,int[] dst_base,int dst_offset,int[] src_base,int src_offset,int stride,int height) {
//(uint8_t *dest,const uint8_t *ref, const int stride,int height)
switch(size) {
case 2:
if(opcode == 0) { // PUT
for(int i=0;i<height;i++) {
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 2);
dst_offset += stride;
src_offset += stride;
} // for
} else { // AVG
for(int i=0;i<height;i++) {
int a = makeU16(src_base, src_offset);
int b = makeU16(dst_base, dst_offset);
b = rnd_avg32(b, a);
storeU16(dst_base, dst_offset, b);
dst_offset += stride;
src_offset += stride;
} // for
} // if
break;
case 4:
if(opcode == 0) { // PUT
for(int i=0;i<height;i++) {
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 4);
dst_offset += stride;
src_offset += stride;
} // for
} else { // AVG
for(int i=0;i<height;i++) {
int a = makeU32(src_base, src_offset);
int b = makeU32(dst_base, dst_offset);
b = rnd_avg32(b, a);
storeU32(dst_base, dst_offset, b);
dst_offset += stride;
src_offset += stride;
} // for
} // if
break;
case 8:
if(opcode == 0) { // PUT
for(int i=0;i<height;i++) {
//// DebugTool.printDebugString("Copy offset: "+(src_offset-8208)+"=>"+(dst_offset-8208)+"\n");
System.arraycopy(src_base, src_offset, dst_base, dst_offset, 8);
dst_offset += stride;
src_offset += stride;
} // for
} else { // AVG
for(int i=0;i<height;i++) {
int a = makeU32(src_base, src_offset);
int b = makeU32(dst_base, dst_offset);
b = rnd_avg32(b, a);
storeU32(dst_base, dst_offset, b);
a = makeU32(src_base, 4+ src_offset);
b = makeU32(dst_base, 4+ dst_offset);
b = rnd_avg32(b, a);
storeU32(dst_base, 4+ dst_offset, b);
dst_offset += stride;
src_offset += stride;
} // for
} // if
break;
case 16: {
pixels_c(opcode, 8, dst_base, dst_offset , src_base, src_offset , stride, height);
pixels_c(opcode, 8, dst_base, dst_offset+8, src_base, src_offset+8, stride, height);
break;
}
} // switch
}
public static int op_avg(int a, int b, int[] cm_base, int cm_offset) { return (((a)+cm_base[cm_offset + (((b) + 16)>>5)]+1)>>1); }
public static int op_put(int a, int b, int[] cm_base, int cm_offset) { return cm_base[cm_offset + (((b) + 16)>>5)]; }
public static int op_avg2(int a, int b, int[] cm_base, int cm_offset) { return (((a)+cm_base[cm_offset + (((b) + 512)>>10)]+1)>>1); }
public static int op_put2(int a, int b, int[] cm_base, int cm_offset) {
try {
return cm_base[cm_offset + (((b) + 512)>>10)];
} catch(Exception e) {
e.printStackTrace();
return 0;
} // try
}
public static void h264_qpel_h_lowpass(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int dstStride, int srcStride){
switch(size) {
case 2: {
int h=2;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
for(i=0; i<h; i++)
{
if(opcode == 0) { // PUT
dst_base[dst_offset + 0] = op_put(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_put(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]), cm_base, cm_offset);
dst_offset+=dstStride;
} else { // AVG
dst_base[dst_offset + 0] = op_avg(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_avg(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]), cm_base, cm_offset);
dst_offset+=dstStride;
} // if
src_offset+=srcStride;
}
} // case
break;
case 4: {
int h=4;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
// DebugTool.printDebugString("h264_qpel4_h_lowpass:\n");
for(i=0; i<h; i++)
{
if(opcode == 0) { // PUT
dst_base[dst_offset + 0] = op_put(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_put(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]), cm_base, cm_offset);
dst_base[dst_offset + 2] = op_put(dst_base[dst_offset + 2], (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5]), cm_base, cm_offset);
dst_base[dst_offset + 3] = op_put(dst_base[dst_offset + 3], (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6]), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0] = op_avg(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_avg(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]), cm_base, cm_offset);
dst_base[dst_offset + 2] = op_avg(dst_base[dst_offset + 2], (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5]), cm_base, cm_offset);
dst_base[dst_offset + 3] = op_avg(dst_base[dst_offset + 3], (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6]), cm_base, cm_offset);
} // if
dst_offset+=dstStride;
src_offset+=srcStride;
}
} // case
break;
case 8: {
int h=8;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
// DebugTool.printDebugString("h264_qpel8_h_lowpass:\n");
for(i=0; i<h; i++)
{
if(opcode == 0) { // PUT
dst_base[dst_offset + 0] = op_put(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3 ]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_put(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4 ]), cm_base, cm_offset);
dst_base[dst_offset + 2] = op_put(dst_base[dst_offset + 2], (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5 ]), cm_base, cm_offset);
dst_base[dst_offset + 3] = op_put(dst_base[dst_offset + 3], (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6 ]), cm_base, cm_offset);
dst_base[dst_offset + 4] = op_put(dst_base[dst_offset + 4], (src_base[src_offset + 4]+src_base[src_offset + 5])*20 - (src_base[src_offset + 3 ]+src_base[src_offset + 6])*5 + (src_base[src_offset + 2 ]+src_base[src_offset + 7 ]), cm_base, cm_offset);
dst_base[dst_offset + 5] = op_put(dst_base[dst_offset + 5], (src_base[src_offset + 5]+src_base[src_offset + 6])*20 - (src_base[src_offset + 4 ]+src_base[src_offset + 7])*5 + (src_base[src_offset + 3 ]+src_base[src_offset + 8 ]), cm_base, cm_offset);
dst_base[dst_offset + 6] = op_put(dst_base[dst_offset + 6], (src_base[src_offset + 6]+src_base[src_offset + 7])*20 - (src_base[src_offset + 5 ]+src_base[src_offset + 8])*5 + (src_base[src_offset + 4 ]+src_base[src_offset + 9 ]), cm_base, cm_offset);
dst_base[dst_offset + 7] = op_put(dst_base[dst_offset + 7], (src_base[src_offset + 7]+src_base[src_offset + 8])*20 - (src_base[src_offset + 6 ]+src_base[src_offset + 9])*5 + (src_base[src_offset + 5 ]+src_base[src_offset + 10]), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0] = op_avg(dst_base[dst_offset + 0], (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3 ]), cm_base, cm_offset);
dst_base[dst_offset + 1] = op_avg(dst_base[dst_offset + 1], (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4 ]), cm_base, cm_offset);
dst_base[dst_offset + 2] = op_avg(dst_base[dst_offset + 2], (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5 ]), cm_base, cm_offset);
dst_base[dst_offset + 3] = op_avg(dst_base[dst_offset + 3], (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6 ]), cm_base, cm_offset);
dst_base[dst_offset + 4] = op_avg(dst_base[dst_offset + 4], (src_base[src_offset + 4]+src_base[src_offset + 5])*20 - (src_base[src_offset + 3 ]+src_base[src_offset + 6])*5 + (src_base[src_offset + 2 ]+src_base[src_offset + 7 ]), cm_base, cm_offset);
dst_base[dst_offset + 5] = op_avg(dst_base[dst_offset + 5], (src_base[src_offset + 5]+src_base[src_offset + 6])*20 - (src_base[src_offset + 4 ]+src_base[src_offset + 7])*5 + (src_base[src_offset + 3 ]+src_base[src_offset + 8 ]), cm_base, cm_offset);
dst_base[dst_offset + 6] = op_avg(dst_base[dst_offset + 6], (src_base[src_offset + 6]+src_base[src_offset + 7])*20 - (src_base[src_offset + 5 ]+src_base[src_offset + 8])*5 + (src_base[src_offset + 4 ]+src_base[src_offset + 9 ]), cm_base, cm_offset);
dst_base[dst_offset + 7] = op_avg(dst_base[dst_offset + 7], (src_base[src_offset + 7]+src_base[src_offset + 8])*20 - (src_base[src_offset + 6 ]+src_base[src_offset + 9])*5 + (src_base[src_offset + 5 ]+src_base[src_offset + 10]), cm_base, cm_offset);
} // if
dst_offset+=dstStride;
src_offset+=srcStride;
}
} // case
break;
case 16: {
h264_qpel_h_lowpass(opcode, 8, dst_base, dst_offset , src_base, src_offset , dstStride, srcStride);
h264_qpel_h_lowpass(opcode, 8, dst_base, dst_offset+8, src_base, src_offset+8, dstStride, srcStride);
src_offset += 8*srcStride;
dst_offset += 8*dstStride;
h264_qpel_h_lowpass(opcode, 8, dst_base, dst_offset , src_base, src_offset , dstStride, srcStride);
h264_qpel_h_lowpass(opcode, 8, dst_base, dst_offset+8, src_base, src_offset+8, dstStride, srcStride);
} // case
break;
} // switch
}
public static void h264_qpel_v_lowpass(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int dstStride, int srcStride){
switch(size) {
case 2: {
int w=2;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
for(i=0; i<w; i++)
{
int srcB= src_base[src_offset + -2*srcStride];
int srcA= src_base[src_offset + -1*srcStride];
int src0= src_base[src_offset + 0 *srcStride];
int src1= src_base[src_offset + 1 *srcStride];
int src2= src_base[src_offset + 2 *srcStride];
int src3= src_base[src_offset + 3 *srcStride];
int src4= src_base[src_offset + 4 *srcStride];
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
} // if
dst_offset++;
src_offset++;
}
} // case
break;
case 4: {
int w=4;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
// DebugTool.printDebugString("h264_qpel4_v_lowpass:\n");
for(i=0; i<w; i++)
{
int srcB= src_base[src_offset + -2*srcStride];
int srcA= src_base[src_offset + -1*srcStride];
int src0= src_base[src_offset + 0 *srcStride];
int src1= src_base[src_offset + 1 *srcStride];
int src2= src_base[src_offset + 2 *srcStride];
int src3= src_base[src_offset + 3 *srcStride];
int src4= src_base[src_offset + 4 *srcStride];
int src5= src_base[src_offset + 5 *srcStride];
int src6= src_base[src_offset + 6 *srcStride];
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_put(dst_base[dst_offset + 2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_put(dst_base[dst_offset + 3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_avg(dst_base[dst_offset + 2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_avg(dst_base[dst_offset + 3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6), cm_base, cm_offset);
} // if
dst_offset++;
src_offset++;
}
} // case
break;
case 8: {
int w=8;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
for(i=0; i<w; i++)
{
int srcB= src_base[src_offset + -2*srcStride];
int srcA= src_base[src_offset + -1*srcStride];
int src0= src_base[src_offset + 0 *srcStride];
int src1= src_base[src_offset + 1 *srcStride];
int src2= src_base[src_offset + 2 *srcStride];
int src3= src_base[src_offset + 3 *srcStride];
int src4= src_base[src_offset + 4 *srcStride];
int src5= src_base[src_offset + 5 *srcStride];
int src6= src_base[src_offset + 6 *srcStride];
int src7= src_base[src_offset + 7 *srcStride];
int src8= src_base[src_offset + 8 *srcStride];
int src9= src_base[src_offset + 9 *srcStride];
int src10=src_base[src_offset + 10*srcStride];
// DebugTool.printDebugString("h264_qpel8_v_lowpass: src="+srcB+","+srcA+","+src0+","+src1+","+src2+","+src3+","+src4+","+src5+","+src6+","+src7+","+src8+","+src9+","+src10+",\n");
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_put(dst_base[dst_offset + 2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_put(dst_base[dst_offset + 3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6), cm_base, cm_offset);
dst_base[dst_offset + 4*dstStride] = op_put(dst_base[dst_offset + 4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7), cm_base, cm_offset);
dst_base[dst_offset + 5*dstStride] = op_put(dst_base[dst_offset + 5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8), cm_base, cm_offset);
dst_base[dst_offset + 6*dstStride] = op_put(dst_base[dst_offset + 6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9), cm_base, cm_offset);
dst_base[dst_offset + 7*dstStride] = op_put(dst_base[dst_offset + 7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg(dst_base[dst_offset + 0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg(dst_base[dst_offset + 1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_avg(dst_base[dst_offset + 2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_avg(dst_base[dst_offset + 3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6), cm_base, cm_offset);
dst_base[dst_offset + 4*dstStride] = op_avg(dst_base[dst_offset + 4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7), cm_base, cm_offset);
dst_base[dst_offset + 5*dstStride] = op_avg(dst_base[dst_offset + 5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8), cm_base, cm_offset);
dst_base[dst_offset + 6*dstStride] = op_avg(dst_base[dst_offset + 6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9), cm_base, cm_offset);
dst_base[dst_offset + 7*dstStride] = op_avg(dst_base[dst_offset + 7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10), cm_base, cm_offset);
} // if
dst_offset++;
src_offset++;
}
} // case
break;
case 16: {
h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset , src_base, src_offset , dstStride, srcStride);
h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset+8, src_base, src_offset+8, dstStride, srcStride);
src_offset += 8*srcStride;
dst_offset += 8*dstStride;
h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset , src_base, src_offset , dstStride, srcStride);
h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset+8, src_base, src_offset+8, dstStride, srcStride);
} // case
break;
} // switch
}
public static void h264_qpel_hv_lowpass(int opcode, int size, int[] dst_base, int dst_offset,
/*int16_t *tmp,*/ int[] tmp_base, int tmp_offset,
int[] src_base, int src_offset, int dstStride, int tmpStride, int srcStride){
switch(size) {
case 2: {
int h=2;
int w=2;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
src_offset -= 2*srcStride;
for(i=0; i<h+5; i++)
{
tmp_base[tmp_offset + 0]= (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]);
tmp_base[tmp_offset + 1]= (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]);
tmp_offset+=tmpStride;
src_offset+=srcStride;
}
tmp_offset -= tmpStride*(h+5-2);
for(i=0; i<w; i++)
{
int tmpB= tmp_base[tmp_offset + -2*tmpStride];
int tmpA= tmp_base[tmp_offset + -1*tmpStride];
int tmp0= tmp_base[tmp_offset + 0 *tmpStride];
int tmp1= tmp_base[tmp_offset + 1 *tmpStride];
int tmp2= tmp_base[tmp_offset + 2 *tmpStride];
int tmp3= tmp_base[tmp_offset + 3 *tmpStride];
int tmp4= tmp_base[tmp_offset + 4 *tmpStride];
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
} // if
dst_offset++;
tmp_offset++;
}
} // case
break;
case 4: {
int h=4;
int w=4;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
// DebugTool.printDebugString("h264_qpel4_hv_lowpass:\n");
src_offset -= 2*srcStride;
for(i=0; i<h+5; i++)
{
tmp_base[tmp_offset + 0]= (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3]);
tmp_base[tmp_offset + 1]= (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4]);
tmp_base[tmp_offset + 2]= (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5]);
tmp_base[tmp_offset + 3]= (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6]);
tmp_offset+=tmpStride;
src_offset+=srcStride;
}
tmp_offset -= tmpStride*(h+5-2);
for(i=0; i<w; i++)
{
int tmpB= tmp_base[tmp_offset + -2*tmpStride];
int tmpA= tmp_base[tmp_offset + -1*tmpStride];
int tmp0= tmp_base[tmp_offset + 0 *tmpStride];
int tmp1= tmp_base[tmp_offset + 1 *tmpStride];
int tmp2= tmp_base[tmp_offset + 2 *tmpStride];
int tmp3= tmp_base[tmp_offset + 3 *tmpStride];
int tmp4= tmp_base[tmp_offset + 4 *tmpStride];
int tmp5= tmp_base[tmp_offset + 5 *tmpStride];
int tmp6= tmp_base[tmp_offset + 6 *tmpStride];
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_put2(dst_base[dst_offset + 2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_put2(dst_base[dst_offset + 3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_avg2(dst_base[dst_offset + 2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_avg2(dst_base[dst_offset + 3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6), cm_base, cm_offset);
} // if
dst_offset++;
tmp_offset++;
}
} // case
break;
case 8: {
int h=8;
int w=8;
int[] cm_base = H264DSPContext.ff_cropTbl;
int cm_offset = H264DSPContext.MAX_NEG_CROP;
int i;
// DebugTool.printDebugString("h264_qpel8_hv_lowpass:\n");
src_offset -= 2*srcStride;
for(i=0; i<h+5; i++)
{
tmp_base[tmp_offset + 0]= (src_base[src_offset + 0]+src_base[src_offset + 1])*20 - (src_base[src_offset + -1]+src_base[src_offset + 2])*5 + (src_base[src_offset + -2]+src_base[src_offset + 3 ]);
tmp_base[tmp_offset + 1]= (src_base[src_offset + 1]+src_base[src_offset + 2])*20 - (src_base[src_offset + 0 ]+src_base[src_offset + 3])*5 + (src_base[src_offset + -1]+src_base[src_offset + 4 ]);
tmp_base[tmp_offset + 2]= (src_base[src_offset + 2]+src_base[src_offset + 3])*20 - (src_base[src_offset + 1 ]+src_base[src_offset + 4])*5 + (src_base[src_offset + 0 ]+src_base[src_offset + 5 ]);
tmp_base[tmp_offset + 3]= (src_base[src_offset + 3]+src_base[src_offset + 4])*20 - (src_base[src_offset + 2 ]+src_base[src_offset + 5])*5 + (src_base[src_offset + 1 ]+src_base[src_offset + 6 ]);
tmp_base[tmp_offset + 4]= (src_base[src_offset + 4]+src_base[src_offset + 5])*20 - (src_base[src_offset + 3 ]+src_base[src_offset + 6])*5 + (src_base[src_offset + 2 ]+src_base[src_offset + 7 ]);
tmp_base[tmp_offset + 5]= (src_base[src_offset + 5]+src_base[src_offset + 6])*20 - (src_base[src_offset + 4 ]+src_base[src_offset + 7])*5 + (src_base[src_offset + 3 ]+src_base[src_offset + 8 ]);
tmp_base[tmp_offset + 6]= (src_base[src_offset + 6]+src_base[src_offset + 7])*20 - (src_base[src_offset + 5 ]+src_base[src_offset + 8])*5 + (src_base[src_offset + 4 ]+src_base[src_offset + 9 ]);
tmp_base[tmp_offset + 7]= (src_base[src_offset + 7]+src_base[src_offset + 8])*20 - (src_base[src_offset + 6 ]+src_base[src_offset + 9])*5 + (src_base[src_offset + 5 ]+src_base[src_offset + 10]);
tmp_offset+=tmpStride;
src_offset+=srcStride;
}
tmp_offset -= tmpStride*(h+5-2);
for(i=0; i<w; i++)
{
int tmpB= tmp_base[tmp_offset + -2*tmpStride];
int tmpA= tmp_base[tmp_offset + -1*tmpStride];
int tmp0= tmp_base[tmp_offset + 0 *tmpStride];
int tmp1= tmp_base[tmp_offset + 1 *tmpStride];
int tmp2= tmp_base[tmp_offset + 2 *tmpStride];
int tmp3= tmp_base[tmp_offset + 3 *tmpStride];
int tmp4= tmp_base[tmp_offset + 4 *tmpStride];
int tmp5= tmp_base[tmp_offset + 5 *tmpStride];
int tmp6= tmp_base[tmp_offset + 6 *tmpStride];
int tmp7= tmp_base[tmp_offset + 7 *tmpStride];
int tmp8= tmp_base[tmp_offset + 8 *tmpStride];
int tmp9= tmp_base[tmp_offset + 9 *tmpStride];
int tmp10=tmp_base[tmp_offset + 10*tmpStride];
if(opcode == 0) { // PUT
dst_base[dst_offset + 0*dstStride] = op_put2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_put2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_put2(dst_base[dst_offset + 2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_put2(dst_base[dst_offset + 3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6), cm_base, cm_offset);
dst_base[dst_offset + 4*dstStride] = op_put2(dst_base[dst_offset + 4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7), cm_base, cm_offset);
dst_base[dst_offset + 5*dstStride] = op_put2(dst_base[dst_offset + 5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8), cm_base, cm_offset);
dst_base[dst_offset + 6*dstStride] = op_put2(dst_base[dst_offset + 6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9), cm_base, cm_offset);
dst_base[dst_offset + 7*dstStride] = op_put2(dst_base[dst_offset + 7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10), cm_base, cm_offset);
} else { // AVG
dst_base[dst_offset + 0*dstStride] = op_avg2(dst_base[dst_offset + 0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3), cm_base, cm_offset);
dst_base[dst_offset + 1*dstStride] = op_avg2(dst_base[dst_offset + 1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4), cm_base, cm_offset);
dst_base[dst_offset + 2*dstStride] = op_avg2(dst_base[dst_offset + 2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5), cm_base, cm_offset);
dst_base[dst_offset + 3*dstStride] = op_avg2(dst_base[dst_offset + 3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6), cm_base, cm_offset);
dst_base[dst_offset + 4*dstStride] = op_avg2(dst_base[dst_offset + 4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7), cm_base, cm_offset);
dst_base[dst_offset + 5*dstStride] = op_avg2(dst_base[dst_offset + 5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8), cm_base, cm_offset);
dst_base[dst_offset + 6*dstStride] = op_avg2(dst_base[dst_offset + 6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9), cm_base, cm_offset);
dst_base[dst_offset + 7*dstStride] = op_avg2(dst_base[dst_offset + 7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10), cm_base, cm_offset);
} // if
dst_offset++;
tmp_offset++;
}
} // case
break;
case 16: {
h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset , tmp_base, tmp_offset , src_base, src_offset , dstStride, tmpStride, srcStride);
h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset+8, tmp_base, tmp_offset+8, src_base, src_offset+8, dstStride, tmpStride, srcStride);
src_offset += 8*srcStride;
dst_offset += 8*dstStride;
h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset , tmp_base, tmp_offset , src_base, src_offset , dstStride, tmpStride, srcStride);
h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset+8, tmp_base, tmp_offset+8, src_base, src_offset+8, dstStride, tmpStride, srcStride);
} // case
break;
} // switch
}
public static void h264_qpel_mc00_c (int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
pixels_c(opcode, size, dst_base, dst_offset, src_base, src_offset, stride, size);
}
public static void h264_qpel_mc10_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] half = new int[size*size];
h264_qpel_h_lowpass(0, size, half, 0, src_base, src_offset, size, stride);
pixels_l2(opcode, size, dst_base, dst_offset, src_base, src_offset, half, 0, stride, stride, size, size);
}
public static void h264_qpel_mc20_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
h264_qpel_h_lowpass(opcode, size, dst_base, dst_offset, src_base, src_offset, stride, stride);
}
public static void h264_qpel_mc30_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] half = new int[size*size];
h264_qpel_h_lowpass(0, size, half, 0, src_base, src_offset, size, stride);
pixels_l2(opcode, size, dst_base, dst_offset, src_base, src_offset+1, half, 0, stride, stride, size, size);
}
public static void h264_qpel_mc01_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] half = new int[size*size];
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, half, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, full, full_mid, half, 0, stride, size, size, size);
}
public static void h264_qpel_mc02_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(opcode, size, dst_base, dst_offset, full, full_mid, stride, size);
}
public static void h264_qpel_mc03_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] half = new int[size*size];
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, half, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, full, full_mid+size, half, 0, stride, size, size, size);
}
public static void h264_qpel_mc11_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] halfH = new int[size*size];
int[] halfV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset, size, stride);
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfV, 0, stride, size, size, size);
}
public static void h264_qpel_mc31_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] halfH = new int[size*size];
int[] halfV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset, size, stride);
copy_block (size, full, 0, src_base, src_offset - stride*2 + 1, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfV, 0, stride, size, size, size);
}
public static void h264_qpel_mc13_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] halfH = new int[size*size];
int[] halfV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset + stride, size, stride);
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfV, 0, stride, size, size, size);
}
public static void h264_qpel_mc33_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
int[] halfH = new int[size*size];
int[] halfV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset + stride, size, stride);
copy_block (size, full, 0, src_base, src_offset - stride*2 + 1, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfV, 0, stride, size, size, size);
}
public static void h264_qpel_mc22_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
/*int16_t*/ int[] tmp = new int[size*(size+5)];
h264_qpel_hv_lowpass(opcode, size, dst_base, dst_offset, tmp, 0, src_base, src_offset, stride, size, stride);
}
public static void h264_qpel_mc21_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
/*int16_t*/ int[] tmp = new int[size*(size+5)];
int[] halfH = new int[size*size];
int[] halfHV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset, size, stride);
h264_qpel_hv_lowpass(0, size, halfHV, 0, tmp, 0, src_base, src_offset, size, size, stride);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfHV, 0, stride, size, size, size);
}
public static void h264_qpel_mc23_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
/*int16_t*/ int[] tmp = new int[size*(size+5)];
int[] halfH = new int[size*size];
int[] halfHV = new int[size*size];
h264_qpel_h_lowpass(0, size, halfH, 0, src_base, src_offset + stride, size, stride);
h264_qpel_hv_lowpass(0, size, halfHV, 0, tmp, 0, src_base, src_offset, size, size, stride);
pixels_l2(opcode, size, dst_base, dst_offset, halfH, 0, halfHV, 0, stride, size, size, size);
}
public static void h264_qpel_mc12_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
/*int16_t*/ int[] tmp = new int[size*(size+5)];
int[] halfV = new int[size*size];
int[] halfHV = new int[size*size];
copy_block (size, full, 0, src_base, src_offset - stride*2, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
h264_qpel_hv_lowpass(0, size, halfHV, 0, tmp, 0, src_base, src_offset, size, size, stride);
// DebugTool.printDebugString("halfV:");
for(int i=0;i<halfV.length;i++) {
// DebugTool.printDebugString(","+halfV[i]);
}
// DebugTool.printDebugString("\n");
// DebugTool.printDebugString("halfHV:");
for(int i=0;i<halfHV.length;i++) {
// DebugTool.printDebugString(","+halfHV[i]);
}
// DebugTool.printDebugString("\n");
pixels_l2(opcode, size, dst_base, dst_offset, halfV, 0, halfHV, 0, stride, size, size, size);
}
public static void h264_qpel_mc32_c(int opcode, int size, int[] dst_base, int dst_offset, int[] src_base, int src_offset, int stride){
int[] full = new int[size*(size+5)];
int full_mid= size*2;
/*int16_t*/ int[] tmp = new int[size*(size+5)];
int[] halfV = new int[size*size];
int[] halfHV = new int[size*size];
copy_block (size, full, 0, src_base, src_offset - stride*2 + 1, size, stride, size + 5);
h264_qpel_v_lowpass(0, size, halfV, 0, full, full_mid, size, size);
h264_qpel_hv_lowpass(0, size, halfHV, 0, tmp, 0, src_base, src_offset, size, size, stride);
pixels_l2(opcode, size, dst_base, dst_offset, halfV, 0, halfHV, 0, stride, size, size, size);
}
public Ih264_chroma_mc_func[] put_h264_chroma_pixels_tab = new Ih264_chroma_mc_func[3];
public Ih264_chroma_mc_func[] avg_h264_chroma_pixels_tab = new Ih264_chroma_mc_func[3];
public void dsputil_init(/*AVCodecContext *avctx*/ MpegEncContext s) {
int i;
// No Alignment Checking in JAVA
//ff_check_alignment();
//??????????????????????????
// Why initialize it if we don't even use it?
/*
if(s.lowres==1){
//if(s.idct_algo==FF_IDCT_INT || s.idct_algo==FF_IDCT_AUTO || !CONFIG_H264_DECODER){
// this.idct_put= ff_jref_idct4_put;
// this.idct_add= ff_jref_idct4_add;
//}else{
this.idct_put= ff_h264_lowres_idct_put_c;
this.idct_add= ff_h264_lowres_idct_add_c;
//}
this.idct = j_rev_dct4;
this.idct_permutation_type= FF_NO_IDCT_PERM;
}else if(s.lowres==2){
this.idct_put= ff_jref_idct2_put;
this.idct_add= ff_jref_idct2_add;
this.idct = j_rev_dct2;
this.idct_permutation_type= FF_NO_IDCT_PERM;
}else if(s.lowres==3){
this.idct_put= ff_jref_idct1_put;
this.idct_add= ff_jref_idct1_add;
this.idct = j_rev_dct1;
this.idct_permutation_type= FF_NO_IDCT_PERM;
}else{
if(s.idct_algo==FF_IDCT_INT){
this.idct_put= ff_jref_idct_put;
this.idct_add= ff_jref_idct_add;
this.idct = j_rev_dct;
this.idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;
// }else if((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || CONFIG_VP6_DECODER ) &&
// s.idct_algo==FF_IDCT_VP3){
// this.idct_put= ff_vp3_idct_put_c;
// this.idct_add= ff_vp3_idct_add_c;
// this.idct = ff_vp3_idct_c;
// this.idct_permutation_type= FF_NO_IDCT_PERM;
// }else if(s.idct_algo==FF_IDCT_WMV2){
// this.idct_put= ff_wmv2_idct_put_c;
// this.idct_add= ff_wmv2_idct_add_c;
// this.idct = ff_wmv2_idct_c;
// this.idct_permutation_type= FF_NO_IDCT_PERM;
// }else if(s.idct_algo==FF_IDCT_FAAN){
// this.idct_put= ff_faanidct_put;
// this.idct_add= ff_faanidct_add;
// this.idct = ff_faanidct;
// this.idct_permutation_type= FF_NO_IDCT_PERM;
// }else if(CONFIG_EATGQ_DECODER && s.idct_algo==FF_IDCT_EA) {
// this.idct_put= ff_ea_idct_put_c;
// this.idct_permutation_type= FF_NO_IDCT_PERM;
// }else if(CONFIG_BINK_DECODER && s.idct_algo==FF_IDCT_BINK) {
// this.idct = ff_bink_idct_c;
// this.idct_add = ff_bink_idct_add_c;
// this.idct_put = ff_bink_idct_put_c;
// this.idct_permutation_type = FF_NO_IDCT_PERM;
}else{ //accurate/default
this.idct_put= ff_simple_idct_put;
this.idct_add= ff_simple_idct_add;
this.idct = ff_simple_idct;
this.idct_permutation_type= FF_NO_IDCT_PERM;
}
}
*/
// For JAVA software decoder, use simple IDCT Scanline:
this.idct_permutation_type= FF_NO_IDCT_PERM;
put_h264_qpel_pixels_tab[0][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
pixels_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride,16);
}
};
put_h264_qpel_pixels_tab[0][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[0][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(0, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
pixels_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride, 8);
}
};
put_h264_qpel_pixels_tab[1][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[1][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(0, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc00_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[2][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(0, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc00_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_qpel_pixels_tab[3][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(0, 2, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
pixels_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride, 16);
}
};
avg_h264_qpel_pixels_tab[0][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[0][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(1, 16, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
pixels_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride, 8);
}
};
avg_h264_qpel_pixels_tab[1][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[1][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(1, 8, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 0] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc00_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 1] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc10_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 2] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc20_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 3] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc30_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 4] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc01_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 5] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc11_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 6] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc21_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 7] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc31_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 8] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc02_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][ 9] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc12_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][10] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc22_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][11] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc32_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][12] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc03_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][13] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc13_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][14] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc23_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
avg_h264_qpel_pixels_tab[2][15] = new Ih264_qpel_mc_func() {
public void h264_qpel_mc_func(int[] dst_base, int dst_offset,int[] src_base, int src_offset,int stride) {
h264_qpel_mc33_c(1, 4, dst_base, dst_offset, src_base, src_offset, stride);
}
};
put_h264_chroma_pixels_tab[0]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
put_h264_chroma_mc8_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
put_h264_chroma_pixels_tab[1]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
put_h264_chroma_mc4_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
put_h264_chroma_pixels_tab[2]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
put_h264_chroma_mc2_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
avg_h264_chroma_pixels_tab[0]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
avg_h264_chroma_mc8_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
avg_h264_chroma_pixels_tab[1]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
avg_h264_chroma_mc4_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
avg_h264_chroma_pixels_tab[2]= new Ih264_chroma_mc_func() {
public void h264_chroma_mc_func(
int[] dst_base/*align 8*/, int dst_offset,
int[] src_base/*align 1*/, int src_offset,
int srcStride, int h, int x, int y){
avg_h264_chroma_mc2_c(dst_base, dst_offset, src_base, src_offset, srcStride, h, x, y);
}
};
switch(this.idct_permutation_type){
case FF_NO_IDCT_PERM:
for(i=0; i<64; i++)
this.idct_permutation[i]= i;
break;
} // switch
}
}