}
}
-/* API routines */
+/* yuv routines with scaling */
+/* 4:2:2 i, 16 bpp*/
+
+void yuv422ToRgb16_scaled (unsigned char * Y,
+ unsigned char * U, unsigned char * V,
+ short * dest, short table[1935], int width , int dest_width,
+ int height, int dest_height, int skip, int dest_skip,short * buffer)
+{
+ int i, i_hcount, i_vcount, j, k;
+ int u;
+ int v;
+ int uvRed;
+ int uvGreen;
+ int uvBlue;
+ short * tableY;
+ short pix;
+
+ if ( ( width < dest_width ) && ( height < dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i = width >> 1;
+ i_hcount = dest_width;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width > dest_width ) && ( height < dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i_hcount = 0;
+ i = width >> 1;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width < dest_width ) && ( height > dest_height ) )
+ {
+ i_vcount = 0;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i = width >> 1;
+ i_hcount = dest_width;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ dest[j++] = pix;
+ }
+ i_hcount += dest_width;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ dest[j++] = pix;
+ }
+ i_hcount += dest_width;
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ Y += skip;
+ U += skip >> 1;
+ V += skip >> 1;
+ }
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width > dest_width ) && ( height > dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i_hcount = 0;
+ i = width >> 1;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ dest[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ dest[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ Y += skip;
+ U += skip >> 1;
+ V += skip >> 1;
+ }
+ i_vcount += dest_height;
+ }
+ }
+}
+
+/* yuv routines with scaling */
+/* 4:2:0 i, 16 bpp*/
+
+void yuv420ToRgb16_scaled (unsigned char * Y,
+ unsigned char * U, unsigned char * V,
+ short * dest, short table[1935], int width , int dest_width,
+ int height, int dest_height, int skip, int dest_skip,short * buffer)
+{
+ int i, i_hcount, i_vcount, j, k;
+ int u;
+ int v;
+ int uvRed;
+ int uvGreen;
+ int uvBlue;
+ short * tableY;
+ short pix;
+
+ if ( ( width < dest_width ) && ( height < dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height >> 1;
+ while ( k-- )
+ {
+ j = 0;
+ i = width >> 1;
+ i_hcount = dest_width;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ U -= skip >> 1;
+ V -= skip >> 1;
+ j = 0;
+ i = width >> 1;
+ i_hcount = dest_width;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ buffer[j++] = pix;
+ }
+ i_hcount += dest_width;
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width > dest_width ) && ( height < dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i_hcount = 0;
+ i = width >> 1;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ U -= skip >> 1;
+ V -= skip >> 1;
+ j = 0;
+ i_hcount = 0;
+ i = width >> 1;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ buffer[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ }
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ for (j=0; j<dest_width; j+=16)
+ {
+ dest[j]=buffer[j];
+ dest[j+1]=buffer[j+1];
+ dest[j+2]=buffer[j+2];
+ dest[j+3]=buffer[j+3];
+ dest[j+4]=buffer[j+4];
+ dest[j+6]=buffer[j+7];
+ dest[j+8]=buffer[j+9];
+ dest[j+10]=buffer[j+10];
+ dest[j+11]=buffer[j+11];
+ dest[j+12]=buffer[j+12];
+ dest[j+13]=buffer[j+13];
+ dest[j+14]=buffer[j+14];
+ dest[j+15]=buffer[j+15];
+ }
+ dest += dest_skip;
+ }
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width < dest_width ) && ( height > dest_height ) )
+ {
+ i_vcount = 0;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i = width >> 1;
+ i_hcount = dest_width;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ dest[j++] = pix;
+ }
+ i_hcount += dest_width;
+
+ tableY = table + *(Y++);
+ pix = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) + uvRed] |
+ tableY [135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)
+ >>SHIFT) + uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) + uvBlue]);
+ while ( ( i_hcount -= width ) >= 0 )
+ {
+ dest[j++] = pix;
+ }
+ i_hcount += dest_width;
+ }
+ j = 0;
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ Y += skip;
+ j++;
+ }
+ U += skip * ( j >> 1 );
+ V += skip * ( j >> 1 );
+ i_vcount += dest_height;
+ }
+ }
+ else if ( ( width > dest_width ) && ( height > dest_height ) )
+ {
+ i_vcount = dest_height;
+ k = height;
+ while ( k-- )
+ {
+ j = 0;
+ i_hcount = 0;
+ i = width >> 1;
+ while ( i-- )
+ {
+ u = *(U++);
+ v = *(V++);
+ uvRed = (V_RED_COEF*v) >> SHIFT;
+ uvGreen = (U_GREEN_COEF*u + V_GREEN_COEF*v) >> SHIFT;
+ uvBlue = (U_BLUE_COEF*u) >> SHIFT;
+
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ dest[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ if ( ( i_hcount -= dest_width ) >= 0 )
+ Y++;
+ else
+ {
+ tableY = table + *(Y++);
+ dest[j++] = (tableY [1501 - ((V_RED_COEF*128)>>SHIFT) +
+ uvRed] |
+ tableY [135 -
+ (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) +
+ uvGreen] |
+ tableY [818 - ((U_BLUE_COEF*128)>>SHIFT) +
+ uvBlue]);
+ i_hcount += width;
+ }
+ }
+ j = 0;
+ while ( ( i_vcount -= height ) >= 0 )
+ {
+ Y += skip;
+ j++;
+ }
+ U += skip * ( j >> 1 );
+ V += skip * ( j >> 1 );
+ i_vcount += dest_height;
+ }
+ }
+}