mmplugins/imagingplugins/codecs/JPEGCodec/JPGSAMP.CPP
changeset 0 40261b775718
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <e32base.h>
       
    17 
       
    18 #include "JpegTypes.h"
       
    19 
       
    20 void TDataUnitProcessor::SetBufferPtrUtil(CRgbBufferPtr& aBufferPtrUtil)
       
    21     {
       
    22     iBufferPtrUtil = &aBufferPtrUtil;
       
    23     }
       
    24     
       
    25     
       
    26 // TMonoProcessor
       
    27 FORCEDINLINE TInt16 MonoPixel(CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
    28     {
       
    29     return TInt16(
       
    30         			  (
       
    31         			  	(CRgbBufferPtr::Red(aRgbBuffer)<<1) + 
       
    32         			    CRgbBufferPtr::Green(aRgbBuffer) +
       
    33         			    (CRgbBufferPtr::Green(aRgbBuffer)<<2) + 
       
    34         			    CRgbBufferPtr::Blue(aRgbBuffer)
       
    35         			   )>>3
       
    36         	    );
       
    37     }
       
    38     
       
    39 TDataUnit* TMonoProcessor::Process(CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
    40 	{
       
    41 	TInt16* YPtr = iMCU.iCoeff;
       
    42 	const TInt16* YPtrLimit = YPtr + KJpgDCTBlockSize;
       
    43 	const TInt KLineStride = iBufferPtrUtil->NextLineOffset();
       
    44     
       
    45 	do
       
    46 		{
       
    47 		TInt p=0;
       
    48 		do 
       
    49 		    {		
       
    50 		    *YPtr++ = MonoPixel( CRgbBufferPtr::ShiftPtr(aRgbBuffer, p++) );
       
    51 		    *YPtr++ = MonoPixel( CRgbBufferPtr::ShiftPtr(aRgbBuffer, p++) );
       
    52 		    
       
    53 		    } while (p < KJpgDCTBlockWidth);
       
    54 		aRgbBuffer += KLineStride;
       
    55 		
       
    56 		} while (YPtr < YPtrLimit);
       
    57 
       
    58 	return &iMCU;
       
    59 	}
       
    60 
       
    61 // T444Processor
       
    62 TDataUnit* T444Processor::Process(CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
    63 	{
       
    64 	TInt16* YPtr  = iMCU[0].iCoeff;
       
    65 	TInt16* CbPtr = iMCU[1].iCoeff;
       
    66 	TInt16* CrPtr = iMCU[2].iCoeff;
       
    67 	
       
    68 	const TInt16* YPtrLimit = YPtr + KJpgDCTBlockSize;
       
    69 	const TInt KLineStride = iBufferPtrUtil->NextLineOffset();
       
    70 	
       
    71 	do
       
    72 		{
       
    73 		TInt p=0;
       
    74 		do 
       
    75 		    {
       
    76     		TYCbCr::RGBtoYCbCr(YPtr++, CbPtr++, CrPtr++, CRgbBufferPtr::ShiftPtr(aRgbBuffer, p++) );
       
    77 		    } while (p < KJpgDCTBlockWidth);
       
    78 		    
       
    79 		aRgbBuffer += KLineStride;
       
    80 
       
    81 		} while (YPtr < YPtrLimit);
       
    82 
       
    83 	return iMCU;
       
    84 	}
       
    85 
       
    86 
       
    87 // T422Processor
       
    88 TDataUnit* T422Processor::Process(CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
    89 	{
       
    90 	TInt16* CbPtr = iMCU[2].iCoeff;
       
    91 	ASSERT( CbPtr + KJpgDCTBlockSize == iMCU[3].iCoeff); // we assume that V comp is next to U one
       
    92 
       
    93 	const TInt halfWidth = KJpgDCTBlockWidth >> 1;
       
    94 
       
    95 	DoProcess(iMCU[0].iCoeff,CbPtr, aRgbBuffer);
       
    96 	DoProcess(iMCU[1].iCoeff,CbPtr + halfWidth, CRgbBufferPtr::ShiftPtr(aRgbBuffer,KJpgDCTBlockWidth) );
       
    97 
       
    98 	return iMCU;
       
    99 	}
       
   100 
       
   101 void T422Processor::DoProcess(TInt16* aYPtr,TInt16* aCbPtr, CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
   102 	{
       
   103 	const TInt KLineStride = iBufferPtrUtil->NextLineOffset();
       
   104 	const TInt16* YPtrLimit = aYPtr + KJpgDCTBlockSize;
       
   105 
       
   106 	do
       
   107 		{
       
   108 		TYCbCr::RGBtoYCbCr2PixUVSum(aYPtr,aCbPtr, aRgbBuffer);
       
   109 
       
   110 		TYCbCr::RGBtoYCbCr2PixUVSum(aYPtr+2,aCbPtr+1, CRgbBufferPtr::ShiftPtr(aRgbBuffer,2));
       
   111 		
       
   112 		TYCbCr::RGBtoYCbCr2PixUVSum(aYPtr+4,aCbPtr+2,CRgbBufferPtr::ShiftPtr(aRgbBuffer,4));
       
   113 
       
   114 		TYCbCr::RGBtoYCbCr2PixUVSum(aYPtr+6,aCbPtr+3,CRgbBufferPtr::ShiftPtr(aRgbBuffer,6));
       
   115 
       
   116 		aYPtr  += KJpgDCTBlockWidth;
       
   117 		aCbPtr += KJpgDCTBlockWidth;
       
   118 		aRgbBuffer += KLineStride;
       
   119 
       
   120 		} while (aYPtr < YPtrLimit);
       
   121 	}
       
   122 
       
   123 
       
   124 // T420Processor
       
   125 TDataUnit* T420Processor::Process(CRgbBufferPtr::TConstRgbBufferPtr aRgbBuffer)
       
   126 	{
       
   127 	TInt16* CbPtr = iMCU[4].iCoeff;
       
   128 	ASSERT( CbPtr + KJpgDCTBlockSize == iMCU[5].iCoeff); // we assume that V comp is next to U one
       
   129 	
       
   130 	const TInt halfWidth = KJpgDCTBlockWidth >> 1;
       
   131 	const TInt halfSize = KJpgDCTBlockSize >> 1;
       
   132 
       
   133 	DoProcess(iMCU[0].iCoeff,CbPtr, aRgbBuffer);
       
   134 	DoProcess(iMCU[1].iCoeff,CbPtr + halfWidth, CRgbBufferPtr::ShiftPtr(aRgbBuffer, KJpgDCTBlockWidth));
       
   135 
       
   136 	aRgbBuffer += (iBufferPtrUtil->NextLineOffset() << 3);
       
   137 	
       
   138 	CbPtr += halfSize;
       
   139 
       
   140 	DoProcess(iMCU[2].iCoeff,CbPtr, aRgbBuffer);
       
   141 	DoProcess(iMCU[3].iCoeff,CbPtr + halfWidth, CRgbBufferPtr::ShiftPtr(aRgbBuffer, KJpgDCTBlockWidth));
       
   142 
       
   143 	return iMCU;
       
   144 	}
       
   145 
       
   146 void T420Processor::DoProcess(TInt16* aYPtr,TInt16* aCbPtr, CRgbBufferPtr::TConstRgbBufferPtr  aRgbBuffer)
       
   147 	{
       
   148 	const TInt16* YPtrLimit = aYPtr + KJpgDCTBlockSize;
       
   149 	const TInt KLineStride = iBufferPtrUtil->NextLineOffset();
       
   150 	const TInt KDoubleLineStride = KLineStride << 1;
       
   151 	
       
   152 	do
       
   153 		{
       
   154 		TYCbCr::RGBtoYCbCr4PixUVSum(aYPtr, aCbPtr, aRgbBuffer, KLineStride);
       
   155 
       
   156 		TYCbCr::RGBtoYCbCr4PixUVSum(aYPtr+2, aCbPtr+1, CRgbBufferPtr::ShiftPtr(aRgbBuffer,2), KLineStride);
       
   157 
       
   158         TYCbCr::RGBtoYCbCr4PixUVSum(aYPtr+4, aCbPtr+2, CRgbBufferPtr::ShiftPtr(aRgbBuffer,4), KLineStride);
       
   159         
       
   160         TYCbCr::RGBtoYCbCr4PixUVSum(aYPtr+6, aCbPtr+3, CRgbBufferPtr::ShiftPtr(aRgbBuffer,6), KLineStride);
       
   161 
       
   162 		aRgbBuffer 	+= KDoubleLineStride;
       
   163 		aCbPtr 		+= KJpgDCTBlockWidth;
       
   164 		aYPtr 		+= KJpgDCTBlockWidth << 1;
       
   165 		
       
   166 		} while (aYPtr < YPtrLimit);
       
   167 	}
       
   168 
       
   169