mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/Colorspace_conv_yuv.c
changeset 58 b6dbf97aba93
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/Colorspace_conv_yuv.c	Thu Sep 16 18:57:38 2010 +0100
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "common.h"
+
+#ifndef NULL
+#define NULL (void*)0
+#endif 
+
+int32 IPEmz_sYUV420toY2VY1U(tBaseVideoFrame* yuv420Frame, tBaseVideoFrame* yuv422Frame, int16 stride);
+int32 IPEmz_sYUV420toUY1VY2(tBaseVideoFrame* yuv420Frame, tBaseVideoFrame* yuv422Frame, int16 stride);
+
+/*
+*******************************************************************************
+Name            : IPEmz_gYUV420toY2VY1U
+Description     : This fuction converts image from yuv420 to YUYV interleaved format
+Parameter       : yuv420Frame :contains the decoded image of jpeg stream in yuv420 format
+          yuyvFrame:this is user passed buffer to store the output in YUYV
+              interleaved format
+Return Value    : int32
+*******************************************************************************
+*/
+
+int32 IPEmz_sYUV420toY2VY1U(tBaseVideoFrame* yuv420Frame, tBaseVideoFrame* yuv422Frame, int16 stride)
+{
+    int32   lLumWidth, lLumHeight;  
+    uint8   *lLumPtr1;
+    uint8   *lCrPtr;
+    uint8   *lCbPtr;
+  	int32   lY1, lCr, lCb,lTemp;
+    int32   i,j;
+  	uint32  *lOutyuvBufferPtr;
+  	uint8		*pOutputLinePtr;
+    
+  	lLumWidth = yuv420Frame->width;	
+	lLumHeight = yuv420Frame->height;
+	
+	if (stride < lLumWidth<<1)
+        return E_ERROR_ARGUMENT;
+	    
+	lLumPtr1 = yuv420Frame->lum+lLumWidth*(lLumHeight-1);
+  lCbPtr = yuv420Frame->cb+(lLumWidth>>1)*((lLumHeight>>1)-1);
+  lCrPtr = yuv420Frame->cr+(lLumWidth>>1)*((lLumHeight>>1)-1);
+	
+	lOutyuvBufferPtr = (uint32*) (yuv422Frame->lum+((lLumHeight-1)*(stride)));	
+	pOutputLinePtr= (uint8*)lOutyuvBufferPtr;
+ 	     
+  for(i = 0; i < lLumHeight ; i ++)
+	{
+		j=(lLumWidth >> 1) + 1;
+		while(--j)
+		{
+			lY1    = *lLumPtr1++; //Y1
+			lCr	   = *lCrPtr++;			
+			lTemp  = *lLumPtr1++; //Y2
+			lCb    = *lCbPtr++;
+		
+			lTemp |= (lY1 << 16);			  
+			lCr |= (lCb<<16);	//Cb and Cr are common			
+			*lOutyuvBufferPtr++ = (uint32)(lTemp|(lCr<<8));
+	    }
+	    
+		if(i&1)
+		{		
+			lCbPtr	 -= lLumWidth;
+			lCrPtr	 -= lLumWidth;			
+		}
+		else
+		{
+			lCbPtr	 -= lLumWidth/2;
+			lCrPtr	 -= lLumWidth/2;			
+		}
+
+		lLumPtr1 -= lLumWidth*2;	
+		pOutputLinePtr -= stride;
+ 	  lOutyuvBufferPtr = (uint32*) pOutputLinePtr;
+	}
+	
+  return E_SUCCESS;
+}
+
+/*
+*******************************************************************************
+Name            : IPEmz_gYUV420toUY1VY2
+Description     : This fuction converts image from yuv420 to YUYV interleaved format
+Parameter       : yuv420Frame :contains the decoded image of jpeg stream in yuv420 format
+          yuyvFrame:this is user passed buffer to store the output in YUYV
+              interleaved format
+Return Value    : int32
+*******************************************************************************
+*/
+#if (defined ARM_V5) || (defined ARM_V5E) || (defined __WINSCW__)
+int32 IPEmz_sYUV420toUY1VY2(tBaseVideoFrame* yuv420Frame, tBaseVideoFrame* yuv422Frame, int16 stride)
+{
+    int32   lLumWidth, lLumHeight;  
+    uint8   *lLumPtr;
+    uint8   *lCrPtr;
+    uint8   *lCbPtr;
+  	int32   lY1, lCr, lCb,lTemp;
+    int32   i,j;
+	  uint32  *lOutyuvBufferPtr;
+	  uint8		*pOutputLinePtr;
+    
+  	lLumWidth = yuv420Frame->width; 
+  	lLumHeight = yuv420Frame->height;
+
+    if (stride < lLumWidth<<1)
+        return E_ERROR_ARGUMENT;
+    
+    lLumPtr = yuv420Frame->lum+lLumWidth*(lLumHeight-1);
+    lCbPtr = yuv420Frame->cb+(lLumWidth>>1)*((lLumHeight>>1)-1);
+    lCrPtr = yuv420Frame->cr+(lLumWidth>>1)*((lLumHeight>>1)-1);
+	
+	  lOutyuvBufferPtr = (uint32*) (yuv422Frame->lum+((lLumHeight-1)*(stride)));
+	  pOutputLinePtr= (uint8*)lOutyuvBufferPtr;
+
+    for(i = 0; i < lLumHeight ; i ++)
+	  {
+		j=(lLumWidth >> 1) + 1;
+
+		while (--j)
+		{
+			lCr    = *lCrPtr++;
+			lTemp  = *lLumPtr++; //Y1
+			lCb    = *lCbPtr++;			
+			lY1    = *lLumPtr++; //Y2
+				
+			lCb   |= (lCr << 16);	
+			lTemp |= (lY1 << 16);	
+			*lOutyuvBufferPtr++ = (uint32)((lTemp << 8)|(lCb));
+		}
+	    
+		if(i&1)
+		{		
+			lCbPtr	 -= lLumWidth;
+			lCrPtr	 -= lLumWidth;			
+		}
+		else
+		{
+			lCbPtr	 -= lLumWidth >> 1;
+			lCrPtr	 -= lLumWidth >> 1;
+		}
+
+		lLumPtr -= (lLumWidth << 1);
+		pOutputLinePtr -= stride;
+ 	  lOutyuvBufferPtr = (uint32*) pOutputLinePtr;
+	}
+  return E_SUCCESS;
+}
+
+#else
+__asm int32 IPEmz_sYUV420toUY1VY2(tBaseVideoFrame* yuv420Frame, tBaseVideoFrame* yuv422Frame, int16 stride)
+{
+        STMFD    r13!,{r4-r11,lr}
+        LDR      r12,[r1,#0]
+        LDRH     r1,[r0,#0xc]
+        LDR      r6,[r0,#4]
+        LDR      r5,[r0,#8]
+        LDRH     r4,[r0,#0xe]
+        LSR      r3,r1,#1
+        LDR      lr,[r0,#0]
+                
+        CMP      r2,r3,LSL #2
+        MOVLT    r0,#-16
+        STMLTFD   r13!,{r4-r11,pc}
+        ADD      r0,r2,r2,LSR #31
+        ASR      r0,r0,#1
+        SUB      r2,r4,#1
+        LSL      r11,r0,#2
+        MUL      r0,r3,r2
+        ADD      r1,r4,r4,LSR #31
+        LSL      r0,r0,#1
+        ADD      r0,r0,r0,LSR #31
+        BIC      r0,r0,#1
+        ADD      lr,r0,lr
+        MVN      r0,#0
+        ADD      r0,r0,r1,ASR #1
+        MLA      r1,r3,r0,r6
+        MLA      r0,r3,r0,r5
+        ADD      r5,r11,r11,LSR #31
+        ASR      r5,r5,#1
+        MUL      r2,r5,r2
+        ASR      r5,r2,#31
+        ADD      r2,r2,r5,LSR #30
+        BIC      r2,r2,#3
+        ADD      r12,r2,r12
+        MOV      r2,#0xff00
+        ORR      r10,r2,r2,LSL #16
+        MOV      r5,r3
+outer_loop
+        LDRH     r2,[lr],#2
+        LDRB     r6,[r1],#1
+        LDRB     r7,[r0],#1
+inner_loop
+        SUBS     r5,r5,#1
+        PKHBT    r9,r2,r2,LSL #8
+        PKHBT    r8,r6,r7,LSL #16
+        AND      r9,r10,r9,LSL #8
+        LDRBNE   r7,[r0],#1
+        LDRBNE   r6,[r1],#1
+        LDRHNE   r2,[lr],#2
+        ORR      r8,r9,r8
+        STR      r8,[r12],#4
+        BNE      inner_loop
+        ANDS     r2,r4,#1
+        SUBEQ    r1,r1,r3
+        SUBEQ    r0,r0,r3
+        SUBNE    r0,r0,r3,LSL #1
+        SUBNE    r1,r1,r3,LSL #1
+        SUBS     r4,r4,#1
+        SUB      lr,lr,r3,LSL #2
+        SUB      r12,r12,r11,ASR #1
+        SUB	     r12,r12,r3,LSL #2
+        MOV      r5,r3
+        BNE      outer_loop
+        MOV      r0,#1
+        LDMFD    r13!, {r4-r11,pc}
+
+      }
+#endif
+
+/*
+******************************************************************************
+Name            : gColorSpaceConvertYUV
+Description   : Converts YUV Data to YUV 422 Interleaved format.
+Parameter       : yuv420Frame    - Source structure
+          yuv422Frame  - Pointer to yuv 422 Interleaved data.
+          outClrFmt   - input color format.
+Return Value    : int32
+******************************************************************************
+*/
+
+int32 gColorConvYUVtoYUV422Int (tBaseVideoFrame *yuv420Frame, tBaseVideoFrame* yuv422Frame,
+                 uint8 outClrFmt, int stride)             
+{
+  if( (NULL == yuv420Frame) || (NULL == yuv422Frame) || (NULL == yuv420Frame->lum) ||
+    (NULL == yuv420Frame->cb) || (NULL == yuv420Frame->cr))
+  {
+    return E_OUT_OF_MEMORY;
+  }
+
+  switch(outClrFmt)
+  {
+    case(YUV422INT_LE):
+      return IPEmz_sYUV420toY2VY1U(yuv420Frame, yuv422Frame, stride);
+      
+    case(YUV422INT_BE):
+      return IPEmz_sYUV420toUY1VY2(yuv420Frame, yuv422Frame, stride);
+        
+    default:
+      return E_ERROR_ARGUMENT;
+  }
+}
+