| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| /** Class ColorConvert16, convert YUV to RGB16 in 5-6-5 format. */ |
| #include "colorconv_config.h" |
| #include "cczoomrotation16.h" |
| |
| #define pvcc_abs(x) ((x)>0? (x): -(x)) |
| |
| #define DITHER_ON |
| #ifdef DITHER_ON |
| |
| #define OFFSET_5_0 2 |
| #define OFFSET_6_0 (1+1024) |
| #define OFFSET_5_1 6 |
| #define OFFSET_6_1 (3+1024) |
| |
| #else //for the rounding case (no dither) |
| |
| #define OFFSET_5_0 0 // Set to zero for performance4 |
| #define OFFSET_6_0 (0+1024) //(2+1024) |
| #define OFFSET_5_1 0 //4 |
| #define OFFSET_6_1 (0+1024) //(2+1024) |
| |
| #endif |
| |
| OSCL_EXPORT_REF ColorConvertBase* ColorConvert16::NewL(void) |
| { |
| ColorConvert16* self = OSCL_NEW(ColorConvert16, ()); |
| return OSCL_STATIC_CAST(ColorConvertBase*, self); |
| } |
| |
| |
| ColorConvert16::ColorConvert16() |
| { |
| mCoefTbl = (uint8*)mCoefTbl32; |
| } |
| |
| |
| OSCL_EXPORT_REF ColorConvert16::~ColorConvert16() |
| { |
| } |
| |
| |
| int32 ColorConvert16::Init(int32 Src_width, int32 Src_height, int32 Src_pitch, int32 Dst_width, int32 Dst_height, int32 Dst_pitch, int32 nRotation) |
| { |
| //nRotation = 1; |
| //Dst_pitch = Dst_width = Src_height; |
| //Dst_height = Src_width; |
| |
| if (ColorConvertBase::Init(Src_width, Src_height, Src_pitch, Dst_width, Dst_height, Dst_pitch, nRotation) == 0) |
| { |
| return 0; |
| } |
| |
| _mInitialized = false; |
| |
| if ((nRotation&1) == 0) // check for either shrinking or zooming both horz and vert. No combination.. |
| { |
| if ((Src_width > Dst_width && Src_height < Dst_height) || |
| (Src_width < Dst_width && Src_height > Dst_height)) |
| { |
| return 0; |
| } |
| } |
| else |
| { |
| if ((Src_width > Dst_height && Src_height < Dst_width) || |
| (Src_width < Dst_height && Src_height > Dst_width)) |
| { |
| return 0; |
| } |
| } |
| |
| _mInitialized = true; |
| |
| // set default |
| SetYuvFullRange(false); |
| SetMode(0); |
| |
| return 1; |
| } |
| |
| |
| int32 ColorConvert16::SetYuvFullRange(bool range) |
| { |
| uint8 *clip; |
| int32 tmp, i; |
| |
| OSCL_ASSERT(_mInitialized == true); |
| |
| _mYuvRange = range; |
| |
| //local init |
| if (_mYuvRange == false) // default Yuv range from 16-235, BT.709 |
| { |
| *((uint32*)mCoefTbl) = 0x0000b2ce; //65536*0.813/1.164; // 0.533 |
| *((uint32*)(mCoefTbl + 4)) = 0x00015f03; //65536*1.596/1.164; // 1.793 |
| *((uint32*)(mCoefTbl + 8)) = 0x000055fe; //65536*0.391/1.164; // 0.213 |
| *((uint32*)(mCoefTbl + 12)) = 0x0001bbd2; //65536*2.018/1.164; // 2.112 |
| |
| clip = mCoefTbl + 400; |
| /* do 5 bit conversion */ |
| |
| oscl_memset(&clip[-384], 0, 401*sizeof(*clip)); |
| oscl_memset(&clip[ 640], 0, 401*sizeof(*clip)); |
| |
| for (i = 17; i < 236; i++) |
| { // range of (x>>3) between -24 and 56 |
| tmp = (int32)(1.164 * (i - 16)); // clip[1.164*((x>>3) - (16>>3))] |
| clip[i] = (uint8)(tmp >> 3); |
| clip[i+1024] = (uint8)(tmp >> 2); |
| } |
| |
| oscl_memset(&clip[236], 31, 404*sizeof(*clip)); |
| oscl_memset(&clip[1260], 63, 404*sizeof(*clip)); |
| |
| } |
| else // full range 0-255 |
| { |
| *((uint32*)mCoefTbl) = (int)(65536 * 0.4681); //0.714); |
| *((uint32*)(mCoefTbl + 4)) = (int)(65536 * 1.5748);//1.402); |
| *((uint32*)(mCoefTbl + 8)) = (int)(65536 * 0.1873);//0.344); |
| *((uint32*)(mCoefTbl + 12)) = (int)(65536 * 1.8556);//1.772); |
| |
| clip = mCoefTbl + 400; |
| /* do 5 bit conversion */ |
| oscl_memset(&clip[-384], 0, 385*sizeof(*clip)); |
| oscl_memset(&clip[ 640], 0, 385*sizeof(*clip)); |
| |
| for (i = 1; i < 255; i++) // range of (x>>3) between -24 and 56 |
| { |
| clip[i] = i >> 3; |
| clip[i+1024] = i >> 2; |
| } |
| oscl_memset(&clip[255], 31, 385*sizeof(*clip)); |
| oscl_memset(&clip[1279], 63, 385*sizeof(*clip)); |
| } |
| |
| return 1; // success |
| } |
| |
| |
| int32 ColorConvert16::SetMode(int32 nMode) //nMode : 0 Off, 1 On |
| { |
| OSCL_ASSERT(_mInitialized == true); |
| |
| if (nMode == 0) |
| { |
| // mPtrYUV2RGB = cc16Rotate; |
| // _mState = 1; |
| mPtrYUV2RGB = &ColorConvert16::get_frame16; |
| _mState = 0; |
| _mDisp.src_pitch = _mSrc_pitch ; |
| _mDisp.dst_pitch = _mDst_pitch ; |
| _mDisp.src_width = _mSrc_width ; |
| _mDisp.src_height = _mSrc_height ; |
| _mDisp.dst_width = _mSrc_width ; |
| _mDisp.dst_height = _mSrc_height ; |
| } |
| else |
| { |
| if (_mIsZoom) |
| { |
| if (_mRotation&0x1) /* zoom and rotate */ |
| { |
| mPtrYUV2RGB = &ColorConvert16::cc16ZoomRotate; |
| } |
| else /* zoom only */ |
| { |
| mPtrYUV2RGB = &ColorConvert16::cc16ZoomIn; |
| } |
| } |
| else |
| { |
| if (_mRotation&0x1) /* rotate only*/ |
| { |
| mPtrYUV2RGB = &ColorConvert16::cc16Rotate; |
| } |
| else /* no zoom, no rotate, SetMode(1) = SetMode(0) */ |
| { |
| mPtrYUV2RGB = &ColorConvert16::get_frame16; |
| } |
| } |
| _mState = nMode; |
| _mDisp.src_pitch = _mSrc_pitch ; |
| _mDisp.dst_pitch = _mDst_pitch ; |
| _mDisp.src_width = _mSrc_width ; |
| _mDisp.src_height = _mSrc_height ; |
| _mDisp.dst_width = _mDst_width ; |
| _mDisp.dst_height = _mDst_height ; |
| } |
| |
| return 1; |
| } |
| |
| |
| int32 ColorConvert16::GetOutputBufferSize(void) |
| { |
| OSCL_ASSERT(_mInitialized == true); |
| |
| return _mState ? (_mDst_height*_mDst_pitch*2) : (_mSrc_width*_mSrc_height*2); |
| } |
| |
| |
| int32 ColorConvert16::Convert(uint8 **yuvBuf, uint8 *rgbBuf) |
| { |
| OSCL_ASSERT(_mInitialized == true); |
| OSCL_ASSERT(yuvBuf); |
| OSCL_ASSERT(yuvBuf[0]); |
| OSCL_ASSERT(yuvBuf[1]); |
| OSCL_ASSERT(yuvBuf[2]); |
| OSCL_ASSERT(rgbBuf); |
| |
| if (((uint32)rgbBuf)&0x3 || ((uint32)yuvBuf[0])&0x3) /* address is not word align */ |
| { |
| return 0; |
| } |
| |
| (*this.*mPtrYUV2RGB)(yuvBuf, rgbBuf, &_mDisp, (uint8 *)mCoefTbl); |
| |
| return 1; |
| } |
| |
| |
| int32 ColorConvert16::Convert(uint8 *yuvBuf, uint8 *rgbBuf) |
| { |
| //this conversion will cause problems when do src clipping. However, if they want, they must give more info |
| uint8 *TmpYuvBuf[3]; |
| |
| OSCL_ASSERT(_mInitialized == true); |
| OSCL_ASSERT(yuvBuf); |
| OSCL_ASSERT(rgbBuf); |
| |
| if (((uint32)rgbBuf)&0x3 || ((uint32)yuvBuf)&0x3) /* address is not word align */ |
| { |
| return 0; |
| } |
| |
| TmpYuvBuf[0] = yuvBuf; |
| TmpYuvBuf[1] = yuvBuf + (_mSrc_pitch) * (_mSrc_mheight); |
| TmpYuvBuf[2] = TmpYuvBuf[1] + (_mSrc_pitch * _mSrc_mheight) / 4; |
| |
| (*this.*mPtrYUV2RGB)(TmpYuvBuf, rgbBuf, &_mDisp, (uint8 *)mCoefTbl); |
| |
| return 1; |
| } |
| |
| |
| int32 cc16(uint8 **src, uint8 *dst, int32 *disp_prop, uint8 *coeff_tbl); |
| int32 cc16Reverse(uint8 **src, uint8 *dst, int32 *disp_prop, uint8 *coeff_tbl); |
| |
| int32 ColorConvert16::get_frame16(uint8 **src, uint8 *dst, DisplayProperties *disp, uint8 *coff_tbl) |
| { |
| int32 disp_prop[8]; |
| |
| disp_prop[0] = disp->src_pitch; |
| disp_prop[1] = disp->dst_pitch; |
| disp_prop[2] = disp->src_width; |
| disp_prop[3] = disp->src_height; |
| disp_prop[4] = disp->dst_width; |
| disp_prop[5] = disp->dst_height; |
| disp_prop[6] = (_mRotation > 0 ? 1 : 0); |
| disp_prop[7] = _mIsFlip; |
| |
| if (disp_prop[6] ^ disp_prop[7]) /* flip and rotate 180*/ |
| { |
| return cc16Reverse(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| { |
| return cc16(src, dst, disp_prop, coff_tbl); |
| } |
| } |
| |
| int32 cc16(uint8 **src, uint8 *dst, int32 *disp, uint8 *coff_tbl) |
| { |
| |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaDst, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| if (disp[6]) /* rotate 180 and flip */ |
| { /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| deltaDst = (dst_pitch << 1) - src_width; |
| pDst = (uint16 *)dst; |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 2) |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| rgb |= (tmp0 << 16); |
| |
| *((uint32*)(pDst + dst_pitch)) = rgb; |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| rgb |= (tmp0 << 16); |
| *((uint32 *)pDst) = rgb; |
| pDst += 2; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| } |
| return 1; |
| } |
| |
| int32 cc16Reverse(uint8 **src, uint8 *dst, int32 *disp, uint8 *coff_tbl) |
| { |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaDst, deltaCbCr; |
| int row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| // int32 mRotation; |
| int nextrow, mIsFlip; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| mIsFlip = disp[7]; |
| |
| deltaDst = (dst_pitch << 1) - src_width; |
| |
| if (disp[6]) /* rotation, only */ |
| { /* move the starting point to the bottom-right corner of the picture */ |
| nextrow = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + nextrow + src_width - 2); |
| nextrow = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + nextrow + (src_width >> 1) - 1; |
| pCr = src[2] + nextrow + (src_width >> 1) - 1; |
| nextrow = -(src_pitch >> 1); |
| deltaY = src_width - (src_pitch << 1); |
| deltaCbCr = (src_width - src_pitch) >> 1; |
| } |
| else /* flip only */ |
| { /* move the starting point to the top-right corner of the picture */ |
| pY = (uint16 *)(src[0] + src_width - 2); |
| pCb = src[1] + (src_width >> 1) - 1; |
| pCr = src[2] + (src_width >> 1) - 1; |
| nextrow = src_pitch >> 1; |
| deltaY = src_width + (src_pitch << 1); |
| deltaCbCr = (src_width + src_pitch) >> 1; |
| } |
| |
| pDst = (uint16 *)dst; |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 2) |
| { |
| |
| Cb = *pCb--; |
| Cr = *pCr--; |
| //load the bottom two pixels |
| //Y = *(((uint16 *)pY)+src_pitch); |
| //Y = *((uint16 *)(((uint16 *)pY) + src_pitch)); |
| Y = pY[nextrow]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| //Cg = Cr*JCoeff[0];//*((int32*)(clip - 40)) |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| rgb = (rgb << 16) | tmp0; |
| |
| *((uint32*)(pDst + dst_pitch)) = rgb; |
| |
| //load the top two pixels |
| //Y = *((uint16 *)pY)++; |
| Y = *pY--; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| rgb = (rgb << 16) | tmp0; |
| |
| // *( (unsigned int32 *)pDst)++ = rgb; |
| *((uint32 *)pDst) = rgb; |
| pDst += 2; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| } |
| return 1; |
| } |
| |
| |
| int32 cc16rotate_P(uint8 **src, uint8 *dst, int32 src_pitch, int32 dst_pitch, int32 src_width, int32 src_height, |
| int32 deltaY, int32 deltaCbCr, int32 deltaDst, uint8 *coeff_tbl); |
| int32 cc16rotate_N(uint8 **src, uint8 *dst, int32 src_pitch, int32 dst_pitch, int32 src_width, int32 src_height, |
| int32 deltaY, int32 deltaCbCr, int32 deltaDst, uint8 *coeff_tbl); |
| |
| int32 ColorConvert16::cc16Rotate(uint8 **src, uint8 *dst, DisplayProperties *disp, uint8 *COFF_TBL) |
| { |
| int32 src_pitch, dst_pitch, src_width, src_height; |
| int32 deltaY, deltaCbCr, deltaDst; |
| |
| src_pitch = disp->src_pitch; |
| dst_pitch = disp->dst_pitch; |
| src_width = disp->src_width; |
| src_height = disp->src_height; |
| |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| |
| if (_mRotation == CCROTATE_CLKWISE) |
| { |
| if (!_mIsFlip) |
| { // go from upper-right down and left |
| dst += ((src_height - 1) << 1); |
| deltaDst = -(dst_pitch * src_width) - 2; |
| |
| return cc16rotate_N(src, dst, src_pitch, dst_pitch, src_width, src_height, deltaY, |
| deltaCbCr, deltaDst, COFF_TBL); |
| } |
| else |
| { // go from origin down and right |
| deltaDst = -(dst_pitch * src_width) + 2; |
| return cc16rotate_P(src, dst, src_pitch, dst_pitch, src_width, src_height, deltaY, |
| deltaCbCr, deltaDst, COFF_TBL); |
| } |
| |
| } |
| else // rotate counterclockwise |
| { |
| if (!_mIsFlip) |
| { // go from bottom-left to up right |
| dst += (((src_width - 1) * dst_pitch) << 1); |
| deltaDst = (dst_pitch * src_width + 2); |
| dst_pitch = -dst_pitch; |
| |
| return cc16rotate_P(src, dst, src_pitch, dst_pitch, src_width, src_height, deltaY, |
| deltaCbCr, deltaDst, COFF_TBL); |
| } |
| else |
| { // go from bottom right to top and left |
| dst += (((src_height - 1) << 1) + (((src_width - 1) * dst_pitch) << 1)); |
| deltaDst = (dst_pitch * src_width - 2); |
| dst_pitch = -dst_pitch; |
| |
| return cc16rotate_N(src, dst, src_pitch, dst_pitch, src_width, src_height, deltaY, |
| deltaCbCr, deltaDst, COFF_TBL); |
| } |
| } |
| |
| } |
| |
| int32 cc16rotate_P(uint8 **src, uint8 *dst, int32 src_pitch, int32 dst_pitch, int32 src_width, int32 src_height, |
| int32 deltaY, int32 deltaCbCr, int32 deltaDst, uint8 *coeff_tbl) |
| { |
| #if CCROTATE |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 Y, Cb, Cr, Cg; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coeff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| pY = (uint16*) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| |
| pDst = (uint16 *)dst; |
| |
| for (row = src_height; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 2) |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *(pDst += 1) = rgb; |
| |
| Y = (Y >> 8); |
| Y += OFFSET_5_1; |
| |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst += dst_pitch) = tmp0; |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y >> 8); //Low endian right pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst -= 1) = rgb; |
| |
| tmp0 = Y & 0xFF; |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = (tmp0) - (Cg >> 16); |
| tmp2 = (tmp0) + (Cb >> 16); |
| tmp0 = (tmp0) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| pDst[-dst_pitch] = tmp0; |
| pDst += dst_pitch; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| } |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(src_pitch); |
| OSCL_UNUSED_ARG(dst_pitch); |
| OSCL_UNUSED_ARG(src_width); |
| OSCL_UNUSED_ARG(src_height); |
| OSCL_UNUSED_ARG(deltaY); |
| OSCL_UNUSED_ARG(deltaCbCr); |
| OSCL_UNUSED_ARG(deltaDst); |
| OSCL_UNUSED_ARG(coeff_tbl); |
| |
| return 0; |
| #endif // CCROTATE |
| } |
| |
| int32 cc16rotate_N(uint8 **src, uint8 *dst, int32 src_pitch, int32 dst_pitch, int32 src_width, int32 src_height, |
| int32 deltaY, int32 deltaCbCr, int32 deltaDst, uint8 *coeff_tbl) |
| { |
| #if CCROTATE |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 Y, Cb, Cr, Cg; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coeff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| pY = (uint16*) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| |
| pDst = (uint16 *)dst; |
| |
| for (row = src_height; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 2) |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *(pDst -= 1) = rgb; |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst += dst_pitch) = tmp0; |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian right pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst += 1) = rgb; |
| |
| Y = (Y & 0xFF); |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| pDst[-dst_pitch] = tmp0; |
| pDst += dst_pitch; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| } |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(src_pitch); |
| OSCL_UNUSED_ARG(dst_pitch); |
| OSCL_UNUSED_ARG(src_width); |
| OSCL_UNUSED_ARG(src_height); |
| OSCL_UNUSED_ARG(deltaY); |
| OSCL_UNUSED_ARG(deltaCbCr); |
| OSCL_UNUSED_ARG(deltaDst); |
| OSCL_UNUSED_ARG(coeff_tbl); |
| |
| return 0; |
| #endif // CCROTATE |
| } |
| |
| |
| |
| int32 cc16scaledown(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, uint8 *_mColPix); |
| int32 cc16scalingHalf(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl); |
| int32 cc16scaling34(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl); |
| int32 cc16scaleup(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, uint8 *_mColPix); |
| int32 cc16scaling54(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl); |
| int32 cc16scaling43(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl); |
| int32 cc16scaling128x96(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl); |
| |
| // Note:: This zoom algorithm needs an extra line of RGB buffer. So, users |
| // have to use GetOutputBufferSize API to get the size it needs. See GetOutputBufferSize(). |
| int32 ColorConvert16::cc16ZoomIn(uint8 **src, uint8 *dst, DisplayProperties *disp, uint8 *coff_tbl) |
| { |
| int32 disp_prop[8]; |
| int32 src_width, src_height, dst_width, dst_height; |
| int32 tempw, temph; |
| |
| disp_prop[0] = disp->src_pitch; |
| disp_prop[1] = disp->dst_pitch; |
| disp_prop[2] = src_width = disp->src_width; |
| disp_prop[3] = src_height = disp->src_height; |
| disp_prop[4] = dst_width = disp->dst_width; |
| disp_prop[5] = dst_height = disp->dst_height; |
| disp_prop[6] = (_mRotation > 0 ? 1 : 0); |
| disp_prop[7] = _mIsFlip; |
| |
| if (src_width > dst_width) /* scale down in width */ |
| { |
| tempw = (3 * src_width) >> 2; |
| temph = (3 * src_height) >> 2; |
| /* check for special zoom-out case, 3:4 scaling down */ |
| if (dst_width == tempw && dst_height == temph && !(src_width&3)) |
| { |
| return cc16scaling34(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| { |
| if ((dst_width == (src_width >> 1)) && (dst_height == (src_height >> 1))) |
| { |
| return cc16scalingHalf(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| { |
| return cc16scaledown(src, dst, disp_prop, coff_tbl, _mRowPix, _mColPix); |
| } |
| } |
| } |
| else |
| { |
| tempw = (5 * src_width) / 4; |
| temph = (5 * src_height) / 4; |
| |
| /* check for special zoom-out case, 5:4 scaling up */ |
| if (dst_width == tempw && dst_height == temph && !(src_width&3)) |
| { |
| return cc16scaling54(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| { |
| tempw = (4 * src_width) / 3; |
| temph = (4 * src_height) / 3; |
| if (dst_width == tempw && dst_height == temph && !(src_width&3)) |
| { |
| return cc16scaling43(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| { |
| tempw = (15 * src_width) / 8; |
| temph = (15 * src_height) / 8; |
| #ifdef SPECIAL_SCALE_128x96 |
| if (dst_width == tempw && dst_height == temph && !(src_width&7)) |
| { |
| return cc16scaling128x96(src, dst, disp_prop, coff_tbl); |
| } |
| else |
| #endif |
| { |
| return cc16scaleup(src, dst, disp_prop, coff_tbl, _mRowPix, _mColPix); |
| } |
| } |
| } |
| |
| } |
| } |
| |
| #ifdef SPECIAL_SCALE_128x96 |
| int32 cc16scaling128x96(uint8 **src, uint8 *dst, int32 *disp, uint8 *coff_tbl) |
| { |
| #if CCSCALING |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width, nextrow; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| #ifdef INTERPOLATE |
| int i, offset = 0; |
| uint16 *pI2, *pU2, *pIn, *pNext; |
| int32 tmp02, tmp01; |
| #endif |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| if (((disp[6] == 1) && (disp[7] == 1)) || ((disp[6] == 0) && (disp[7] == 0))) |
| { |
| if (disp[6])/* rotate 180 and flip */ |
| { /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else // no rotate,no flip |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| pDst = (uint16 *)dst; |
| |
| for (row = 0; row < disp[3] - 1; row += 2) |
| { |
| for (col = 0; col <= src_width - 1; col += 8) |
| { |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifndef INTERPOLATE |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = ((pDst + (dst_pitch << 1) + 3)); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifndef INTERPOLATE |
| *((pDst + 1)) = rgb; |
| #endif |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = (pDst + (dst_pitch << 1) + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = (pDst + (dst_pitch << 1) + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| #ifdef INTERPOLATE |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = (Y & 0xFF); //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| Y = (Y >> 8) & 0xFF; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + 2) = tmp0; |
| #ifdef INTERPOLATE |
| *((pDst + 1)) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| pDst += 3; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst -= (disp[4]); |
| #ifdef INTERPOLATE |
| /* vertically - 1 1' 2 2' 3 3' 4 4' 5 5' 6 6' 7 7' 8 1 1'2 2'........*/ |
| if ((row & 0x7)) |
| { |
| pIn = pDst - dst_pitch; |
| pNext = pIn - dst_pitch; |
| for (i = 0;i < disp[4]; i++) |
| { |
| int32 curr = pDst[i]; |
| int32 below = pNext[i]; |
| pIn[i] = (((((curr & 0x1F) + (below & 0x1F)) / 2) & 0x1F) |
| | ((((((curr >> 5) & 0x3F) + ((below >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((curr >> 11) & 0x1F) + ((below >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| offset++; |
| } |
| |
| pNext = pDst + (dst_pitch * 2); |
| pIn = pDst + dst_pitch; |
| for (i = 0;i < disp[4]; i++) |
| { |
| int32 curr = pDst[i]; |
| int32 below = pNext[i]; |
| pIn[i] = (((((curr & 0x1F) + (below & 0x1F)) / 2) & 0x1F) |
| | ((((((curr >> 5) & 0x3F) + ((below >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((curr >> 11) & 0x1F) + ((below >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| |
| if (offset == 3) |
| { |
| pDst = pNext + dst_pitch; |
| offset = 0; |
| } |
| else |
| pDst = pNext + dst_pitch * 2; |
| #else |
| oscl_memcpy(pDst + dst_pitch, pDst, (disp[4] << 1)); |
| pDst += (dst_pitch << 1); |
| |
| if (row & 0x7) |
| { |
| oscl_memcpy(pDst + dst_pitch, pDst, (disp[4] << 1)); |
| pDst += dst_pitch; //coz pDst defined as UINT * |
| } |
| pDst += dst_pitch; |
| #endif |
| } |
| } |
| else |
| { |
| if (disp[6])/* rotation 180 only */ |
| { |
| /* move the starting point to the bottom-right corner of the picture */ |
| nextrow = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + nextrow + src_width - 2); |
| nextrow = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + nextrow + (src_width >> 1) - 1; |
| pCr = src[2] + nextrow + (src_width >> 1) - 1; |
| nextrow = -(src_pitch >> 1); |
| deltaY = src_width - (src_pitch << 1); |
| deltaCbCr = (src_width - src_pitch) >> 1; |
| } |
| else /* flip only */ |
| { |
| /* move the starting point to the top-right corner of the picture */ |
| pY = (uint16 *)(src[0] + src_width - 2); |
| pCb = src[1] + (src_width >> 1) - 1; |
| pCr = src[2] + (src_width >> 1) - 1; |
| nextrow = src_pitch >> 1; |
| deltaY = src_width + (src_pitch << 1); |
| deltaCbCr = (src_width + src_pitch) >> 1; |
| } |
| pDst = (uint16 *)dst; |
| for (row = 0; row < disp[3] - 1; row += 2) |
| { |
| for (col = 0; col <= src_width - 1; col += 8) |
| { |
| Cb = *pCb--; |
| Cr = *pCr--; |
| //load the bottom two pixels |
| Y = pY[nextrow]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifndef INTERPOLATE |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = ((pDst + (dst_pitch << 1) + 3)); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| //load the top two pixels |
| Y = *pY--; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| //tmp0 = *pY++; |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifndef INTERPOLATE |
| *((pDst + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb--; |
| Cr = *pCr--; |
| //load the bottom two pixels |
| Y = pY[nextrow]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1- OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| Y = Y & 0xFF; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = (pDst + (dst_pitch << 1) + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| |
| //load the top two pixels |
| Y = *pY--; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| //tmp0 = *pY++; |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb--; |
| Cr = *pCr--; |
| //load the bottom two pixels |
| Y = pY[nextrow]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1- OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp02 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp02; |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pI2 = (pDst + (dst_pitch << 1) + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| *(pDst + (dst_pitch << 1) + 3) = tmp0; |
| #endif |
| |
| //load the top two pixels |
| Y = *pY--; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| //tmp0 = *pY++; |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| #ifdef INTERPOLATE |
| tmp01 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp01; |
| *((pDst + 1)) = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pU2 = (pDst + 3); |
| #else |
| tmp0 = tmp2 | (tmp0 << 5); |
| *(pDst + 2) = tmp0; |
| *(pDst + 3) = tmp0; |
| #endif |
| pDst += 4; |
| |
| Cb = *pCb--; |
| Cr = *pCr--; |
| //load the bottom two pixels |
| Y = pY[nextrow]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1- OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *((pDst + (dst_pitch << 1))) = rgb; |
| #ifdef INTERPOLATE |
| *pI2 = (((((tmp02 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + (dst_pitch << 1) + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + (dst_pitch << 1) + 2) = tmp0; |
| #ifdef INTERPOLATE |
| *((pDst + (dst_pitch << 1) + 1)) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| //load the top two pixels |
| Y = *pY--; |
| |
| tmp0 = (Y >> 8) & 0xFF; //Low endian left pixel |
| //tmp0 = *pY++; |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *((pDst)) = rgb; |
| #ifdef INTERPOLATE |
| *pU2 = (((((tmp01 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #else |
| *((pDst + 1)) = rgb; |
| #endif |
| |
| Y = Y & 0xFF; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + 2) = tmp0; |
| #ifdef INTERPOLATE |
| *((pDst + 1)) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| pDst += 3; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst -= (disp[4]); |
| #ifdef INTERPOLATE |
| /* vertically - 1 1' 2 2' 3 3' 4 4' 5 5' 6 6' 7 7' 8 1 1'2 2'........*/ |
| if ((row & 0x7)) |
| { |
| pIn = pDst - dst_pitch; |
| pNext = pIn - dst_pitch; |
| for (i = 0;i < disp[4]; i++) |
| { |
| int32 curr = pDst[i]; |
| int32 below = pNext[i]; |
| pIn[i] = (((((curr & 0x1F) + (below & 0x1F)) / 2) & 0x1F) |
| | ((((((curr >> 5) & 0x3F) + ((below >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((curr >> 11) & 0x1F) + ((below >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| offset++; |
| } |
| |
| pNext = pDst + (dst_pitch * 2); |
| pIn = pDst + dst_pitch; |
| for (i = 0;i < disp[4]; i++) |
| { |
| int32 curr = pDst[i]; |
| int32 below = pNext[i]; |
| pIn[i] = (((((curr & 0x1F) + (below & 0x1F)) / 2) & 0x1F) |
| | ((((((curr >> 5) & 0x3F) + ((below >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((curr >> 11) & 0x1F) + ((below >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| |
| if (offset == 3) |
| { |
| pDst = pNext + dst_pitch; |
| offset = 0; |
| } |
| else |
| pDst = pNext + dst_pitch * 2; |
| #else |
| oscl_memcpy(pDst + dst_pitch, pDst, (disp[4] << 1)); |
| pDst += (dst_pitch << 1); |
| |
| if (row & 0x7) |
| { |
| oscl_memcpy(pDst + dst_pitch, pDst, (disp[4] << 1)); |
| pDst += dst_pitch; //coz pDst defined as UINT * |
| } |
| pDst += dst_pitch; |
| #endif |
| } |
| } |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coeff_tbl); |
| return 0; |
| #endif // CCSCALING |
| } |
| #endif |
| |
| /* special function when scale down in width */ |
| int32 cc16scaledown(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, uint8 *_mColPix) |
| { |
| #if CCSCALING |
| /* 1. move the dst pointer to the line above the border |
| 2. do 2 line conversion |
| 3. copy both up & down |
| */ |
| uint8 *pCb, *pCr; |
| uint8 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, dst_width, deltaCbCr, src_inc; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint8 *clip = coff_tbl + 400; |
| uint8 *rowpix, *colpix; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| |
| if (((disp[6] == 0) && (disp[7] == 1)) || ((disp[6] == 1) && (disp[7] == 0))) // rotate 0 and flip || // rotate 180 and no flip |
| { |
| if (disp[6])/* rotation 180 only */ |
| { |
| /* move the starting point to the bottom-right corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (src[0] + deltaY + src_width - 2); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY + (src_width >> 1) - 1; |
| pCr = src[2] + deltaY + (src_width >> 1) - 1; |
| deltaY = src_width - (src_pitch << 1); |
| deltaCbCr = (src_width - src_pitch) >> 1; |
| src_pitch = -src_pitch; |
| } |
| else /* flip only */ |
| { |
| /* move the starting point to the top-right corner of the picture */ |
| pY = (src[0] + src_width - 2); |
| pCb = src[1] + (src_width >> 1) - 1; |
| pCr = src[2] + (src_width >> 1) - 1; |
| deltaY = src_width + (src_pitch << 1); |
| deltaCbCr = (src_width + src_pitch) >> 1; |
| } |
| |
| src_inc = -1; |
| } |
| else // rotate 180 and flip || no rotate, no flip |
| { |
| if (disp[6]) // rotate 180 and flip |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = src[0] + deltaY; |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = - src_pitch; |
| } |
| else // no rotate, no flip |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| dst_width = disp[4]; |
| pY = src[0]; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| src_inc = 1; |
| } |
| |
| pDst = (uint16 *)dst; |
| |
| colpix = _mColPix + disp[3] - 1; |
| |
| for (row = disp[3] - 1; row >= 0; row -= 2) |
| {/* decrement index, _mColPix[.] is |
| symmetric to increment index */ |
| if (colpix[-1] + colpix[0] == 0) |
| { |
| pCb += (src_pitch >> 1); |
| pCr += (src_pitch >> 1); |
| pY += (src_pitch << 1); |
| colpix -= 2; |
| continue; |
| } |
| |
| rowpix = _mRowPix + src_width - 1; |
| |
| if (colpix[-1] + colpix[0] == 1) // one line not skipped |
| { |
| for (col = src_width - 2; col >= 0; col -= 2) |
| { /* decrement index, _mRowPix[.] is |
| symmetric to increment index */ |
| |
| Cb = *pCb; |
| (pCb += src_inc); |
| Cr = *pCr; |
| (pCr += src_inc); |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (*rowpix) /* compute this pixel */ |
| { |
| Y = *pY; |
| (pY += src_inc); //upper left |
| |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + 1024]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| |
| } |
| else /* if(_mRowPix[col]) */ |
| { |
| pY += src_inc; |
| } |
| pDst += *rowpix--; |
| |
| if (*rowpix) /* compute this pixel */ |
| { |
| Y = *pY; |
| (pY += src_inc); //upper right |
| |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + 1024]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| } |
| else /* if(_mRowPix[col+1]) */ |
| { |
| pY += src_inc; |
| } |
| |
| pDst += *rowpix--; |
| }//end of COL |
| |
| } // one line not skipped |
| |
| else //both lines not skipped |
| |
| { |
| for (col = src_width - 2; col >= 0; col -= 2) |
| { /* decrement index, _mRowPix[.] is |
| symmetric to increment index */ |
| |
| Cb = *pCb; |
| (pCb += src_inc); |
| Cr = *pCr; |
| (pCr += src_inc); |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (*rowpix) /* compute this pixel */ |
| { |
| Y = pY[src_pitch]; //lower left |
| |
| Y += OFFSET_5_1; |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + dst_pitch) = (uint16)tmp0; |
| |
| Y = *pY; |
| (pY += src_inc); //upper left |
| |
| Y += OFFSET_5_0; |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| |
| } |
| else /* if(_mRowPix[col]) */ |
| { |
| pY += src_inc; |
| } |
| pDst += *rowpix--; |
| |
| if (*rowpix) /* compute this pixel */ |
| { |
| Y = pY[src_pitch]; //lower left |
| |
| Y += OFFSET_5_0; |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + dst_pitch) = (uint16)tmp0; |
| |
| Y = *pY; |
| (pY += src_inc); //upper right |
| |
| Y += OFFSET_5_1; |
| tmp1 = Y - (Cg >> 16); |
| tmp2 = Y + (Cb >> 16); |
| tmp0 = Y + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| } |
| else /* if(_mRowPix[col+1]) */ |
| { |
| pY += src_inc; |
| } |
| |
| pDst += *rowpix--; |
| }//end of COL |
| |
| pDst += dst_pitch; |
| |
| } |
| |
| pY += (deltaY); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst += dst_pitch - disp[4]; |
| colpix -= 2; |
| |
| } |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| OSCL_UNUSED_ARG(_mRowPix); |
| OSCL_UNUSED_ARG(_mColPix); |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| /* special scaling by one-half */ |
| int32 cc16scalingHalf(uint8 **src, uint8 *dst, int32 *disp, uint8 *coff_tbl) |
| { |
| #if CCSCALING |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width, nextrow; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| if (((disp[6] == 1) && (disp[7] == 1)) || ((disp[6] == 0) && (disp[7] == 0))) |
| { |
| if (disp[6])/* rotate 180 and flip */ |
| { /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else // no rotate,no flip |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| pDst = (uint16 *)dst; |
| |
| for (row = 0; row < disp[3] - 1; row += 2) |
| { |
| for (col = 0; col <= src_width - 1; col += 2) |
| { |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Y = *pY++; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + 1024]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *pDst++ = rgb; |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst -= (disp[4]); |
| pDst += dst_pitch; |
| } |
| } |
| else |
| { |
| if (disp[6])/* rotation 180 only */ |
| { |
| /* move the starting point to the bottom-right corner of the picture */ |
| nextrow = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + nextrow + src_width - 2); |
| nextrow = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + nextrow + (src_width >> 1) - 1; |
| pCr = src[2] + nextrow + (src_width >> 1) - 1; |
| nextrow = -(src_pitch >> 1); |
| deltaY = src_width - (src_pitch << 1); |
| deltaCbCr = (src_width - src_pitch) >> 1; |
| } |
| else /* flip only */ |
| { |
| /* move the starting point to the top-right corner of the picture */ |
| pY = (uint16 *)(src[0] + src_width - 2); |
| pCb = src[1] + (src_width >> 1) - 1; |
| pCr = src[2] + (src_width >> 1) - 1; |
| nextrow = src_pitch >> 1; |
| deltaY = src_width + (src_pitch << 1); |
| deltaCbCr = (src_width + src_pitch) >> 1; |
| } |
| pDst = (uint16 *)dst; |
| for (row = 0; row < disp[3] - 1; row += 2) |
| { |
| for (col = 0; col <= src_width - 1; col += 2) |
| { |
| Cb = *pCb--; |
| Cr = *pCr--; |
| Y = *pY--; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + 1024]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *pDst++ = rgb; |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst -= (disp[4]); |
| pDst += dst_pitch; |
| } |
| } |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| |
| /* special 3:4 scale-down color conversion */ |
| int32 cc16scaling34(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl) |
| { |
| #if CCSCALING |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaDst, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| if (((disp[6] == 0) && (disp[7] == 1)) || ((disp[6] == 1) && (disp[7] == 0))) /* rotate 180 and no flip, rotate 0 and flip *///Ankur |
| { |
| if (disp[6] == 0) |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| else |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| |
| pDst = (uint16 *)dst + disp[4] - 1; |
| deltaDst = (dst_pitch << 1) + disp[4]; /* disp[4] is dst_width */ |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 4) /* do 8 pixels at a time, 4 ups 4 downs */ |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (!(row&0x2)) /* do the bottom row every other times */ |
| { |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst + dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + dst_pitch - 1) = tmp0; /* save right pixel */ |
| } |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *pDst-- = rgb; /* save left pixel */ |
| |
| Y >>= 8; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *pDst-- = tmp0; /* save right pixel */ |
| |
| /* now do another 4 pixels but drop 2 pixels in the last column */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| //load the bottom two pixels |
| if (!(row&0x2)) /* do the bottom row every other times */ |
| { |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *(pDst + dst_pitch) = rgb; /* save only one pixel, 2 bytes */ |
| } |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *pDst = rgb; |
| pDst--; /* save only one pixel, 2 bytes */ |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| if (row&0x2) |
| { |
| pDst -= dst_pitch; |
| } |
| } |
| } |
| else /* rotate 180 and flip || no rotation,no flip*/ |
| { |
| if (disp[6]) /* rotate 180 and flip */ |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else // no rotation,no flip |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| deltaDst = (dst_pitch << 1) - disp[4]; /* disp[4] is dst_width */ |
| pDst = (uint16 *)dst; |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 4) /* do 8 pixels at a time, 4 ups 4 downs */ |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (!(row&0x2)) /* do the bottom row every other times */ |
| { //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst + dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst + dst_pitch + 1) = tmp0; /* save right pixel */ |
| } |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *pDst++ = rgb; /* save left pixel */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *pDst++ = tmp0; /* save right pixel */ |
| |
| /* now do another 4 pixels but drop 2 pixels in the last column */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| //load the bottom two pixels |
| if (!(row&0x2)) /* do the bottom row every other times */ |
| { |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *(pDst + dst_pitch) = rgb; /* save only one pixel, 2 bytes */ |
| } |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *pDst = rgb; |
| pDst++; /* save only one pixel, 2 bytes */ |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| if (row&0x2) |
| { |
| pDst -= dst_pitch; |
| } |
| } |
| } |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| |
| int32 cc16scaleup(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, uint8 *_mColPix) |
| { |
| #if CCSCALING |
| /* 1. move the dst pointer to the line above the border |
| 2. do 2 line conversion |
| 3. copy both up & down |
| */ |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, dst_width, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2, temp; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 offset; |
| uint8 *rowpix, *colpix; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| #ifdef INTERPOLATE |
| int i; |
| uint32 copyline = 0; //maru |
| uint16 *prev_pDst = 0; //maru |
| int32 prev_offset = 0; //maru |
| #endif |
| |
| if (((disp[6] == 0) && (disp[7] == 1)) || ((disp[6] == 1) && (disp[7] == 0))) /* rotate 180 and no flip || rotate 0 and with flip */ //Ankur |
| { |
| if (disp[6] == 0) /*rotate 0 and with flip */ |
| pDst = (uint16 *)dst + disp[4] - 1; |
| else /* rotate 180 and no flip */ |
| { |
| pDst = ((uint16 *)dst) + disp[1] * (disp[5] - 1) + disp[4] - 1; |
| dst_pitch = -dst_pitch; |
| } |
| |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| dst_width = disp[4]; |
| pY = (uint16*)src[0]; |
| pCb = src[1]; |
| pCr = src[2]; |
| src_pitch >>= 1; |
| colpix = _mColPix + disp[3] - 1; |
| |
| for (row = disp[3] - 1; row >= 0; row -= 2) |
| {/* decrement index, _mColPix[.] is |
| symmetric to increment index */ |
| rowpix = _mRowPix + src_width - 1; |
| |
| for (col = src_width - 2; col >= 0; col -= 2) |
| { /* decrement index, _mRowPix[.] is |
| symmetric to increment index */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = Y & 0xFF; //bottom left |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; //bottom right |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| pDst += dst_pitch; |
| temp = rowpix[0] + rowpix[-1]; |
| rowpix -= 2; |
| if (temp == 2) |
| { |
| *pDst = rgb; |
| *(pDst - 1) = tmp0; |
| } |
| else if (temp == 3) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| *(pDst - 2) = tmp0; |
| } |
| else if (temp == 4) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| #endif |
| *(pDst - 3) = tmp0; |
| } |
| else if (temp == 5) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = tmp0; |
| *(pDst - 3) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 3) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 3) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 3) / 4) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(pDst - 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F)) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F)) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F)) / 4) & 0x1F) << 11)); |
| #endif |
| *(pDst - 4) = tmp0; |
| } |
| else /* temp ==6 */ |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = rgb; |
| *(pDst - 3) = tmp0; |
| *(pDst - 4) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 4) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 4) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 4) / 5) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F) * 3) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F) * 3) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F) * 3) / 5) & 0x1F) << 11)); |
| *(pDst - 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F) * 2) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) * 2) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) * 2) / 5) & 0x1F) << 11)); |
| *(pDst - 4) = (((((tmp0 & 0x1F) * 4 + (rgb & 0x1F)) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 4 + ((rgb >> 5) & 0x3F)) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 4 + ((rgb >> 11) & 0x1F)) / 5) & 0x1F) << 11)); |
| #endif |
| *(pDst - 5) = tmp0; |
| } |
| |
| pDst -= dst_pitch; |
| |
| Y = *pY++; |
| tmp0 = Y & 0xFF; //top left |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; //top right |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| if (temp == 2) |
| { |
| *pDst = rgb; |
| *(pDst - 1) = tmp0; |
| } |
| else if (temp == 3) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| *(pDst - 2) = tmp0; |
| } |
| else if (temp == 4) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| #endif |
| *(pDst - 3) = tmp0; |
| } |
| else if (temp == 5) |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = tmp0; |
| *(pDst - 3) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 3) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 3) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 3) / 4) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(pDst - 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F)) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F)) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F)) / 4) & 0x1F) << 11)); |
| #endif |
| *(pDst - 4) = tmp0; |
| } |
| else /* temp ==6 */ |
| { |
| *pDst = rgb; |
| #ifndef INTERPOLATE |
| *(pDst - 1) = rgb; |
| *(pDst - 2) = rgb; |
| *(pDst - 3) = tmp0; |
| *(pDst - 4) = tmp0; |
| #else |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 4) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 4) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 4) / 5) & 0x1F) << 11)); |
| *(pDst - 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F) * 3) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F) * 3) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F) * 3) / 5) & 0x1F) << 11)); |
| *(pDst - 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F) * 2) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) * 2) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) * 2) / 5) & 0x1F) << 11)); |
| *(pDst - 4) = (((((tmp0 & 0x1F) * 4 + (rgb & 0x1F)) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 4 + ((rgb >> 5) & 0x3F)) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 4 + ((rgb >> 11) & 0x1F)) / 5) & 0x1F) << 11)); |
| #endif |
| *(pDst - 5) = tmp0; |
| } |
| pDst -= temp; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst++; // goes back to the beginning of the line |
| |
| #ifdef INTERPOLATE |
| |
| if (copyline&0x1) //Maruyama comment:BLACK line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset, prev_pDst + dst_pitch, dst_width*2); |
| } |
| if (copyline&0x2) //Maruyama comment:BLUE line in SubQCIF.bmp |
| { |
| for (i = 0 ; i < dst_width ; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| // int32 curtemp = *(pDst+dst_pitch+i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch+i) = 0x1F; |
| } |
| } |
| |
| if (copyline&0x4) |
| { |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| // int32 curtemp = *(pDst+dst_pitch+i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch+i) = 0x3F<<5; |
| } |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| int32 curtemp = *(pDst + dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch*2 + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch*2+i) = 0x1F<<11; |
| } |
| } |
| |
| if (copyline&0x8) //Maruyama comment:WHITE line in SubQCIF.bmp |
| { |
| for (i = 0 ; i < dst_width ; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *(pDst - dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch+i) = 0xFFFF; |
| } |
| } |
| |
| if (copyline&0x10) |
| { |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| // int32 curtemp = *(pDst+i); |
| int32 curtemp = *(pDst - dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch+i) = 0x1F|(0x3F<<5); |
| } |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch*2 + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch*2+i) = 0x1F|(0x1F<<11); |
| } |
| } |
| #endif |
| //copy down |
| offset = (colpix[0] * dst_pitch); |
| |
| #ifdef INTERPOLATE |
| copyline = 0; //maru |
| prev_pDst = pDst; //maru |
| prev_offset = offset; //maru |
| #endif |
| if (colpix[-1] && colpix[0] != 1) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x1; //maru |
| #endif |
| } |
| if (colpix[-1] == 2) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x2; //maru |
| #endif |
| } |
| else if (colpix[-1] == 3) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| oscl_memcpy(pDst + offset + dst_pitch*2, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x4; //maru |
| #endif |
| } |
| //copy up |
| if (colpix[0] == 2) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + dst_pitch, pDst, dst_width*2); |
| #else |
| copyline |= 0x8; //maru |
| #endif |
| } |
| else if (colpix[0] == 3) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + dst_pitch, pDst, dst_width*2); |
| oscl_memcpy(pDst + dst_pitch*2, pDst, dst_width*2); |
| #else |
| copyline |= 0x10; //maru |
| #endif |
| } |
| |
| pDst += dst_pitch * (colpix[-1] + colpix[0]) + dst_width - 1; |
| colpix -= 2; |
| }//end of row |
| |
| #ifdef INTERPOLATE |
| |
| if (copyline&0x1) //Maruyama comment:BLACK line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset, prev_pDst + dst_pitch, dst_width*2); |
| } |
| if (copyline&0x2) //Maruyama comment:BLUE line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset + dst_pitch, prev_pDst + dst_pitch, dst_width*2); |
| } |
| |
| if (copyline&0x4) |
| { |
| oscl_memcpy(prev_pDst + offset + dst_pitch, prev_pDst + dst_pitch, dst_width*2); |
| oscl_memcpy(prev_pDst + offset + dst_pitch*2, prev_pDst + dst_pitch, dst_width*2); |
| } |
| #endif |
| } |
| else /* rotate 180 and with flip || no rotation ,no flip */ |
| { |
| if (disp[6] == 1) /* rotate 180 and with flip */ //Ankur |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16 *)src[0] + (deltaY >> 1); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + (deltaY >> 0); |
| pCr = src[2] + (deltaY >> 0); |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| dst_width = disp[4]; |
| src_pitch >>= 1; |
| src_pitch = -src_pitch; |
| } |
| else |
| { // only scale up, no rotation ,no flip |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| dst_width = disp[4]; |
| src_pitch >>= 1; |
| pY = (uint16*)src[0]; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| pDst = (uint16 *)dst; |
| colpix = _mColPix + disp[3] - 1; |
| |
| for (row = disp[3] - 1; row >= 0; row -= 2) |
| {/* decrement index, _mColPix[.] is |
| symmetric to increment index */ |
| rowpix = _mRowPix + src_width - 1; |
| |
| for (col = src_width - 2; col >= 0; col -= 2) |
| { /* decrement index, _mRowPix[.] is |
| symmetric to increment index */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Y = pY[src_pitch]; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| tmp0 = Y & 0xFF; //bottom left |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; //bottom right |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| pDst += dst_pitch; |
| temp = rowpix[0] + rowpix[-1]; |
| rowpix -= 2; |
| if (temp == 2) |
| { |
| *pDst = (uint16)rgb; |
| *(pDst + 1) = (uint16)tmp0; |
| } |
| else if (temp == 3) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| *(pDst + 2) = (uint16)tmp0; |
| } |
| else if (temp == 4) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| #endif |
| *(pDst + 3) = (uint16)tmp0; |
| } |
| else if (temp == 5) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)tmp0; |
| *(pDst + 3) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 3) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 3) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 3) / 4) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(pDst + 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F)) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F)) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F)) / 4) & 0x1F) << 11)); |
| #endif |
| *(pDst + 4) = (uint16)tmp0; |
| } |
| else /* temp ==6 */ |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)rgb; |
| *(pDst + 3) = (uint16)tmp0; |
| *(pDst + 4) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 4) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 4) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 4) / 5) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F) * 3) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F) * 3) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F) * 3) / 5) & 0x1F) << 11)); |
| *(pDst + 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F) * 2) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) * 2) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) * 2) / 5) & 0x1F) << 11)); |
| *(pDst + 4) = (((((tmp0 & 0x1F) * 4 + (rgb & 0x1F)) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 4 + ((rgb >> 5) & 0x3F)) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 4 + ((rgb >> 11) & 0x1F)) / 5) & 0x1F) << 11)); |
| #endif |
| *(pDst + 5) = (uint16)tmp0; |
| } |
| |
| pDst -= dst_pitch; |
| |
| Y = *pY++; |
| tmp0 = Y & 0xFF; //top left |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; //top right |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| if (temp == 2) |
| { |
| *pDst = (uint16)rgb; |
| *(pDst + 1) = (uint16)tmp0; |
| } |
| else if (temp == 3) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| *(pDst + 2) = (uint16)tmp0; |
| } |
| else if (temp == 4) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| #endif |
| *(pDst + 3) = (uint16)tmp0; |
| } |
| else if (temp == 5) |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)tmp0; |
| *(pDst + 3) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 3) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 3) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 3) / 4) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(pDst + 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F)) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F)) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F)) / 4) & 0x1F) << 11)); |
| #endif |
| *(pDst + 4) = (uint16)tmp0; |
| } |
| else /* temp ==6 */ |
| { |
| *pDst = (uint16)rgb; |
| #ifndef INTERPOLATE |
| *(pDst + 1) = (uint16)rgb; |
| *(pDst + 2) = (uint16)rgb; |
| *(pDst + 3) = (uint16)tmp0; |
| *(pDst + 4) = (uint16)tmp0; |
| #else |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F) * 4) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 4) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 4) / 5) & 0x1F) << 11)); |
| *(pDst + 2) = (((((tmp0 & 0x1F) * 2 + (rgb & 0x1F) * 3) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F) * 3) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F) * 3) / 5) & 0x1F) << 11)); |
| *(pDst + 3) = (((((tmp0 & 0x1F) * 3 + (rgb & 0x1F) * 2) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) * 2) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) * 2) / 5) & 0x1F) << 11)); |
| *(pDst + 4) = (((((tmp0 & 0x1F) * 4 + (rgb & 0x1F)) / 5) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) * 4 + ((rgb >> 5) & 0x3F)) / 5) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) * 4 + ((rgb >> 11) & 0x1F)) / 5) & 0x1F) << 11)); |
| #endif |
| *(pDst + 5) = (uint16)tmp0; |
| } |
| pDst += temp; |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst -= (disp[4]); //goes back to the beginning of the line; |
| |
| #ifdef INTERPOLATE |
| |
| if (copyline&0x1) //Maruyama comment:BLACK line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset, prev_pDst + dst_pitch, dst_width*2); |
| } |
| if (copyline&0x2) //Maruyama comment:BLUE line in SubQCIF.bmp |
| { |
| for (i = 0 ; i < dst_width ; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| // int32 curtemp = *(pDst+dst_pitch+i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch+i) = 0x1F; |
| } |
| } |
| |
| if (copyline&0x4) |
| { |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| // int32 curtemp = *(pDst+dst_pitch+i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch+i) = 0x3F<<5; |
| } |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + dst_pitch + i); |
| int32 curtemp = *(pDst + dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + prev_offset + dst_pitch*2 + i) = (uint16)coltemp; |
| // *(prev_pDst+prev_offset+dst_pitch*2+i) = 0x1F<<11; |
| } |
| } |
| |
| if (copyline&0x8) //Maruyama comment:WHITE line in SubQCIF.bmp |
| { |
| for (i = 0 ; i < dst_width ; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *(pDst - dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch+i) = 0xFFFF; |
| } |
| } |
| |
| if (copyline&0x10) |
| { |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| // int32 curtemp = *(pDst+i); |
| int32 curtemp = *(pDst - dst_pitch + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch+i) = 0x1F|(0x3F<<5); |
| } |
| for (i = 0 ; i < dst_width ; i++) //Maruyama comment:Not appeared in SubQCIF.bmp |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *(pDst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch*2 + i) = (uint16)coltemp; |
| // *(prev_pDst+dst_pitch*2+i) = 0x1F|(0x1F<<11); |
| } |
| } |
| #endif |
| //copy down |
| offset = (colpix[0] * dst_pitch); |
| |
| #ifdef INTERPOLATE |
| copyline = 0; //maru |
| prev_pDst = pDst; //maru |
| prev_offset = offset; //maru |
| #endif |
| if (colpix[-1] && colpix[0] != 1) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x1; //maru |
| #endif |
| } |
| if (colpix[-1] == 2) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x2; //maru |
| #endif |
| } |
| else if (colpix[-1] == 3) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| oscl_memcpy(pDst + offset + dst_pitch*2, pDst + dst_pitch, dst_width*2); |
| #else |
| copyline |= 0x4; //maru |
| #endif |
| } |
| |
| //copy up |
| if (colpix[0] == 2) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + dst_pitch, pDst, dst_width*2); |
| #else |
| copyline |= 0x8; //maru |
| #endif |
| } |
| else if (colpix[0] == 3) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(pDst + dst_pitch, pDst, dst_width*2); |
| oscl_memcpy(pDst + dst_pitch*2, pDst, dst_width*2); |
| #else |
| copyline |= 0x10; //maru |
| #endif |
| } |
| |
| pDst += dst_pitch * (colpix[-1] + colpix[0]); |
| colpix -= 2; |
| }//end of row |
| |
| #ifdef INTERPOLATE |
| if (copyline&0x1) //Maruyama comment:BLACK line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset, prev_pDst + dst_pitch, dst_width*2); |
| } |
| if (copyline&0x2) //Maruyama comment:BLUE line in SubQCIF.bmp |
| { |
| oscl_memcpy(prev_pDst + offset + dst_pitch, prev_pDst + dst_pitch, dst_width*2); |
| } |
| |
| if (copyline&0x4) |
| { |
| oscl_memcpy(prev_pDst + offset + dst_pitch, prev_pDst + dst_pitch, dst_width*2); |
| oscl_memcpy(prev_pDst + offset + dst_pitch*2, prev_pDst + dst_pitch, dst_width*2); |
| } |
| #endif |
| } |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| OSCL_UNUSED_ARG(_mRowPix); |
| OSCL_UNUSED_ARG(_mColPix); |
| |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| /* special 5:4 scale-up color conversion */ |
| int32 cc16scaling54(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl) |
| { |
| #if CCSCALING |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaDst, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb1, rgb2; |
| int32 tmp01, tmp02; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| #ifdef INTERPOLATE |
| int copyline = 0, i; |
| uint16 *pFifth, *previous, *current; |
| #endif |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| |
| if (((disp[6] == 1) && (disp[7] == 0)) || ((disp[6] == 0) && (disp[7] == 1))) /* rotate 180, no flip || rotate 0 and flip */ |
| { |
| if (disp[6]) |
| { |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| |
| deltaDst = (dst_pitch << 1) + disp[4] - 1; /* disp[4] is dst_width */ |
| pDst = (uint16 *)dst + disp[4] - 1; |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 4) /* do 8 pixels at a time, 4 ups 2 downs */ |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst + dst_pitch) = rgb; // i1 = p1;/* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp02 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch - 1) = (((((tmp02 & 0x1F) * 3 + (rgb & 0x1F) + 2) / 4) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) + 2) / 4) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) + 2) / 4) & 0x1F) << 11)); |
| //i2 = (p1 + 3*p2 + 2)>>2; |
| #else |
| *(pDst + dst_pitch - 1) = tmp02; /* save right pixel */ |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *pDst-- = rgb; // i1 = p1; /* save left pixel */ |
| |
| Y >>= 8; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp01 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *(pDst--) = (((((tmp01 & 0x1F) * 3 + (rgb & 0x1F) + 2) / 4) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) + 2) / 4) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) + 2) / 4) & 0x1F) << 11)); |
| //i2 = (p1 + 3*p2 + 2)>>2; |
| #else |
| *pDst-- = tmp01; /* save right pixel */ |
| #endif |
| /* now do another 4 pixels add 1 pixels in the last column */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb2 = tmp2 | (rgb << 5); |
| |
| #ifdef INTERPOLATE |
| // i3 = (p2 + p3 + 1)>>1; |
| *(pDst + dst_pitch) = (((((tmp02 & 0x1F) + (rgb2 & 0x1F) + 1) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb2 >> 5) & 0x3F) + 1) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb2 >> 11) & 0x1F) + 1) / 2) & 0x1F) << 11)); |
| #else |
| *(pDst + dst_pitch) = rgb2; /* save left pixel, have to save separately */ |
| #endif |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| //i4 = (3*p3 + p4 + 2)>>2; |
| *(pDst + dst_pitch - 1) = (((((tmp0 & 0x1F) + (rgb2 & 0x1F) * 3 + 1) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb2 >> 5) & 0x3F) * 3 + 1) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb2 >> 11) & 0x1F) * 3 + 1) / 4) & 0x1F) << 11)); |
| #else |
| *(pDst + dst_pitch - 1) = tmp0; /* save right pixel */ |
| #endif |
| *(pDst + dst_pitch - 2) = tmp0; // i5 = p4; /* save right pixel */ |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb1 = tmp2 | (rgb << 5); |
| |
| #ifdef INTERPOLATE |
| *pDst-- = (((((tmp01 & 0x1F) + (rgb1 & 0x1F) + 1) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb1 >> 5) & 0x3F) + 1) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb1 >> 11) & 0x1F) + 1) / 2) & 0x1F) << 11)); |
| #else |
| *pDst-- = rgb1; /* save left pixel */ |
| #endif |
| |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *pDst-- = (((((tmp0 & 0x1F) + (rgb1 & 0x1F) * 3 + 1) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb1 >> 5) & 0x3F) * 3 + 1) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb1 >> 11) & 0x1F) * 3 + 1) / 4) & 0x1F) << 11)); |
| #else |
| *pDst-- = tmp0; /* save right pixel */ |
| #endif |
| *pDst-- = tmp0; /* save right pixel */ |
| |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst++; // go back to the beginning of the line |
| if (!(row&0x3)) |
| { |
| oscl_memcpy(pDst + (dst_pitch << 1), pDst + dst_pitch, 2*disp[4]); |
| pDst += dst_pitch; |
| #ifdef INTERPOLATE |
| previous = pDst - dst_pitch; |
| |
| for (i = 0; i < disp[4]; i++) // linear interpolation |
| { |
| int32 last = previous[i]; |
| int32 curr = pDst[i]; |
| pDst[i] = (((((last & 0x1F) + (curr & 0x1F)) / 2) & 0x1F) |
| | ((((((last >> 5) & 0x3F) + ((curr >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((last >> 11) & 0x1F) + ((curr >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| #endif |
| } |
| |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| } |
| } |
| else |
| { |
| if (disp[6]) /* rotate 180 and flip */ |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else // no rotation,no flip,only scale |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| |
| } |
| |
| deltaDst = (dst_pitch << 1) - disp[4]; /* disp[4] is dst_width */ |
| pDst = (uint16 *)dst; |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| |
| for (col = src_width - 1; col >= 0; col -= 4) /* do 8 pixels at a time, 4 ups 2 downs */ |
| { |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst + dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp02 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch + 1) = (((((tmp02 & 0x1F) * 3 + (rgb & 0x1F) + 2) / 4) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) + 2) / 4) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) + 2) / 4) & 0x1F) << 11)); |
| //i2 = (p1 + 3*p2 + 2)>>2; |
| #else |
| *(pDst + dst_pitch + 1) = tmp02; /* save right pixel */ |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *pDst++ = rgb; /* save left pixel */ |
| |
| Y >>= 8; |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp01 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *(pDst++) = (((((tmp01 & 0x1F) * 3 + (rgb & 0x1F) + 2) / 4) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) * 3 + ((rgb >> 5) & 0x3F) + 2) / 4) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) * 3 + ((rgb >> 11) & 0x1F) + 2) / 4) & 0x1F) << 11)); |
| //i2 = (p1 + 3*p2 + 2)>>2; |
| #else |
| *pDst++ = tmp01; /* save right pixel */ |
| #endif |
| /* now do another 4 pixels add 1 pixels in the last column */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb2 = tmp2 | (rgb << 5); |
| #ifdef INTERPOLATE |
| // i3 = (p2 + p3 + 1)>>1; |
| *(pDst + dst_pitch) = (((((tmp02 & 0x1F) + (rgb2 & 0x1F) + 1) / 2) & 0x1F) |
| | ((((((tmp02 >> 5) & 0x3F) + ((rgb2 >> 5) & 0x3F) + 1) / 2) & 0x3F) << 5) |
| | ((((((tmp02 >> 11) & 0x1F) + ((rgb2 >> 11) & 0x1F) + 1) / 2) & 0x1F) << 11)); |
| #else |
| *(pDst + dst_pitch) = rgb2; /* save left pixel, have to save separately */ |
| #endif |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch + 1) = (((((tmp0 & 0x1F) + (rgb2 & 0x1F) * 3 + 1) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb2 >> 5) & 0x3F) * 3 + 1) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb2 >> 11) & 0x1F) * 3 + 1) / 4) & 0x1F) << 11)); |
| #else |
| *(pDst + dst_pitch + 1) = tmp0; /* save right pixel */ |
| #endif |
| *(pDst + dst_pitch + 2) = tmp0; /* save right pixel */ //Ankur |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb1 = tmp2 | (rgb << 5); |
| #ifdef INTERPOLATE |
| *pDst++ = (((((tmp01 & 0x1F) + (rgb1 & 0x1F) + 1) / 2) & 0x1F) |
| | ((((((tmp01 >> 5) & 0x3F) + ((rgb1 >> 5) & 0x3F) + 1) / 2) & 0x3F) << 5) |
| | ((((((tmp01 >> 11) & 0x1F) + ((rgb1 >> 11) & 0x1F) + 1) / 2) & 0x1F) << 11)); |
| #else |
| *pDst++ = rgb1; /* save left pixel */ |
| #endif |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| *pDst++ = (((((tmp0 & 0x1F) + (rgb1 & 0x1F) * 3 + 1) / 4) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb1 >> 5) & 0x3F) * 3 + 1) / 4) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb1 >> 11) & 0x1F) * 3 + 1) / 4) & 0x1F) << 11)); |
| #else |
| *pDst++ = tmp0; /* save right pixel */ |
| #endif |
| *pDst++ = tmp0; /* save right pixel */ // Ankur |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| pDst += (deltaDst); //coz pDst defined as UINT * |
| |
| /************ |
| interpolating 3rd row in between |
| row1 |
| row2 |
| inter1 |
| row3 |
| row4 |
| **************/ |
| |
| if (!(row&0x3)) |
| { |
| #ifdef INTERPOLATE |
| pFifth = pDst; // interpolating 3rd line in between |
| copyline = 0; |
| #else |
| oscl_memcpy(pDst, pDst - dst_pitch, 2*disp[4]); |
| #endif |
| pDst += dst_pitch; |
| } |
| #ifdef INTERPOLATE |
| if (copyline) |
| { |
| previous = pFifth - dst_pitch; |
| current = pDst - (dst_pitch * 2); |
| |
| for (i = 0; i < disp[4]; i++) // linear interpolation |
| { |
| int32 last = previous[i]; |
| int32 curr = current[i]; |
| pFifth[i] = (((((last & 0x1F) + (curr & 0x1F)) / 2) & 0x1F) |
| | ((((((last >> 5) & 0x3F) + ((curr >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((last >> 11) & 0x1F) + ((curr >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| |
| } |
| |
| copyline++; |
| #endif |
| } |
| } |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| /* special 4:3 scale-up color conversion */ |
| int32 cc16scaling43(uint8 **src, uint8 *dst, |
| int32 *disp, uint8 *coff_tbl) |
| { |
| #if CCSCALING |
| uint8 *pCb, *pCr; |
| uint16 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, deltaCbCr; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 col3, row3; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| #ifdef INTERPOLATE |
| int i; |
| uint32 copyline = 0; //maru |
| uint16 *prev_pDst = 0; //maru |
| int32 prev_offset = 0; //maru |
| #endif |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| |
| if (((disp[6] == 0 && disp[7] == 1)) || ((disp[6] == 1) && (disp[7] == 0))) /* rotate 0 and flip // rotate 180, no flip*/ |
| { |
| if (disp[6] == 0) |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| else |
| { /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| |
| pDst = ((uint16 *)dst) + disp[4] - 1; |
| row3 = 2; |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| col3 = 2; |
| if (row3 == 1) |
| { |
| dst_pitch <<= 1; |
| } |
| |
| for (col = src_width - 1; col >= 0; col -= 4) |
| { /* do 8 pixels at a time, 2 ups 2 downs */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst += dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| if (col3 == 0) |
| { |
| #ifndef INTERPOLATE |
| //*(++pDst) = rgb; /* repeat this pixel */ |
| *(--pDst) = rgb; /* repeat this pixel */ |
| #else |
| *(--pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| } |
| #ifndef INTERPOLATE |
| //*(pDst+1) = tmp0; /* save right pixel */Ankur |
| *(pDst - 1) = tmp0; /* save right pixel */ |
| if (col3 == 1) |
| { |
| //*(pDst+2) = tmp0; /* repeat this pixel */Ankur |
| *(pDst - 2) = tmp0; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 1) |
| { |
| *(pDst - 1) = tmp0; |
| } |
| else |
| { |
| *(pDst - 2) = tmp0; |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| #endif |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifndef INTERPOLATE |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| if (col3 == 0) |
| { |
| pDst[1] = rgb; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| } |
| else |
| { |
| *(pDst -= dst_pitch) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pDst[1] = rgb; |
| } |
| #endif |
| #ifndef INTERPOLATE |
| *(--pDst) = tmp0; /* save right pixel */ |
| if (col3 == 1) |
| { |
| *(--pDst) = tmp0; /* save right pixel */ |
| } |
| #else |
| if (col3 != 1) |
| { |
| *(--pDst) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(--pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(--pDst) = tmp0; |
| } |
| #endif |
| |
| pDst--; |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst += dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| if (col3 == 2) |
| { |
| #ifndef INTERPOLATE |
| *(--pDst) = rgb; |
| #else |
| *(--pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| } |
| |
| #ifndef INTERPOLATE |
| *(pDst - 1) = tmp0; /* save right pixel */ |
| if (col3 == 0) |
| { |
| *(pDst - 2) = tmp0; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(pDst - 1) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(pDst - 2) = tmp0; /* save right pixel */ |
| *(pDst - 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| #endif |
| |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| #ifndef INTERPOLATE |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| if (col3 == 2) |
| { |
| pDst[1] = rgb; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 2) |
| { |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| } |
| else |
| { |
| *(pDst -= dst_pitch) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pDst[1] = rgb; |
| } |
| #endif |
| |
| #ifndef INTERPOLATE |
| *(--pDst) = tmp0; /* save right pixel */ |
| if (col3 == 0) |
| { |
| *(--pDst) = tmp0; |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(--pDst) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(--pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(--pDst) = tmp0; /* save right pixel */ |
| } |
| #endif |
| |
| pDst--; |
| |
| col3--; |
| if (col3 < 0) |
| { |
| col3 = 2; |
| } |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| if (row3 == 1) |
| { |
| dst_pitch >>= 1; |
| } |
| dst += (dst_pitch << 2); |
| |
| if (row3 == 1) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(dst - (dst_pitch << 1), dst - (dst_pitch << 2), 2*disp[4]); |
| #else |
| prev_pDst = (uint16*)(dst - (dst_pitch << 2)); |
| for (i = 0; i < dst_pitch; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *((uint16*)dst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| } |
| #endif |
| dst += (dst_pitch << 1); |
| } |
| else if (row3 == 0) |
| { |
| oscl_memcpy(dst, dst - (dst_pitch << 1), 2*disp[4]); |
| #ifdef INTERPOLATE |
| prev_pDst = (uint16*)(dst - (dst_pitch << 2)); |
| for (i = 0; i < dst_pitch; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *((uint16*)dst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| } |
| #endif |
| dst += (dst_pitch << 1); |
| } |
| row3--; |
| |
| if (row3 < 0) |
| { |
| row3 = 2; |
| } |
| |
| pDst = ((uint16*)dst) + disp[4] - 1; |
| } |
| } |
| else /* rotate 180 and flip || no rotation,no flip */ |
| { |
| if (disp[6]) /* rotate 180 and flip */ |
| { |
| /* move the starting point to the bottom-left corner of the picture */ |
| deltaY = src_pitch * (disp[3] - 1); |
| pY = (uint16*)(src[0] + deltaY); |
| deltaY = (src_pitch >> 1) * ((disp[3] >> 1) - 1); |
| pCb = src[1] + deltaY; |
| pCr = src[2] + deltaY; |
| deltaY = -src_width - (src_pitch << 1); |
| deltaCbCr = -((src_width + src_pitch) >> 1); |
| src_pitch = -(src_pitch >> 1); |
| } |
| else // no rotation,no flip |
| { |
| deltaY = (src_pitch << 1) - src_width; |
| deltaCbCr = (src_pitch - src_width) >> 1; |
| pY = (uint16 *) src[0]; |
| src_pitch >>= 1; |
| pCb = src[1]; |
| pCr = src[2]; |
| } |
| pDst = (uint16 *)dst; |
| row3 = 2; |
| |
| for (row = disp[3]; row > 0; row -= 2) |
| { |
| col3 = 2; |
| |
| if (row3 == 1) |
| { |
| dst_pitch <<= 1; |
| } |
| |
| for (col = src_width - 1; col >= 0; col -= 4) |
| { /* do 8 pixels at a time, 2 ups 2 downs */ |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| *(pDst += dst_pitch) = rgb; /* save left pixel, have to save separately */ |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| if (col3 == 0) |
| { |
| #ifndef INTERPOLATE |
| *(++pDst) = rgb; /* repeat this pixel */ |
| #else |
| *(++pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| } |
| |
| #ifndef INTERPOLATE |
| *(pDst + 1) = tmp0; /* save right pixel */ |
| if (col3 == 1) |
| { |
| *(pDst + 2) = tmp0; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 1) |
| { |
| *(pDst + 1) = tmp0; |
| } |
| else |
| { |
| *(pDst + 2) = tmp0; |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifndef INTERPOLATE |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| if (col3 == 0) |
| { |
| pDst[-1] = rgb; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| } |
| else |
| { |
| *(pDst -= dst_pitch) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pDst[-1] = rgb; |
| } |
| #endif |
| |
| #ifndef INTERPOLATE |
| *(++pDst) = tmp0; /* save right pixel */ |
| if (col3 == 1) |
| { |
| *(++pDst) = tmp0; /* save right pixel */ |
| } |
| #else |
| if (col3 != 1) |
| { |
| *(++pDst) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(++pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(++pDst) = tmp0; |
| } |
| #endif |
| pDst++; |
| |
| Cb = *pCb++; |
| Cr = *pCr++; |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| //load the bottom two pixels |
| Y = pY[src_pitch]; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| *(pDst += dst_pitch) = rgb; |
| |
| Y >>= 8; |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| if (col3 == 2) |
| { |
| #ifndef INTERPOLATE |
| *(++pDst) = rgb; /* repeat this pixel */ |
| #else |
| *(++pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| #endif |
| } |
| |
| #ifndef INTERPOLATE |
| *(pDst + 1) = tmp0; /* save right pixel */ |
| if (col3 == 0) |
| { |
| *(pDst + 2) = tmp0; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(pDst + 1) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(pDst + 2) = tmp0; /* save right pixel */ |
| *(pDst + 1) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| } |
| #endif |
| //load the top two pixels |
| Y = *pY++; |
| |
| tmp0 = Y & 0xFF; //Low endian left pixel |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y >>= 8; |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| #ifndef INTERPOLATE |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| if (col3 == 2) |
| { |
| pDst[-1] = rgb; /* repeat this pixel */ |
| } |
| #else |
| if (col3 != 2) |
| { |
| *(pDst -= dst_pitch) = rgb; /* save left pixel */ |
| } |
| else |
| { |
| *(pDst -= dst_pitch) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| pDst[-1] = rgb; |
| } |
| #endif |
| |
| #ifndef INTERPOLATE |
| *(++pDst) = tmp0; /* save right pixel */ |
| if (col3 == 0) |
| { |
| *(++pDst) = tmp0; /* save right pixel */ |
| } |
| #else |
| if (col3 != 0) |
| { |
| *(++pDst) = tmp0; /* save right pixel */ |
| } |
| else |
| { |
| *(++pDst) = (((((tmp0 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((tmp0 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((tmp0 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(++pDst) = tmp0; /* save right pixel */ |
| } |
| #endif |
| pDst++; |
| |
| col3--; |
| if (col3 < 0) |
| { |
| col3 = 2; |
| } |
| }//end of COL |
| |
| pY += (deltaY >> 1); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| if (row3 == 1) |
| { |
| dst_pitch >>= 1; |
| } |
| dst += (dst_pitch << 2); |
| if (row3 == 1) |
| { |
| #ifndef INTERPOLATE |
| oscl_memcpy(dst - (dst_pitch << 1), dst - (dst_pitch << 2), 2*disp[4]); |
| #else |
| prev_pDst = (uint16*)(dst - (dst_pitch << 2)); |
| for (i = 0; i < dst_pitch; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *((uint16*)dst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| } |
| #endif |
| dst += (dst_pitch << 1); |
| } |
| else if (row3 == 0) |
| { |
| oscl_memcpy(dst, dst - (dst_pitch << 1), 2*disp[4]); |
| |
| #ifdef INTERPOLATE |
| prev_pDst = (uint16*)(dst - (dst_pitch << 2)); |
| for (i = 0; i < dst_pitch; i++) |
| { |
| int32 coltemp; |
| int32 pretemp = *(prev_pDst + i); |
| int32 curtemp = *((uint16*)dst + i); |
| coltemp = (((((pretemp & 0x1F) + (curtemp & 0x1F)) / 2) & 0x1F) |
| | ((((((pretemp >> 5) & 0x3F) + ((curtemp >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((pretemp >> 11) & 0x1F) + ((curtemp >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| *(prev_pDst + dst_pitch + i) = (uint16)coltemp; |
| } |
| #endif |
| dst += (dst_pitch << 1); |
| } |
| |
| row3--; |
| if (row3 < 0) |
| { |
| row3 = 2; |
| } |
| |
| pDst = (uint16*)dst; |
| } |
| } |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| |
| return 0; |
| #endif // CCSCALING |
| } |
| |
| |
| // platform specfic function in C |
| int32 cc16sc_rotate(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, |
| uint8 *_mColPix, bool _mIsRotateClkwise, int32 flip); // ankur |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Note:: This zoom algorithm needs an extra line of RGB buffer. So, users |
| // have to use GetRGBBufferSize API to get the size it needs. See GetRGBBufferSize(). |
| int32 ColorConvert16::cc16ZoomRotate(uint8 **src, uint8 *dst, |
| DisplayProperties *disp, uint8 *coff_tbl) |
| { |
| int32 disp_prop[6]; |
| int32 flip; // ankur |
| |
| disp_prop[0] = disp->src_pitch; |
| disp_prop[1] = disp->dst_pitch; |
| disp_prop[2] = disp->src_width; |
| disp_prop[3] = disp->src_height; |
| disp_prop[4] = disp->dst_width; |
| disp_prop[5] = disp->dst_height; |
| |
| flip = _mIsFlip; |
| return cc16sc_rotate(src, dst, disp_prop, coff_tbl, _mRowPix, _mColPix, (_mRotation == CCROTATE_CLKWISE), flip); |
| } |
| |
| int32 cc16sc_rotate(uint8 **src, uint8 *dst, int32 *disp, |
| uint8 *coff_tbl, uint8 *_mRowPix, |
| uint8 *_mColPix, bool _mIsRotateClkwise, int32 flip) // ankur |
| { |
| #if (CCROTATE && CCSCALING) |
| /* 1. move the dst pointer to the line above the border |
| 2. do 2 line conversion |
| 3. copy both up & down |
| */ |
| uint8 *pCb, *pCr; |
| uint8 *pY; |
| uint16 *pDst; |
| int32 src_pitch, dst_pitch, src_width; |
| int32 Y, Cb, Cr, Cg; |
| int32 deltaY, dst_width, deltaCbCr, dst_inc, dst_start_pos; |
| int32 row, col; |
| int32 tmp0, tmp1, tmp2; |
| uint32 rgb; |
| uint8 *clip = coff_tbl + 400; |
| int32 offset; |
| int32 cc1 = (*((int32*)(clip - 400))); |
| int32 cc3 = (*((int32*)(clip - 396))); |
| int32 cc2 = (*((int32*)(clip - 392))); |
| int32 cc4 = (*((int32*)(clip - 388))); |
| |
| src_pitch = disp[0]; |
| dst_pitch = disp[1]; |
| src_width = disp[2]; |
| dst_width = disp[4]; |
| |
| #ifdef INTERPOLATE |
| int32 prgb1; |
| int32 prgb2; |
| int32 prgb3; |
| int32 prgb4; |
| #endif |
| |
| if (_mIsRotateClkwise) |
| { |
| deltaY = src_pitch * disp[3] + 2; |
| deltaCbCr = ((src_pitch * disp[3]) >> 2) + 1; |
| } |
| else // rotate counterclockwise |
| { |
| deltaY = -(src_pitch * disp[3] + 2); |
| deltaCbCr = -(((src_pitch * disp[3]) >> 2) + 1); |
| } |
| |
| // map origin of the destination to the source |
| if (_mIsRotateClkwise) |
| { |
| pY = src[0] + src_pitch * (disp[3] - 1); |
| pCb = src[1] + ((src_pitch >> 1) * ((disp[3] >> 1) - 1)); |
| pCr = src[2] + ((src_pitch >> 1) * ((disp[3] >> 1) - 1)); |
| } |
| else // rotate counterclockwise |
| { |
| pY = src[0] + src_width - 1; |
| pCb = src[1] + (src_width >> 1) - 1; |
| pCr = src[2] + (src_width >> 1) - 1; |
| } |
| |
| int32 half_src_pitch, read_idx, tmp_src_pitch; |
| if (_mIsRotateClkwise) |
| { |
| half_src_pitch = -(src_pitch >> 1); |
| read_idx = 1; |
| tmp_src_pitch = -src_pitch; |
| } |
| else // rotate counterclockwise |
| { |
| half_src_pitch = (src_pitch >> 1); |
| read_idx = -1; |
| tmp_src_pitch = src_pitch; |
| } |
| |
| if (flip == 0) |
| { |
| dst_start_pos = 0; |
| dst_inc = 1; |
| } |
| else |
| { |
| dst_start_pos = disp[4] - 1; |
| dst_inc = -1; |
| } |
| |
| pDst = (uint16 *)dst + dst_start_pos; |
| |
| for (row = src_width - 1; row > 0; row -= 2) |
| { /* decrement index, _mColPix[.] is symmetric to increment index */ |
| |
| if ((_mColPix[row-1] == 0) && (_mColPix[row] == 0)) |
| { |
| pCb += read_idx; |
| pCr += read_idx; |
| pY += (read_idx * 2); |
| continue; |
| } |
| |
| if (_mColPix[row-1] + _mColPix[row] == 1) // do only one row, scale down |
| { |
| for (col = disp[3] - 2; col >= 0; col -= 2) |
| {/* decrement index, _mRowPix[.] is symmetric to increment index */ |
| Cb = *pCb; |
| pCb += half_src_pitch; |
| Cr = *pCr; |
| pCr += half_src_pitch; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (_mRowPix[col]) /* compute this pixel */ |
| { |
| tmp0 = pY[read_idx]; //bottom left |
| |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = *pY; |
| pY += tmp_src_pitch; //upper left |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| |
| } /* if(_mRowPix[col]) */ |
| else |
| { |
| pY += tmp_src_pitch; |
| } |
| |
| pDst += (dst_inc > 0 ? _mRowPix[col] : -_mRowPix[col]); |
| |
| if (_mRowPix[col+1]) /* compute this pixel */ |
| { |
| tmp0 = pY[read_idx]; //bottom right |
| |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = *pY; |
| pY += tmp_src_pitch; //upper right |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| *(pDst) = (uint16)tmp0; |
| }/* if(_mRowPix[col]) */ |
| else |
| { |
| pY += tmp_src_pitch; |
| } |
| pDst += (dst_inc > 0 ? _mRowPix[col+1] : -_mRowPix[col+1]); |
| }//end of COL |
| //oscl_memcpy() both up & down |
| |
| pY += (deltaY); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| pDst += dst_pitch; |
| |
| if (dst_inc > 0) |
| { |
| pDst -= dst_width; //goes back to the beginning of the line; |
| } |
| else |
| { |
| pDst += dst_width; |
| } |
| } |
| else // do two rows at least, scale up or down |
| { |
| |
| #ifdef INTERPOLATE |
| prgb1 = 0; |
| prgb2 = 0; |
| prgb3 = 0; |
| prgb4 = 0; |
| #endif |
| for (col = disp[3] - 2; col >= 0; col -= 2) |
| {/* decrement index, _mRowPix[.] is symmetric to increment index */ |
| Cb = *pCb; |
| pCb += half_src_pitch; |
| Cr = *pCr; |
| pCr += half_src_pitch; |
| |
| Cb -= 128; |
| Cr -= 128; |
| Cg = Cr * cc1; |
| Cr *= cc3; |
| |
| Cg += Cb * cc2; |
| Cb *= cc4; |
| |
| if (_mRowPix[col]) /* compute this pixel */ |
| { |
| tmp0 = pY[read_idx]; //bottom left |
| |
| tmp0 += OFFSET_5_0; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = *pY; |
| pY += tmp_src_pitch; //upper left |
| |
| Y += OFFSET_5_1; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| //RGB_565 |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| prgb3 = rgb; |
| prgb4 = tmp0; |
| #endif |
| |
| if (_mRowPix[col] == 2) |
| { |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch) = (((((prgb1 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((prgb1 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((prgb1 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| |
| *(pDst + dst_pitch + dst_inc) = (uint16)rgb; |
| |
| *(pDst) = (((((prgb2 & 0x1F) + (tmp0 & 0x1F)) / 2) & 0x1F) |
| | ((((((prgb2 >> 5) & 0x3F) + ((tmp0 >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((prgb2 >> 11) & 0x1F) + ((tmp0 >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| |
| *(pDst + dst_inc) = (uint16)tmp0; |
| |
| #else |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *(pDst + dst_pitch + dst_inc) = (uint16)rgb; |
| *(pDst) = (uint16)tmp0; |
| *(pDst + dst_inc) = (uint16)tmp0; |
| #endif |
| } |
| else if (_mRowPix[col] == 3) |
| { |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch) = (((((prgb1 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((prgb1 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((prgb1 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_pitch + dst_inc)) = (((((prgb1 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((prgb1 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((prgb1 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_pitch + (dst_inc << 1))) = (uint16)rgb ; |
| |
| *(pDst) = (((((prgb2 & 0x1F) + (tmp0 & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((prgb2 >> 5) & 0x3F) + ((tmp0 >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((prgb2 >> 11) & 0x1F) + ((tmp0 >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_inc)) = (((((prgb2 & 0x1F) * 2 + (tmp0 & 0x1F)) / 3) & 0x1F) |
| | ((((((prgb2 >> 5) & 0x3F) * 2 + ((tmp0 >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((prgb2 >> 11) & 0x1F) * 2 + ((tmp0 >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| |
| *((pDst + (dst_inc << 1))) = (uint16)tmp0; |
| #else |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *((pDst + dst_pitch + dst_inc)) = (uint16)rgb ; |
| *((pDst + dst_pitch + (dst_inc << 1))) = (uint16)rgb ; |
| |
| *(pDst) = (uint16)tmp0; |
| *((pDst + dst_inc)) = (uint16)tmp0; |
| *((pDst + (dst_inc << 1))) = (uint16)tmp0; |
| #endif |
| } |
| else |
| { |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *(pDst) = (uint16)tmp0; |
| } |
| |
| } /* if(_mRowPix[col]) */ |
| else |
| { |
| pY += tmp_src_pitch; |
| } |
| |
| pDst += (dst_inc > 0 ? _mRowPix[col] : -_mRowPix[col]); |
| |
| if (_mRowPix[col+1]) /* compute this pixel */ |
| { |
| tmp0 = pY[read_idx]; //bottom right |
| |
| tmp0 += OFFSET_5_1; |
| |
| tmp1 = tmp0 - (Cg >> 16); |
| tmp2 = tmp0 + (Cb >> 16); |
| tmp0 = tmp0 + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_1 - OFFSET_5_1]; |
| tmp2 = clip[tmp2]; |
| |
| |
| rgb = tmp1 | (tmp0 << 6); |
| rgb = tmp2 | (rgb << 5); |
| |
| Y = *pY; |
| pY += tmp_src_pitch; //upper right |
| |
| Y += OFFSET_5_0; |
| tmp1 = (Y) - (Cg >> 16); |
| tmp2 = (Y) + (Cb >> 16); |
| tmp0 = (Y) + (Cr >> 16); |
| |
| tmp0 = clip[tmp0]; |
| tmp1 = clip[tmp1 + OFFSET_6_0 - OFFSET_5_0]; |
| tmp2 = clip[tmp2]; |
| |
| tmp0 = tmp1 | (tmp0 << 6); |
| tmp0 = tmp2 | (tmp0 << 5); |
| |
| #ifdef INTERPOLATE |
| prgb1 = rgb; |
| prgb2 = tmp0; |
| #endif |
| if (_mRowPix[col+1] == 2) |
| { |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch) = (((((prgb3 & 0x1F) + (rgb & 0x1F)) / 2) & 0x1F) |
| | ((((((prgb3 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((prgb3 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| |
| *(pDst + dst_pitch + dst_inc) = (uint16)rgb; |
| |
| *(pDst) = (((((prgb4 & 0x1F) + (tmp0 & 0x1F)) / 2) & 0x1F) |
| | ((((((prgb4 >> 5) & 0x3F) + ((tmp0 >> 5) & 0x3F)) / 2) & 0x3F) << 5) |
| | ((((((prgb4 >> 11) & 0x1F) + ((tmp0 >> 11) & 0x1F)) / 2) & 0x1F) << 11)); |
| |
| *(pDst + dst_inc) = (uint16)tmp0; |
| |
| #else |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *(pDst + dst_pitch + dst_inc) = (uint16)rgb; |
| *(pDst) = (uint16)tmp0; |
| *(pDst + dst_inc) = (uint16)tmp0; |
| #endif |
| } |
| else if (_mRowPix[col+1] == 3) |
| { |
| #ifdef INTERPOLATE |
| *(pDst + dst_pitch) = (((((prgb3 & 0x1F) + (rgb & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((prgb3 >> 5) & 0x3F) + ((rgb >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((prgb3 >> 11) & 0x1F) + ((rgb >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_pitch + dst_inc)) = (((((prgb3 & 0x1F) * 2 + (rgb & 0x1F)) / 3) & 0x1F) |
| | ((((((prgb3 >> 5) & 0x3F) * 2 + ((rgb >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((prgb3 >> 11) & 0x1F) * 2 + ((rgb >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_pitch + (dst_inc << 1))) = (uint16)rgb ; |
| |
| *(pDst) = (((((prgb4 & 0x1F) + (tmp0 & 0x1F) * 2) / 3) & 0x1F) |
| | ((((((prgb4 >> 5) & 0x3F) + ((tmp0 >> 5) & 0x3F) * 2) / 3) & 0x3F) << 5) |
| | ((((((prgb4 >> 11) & 0x1F) + ((tmp0 >> 11) & 0x1F) * 2) / 3) & 0x1F) << 11)); |
| |
| *((pDst + dst_inc)) = (((((prgb4 & 0x1F) * 2 + (tmp0 & 0x1F)) / 3) & 0x1F) |
| | ((((((prgb4 >> 5) & 0x3F) * 2 + ((tmp0 >> 5) & 0x3F)) / 3) & 0x3F) << 5) |
| | ((((((prgb4 >> 11) & 0x1F) * 2 + ((tmp0 >> 11) & 0x1F)) / 3) & 0x1F) << 11)); |
| |
| *((pDst + (dst_inc << 1))) = (uint16)tmp0; |
| #else |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *((pDst + dst_pitch + dst_inc)) = (uint16)rgb ; |
| *((pDst + dst_pitch + (dst_inc << 1))) = (uint16)rgb ; |
| |
| *(pDst) = (uint16)tmp0; |
| *((pDst + dst_inc)) = (uint16)tmp0; |
| *((pDst + (dst_inc << 1))) = (uint16)tmp0; |
| #endif |
| } |
| else |
| { |
| *(pDst + dst_pitch) = (uint16)rgb; |
| *(pDst) = (uint16)tmp0; |
| } |
| }/* if(_mRowPix[col]) */ |
| else |
| { |
| pY += tmp_src_pitch; |
| } |
| pDst += (dst_inc > 0 ? _mRowPix[col+1] : -_mRowPix[col+1]); |
| }//end of COL |
| //oscl_memcpy() both up & down |
| |
| pY += (deltaY); |
| pCb += deltaCbCr; |
| pCr += deltaCbCr; |
| |
| if (dst_inc > 0) |
| { |
| pDst -= (dst_width); //goes back to the beginning of the line; |
| } |
| else |
| { |
| pDst += 1; |
| } |
| |
| //copy down |
| offset = (_mColPix[row] * dst_pitch); |
| |
| if (_mColPix[row-1] && _mColPix[row] != 1) |
| { |
| oscl_memcpy(pDst + offset, pDst + dst_pitch, dst_width*2); |
| } |
| if (_mColPix[row-1] == 2) |
| { |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| } |
| else if (_mColPix[row-1] == 3) |
| { |
| oscl_memcpy(pDst + offset + dst_pitch, pDst + dst_pitch, dst_width*2); |
| oscl_memcpy(pDst + offset + dst_pitch*2, pDst + dst_pitch, dst_width*2); |
| } |
| |
| if (_mColPix[row] > 1) |
| { |
| oscl_memcpy(pDst + dst_pitch, pDst, dst_width*2); |
| if (_mColPix[row] > 2) |
| { |
| oscl_memcpy(pDst + dst_pitch*2, pDst, dst_width*2); |
| } |
| } |
| |
| pDst += dst_pitch * (_mColPix[row-1] + _mColPix[row]); |
| if (dst_inc < 0) |
| { |
| pDst += (dst_width - 1); |
| } |
| } |
| } // row |
| |
| return 1; |
| #else |
| OSCL_UNUSED_ARG(src); |
| OSCL_UNUSED_ARG(dst); |
| OSCL_UNUSED_ARG(disp); |
| OSCL_UNUSED_ARG(coff_tbl); |
| OSCL_UNUSED_ARG(_mRowPix); |
| OSCL_UNUSED_ARG(_mColPix); |
| OSCL_UNUSED_ARG(_mIsRotateClkwise); |
| OSCL_UNUSED_ARG(flip); |
| |
| return 0; |
| #endif // defined(CCROTATE) && defined(CCSCALING) |
| } |
| |
| |