# HG changeset patch # User hgs # Date 1284659858 -3600 # Node ID b6dbf97aba9385c88c132bc71dedb9c1de2fa059 # Parent 1cbb0d5bf7f230e6ea0760bfa049669b7b6fef3d 2010wk36_01 diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/addeddevsoundcontrol/AddedDevSoundControlMsgHdlr/Group/AddedDevSoundControlMsgHdlr.mmp --- a/devsoundextensions/addeddevsoundcontrol/AddedDevSoundControlMsgHdlr/Group/AddedDevSoundControlMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/addeddevsoundcontrol/AddedDevSoundControlMsgHdlr/Group/AddedDevSoundControlMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ SYSTEMINCLUDE /epoc32/include/mmf/common LIBRARY euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/audiorouting/Input/AudioInputBase/group/AudioInput.mmp --- a/devsoundextensions/audiorouting/Input/AudioInputBase/group/AudioInput.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/audiorouting/Input/AudioInputBase/group/AudioInput.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,5 +36,5 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY euser.lib MMFDevSound.lib CustomInterfaceUtility.lib CustomCommandUtility.lib MediaClientAudioInputStream.lib +LIBRARY euser.lib mmfdevsound.lib CustomInterfaceUtility.lib CustomCommandUtility.lib mediaclientaudioinputstream.lib LIBRARY mediaclientvideo.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/audiorouting/Input/AudioInputMessageHandler/Group/AudioInputMessageHandler.mmp --- a/devsoundextensions/audiorouting/Input/AudioInputMessageHandler/Group/AudioInputMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/audiorouting/Input/AudioInputMessageHandler/Group/AudioInputMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,5 +35,5 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY euser.lib MmfControllerFramework.lib +LIBRARY euser.lib mmfcontrollerframework.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/audiorouting/Output/AudioOutputBase/group/AudioOutput.mmp --- a/devsoundextensions/audiorouting/Output/AudioOutputBase/group/AudioOutput.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/audiorouting/Output/AudioOutputBase/group/AudioOutput.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -44,7 +44,7 @@ LIBRARY CustomCommandUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudiostream.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfdevsound.lib LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientvideo.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/audiorouting/Output/AudioOutputMessageHandler/Group/AudioOutputMessageHandler.mmp --- a/devsoundextensions/audiorouting/Output/AudioOutputMessageHandler/Group/AudioOutputMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/audiorouting/Output/AudioOutputMessageHandler/Group/AudioOutputMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,6 +36,6 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY euser.lib MmfControllerFramework.lib +LIBRARY euser.lib mmfcontrollerframework.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/audiorouting/Output/AudioOutputProxy/src/AudioOutputProxy.cpp --- a/devsoundextensions/audiorouting/Output/AudioOutputProxy/src/AudioOutputProxy.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/audiorouting/Output/AudioOutputProxy/src/AudioOutputProxy.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -192,7 +192,14 @@ { iSecureOutput = aSecureOutput; TPckgC outputPckg(aSecureOutput); - iCustomCommand->CustomCommandSync(iMessageHandler, EAofSetSecureOutput, outputPckg, KNullDesC8); + TInt err = KErrNone; + //ou1cimx1#454515 CAudioOutputConfigurator::SetSecureOutputL() is deprecated + err = iCustomCommand->CustomCommandSync(iMessageHandler, EAofSetSecureOutput, outputPckg, KNullDesC8); + if(err != KErrNone) + { + User::Leave(err); + } + } // --------------------------------------------------------- diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/drmaudioplayer/DRMPlayServer/src/DRMPlaySession.cpp --- a/devsoundextensions/drmaudioplayer/DRMPlayServer/src/DRMPlaySession.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/drmaudioplayer/DRMPlayServer/src/DRMPlaySession.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -905,7 +905,7 @@ } // Add custCmdAsyncAO object to array of async custom command objects - iActiveAsyncCustomCommands.Append( iCDRMCustomCommandAsyncAO2Phase ); + iActiveAsyncCustomCommands.AppendL( iCDRMCustomCommandAsyncAO2Phase ); // aMessage ownership is transferred to custCmdAsyncAO. // After succesful transfer, aMessage should not be completed diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/drmaudioplayer/DRMPlayUtility/group/DRMPlayUtility.mmp --- a/devsoundextensions/drmaudioplayer/DRMPlayUtility/group/DRMPlayUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/drmaudioplayer/DRMPlayUtility/group/DRMPlayUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -13,7 +13,7 @@ * * Description: Project file for DRM Utility * -* Version : %version: bh1mmcf#12 % +* Version : %version: bh1sosd2#13 % */ @@ -57,4 +57,4 @@ LIBRARY ecom.lib #endif -LIBRARY MediaClientAudio.lib +LIBRARY mediaclientaudio.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/AudioEqualizer/AudioEqualizerEffect/Group/AudioEqualizerEffect.mmp --- a/devsoundextensions/effects/AudioEqualizer/AudioEqualizerEffect/Group/AudioEqualizerEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/AudioEqualizer/AudioEqualizerEffect/Group/AudioEqualizerEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,15 +35,15 @@ SOURCE AudioEqualizerBase.cpp -LIBRARY Euser.lib -LIBRARY Estor.lib +LIBRARY euser.lib +LIBRARY estor.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib LIBRARY mmfdevsound.lib -LIBRARY MediaClientVideo.lib +LIBRARY mediaclientvideo.lib // End of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/Group/AudioEqualizerMessageHandler.mmp --- a/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/Group/AudioEqualizerMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/Group/AudioEqualizerMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY AudioEqualizerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/AudioEqualizer/AudioEqualizerProxy/Group/AudioEqualizerProxy.mmp --- a/devsoundextensions/effects/AudioEqualizer/AudioEqualizerProxy/Group/AudioEqualizerProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/AudioEqualizer/AudioEqualizerProxy/Group/AudioEqualizerProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE AudioEqualizerProxy.cpp SOURCE AudioEqualizerEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY AudioEqualizerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/BassBoost/BassBoostEffect/Group/BassBoostEffect.mmp --- a/devsoundextensions/effects/BassBoost/BassBoostEffect/Group/BassBoostEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/BassBoost/BassBoostEffect/Group/BassBoostEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,10 +36,10 @@ SOURCE BassBoostBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/BassBoost/BassBoostMessageHandler/Group/BassBoostMessageHandler.mmp --- a/devsoundextensions/effects/BassBoost/BassBoostMessageHandler/Group/BassBoostMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/BassBoost/BassBoostMessageHandler/Group/BassBoostMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY BassBoostEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/BassBoost/BassBoostProxy/Group/BassBoostProxy.mmp --- a/devsoundextensions/effects/BassBoost/BassBoostProxy/Group/BassBoostProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/BassBoost/BassBoostProxy/Group/BassBoostProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE BassBoostProxy.cpp SOURCE BassBoostEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY BassBoostEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/DistAtten/DistanceAttenuationEffect/Group/DistanceAttenuationEffect.mmp --- a/devsoundextensions/effects/DistAtten/DistanceAttenuationEffect/Group/DistanceAttenuationEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/DistAtten/DistanceAttenuationEffect/Group/DistanceAttenuationEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -34,10 +34,10 @@ SOURCE DistanceAttenuationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/DistAtten/DistanceAttenuationMessageHandler/Group/DistanceAttenuationMessageHandler.mmp --- a/devsoundextensions/effects/DistAtten/DistanceAttenuationMessageHandler/Group/DistanceAttenuationMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/DistAtten/DistanceAttenuationMessageHandler/Group/DistanceAttenuationMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY DistanceAttenuationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/DistAtten/DistanceAttenuationProxy/Group/DistanceAttenuationProxy.mmp --- a/devsoundextensions/effects/DistAtten/DistanceAttenuationProxy/Group/DistanceAttenuationProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/DistAtten/DistanceAttenuationProxy/Group/DistanceAttenuationProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE DistanceAttenuationProxy.cpp SOURCE DistanceAttenuationEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY DistanceAttenuationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/DopplerBase/Group/DopplerBase.mmp --- a/devsoundextensions/effects/DopplerBase/Group/DopplerBase.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/DopplerBase/Group/DopplerBase.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,7 +39,7 @@ SOURCE DopplerBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib LIBRARY estlib.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/EffectBase/Group/EffectBase.mmp --- a/devsoundextensions/effects/EffectBase/Group/EffectBase.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/EffectBase/Group/EffectBase.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE AudioEffectBase.cpp -LIBRARY Euser.lib -LIBRARY MediaClientAudio.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mediaclientaudio.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/EnvReverb/EnvironmentalReverbEffect/Group/EnvironmentalReverbEffect.mmp --- a/devsoundextensions/effects/EnvReverb/EnvironmentalReverbEffect/Group/EnvironmentalReverbEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/EnvReverb/EnvironmentalReverbEffect/Group/EnvironmentalReverbEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,14 +35,14 @@ SOURCE EnvironmentalReverbBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib LIBRARY mmfdevsound.lib -LIBRARY MediaClientVideo.lib +LIBRARY mediaclientvideo.lib // End of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/EnvReverb/EnvironmentalReverbMessageHandler/Group/EnvironmentalReverbMessageHandler.mmp --- a/devsoundextensions/effects/EnvReverb/EnvironmentalReverbMessageHandler/Group/EnvironmentalReverbMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/EnvReverb/EnvironmentalReverbMessageHandler/Group/EnvironmentalReverbMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY EnvironmentalReverbEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/EnvReverb/EnvironmentalReverbProxy/Group/EnvironmentalReverbProxy.mmp --- a/devsoundextensions/effects/EnvReverb/EnvironmentalReverbProxy/Group/EnvironmentalReverbProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/EnvReverb/EnvironmentalReverbProxy/Group/EnvironmentalReverbProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE EnvironmentalReverbProxy.cpp SOURCE EnvironmentalReverbEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY EnvironmentalReverbEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListDoppler/ListenerDopplerEffect/Group/ListenerDopplerEffect.mmp --- a/devsoundextensions/effects/ListDoppler/ListenerDopplerEffect/Group/ListenerDopplerEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListDoppler/ListenerDopplerEffect/Group/ListenerDopplerEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,11 +36,11 @@ SOURCE ListenerDopplerEffect.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY Dopplerbase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListDoppler/ListenerDopplerMessageHandler/Group/ListenerDopplerMessageHandler.mmp --- a/devsoundextensions/effects/ListDoppler/ListenerDopplerMessageHandler/Group/ListenerDopplerMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListDoppler/ListenerDopplerMessageHandler/Group/ListenerDopplerMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,10 +38,10 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib -LIBRARY DopplerBase.lib +LIBRARY Dopplerbase.lib LIBRARY ListenerDopplerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListDoppler/ListenerDopplerProxy/Group/ListenerDopplerProxy.mmp --- a/devsoundextensions/effects/ListDoppler/ListenerDopplerProxy/Group/ListenerDopplerProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListDoppler/ListenerDopplerProxy/Group/ListenerDopplerProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,11 +38,11 @@ SOURCE ListenerDopplerProxy.cpp SOURCE ListenerDopplerEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib -LIBRARY DopplerBase.lib +LIBRARY Dopplerbase.lib LIBRARY ListenerDopplerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListLocation/ListenerLocationEffect/Group/ListenerLocationEffect.mmp --- a/devsoundextensions/effects/ListLocation/ListenerLocationEffect/Group/ListenerLocationEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListLocation/ListenerLocationEffect/Group/ListenerLocationEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,11 +36,11 @@ SOURCE ListenerLocationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY LocationBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListLocation/ListenerLocationMessageHandler/Group/ListenerLocationMessageHandler.mmp --- a/devsoundextensions/effects/ListLocation/ListenerLocationMessageHandler/Group/ListenerLocationMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListLocation/ListenerLocationMessageHandler/Group/ListenerLocationMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY ListenerLocationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListLocation/ListenerLocationProxy/Group/ListenerLocationProxy.mmp --- a/devsoundextensions/effects/ListLocation/ListenerLocationProxy/Group/ListenerLocationProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListLocation/ListenerLocationProxy/Group/ListenerLocationProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE ListenerLocationProxy.cpp SOURCE ListenerLocationEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY LocationBase.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListOrient/ListenerOrientationEffect/Group/ListenerOrientationEffect.mmp --- a/devsoundextensions/effects/ListOrient/ListenerOrientationEffect/Group/ListenerOrientationEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListOrient/ListenerOrientationEffect/Group/ListenerOrientationEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,11 +35,11 @@ SOURCE ListenerOrientationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY OrientationBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListOrient/ListenerOrientationMessageHandler/Group/ListenerOrientationMessageHandler.mmp --- a/devsoundextensions/effects/ListOrient/ListenerOrientationMessageHandler/Group/ListenerOrientationMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListOrient/ListenerOrientationMessageHandler/Group/ListenerOrientationMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY ListenerOrientationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/ListOrient/ListenerOrientationProxy/Group/ListenerOrientationProxy.mmp --- a/devsoundextensions/effects/ListOrient/ListenerOrientationProxy/Group/ListenerOrientationProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/ListOrient/ListenerOrientationProxy/Group/ListenerOrientationProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ SOURCE ListenerOrientationProxy.cpp SOURCE ListenerOrientationEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY OrientationBase.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/LocationBase/Group/LocationBase.mmp --- a/devsoundextensions/effects/LocationBase/Group/LocationBase.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/LocationBase/Group/LocationBase.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE LocationBase.cpp -LIBRARY estlib.lib -LIBRARY Euser.lib +LIBRARY estlib.lib +LIBRARY euser.lib LIBRARY EffectBase.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/Loudness/LoudnessEffect/Group/LoudnessEffect.mmp --- a/devsoundextensions/effects/Loudness/LoudnessEffect/Group/LoudnessEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/Loudness/LoudnessEffect/Group/LoudnessEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,10 +35,10 @@ SOURCE LoudnessBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/Loudness/LoudnessMessageHandler/Group/LoudnessMessageHandler.mmp --- a/devsoundextensions/effects/Loudness/LoudnessMessageHandler/Group/LoudnessMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/Loudness/LoudnessMessageHandler/Group/LoudnessMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,8 +35,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY LoudnessEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/Loudness/LoudnessProxy/Group/LoudnessProxy.mmp --- a/devsoundextensions/effects/Loudness/LoudnessProxy/Group/LoudnessProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/Loudness/LoudnessProxy/Group/LoudnessProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE LoudnessProxy.cpp SOURCE LoudnessEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY LoudnessEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/OrientationBase/Group/OrientationBase.mmp --- a/devsoundextensions/effects/OrientationBase/Group/OrientationBase.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/OrientationBase/Group/OrientationBase.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ SOURCE OrientationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib -LIBRARY MmfControllerFramework.lib -LIBRARY estlib.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY estlib.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/RoomLevel/RoomLevelEffect/Group/RoomLevelEffect.mmp --- a/devsoundextensions/effects/RoomLevel/RoomLevelEffect/Group/RoomLevelEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/RoomLevel/RoomLevelEffect/Group/RoomLevelEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -34,13 +34,13 @@ OS_LAYER_SYSTEMINCLUDE SOURCE RoomLevelBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib LIBRARY EnvironmentalReverbProxy.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY EnvironmentalReverbEffect.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/RoomLevel/RoomLevelMessageHandler/Group/RoomLevelMessageHandler.mmp --- a/devsoundextensions/effects/RoomLevel/RoomLevelMessageHandler/Group/RoomLevelMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/RoomLevel/RoomLevelMessageHandler/Group/RoomLevelMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY EffectBase.lib LIBRARY RoomLevelEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/RoomLevel/RoomLevelProxy/Group/RoomLevelProxy.mmp --- a/devsoundextensions/effects/RoomLevel/RoomLevelProxy/Group/RoomLevelProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/RoomLevel/RoomLevelProxy/Group/RoomLevelProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE RoomLevelProxy.cpp SOURCE RoomLevelEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY RoomLevelEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcDoppler/SourceDopplerEffect/Group/SourceDopplerEffect.mmp --- a/devsoundextensions/effects/SrcDoppler/SourceDopplerEffect/Group/SourceDopplerEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcDoppler/SourceDopplerEffect/Group/SourceDopplerEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -36,11 +36,11 @@ SOURCE SourceDopplerEffect.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY Dopplerbase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcDoppler/SourceDopplerMessageHandler/Group/SourceDopplerMessageHandler.mmp --- a/devsoundextensions/effects/SrcDoppler/SourceDopplerMessageHandler/Group/SourceDopplerMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcDoppler/SourceDopplerMessageHandler/Group/SourceDopplerMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,10 +39,10 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib -LIBRARY DopplerBase.lib +LIBRARY Dopplerbase.lib LIBRARY SourceDopplerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcDoppler/SourceDopplerProxy/Group/SourceDopplerProxy.mmp --- a/devsoundextensions/effects/SrcDoppler/SourceDopplerProxy/Group/SourceDopplerProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcDoppler/SourceDopplerProxy/Group/SourceDopplerProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,11 +38,11 @@ SOURCE SourceDopplerProxy.cpp SOURCE SourceDopplerEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib -LIBRARY DopplerBase.lib +LIBRARY Dopplerbase.lib LIBRARY SourceDopplerEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcLocation/SourceLocationEffect/Group/SourceLocationEffect.mmp --- a/devsoundextensions/effects/SrcLocation/SourceLocationEffect/Group/SourceLocationEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcLocation/SourceLocationEffect/Group/SourceLocationEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,11 +35,11 @@ SOURCE SourceLocationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY LocationBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcLocation/SourceLocationMessageHandler/Group/SourceLocationMessageHandler.mmp --- a/devsoundextensions/effects/SrcLocation/SourceLocationMessageHandler/Group/SourceLocationMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcLocation/SourceLocationMessageHandler/Group/SourceLocationMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY SourceLocationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcLocation/SourceLocationProxy/Group/SourceLocationProxy.mmp --- a/devsoundextensions/effects/SrcLocation/SourceLocationProxy/Group/SourceLocationProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcLocation/SourceLocationProxy/Group/SourceLocationProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE SourceLocationProxy.cpp SOURCE SourceLocationEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY LocationBase.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcOrientation/SourceOrientationEffect/Group/SourceOrientationEffect.mmp --- a/devsoundextensions/effects/SrcOrientation/SourceOrientationEffect/Group/SourceOrientationEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcOrientation/SourceOrientationEffect/Group/SourceOrientationEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,11 +35,11 @@ SOURCE SourceOrientationBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY OrientationBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcOrientation/SourceOrientationMessageHandler/Group/SourceOrientationMessageHandler.mmp --- a/devsoundextensions/effects/SrcOrientation/SourceOrientationMessageHandler/Group/SourceOrientationMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcOrientation/SourceOrientationMessageHandler/Group/SourceOrientationMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY SourceOrientationEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/SrcOrientation/SourceOrientationProxy/Group/SourceOrientationProxy.mmp --- a/devsoundextensions/effects/SrcOrientation/SourceOrientationProxy/Group/SourceOrientationProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/SrcOrientation/SourceOrientationProxy/Group/SourceOrientationProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE SourceOrientationProxy.cpp SOURCE SourceOrientationEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY OrientationBase.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/StereoWidening/StereoWideningEffect/Group/StereoWideningEffect.mmp --- a/devsoundextensions/effects/StereoWidening/StereoWideningEffect/Group/StereoWideningEffect.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/StereoWidening/StereoWideningEffect/Group/StereoWideningEffect.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,15 +35,15 @@ SOURCE StereoWideningBase.cpp -LIBRARY Euser.lib +LIBRARY euser.lib LIBRARY EffectBase.lib LIBRARY CustomInterfaceUtility.lib -LIBRARY DRMAudioPlayUtility.lib +LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientaudio.lib LIBRARY mediaclientaudioinputstream.lib LIBRARY mediaclientaudiostream.lib LIBRARY mmfdevsound.lib -LIBRARY MediaClientVideo.lib +LIBRARY mediaclientvideo.lib // End of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/StereoWidening/StereoWideningMessageHandler/Group/StereoWideningMessageHandler.mmp --- a/devsoundextensions/effects/StereoWidening/StereoWideningMessageHandler/Group/StereoWideningMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/StereoWidening/StereoWideningMessageHandler/Group/StereoWideningMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ OS_LAYER_SYSTEMINCLUDE -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY EffectBase.lib LIBRARY StereoWideningEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effects/StereoWidening/StereoWideningProxy/Group/StereoWideningProxy.mmp --- a/devsoundextensions/effects/StereoWidening/StereoWideningProxy/Group/StereoWideningProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effects/StereoWidening/StereoWideningProxy/Group/StereoWideningProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SOURCE StereoWideningProxy.cpp SOURCE StereoWideningEventObserver.cpp -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY EffectBase.lib LIBRARY StereoWideningEffect.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effectspresets/AudioEqualizerUtility/group/AudioEqualizerUtility.mmp --- a/devsoundextensions/effectspresets/AudioEqualizerUtility/group/AudioEqualizerUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effectspresets/AudioEqualizerUtility/group/AudioEqualizerUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -45,15 +45,15 @@ SYSTEMINCLUDE /epoc32/include/kernel SYSTEMINCLUDE /epoc32/include/mmf/common -LIBRARY EUser.lib -LIBRARY Estlib.lib +LIBRARY euser.lib +LIBRARY estlib.lib LIBRARY centralrepository.lib LIBRARY AudioEqualizerEffect.lib LIBRARY BassBoostEffect.lib LIBRARY EffectBase.lib -LIBRARY MmfControllerFramework.lib -LIBRARY DRMAudioPlayUtility.lib -LIBRARY MediaClientVideo.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY DrmAudioPlayUtility.lib +LIBRARY mediaclientvideo.lib //----------------------------------------------------------------------------- // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effectspresets/EnvironmentalReverbUtility/group/EnvironmentalReverbUtility.mmp --- a/devsoundextensions/effectspresets/EnvironmentalReverbUtility/group/EnvironmentalReverbUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effectspresets/EnvironmentalReverbUtility/group/EnvironmentalReverbUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -44,14 +44,14 @@ SYSTEMINCLUDE /epoc32/include/kernel SYSTEMINCLUDE /epoc32/include/mmf/common -LIBRARY EUser.lib -LIBRARY Estlib.lib +LIBRARY euser.lib +LIBRARY estlib.lib LIBRARY centralrepository.lib LIBRARY EnvironmentalReverbEffect.lib LIBRARY EffectBase.lib -LIBRARY MmfControllerFramework.lib -LIBRARY DRMAudioPlayUtility.lib -LIBRARY MediaClientVideo.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY DrmAudioPlayUtility.lib +LIBRARY mediaclientvideo.lib //----------------------------------------------------------------------------- // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/effectspresets/StereoWideningUtility/group/StereoWideningUtility.mmp --- a/devsoundextensions/effectspresets/StereoWideningUtility/group/StereoWideningUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/effectspresets/StereoWideningUtility/group/StereoWideningUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -45,14 +45,14 @@ SYSTEMINCLUDE /epoc32/include/kernel SYSTEMINCLUDE /epoc32/include/mmf/common -LIBRARY EUser.lib -LIBRARY Estlib.lib +LIBRARY euser.lib +LIBRARY estlib.lib LIBRARY centralrepository.lib LIBRARY StereoWideningEffect.lib LIBRARY EffectBase.lib -LIBRARY MmfControllerFramework.lib -LIBRARY DRMAudioPlayUtility.lib -LIBRARY MediaClientVideo.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY DrmAudioPlayUtility.lib +LIBRARY mediaclientvideo.lib //----------------------------------------------------------------------------- // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/globalaudiosettings/group/GlobalAudioSettings.mmp --- a/devsoundextensions/globalaudiosettings/group/GlobalAudioSettings.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/globalaudiosettings/group/GlobalAudioSettings.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -39,8 +39,8 @@ deffile GlobalAudioSettings.def nostrictdef -LIBRARY EUser.lib -LIBRARY Estlib.lib +LIBRARY euser.lib +LIBRARY estlib.lib LIBRARY centralrepository.lib //----------------------------------------------------------------------------- diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmextfw/customcommandutility/Group/CustomCommandUtility.mmp --- a/devsoundextensions/mmextfw/customcommandutility/Group/CustomCommandUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmextfw/customcommandutility/Group/CustomCommandUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,10 +38,10 @@ LIBRARY euser.lib -LIBRARY MediaClientAudio.lib -LIBRARY MidiClient.lib +LIBRARY mediaclientaudio.lib +LIBRARY midiclient.lib LIBRARY DrmAudioPlayUtility.lib -LIBRARY MediaClientVideo.lib +LIBRARY mediaclientvideo.lib // End of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/Group/CustomInterfaceBuilder.mmp --- a/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/Group/CustomInterfaceBuilder.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/Group/CustomInterfaceBuilder.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,6 +37,6 @@ SYSTEMINCLUDE /epoc32/include/mmf/common /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MmfControllerFramework.lib -LIBRARY MMFDevSound.lib -LIBRARY MessageHandlerFactory.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib +LIBRARY MessageHandlerFactory.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceUtility/Group/CustomInterfaceUtility.mmp --- a/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceUtility/Group/CustomInterfaceUtility.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceUtility/Group/CustomInterfaceUtility.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -40,8 +40,8 @@ LIBRARY euser.lib LIBRARY CustomCommandUtility.lib LIBRARY CustomInterfaceProxyFactory.lib -LIBRARY MMFControllerFramework.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY mmfdevsound.lib LIBRARY DrmAudioPlayUtility.lib LIBRARY mediaclientvideo.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfig/group/AacDecoderConfig.mmp --- a/devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfig/group/AacDecoderConfig.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfig/group/AacDecoderConfig.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,7 +38,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfigMsgHdlr/Group/AacDecoderConfigMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfigMsgHdlr/Group/AacDecoderConfigMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/AacDecoderConfig/AacDecoderConfigMsgHdlr/Group/AacDecoderConfigMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY AacDecoderConfig.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfc/Group/EAacPlusDecoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfc/Group/EAacPlusDecoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfc/Group/EAacPlusDecoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,7 +38,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfcMsgHdlr/Group/EAacPlusDecoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfcMsgHdlr/Group/EAacPlusDecoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/EAacPlusDecoderIntfc/EAacPlusDecoderIntfcMsgHdlr/Group/EAacPlusDecoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY EAacPlusDecoderIntfc.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfc/group/ErrorConcealmentIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfc/group/ErrorConcealmentIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfc/group/ErrorConcealmentIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,8 +38,8 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfcMsgHdlr/Group/ErrorConcealmentIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfcMsgHdlr/Group/ErrorConcealmentIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/ErrConcealmentIntfc/ErrorConcealmentIntfcMsgHdlr/Group/ErrorConcealmentIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY ErrorConcealmentIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfc/group/G711DecoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfc/group/G711DecoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfc/group/G711DecoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfcMsgHdlr/Group/G711DecoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfcMsgHdlr/Group/G711DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G711DecoderIntfc/G711DecoderIntfcMsgHdlr/Group/G711DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY G711DecoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfc/group/G711EncoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfc/group/G711EncoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfc/group/G711EncoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioInputStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudioinputstream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfcMsgHdlr/Group/G711EncoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfcMsgHdlr/Group/G711EncoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G711EncoderIntfc/G711EncoderIntfcMsgHdlr/Group/G711EncoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY G711EncoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfc/group/G729DecoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfc/group/G729DecoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfc/group/G729DecoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,8 +37,8 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfcMsgHdlr/Group/G729DecoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfcMsgHdlr/Group/G729DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G729DecoderIntfc/G729DecoderIntfcMsgHdlr/Group/G729DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY G729DecoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfc/group/G729EncoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfc/group/G729EncoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfc/group/G729EncoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioInputStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudioinputstream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfcMsgHdlr/Group/G729EncoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfcMsgHdlr/Group/G729EncoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/G729EncoderIntfc/G729EncoderIntfcMsgHdlr/Group/G729EncoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY G729EncoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfc/group/IlbcDecoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfc/group/IlbcDecoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfc/group/IlbcDecoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudiostream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfcMsgHdlr/Group/IlbcDecoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfcMsgHdlr/Group/IlbcDecoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/IlbcDecoderIntfc/IlbcDecoderIntfcMsgHdlr/Group/IlbcDecoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY IlbcDecoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfc/group/IlbcEncoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfc/group/IlbcEncoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfc/group/IlbcEncoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioInputStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudioinputstream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfcMsgHdlr/Group/IlbcEncoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfcMsgHdlr/Group/IlbcEncoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/IlbcEncoderIntfc/IlbcEncoderIntfcMsgHdlr/Group/IlbcEncoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY IlbcEncoderIntfc.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfc/Group/Ra8DecoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfc/Group/Ra8DecoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfc/Group/Ra8DecoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,6 +37,6 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcMsgHdlr/Group/Ra8DecoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcMsgHdlr/Group/Ra8DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcMsgHdlr/Group/Ra8DecoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,6 +37,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcProxy/Group/Ra8DecoderIntfcProxy.mmp --- a/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcProxy/Group/Ra8DecoderIntfcProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/Ra8DecoderIntfc/Ra8DecoderIntfcProxy/Group/Ra8DecoderIntfcProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfc/Group/SbcEncoderIntfc.mmp --- a/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfc/Group/SbcEncoderIntfc.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfc/Group/SbcEncoderIntfc.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioInputStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudioinputstream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcMsgHdlr/Group/SbcEncoderIntfcMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcMsgHdlr/Group/SbcEncoderIntfcMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcMsgHdlr/Group/SbcEncoderIntfcMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY SbcEncoderIntfc.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcProxy/src/SbcEncoderIntfcProxy.cpp --- a/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcProxy/src/SbcEncoderIntfcProxy.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SbcEncoderIntfc/SbcEncoderIntfcProxy/src/SbcEncoderIntfcProxy.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -205,7 +205,7 @@ for (TInt i = 0; i < pckgBuf(); i++) { - aSupportedChannelModes.Append( + aSupportedChannelModes.AppendL( static_cast(stream.ReadUint32L())); } @@ -376,7 +376,7 @@ for (TInt i = 0; i < pckgBuf(); i++) { - aSupportedAllocationMethods.Append( + aSupportedAllocationMethods.AppendL( static_cast(stream.ReadUint32L())); } @@ -697,7 +697,7 @@ for (TInt i = 0; i < aCount; i++) { - aArray.Append(stream.ReadUint32L()); + aArray.AppendL(stream.ReadUint32L()); } CleanupStack::PopAndDestroy(&stream); diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfig/group/SpeechEncoderConfig.mmp --- a/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfig/group/SpeechEncoderConfig.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfig/group/SpeechEncoderConfig.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -37,7 +37,7 @@ SYSTEMINCLUDE /epoc32/include/mmf/server LIBRARY euser.lib -LIBRARY MediaClientAudioInputStream.lib -LIBRARY MMFDevSound.lib +LIBRARY mediaclientaudioinputstream.lib +LIBRARY mmfdevsound.lib // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigMsgHdlr/Group/SpeechEncoderConfigMsgHdlr.mmp --- a/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigMsgHdlr/Group/SpeechEncoderConfigMsgHdlr.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigMsgHdlr/Group/SpeechEncoderConfigMsgHdlr.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -38,7 +38,7 @@ LIBRARY euser.lib LIBRARY estor.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY SpeechEncoderConfig.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigProxy/src/SpeechEncoderConfigProxy.cpp --- a/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigProxy/src/SpeechEncoderConfigProxy.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/mmfcustominterfaces/SpeechEncoderConfig/SpeechEncoderConfigProxy/src/SpeechEncoderConfigProxy.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -150,7 +150,7 @@ CleanupClosePushL(stream); // stream on cleanup for (TInt i=0; i(stream.ReadUint32L())); + aSupportedFormats.AppendL(static_cast(stream.ReadUint32L())); } CleanupStack::PopAndDestroy(&stream); CleanupStack::PopAndDestroy(buf); @@ -874,7 +874,7 @@ CleanupClosePushL(stream); // stream on cleanup for (TInt i=0; i(stream.ReadUint32L())); + aSupportedTools.AppendL(static_cast(stream.ReadUint32L())); } CleanupStack::PopAndDestroy(&stream); CleanupStack::PopAndDestroy(buf); @@ -918,7 +918,7 @@ CleanupClosePushL(stream); // stream on cleanup for (TInt i=0; i < numPckg(); i++) { - aControllableTools.Append(static_cast(stream.ReadUint32L())); + aControllableTools.AppendL(static_cast(stream.ReadUint32L())); } CleanupStack::PopAndDestroy(&stream); CleanupStack::PopAndDestroy(buf); diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputBase/group/RestrictedAudioOutput.mmp --- a/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputBase/group/RestrictedAudioOutput.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputBase/group/RestrictedAudioOutput.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -42,6 +42,6 @@ LIBRARY euser.lib LIBRARY CustomCommandUtility.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfdevsound.lib // End of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputMessageHandler/Group/RestrictedAudioOutputMessageHandler.mmp --- a/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputMessageHandler/Group/RestrictedAudioOutputMessageHandler.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputMessageHandler/Group/RestrictedAudioOutputMessageHandler.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -40,7 +40,7 @@ LIBRARY euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY mmfcontrollerframework.lib LIBRARY RestrictedAudioOutput.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputProxy/Group/RestrictedAudioOutputProxy.mmp --- a/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputProxy/Group/RestrictedAudioOutputProxy.mmp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/restrictedaudiooutput/RestrictedAudioOutputProxy/Group/RestrictedAudioOutputProxy.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -35,9 +35,9 @@ SYSTEMINCLUDE /epoc32/include/mmf/common SYSTEMINCLUDE /epoc32/include/mmf/server -LIBRARY Euser.lib -LIBRARY MmfControllerFramework.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib LIBRARY CustomCommandUtility.lib LIBRARY RestrictedAudioOutput.lib -LIBRARY MMFDevSound.lib +LIBRARY mmfdevsound.lib diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 devsoundextensions/telephonyaudiorouting/Server/src/TelephonyAudioRoutingServer.cpp --- a/devsoundextensions/telephonyaudiorouting/Server/src/TelephonyAudioRoutingServer.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/devsoundextensions/telephonyaudiorouting/Server/src/TelephonyAudioRoutingServer.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -209,7 +209,7 @@ iShowNoteMode = showNotePkg(); TELAUDRTNG_RDEBUG1(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingServer::DoSetOutputL ShowNoteMode Value Sent to server = %d"), iShowNoteMode); - iSetOutputRequests.Append(aSessionId); + iSetOutputRequests.AppendL(aSessionId); // Verify requested audio change exists in available outputs (unless is ENone or ENotActive) if ( (response != CTelephonyAudioRouting::ENone) && (response != CTelephonyAudioRouting::ENotActive)) diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 layers.sysdef.xml --- a/layers.sysdef.xml Thu Sep 16 18:39:58 2010 +0100 +++ b/layers.sysdef.xml Thu Sep 16 18:57:38 2010 +0100 @@ -52,7 +52,7 @@ - + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/group/bld.inf --- a/mdfdevvideoextensions/group/bld.inf Thu Sep 16 18:39:58 2010 +0100 +++ b/mdfdevvideoextensions/group/bld.inf Thu Sep 16 18:57:38 2010 +0100 @@ -15,13 +15,18 @@ * */ +#include + PRJ_PLATFORMS DEFAULT PRJ_EXPORTS PRJ_MMPFILES +#ifdef NCP_COMMON_OMXIL_SHAI_SUPPORT_ENABLED +#include "../nga_mdf_postprocessor_shai/group/bld.inf" +#else #include "../nga_mdf_postprocessor/group/bld.inf" - +#endif // End of File diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor/group/bld.inf --- a/mdfdevvideoextensions/nga_mdf_postprocessor/group/bld.inf Thu Sep 16 18:39:58 2010 +0100 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor/group/bld.inf Thu Sep 16 18:57:38 2010 +0100 @@ -17,15 +17,19 @@ #include +#include PRJ_PLATFORMS WINSCW ARMV5 PRJ_MMPFILES +#ifndef NCP_COMMON_OMXIL_SHAI_SUPPORT_ENABLED NGAPostProcHwDevice.mmp +#endif PRJ_EXPORTS - +#ifndef NCP_COMMON_OMXIL_SHAI_SUPPORT_ENABLED ../rom/NGA_MDF_Postprocessor.iby CORE_OS_LAYER_IBY_EXPORT_PATH(NGA_MDF_Postprocessor.iby) ../data/nga_mdf_postprocessor_stub.sis /epoc32/data/z/system/install/nga_mdf_postprocessor_stub.sis +#endif diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/data/nga_mdf_postprocessor_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/data/nga_mdf_postprocessor_stub.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,30 @@ +; +; Copyright (c) 2008 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: Package file for project NGA MDF PostProcessor +; + +; nga_mdf_postprocessor.pkg +; +; Languages +&EN + +; Header +#{"NGA MDF PostProcessor"},(0x0251318C), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/data/nga_mdf_postprocessor_stub.sis Binary file mdfdevvideoextensions/nga_mdf_postprocessor_shai/data/nga_mdf_postprocessor_stub.sis has changed diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/NGAPostProcHwDevice.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/NGAPostProcHwDevice.mmp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2006 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 +#include "../inc/NGAPostProcHwDevice_UID.hrh" + +TARGET NGAPostProcHwDevice110.dll + +TARGETTYPE PLUGIN + +//MACRO DISPLAY_POSTING_API +#if defined(MARM_ARMV5) || defined(ARM9E) +ALWAYS_BUILD_AS_ARM +MACRO ARM_V5E +OPTION_REPLACE ARMCC --cpu ARM9E +#endif + + +UID 0x10009D8D KUidNGAPostProcHwDeviceDllUid + +VENDORID VID_DEFAULT +CAPABILITY CAP_ECOM_PLUGIN + +SOURCEPATH ../src + +SOURCE Colorspace_conv_yuv.c +SOURCE colorconversion.c +SOURCE NGAPostProcHwDevice.cpp +SOURCE ImplementationProxy.cpp +SOURCE NGAPostProcSessionManager.cpp +SOURCE NGAPostProcSurfaceHandler.cpp +SOURCE NGAPostProcNotifier.cpp + +#ifdef _DUMP_YUV_FRAMES +SOURCE myfopen.c +#endif + +START RESOURCE 200195AF.rss +TARGET NGAPostProcHwDevice110.rsc +END + +USERINCLUDE ../inc + + +OS_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/libc + + + +LIBRARY euser.lib +LIBRARY surfaceupdateclient.lib +LIBRARY surfacemanager.lib +LIBRARY fbscli.lib bitgdi.lib +LIBRARY devvideo.lib +LIBRARY hal.lib ws32.lib +LIBRARY efsrv.lib efile.lib estlib.lib +LIBRARY Flogger.lib + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/bld.inf Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2008 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 +#include + +PRJ_PLATFORMS +WINSCW ARMV5 + +PRJ_MMPFILES +#ifdef NCP_COMMON_OMXIL_SHAI_SUPPORT_ENABLED +NGAPostProcHwDevice.mmp +#endif + +PRJ_EXPORTS +#ifdef NCP_COMMON_OMXIL_SHAI_SUPPORT_ENABLED +../rom/NGA_MDF_Postprocessor.iby CORE_OS_LAYER_IBY_EXPORT_PATH(NGA_MDF_Postprocessor.iby) +../data/nga_mdf_postprocessor_stub.sis /epoc32/data/z/system/install/nga_mdf_postprocessor_stub.sis +#endif + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/nga_mdf_postprocessor.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/group/nga_mdf_postprocessor.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,35 @@ +; +; Copyright (c) 2008 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: Package file for project NGA MDF PostProcessor +; + +; nga_mdf_postprocessor.pkg +; +; Languages +&EN + +; Header +#{"NGA MDF PostProcessor"},(0x0251318C), 1, 0, 0, TYPE=SA,RU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +"\epoc32\release\armv5\urel\NGAPostProcHwDevice110.dll"-"!:\sys\bin\NGAPostProcHwDevice110.dll" + +"\epoc32\data\z\resource\plugins\NGAPostProcHwDevice110.RSC"-"!:\resource\plugins\NGAPostProcHwDevice110.RSC" + + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/Colorconversion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/Colorconversion.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,774 @@ +/* +* Copyright (c) 2010 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" + +#define CONST_19075 19075 +#define CONST_26748 26748 +#define CONST_6563 6563 +#define CONST_13621 13621 +#define CONST_33802 33802 +#define CONST_29374 29374 +#define CONST_8731 8731 +#define CONST_1747 1747 +#define CONST_34603 34603 +#define CONST_22973 22973 +#define CONST_5637 5637 +#define CONST_11699 11699 +#define CONST_29032 29032 +#define CONST_25801 25801 +#define CONST_3835 3835 +#define CONST_30397 30397 + + +/************* Start of Chroma2 format ******************************************/ + +/* For YUV420 Chroma2 input */ +// For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV420Chr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV420Chr2toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr2toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/* End of YUV420 input */ + + + + +/* Start of YUV422 Chroma2 BE (U1 Y1 V1 Y2) input */ +// For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV422BEChr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV422BEChr2toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr2toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/* End of YUV422 Chroma2 BE (U1 Y1 V1 Y2) input */ + + +/* Start of YUV422 Chr2 LE (Y2 V1 Y1 U1) input */ +// For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV422LEChr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV422LEChr2toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr2toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/* End of YUV422 Chr2 LE (Y2 V1 Y1 U1) input */ + + +void sDiffuse(int32 i, int32 j, int32 diff, int32 actWidth, int32 actHeight, + uint8 *lLumPtr, int32 lLumWidth, uint8 skip); + +/************* End of Chroma2 format ********************************************/ + + +/************* Start of Chroma1 format ******************************************/ + +/* For YUV420 Chroma1 input */ +//For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV420Chr1toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +//For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV420Chr1toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr1toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/* For YUV422 BE Chroma1 input */ +//For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV422BEChr1toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV422BEChr1toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422BEChr1toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/* For YUV422 LE Chroma1 input */ +//For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV422LEChr1toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV422LEChr1toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV422LEChr1toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/************* End of Chroma1 format ********************************************/ + + + +/************* Start of Chroma3 format ******************************************/ + +/* For YUV420 Chroma3 input */ +// For RGB 5:6:5 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 4:4:4:4 Ordered and Error Diffusion +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For RGB 8:8:8 +void sEmz_VDec_YUV420Chr3toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +// For XRGB 8:8:8:8 +void sEmz_VDec_YUV420Chr3toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +void sEmz_VDec_YUV420Chr3toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow); + +/************* End of Chroma3 format ******************************************/ + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/MdfRDebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/MdfRDebug.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __MDF_RDEBUG_H__ +#define __MDF_RDEBUG_H__ + +#include +#include +#include + +#ifdef _DEBUG + #define PP_DEBUG RDebug::Print +#else + #define PP_DEBUG +#endif + +#endif // __MDF_RDEBUG_H__ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,1161 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGAPOSTPROCHWDEVICE_H__ +#define __NGAPOSTPROCHWDEVICE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include //RSurfaceManager +#include //TSurfaceId +#include //TVideoAspectRatio +//TBC++ +//#include +#include "devvideosurfacehandlecustominterface.h" +#include "postinitializeci.h" +//TBC-- +#include +#include +#include +#include +#include + +#include "fetchframecustominterface.h" +#include "MdfRDebug.h" +#include "NGAPostProcHwDevice_UID.hrh" +#include "NGAPostProcSessionManagerObserver.h" +#include "common.h" + +class CNGAPostProcSessionManager; +class CNGAPostProcSurfaceHandler; +class CNGAPostProcTimer; +class RWsSession; + +class CNGAPostProcHwDevice: public CMMFVideoPostProcHwDevice, + public MMmfVideoBufferManagement, + public MNGAPostProcSessionManagerObserver, + public MMMFVideoSurfaceSupport, + public MMmfVideoPropertiesObserver, + public MMmfVideoResourceObserver, + public MMmfVideoSurfaceHandleControl, + public MMmfVideoPropertiesNotifier, + public MMmfVideoPlayRateControl, + public MMmfVideoSecureOutput, + public MMmfAdvancedVideoSecureOutput, + public MMmfPostInitializeRequest +{ + +public: + // === Constructors and destructor === + /** + * Two-phased constructor. + * @return pointer to an instance of CMMFVideoPostProcHwDevice + */ + static CMMFVideoPostProcHwDevice* NewL(); + + /** + * Destructor. + */ + ~CNGAPostProcHwDevice(); + +public: + + // === CMMFVideoPostProcHwDevice === + + /** + Sets the device input format to an uncompressed video format. + + @param "aFormat" "The input format to use." + @leave "The method will leave if an error occurs. Typical error codes used: + * KErrNotSupported - The input format is not supported." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + void SetInputFormatL(const TUncompressedVideoFormat& aFormat); + + /** + Sets the decoder device that will write data to this post-processor. Decoded pictures will be + written with WritePictureL() or through a custom interface. After pictures have been processed, + they must be returned to the decoder using ReturnPicture(). + + @param "aDevice" "The decoder source plug-in to use." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + void SetInputDevice(CMMFVideoDecodeHwDevice* aDevice); + + /** + Writes an uncompressed video picture to the post-processor. The picture must be returned to the + client or source plug-in after it has been used. + + @param "aPicture" "The picture to write." + @leave "This method may leave with one of the system-wide error codes." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void WritePictureL(TVideoPicture* aPicture); + + /** + Retrieves post-processing information about this hardware device. + The device creates a CPostProcessorInfo structure, fills it with correct data, pushes it + to the cleanup stack and returns it. The client will delete the object when it is no + longer needed. + + @return "Post-processor information as a CPostProcessorInfo object. + The object is pushed to the cleanup stack, and must be deallocated by the caller." + @leave "This method may leave with one of the system-wide error codes. + */ + CPostProcessorInfo* PostProcessorInfoLC(); + + /** + Retrieves the list of the output formats that the device supports. The list is ordered in + plug-in preference order, with the preferred formats at the beginning of the list. The list + can depend on the device source format, and therefore SetSourceFormatL() must be called before + calling this method. + + @param "aFormats" "An array for the result format list. The array must be created and destroyed by the caller." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method may only be called before the hwdevice has been initialized using Initialize()." + */ + void GetOutputFormatListL(RArray& aFormats); + + /** + Sets the device output format. + + @param "aFormat" "The format to use." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method may only be called before the hwdevice has been initialized using Initialize()." + */ + void SetOutputFormatL(const TUncompressedVideoFormat &aFormat); + + /** + Sets the clock source to use for video timing. If no clock source is set. video playback + will not be synchronized, but will proceed as fast as possible, depending on input data + and output buffer availability. + + @param "aClock" "The clock source to be used." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + void SetClockSource(MMMFClockSource* aClock); + + /** + Sets the device video output destination. The destination can be the screen (using direct + screen access) or memory buffers. By default memory buffers are used. If data is written + to another device, this method is ignored, and suitable memory buffers are always used. + + @param "aScreen" "True if video output destination is the screen, false if memory buffers." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + void SetVideoDestScreenL(TBool aScreen); + + /** + Sets the post-processing types to be used. + + @param "aPostProcCombination" "The post-processing steps to perform, a bitwise OR of values from TPostProcessType." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetPostProcessTypesL(TUint32 aPostProcCombination); + + /** + Sets post-processing options for input (pan-scan) cropping. + + @param "aRect" "The cropping rectangle to use." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetInputCropOptionsL(const TRect& aRect); + + /** + Sets post-processing options for YUV to RGB color space conversion. + Specifies the input YUV and output RGB formats to use explicitly. SetSourceFormatL(), + SetOutputFormatL(), and SetPostProcessTypesL() must be called before this method is used. + + @param "aOptions" "The conversion options to use." + @param "aYuvFormat" "Conversion source YUV format" + @param "aRgbFormat" "Conversion target RGB format" + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions, const TYuvFormat& aYuvFormat, + TRgbFormat aRgbFormat); + + /** + Sets post-processing options for YUV to RGB color space conversion. + Uses the device input and output formats. For decoder devices the default YUV format used is + the format specified in the input bitstream. SetSourceFormatL(), SetOutputFormatL(), and + SetPostProcessTypesL() must be called before this method is used. + + @param "aOptions" "The conversion options to use." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions); + + /** + Sets post-processing options for rotation. SetPostProcessTypesL() must be called before + this method is used. + + @param "aRotationType" "The rotation to perform." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetRotateOptionsL(TRotationType aRotationType); + + /** + Sets post-processing options for scaling. SetPostProcessTypesL() must be called before + this method is used. + + @param "aTargetSize" "Scaling target size. If a fixed scale factor size is used, + the new dimensions must be set to width=floor(factor*width), + height=floor(factor*height). For example, scaling a + QCIF (176x144) picture up by a factor of 4/3 yields a size + of 234x192." + @param "aAntiAliasFiltering" "True if anti-aliasing filtering should be used. + If the post-processor does not support anti-aliased scaling, + or supports anti-aliased scaling only, this argument is ignored." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering); + + /** + Sets post-processing options for output cropping. SetPostProcessTypesL() must be called before + this method is used. + + @param "aRect" "Output cropping area." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetOutputCropOptionsL(const TRect& aRect); + + /** + Sets post-processing plug-in specific options. SetPostProcessTypesL() must be called before + this method is used. + + @param "aOptions" "The options. The format is plug-in specific." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). + If called after initialization, the change must only be committed when CommitL() is called." + */ + void SetPostProcSpecificOptionsL(const TDesC8& aOptions); + + /** + Initializes the device. This method is asynchronous, the device will call + MMFVideoPlayProxy::MdvppInitializeComplete() after initialization has completed. After this + method has successfully completed, further configuration changes are not possible except where + separately noted. + */ + void Initialize(); + + /** + Commit all changes since the last CommitL(), Revert() or Initialize() + to the hardware device. This only applies to methods which can be called both + before AND after DevVideoPlay has been initialized. + + @see SetPostProcessTypesL + @see SetInputCropOptionsL + @see SetYuvToRgbOptionsL + @see SetRotateOptionsL + @see SetScaleOptionsL + @see SetOutputCropOptionsL + @see SetPostProcSpecificOptionsL + + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void CommitL(); + + /** + Revert all changes since the last CommitL(), Revert() or Initialize() + back to their previous settings. This only applies to methods which can + be called both before AND after DevVideoPlay has been initialized. + + @see SetPostProcessTypesL + @see SetInputCropOptionsL + @see SetYuvToRgbOptionsL + @see SetRotateOptionsL + @see SetScaleOptionsL + @see SetOutputCropOptionsL + @see SetPostProcSpecificOptionsL + + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Revert(); + + /** + Starts writing output directly to the display frame buffer using Direct Screen Access. + + @param "aVideoRect" "The video output rectangle on screen." + @param "aScreenDevice" "The screen device to use. The screen device object must be valid in the current thread." + @param "aClipRegion" "Initial clipping region to use." + + @leave "This method may leave with one of the system-wide error codes. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void StartDirectScreenAccessL(const TRect& aVideoRect, + CFbsScreenDevice& aScreenDevice, const TRegion& aClipRegion); + + /** + Sets a new clipping region for Direct Screen Access. After the method returns, no video will + be drawn outside of the region. If clipping is not supported, or the clipping region is too + complex, either playback will pause or will resume without video display, depending on the + current setting of SetPauseOnClipFail(), and the result can be verified with IsPlaying(). + Clipping can be disabled by setting a new clipping region that includes the whole video window. + + @param "aRegion" "The new clipping region. After the method returns, no video will be drawn outside the region." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void SetScreenClipRegion(const TRegion& aRegion); + + /** + Sets whether the system should pause playback when it gets a clipping region it cannot handle, + or Direct Screen Access is aborted completely. If not, processing will proceed normally, but no + video will be drawn. By default, playback is paused. + + @param "aPause" "True if playback should be paused when clipping fails, false if not. + If playback is not paused, it will be continued without video display." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void SetPauseOnClipFail(TBool aPause); + + /** + Aborts Direct Screen Access completely, to be called from MAbortDirectScreenAccess::AbortNow() + and similar methods. DSA can be resumed by calling StartDirectScreenAccessL(). + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void AbortDirectScreenAccess(); + + /** + Indicates whether playback is proceeding. This method can be used to check whether playback was + paused or not in response to a new clipping region or DSA abort. + + @return "ETrue if video is still being played (even if not necessarily displayed)." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + TBool IsPlaying(); + + /** + Re-draws the latest video picture. Only available when DSA is being used. If DSA is aborted or a + non-supported clipping region has been set, the request may be ignored. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Redraw(); + + + /** + Starts video playback, including decoding, post-processing, and rendering. Playback will proceed + until it has been stopped or paused, or the end of the bitstream is reached. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Start(); + + /** + Stops video playback. No new pictures will be decoded, post-processed, or rendered. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Stop(); + + /** + Pauses video playback, including decoding, post-processing, and rendering. No pictures will be + decoded, post-processed, or rendered until playback has been resumed. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Pause(); + + /** + Resumes video playback after a pause. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void Resume(); + + /** + Changes to a new decoding and playback position, used for randomly accessing (seeking) the + input stream. The position change flushes all input and output buffers. Pre-decoder and + post-decoder buffering are handled as if a new bitstream was being decoded. If the device still + has buffered pictures that precede the new playback position, they will be discarded. If playback + is synchronized to a clock source, the client is responsible for setting the clock source to the + new position. + + @param "aPlaybackPosition" "The new playback position in the video stream." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition); + + /** + Freezes a picture on the screen. After the picture has been frozen, no new pictures are + displayed until the freeze is released with ReleaseFreeze(). If the device output is being + written to memory buffers or to another plug-in, instead of the screen, no decoded pictures + will be delivered while the freeze is active, and they are simply discarded. + + @param "aTimestamp" "The presentation timestamp of the picture to freeze. The frozen picture + will be the first picture with a timestamp greater than or equal to this + parameter." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void FreezePicture(const TTimeIntervalMicroSeconds& aTimestamp); + + /** + Releases a picture frozen with FreezePicture(). + + @param "aTimestamp" "The presentation timestamp of the picture to release. The first picture + displayed after the release will be the first picture with a timestamp + greater than or equal to this parameter. To release the freeze immediately, + set the timestamp to zero." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void ReleaseFreeze(const TTimeIntervalMicroSeconds& aTimestamp); + + + /** + Returns the current playback position, i.e. the timestamp for the most recently displayed or + virtually displayed picture. If the device output is written to another device, the most recent + output picture is used. + + @return "Current playback position." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + TTimeIntervalMicroSeconds PlaybackPosition(); + + /** + Returns the total amount of memory allocated for uncompressed pictures. This figure only + includes the pictures actually allocated by the plug-in itself, so that the total number of + bytes allocated in the system can be calculated by taking the sum of the values from all plug-ins. + + @return "Total number of bytes of memory allocated for uncompressed pictures." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + TUint PictureBufferBytes(); + + /** + Reads various counters related to decoded pictures. The counters are reset when Initialize() + or this method is called, and thus they only include pictures processed since the last call. + + Post-processor devices return the number of input pictures in iPicturesDecoded and + iTotalPictures. If the decoded pictures are written to another plug-in, they are considered + to be "virtually displayed". + + @param "aCounters" "The counter structure to fill." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void GetPictureCounters(CMMFDevVideoPlay::TPictureCounters& aCounters); + + + /** + Sets the computational complexity level to use. If separate complexity levels are not available, + the method call is ignored. If the level specified is not available, the results are undefined. + Typically the device will either ignore the request or use the nearest suitable level. + + The complexity level can be changed at any point during playback. + + @param "aLevel" "The computational complexity level to use. Level zero (0) is the most complex + one, with the highest quality. Higher level numbers require less processing + and may have lower quality." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void SetComplexityLevel(TUint aLevel); + + /** + Gets the number of complexity levels available. + + @return "The number of complexity control levels available, or zero if the information is not + available yet. The information may not be available if the number of levels depends on + the input data, and enough input data has not been read yet. In that case, using level + zero is safe." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + TUint NumComplexityLevels(); + + /** + Gets information about a computational complexity level. This method can be called after + NumComplexityLevels() has returned a non-zero value - at that point the information is guaranteed + to be available. Some hardware device implementations may not be able to provide all values, + in that case the values will be approximated. + + @param "aLevel" "The computational complexity level to query. The level numbers range from zero + (the most complex) to NumComplexityLevels()-1." + @param "aInfo" "The information structure to fill." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void GetComplexityLevelInfo(TUint aLevel, CMMFDevVideoPlay::TComplexityLevelInfo& aInfo); + + /** + Returns a picture back to the device. This method is called by CMMFDevVideoPlay to return pictures + from the client (after they have been written with NewPicture()), or by the output device when + it has finished using a picture. + + @param "aPicture" "The picture to return. The device can re-use the memory for the picture." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void ReturnPicture(TVideoPicture* aPicture); + + /** + Gets a copy of the latest picture sent to output. + + @param "aPictureData" "Target picture. The memory for the picture must be allocated by the + caller, and initialized properly. The data formats must match the snapshot + format requested." + @param "aFormat" "The picture format to use for the snapshot." + + @return "ETrue if the snapshot was taken, EFalse if a picture is not available. The picture may not + be available if decoding has not progressed far enough yet." + + @leave "The method will leave if an error occurs. Typical error codes used: + * KErrNotSupported - The requested data format or picture size is not supported, or the + plug-in does not support snapshots." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ +// TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat) {return EFalse;}; + TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat); + + /** + When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete() + callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot + request can be active at a time. + + @param "aPictureData" "Target picture. The memory for the picture must be allocated by + the caller, and initialized properly. The data formats must match + the snapshot format requested. The picture must remain valid until + the snapshot has been taken or until the request has been cancelled + with CancelTimedSnapshot()." + @param "aFormat" "The picture format to use for the snapshot." + @param "aPresentationTimestamp" "Presentation timestamp for the picture to copy." + + @leave "The method will leave if an error occurs. Typical error codes used: + * KErrNotSupported - The requested data format or picture size is not supported or + the plug-in does not support timed snapshots." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + //void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, + // const TTimeIntervalMicroSeconds& aPresentationTimestamp){}; + void GetTimedSnapshotL(TPictureData*, const TUncompressedVideoFormat&, const TTimeIntervalMicroSeconds&){}; + + + /** + When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete() + callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot + request can be active at a time. + + @param "aPictureData" "Target picture. The memory for the picture must be allocated by + the caller, and initialized properly. The data formats must match + the snapshot format requested. The picture must remain valid until + the snapshot has been taken or until the request has been cancelled + with CancelTimedSnapshot()." + @param "aFormat" "The picture format to use for the snapshot." + @param "aPictureId" "Picture identifier for the picture to copy." + + @leave "The method will leave if an error occurs. Typical error codes used: + * KErrNotSupported - The requested data format or picture size is not supported or + the plug-in does not support timed snapshots." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ +// void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, +// const TPictureId& aPictureId){}; + void GetTimedSnapshotL(TPictureData*, const TUncompressedVideoFormat&, const TPictureId& ){}; + + /** + Cancels a timed snapshot request. + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void CancelTimedSnapshot(){}; + + /** + Gets a list of the supported snapshot picture formats. + + @param "aFormats" "An array for the result format list. The array must be created and destroyed by + the caller." + + @leave "This method may leave with one of the standard error codes." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void GetSupportedSnapshotFormatsL(RArray&){}; + + + /** + + Notifies the hardware device that the end of input data has been reached and no more input data + will be written. The hardware device can use this signal to ensure that the remaining data gets + processed, without waiting for new data. For example when the data type is not EDuCodedPicture, + calling this method is necessary otherwise a hardware device implementation might be looking for + the start code for the next picture to ensure it has a complete picture before starting to decode + the previous one. + + + After the remaining data has been processed (and displayed, if applicable), the hardware + device must notify the proxy with the MdvppStreamEnd() callback. + + DevVideo clients are encouraged to call this method, but its use is not mandatory for synchronized + processing. For synchronized playback, all video pictures are processed or discarded according to + their timestamps, and so the client can easily infer when processing is complete. However, it + should be noted that the last picture might not be displayed if this method is not called and the + input data type is not EDuCodedPicture. + + For non-synchronized playback (e.g. file conversion), a client must call this method otherwise it + will never find out when the hardware device has finished processing the data. + + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + void InputEnd(); + + /** + Retrieves a custom interface to the device. + @param "aInterface" "Interface UID, defined with the custom interface." + @return "Pointer to the interface implementation, or NULL if the device does not + implement the interface requested. The return value must be cast to the + correct type by the user." + */ + TAny* CustomInterface(TUid aInterface); + + // === MNGAPostProcSessionManagerObserver === + /** + Set the proxy implementation to be used. Called just after the object is constructed. + @param "aProxy" "The proxy to use." + */ + void BufferAvailable(TInt aBufId, TInt aStatus); + +public: + + // === MMmfVideoBufferManagement === + + /** + * Sets the observer object to use. The observer gets notified + * when new buffers are available and when buffers need to be + * released back to the media device. + * + * This method can only be called before the media device has + * been Initialized with InitializeL(). + * + * @param aObserver The observer object to use. + */ + void MmvbmSetObserver(MMmfVideoBufferManagementObserver* aObserver); + + /** + * Enables input buffer management mode. In buffer management mode + * the target media device allocates memory for input buffers and + * the client can only use input buffers allocated with + * MmvbmGetBufferL(). + * + * This method can only be called before the media device has been + * Initialized with InitializeL(). This method must be called if + * the client uses MmvbmGetBufferL(). + * + * @param aEnable ETrue if input buffer management mode is used. + */ + void MmvbmEnable(TBool aEnable); + + /** + * Sets the buffer options to use. The client can request the + * number of input buffers that should be available, but typically + * only few (one or two) buffers can be used. + * + * This method can only be called before the media device has been + * Initialized with InitializeL(). + * + * @param aOptions The buffer options to use, see TBufferOptions. + * + * @leave KErrNotSupported The requested buffer options are not + * supported. Typically the client has requested too many input + * buffers. + */ + void MmvbmSetBufferOptionsL(const TBufferOptions& aOptions); + + /** + * Gets the buffer options currently in use. + * + * This method can only be called before the media device has been + * Initialized with InitializeL(). + * + * @param aOptions Target buffer options data structure. + */ + void MmvbmGetBufferOptions(TBufferOptions& aOptions); + + /** + * Gets a new input picture buffer. The client can then write data + * into the buffer and write it back to the media device with + * WritePictureL(). + * + * This method can only be called after the media device has been + * Initialized with InitializeL(). This method can only be called + * in buffer management mode, i.e. if the client has called + * MmvbmEnable(ETrue). + * + * Note that target-allocated and client-allocated input buffers + * cannot be mixed. In buffer management mode only input buffers + * allocated with this method can be sent to the media device. + * + * If a client has retrieved buffers with MmvbmGetBufferL(), it + * must be prepated to release them synchronously at any point if + * MmmfBufferManagementObserver::MmvbmoReleaseBuffers() is + * called. This may happen if the target media device suddenly + * loses access to the buffers due to DSA abort, resource + * management conflict, or media device destruction. + * + * @param aSize The requested buffer size, in pixels. The buffer + * size should match the picture size set at initialisation phase, + * or otherwise suitable buffer may not be available. If the size + * is smaller than the size set at initialisation phase, the + * allocated buffer may be larger than requested. + * + * @return A new input picture buffer. If no free buffers are + * available, the return value is NULL. + * + * @leave General The method will leave if an error occurs. Lack + * of free buffers is not considered an error. + */ + TVideoPicture* MmvbmGetBufferL(const TSize& aSize); + + /** + * Releases an input buffer back to the media device without using + * it. This method is mainly used as a response to a + * MmvbmReleaseBuffers() callback. + * + * @param aBuffer The buffer to release. + */ + void MmvbmReleaseBuffer(TVideoPicture* aBuffer); + +public: + + // === MMMFVideoSurfaceSupport === + + /** + Requests the media device to use graphics surfaces for video rendering. + The client must call this method before Initialize() to ensure the media + device allocates the right types of resources for rendering. + */ + void MmvssUseSurfaces(); + + /** + Sets a new video surface support observer to receive surface management events + from the media device. + + @param aObserver New observer object to use. + */ + void MmvssSetObserver(MMMFVideoSurfaceObserver& aObserver); + + /** + Retrieves surface parameters for a display. The client typically calls this in response + to a MmvsoSurfaceCreated() or MmvsoSurfaceParametersUpdated() observer callback. + + @param aSurfaceId + Surface ID for the display. + @param aCropRect + Cropping rectangle within the surface. The crop rectangle identifies the area of + the surface that should be shown on the screen. + @param aPixelAspectRatio + Video picture pixel aspect ratio. + + @leave KErrNotReady if no surface is available for the display. + */ + + void MmvssGetSurfaceParametersL(TSurfaceId& aSurfaceId, TRect& aCropRect, + TVideoAspectRatio& aPixelAspectRatio); + /** + Indicates that the surface is no longer in use and can be destroyed. The client typically calls + this in response to MmvsoSurfaceCreated() (while old surface is already in use and the current + should be removed) or MmvsoRemoveSurface() observer callback. + + @param aSurfaceId Surface ID that is no longer in use + + @leave KErrNotFound if the surface does not exist + */ + void MmvssSurfaceRemovedL(const TSurfaceId& aSurfaceId); + +public: + + // === MMmfVideoPropertiesObserver === + + /** + Decoded video properties updated. The media device implementing the + MMmfVideoPropertiesNotifier extension will call this method immediately + before outputting a picture with the updated properties. + + When the extension is used between a decoder and a post-processor media + device, the post-processor can associate the changed properties with the + correct picture, since the next incoming picture after this call will + be the first updated one. + + When the extension is used between a DevVideoPlay client and a + post-processor media device, the client can synchronously reconfigure + video display options using SetScaleOptionsL() and related methods. This + lets the client reconfigure the display for the correct picture. + + @param aYuvFormat Updated YUV format parameters. The updated fields are + iAspectRatioDenom, iAspectRatioNum, and iCoefficients + @param aPictureSize Updated picture size. This size will be the true + picture display size, excluding any padding that + the codec might use. + */ + virtual void MmvpoUpdateVideoProperties(const TYuvFormat& aYuvFormat, const TSize& aPictureSize); + +public: + + // === MMmfVideoResourceObserver === + + /** + Indicates that a media device has lost its resources. The client must + synchronously pause or stop processing before returning from this method + so that the media device can release its resources to the system. If + the client does not pause or stop, resource loss will be handled as a + fatal error. + + The client may start again or resume after receiving a + MvroResourcesRestored() callback. + + @param aMediaDevice UID for the media device that lost resources. The + client can use this e.g. to determine whether the + decoder or the post-processor lost resources. This + is typically not required though since the client + must pause DevVideo entirely. + */ + virtual void MmvroResourcesLost(TUid aMediaDevice); + + /** + Indicates that a media device has regained its resources after a + previous resource loss. The client can restart or resume processing. + This can be done either synchronously or asynchronously. + + @param aMediaDevice UID for the media device that regained resources. + */ + virtual void MmvroResourcesRestored(TUid aMediaDevice); + + + // === MMmfVideoSurfaceHandleControl === + + /** + Sets an external surface ID. This should be called as soon as external surface is created. + + @param aSurfaceID external surface ID. + + */ + + virtual void MmvshcSetSurfaceHandle(const TSurfaceId& aSurfaceHandle); + + /** + Sets a redraw buffer to be used during resource loss. + + @param aRedrawBuffer redraw buffer. + + */ + virtual void MmvshcRedrawBufferToSurface(TPtrC8& aRedrawBuffer); + + /** + * Creates a surface and maps the surface with the chunk handle passed in. + * @param aAttributes + * @param aHandle is the Chunk handle for the data. + * @param aSurfaceId returns the surfaceId that was just created + * + * @return error code + */ + + virtual TInt MmvshcCreateSurface(const RSurfaceManager::TSurfaceCreationAttributes& aAttributes, TInt aHandle, TSurfaceId& aSurfaceId); + +public: + // === MMmfVideoPropertiesNotifier === + /** + Sets a new video properties observer. This method can be called at any + time after the media device has been instantiated. + + @param aObserver New observer object. + */ + virtual void MmvpnSetObserver(MMmfVideoPropertiesObserver* aObserver); + +public: + + void ReturnPicToDecoder(TVideoPicture* aPic); + TInt AttemptToPost(); + +public: + //=== MMdfTrickPlayControl === = + /** + * Query the Direction capabilities from the MDF decoders and + * post processor. + * + */ + virtual void MmvprcGetPlayRateCapabilitiesL(TVideoPlayRateCapabilities& aCapabilities); + + /** + * Sets the playback speed. A negative rate means play backward. + * +/- percentage. + * + */ + virtual void MmvprcSetPlayRateL(const TInt aRate); + + /** + * Gets the playback speed. A negative rate means play backward. + * +/- percentage. + * + */ + virtual TInt MmvprcPlayRateL(); + + /** + * Sets the step frame number in frame step mode + * +/- frames + */ + virtual void MmvprcStepFrameL(const TInt aStep); + + /** + * Registers the observer + */ + virtual void MmvprcSetObserver(MMmfVideoPlayRateObserver& aObserver); + +public: + + // === MMmfVideoSecureOutput === + /** + * Notifies the media device if the content can only be sent to a + * secure output. The device display is typically considered a + * secure output, but a high-quality unprotected analog or digital + * video output connector is not. By default all content can be + * sent to both secure and insecure outputs. + * + * This method can only be called before the media device has been + * initialised with InitializeL(). + * + * @param aSecure Set to ETrue if the content can only be sent to + * a secure output, EFalse if both secure and unsecure outputs can + * be used. + * + * @leave KErrNotSupported Insecure outputs cannot be + * disabled. The client should not play protected content. + */ + virtual void MmvsoSetSecureOutputL(TBool aSecure); + +public: + //=== AdvancedVideoSecureOutput === = + virtual void MmavsoSetAllowedOutputL(TUint aAllowedOutputMask); + +public: + // === MMmfPostInitializeRequest === + virtual void MmpirPostInitializeRequest(MMmfPostInitializeResponse& aResponse); + +protected: + + // === CMMFVideoPostProcHwDevice === + /** + Set the proxy implementation to be used. Called just after the object is constructed. + @param "aProxy" "The proxy to use." + */ + void SetProxy(MMMFDevVideoPlayProxy& aProxy); + +protected: + + /** + * Symbian 2nd phase constructor . + */ + void ConstructL(); + +private: + TInt IsTimeToPost(TVideoPicture* frame, TInt64& delta); + TVideoPicture* CreateBuffersL(TInt aBufId); + void CreateVBMBuffersL(); + TInt SetupExternalSurface(const TSurfaceId &aSurfaceID); + void ReleaseInputQ(); + void ReleaseProcessQ(); + void ReleasePicture(TVideoPicture *pic); + void PublishSurfaceCreated(); + void PublishSurfaceUpdated(); + TInt SetupSurface(); + void SetSurfaceAttributes(const TSize& aSize, TInt aNumBuf); + TInt GetID(TVideoPicture *aPicture); + TInt GetExternalBufferID(TVideoPicture *aPicture); + TInt RegisterSurface(const TSurfaceId& aSurfaceId); + TInt IsGceReady(); + void SetTimer(TInt64 aDelta); + TInt ConvertPostProcBuffer(TVideoPicture* pSrc, TVideoPicture* pDest); + void AddPictureToVBMQ(TVideoPicture *pic); + void AddPictureToColorConversionQ(TVideoPicture *pic); + void ResetCountingBuffer(); + void PicturesSkipped(); + TVideoPicture* DoColorConvert(TVideoPicture* aPicture); + + /** + Adds a picture to the Input queue. Based on the timestamp of the picture, + it is either appeneded at the end of the queue or inserted at the + appropriate position. The queue is arranged in the ascending order. + The ret value indicates if the head of the queue was changed or not. + */ + TInt AddToQ(TVideoPicture* aPicture); + + /** + Removes a picture from Input queue based on the playrate. + If the playrate is +ve ie forward playback head will be removed + and if the playrate is -ve ie backward playback tail + will be removed. + */ + void RemoveFromQ(); + + /** + Returns a picture from Input queue based on the playrate. + If the playrate is +ve ie forward playback head will be returned + and if the playrate is -ve ie backward playback tail + will be returned. + */ + TVideoPicture* PeekQ(); + + /** + Adds a surface hint to a video surface. If there is any hint already added, + the surface is updated with the new hint. + */ + TInt AddHints(); + + #ifdef _DUMP_YUV_FRAMES + void captureYuv(TVideoPicture* aPicture); + #endif + + TInt SetSourceFormat(); + TInt SetSourceRange(); + TInt ColorConvert(tBaseVideoFrame* aInputFrame, TUint8* aDestPtr, tWndParam* aInputCropWindow, tWndParam* aOutputCropWindow); + +private: + + // + // C++ default constructor. + // + CNGAPostProcHwDevice(); + + // + // State of post processor + // + enum TPPState + { + EInitializing, + EInitialized, + EPlaying, + EPaused, + EStopped + }; + + enum TTimeToPost + { + ESkipIt = -1, + EPostIt = 0, + EDelayIt = 1, + }; + +private: + + MMMFDevVideoPlayProxy* iProxy; + CMMFVideoDecodeHwDevice* iInputDecoderDevice; + RArray iInputQ; + RArray iProcessQ; + MMMFClockSource* iClockSource; + TTimeIntervalMicroSeconds iCurrentPlaybackPosition; + TPPState iPPState; + CNGAPostProcSurfaceHandler* iSurfaceHandler; + CNGAPostProcSessionManager* iSessionManager; + + RSurfaceManager::TSurfaceCreationAttributesBuf iAttributes; + RChunk iChunk; + RSurfaceManager::TInfoBuf iInfo; + TSurfaceId iSurfaceId; + TBool iIsInputEnded; + CNGAPostProcTimer* iPostingTimer; + CMMFDevVideoPlay::TPictureCounters iPictureCounters; + TBool iFirstPictureUpdated; + TBool iUsingExternalSurface; + TBool iIsColorConversionNeeded; + RArray iColorConversionQ; + TBool iSurfaceCreatedEventPublished; + TInt iOverflowPictureCounter; + TInt iVideoFrameBufSize; + TBool iResourceLost; + TBool iRedrawDone; + // Flag to indicate that the redraw surface has been created, and + // can be used in a subsequent call ro Redraw() + TBool iRedrawSurfaceInUse; + + //-- members for buffer management -- + MMmfVideoBufferManagementObserver* iVBMObserver; + TBufferOptions iVBMBufferOptions; + RArray iVBMBufferReferenceQ; + RArray iVBMBufferQ; + TBool iVBMEnabled; + RArray iSupportedInputFormats; + TInt count; + + //-- members for Surface Hints -- + RSurfaceManager::THintPair iHint; + TUint iSurfaceMask; + TUid iSurfaceKey; + + //-- members for Surface support -- + MMMFVideoSurfaceObserver* iVideoSurfaceObserver; + MMmfVideoPropertiesObserver* iVPObserver; + RWsSession iWsSession; + TSize iPicSize; + TUint iAspectRatioNum; + TUint iAspectRatioDenom; + //-- members for Trickplay support -- + TInt iStepFrameCount; + TInt iPlayRate; + TBool iKeyFrameMode; + MMmfVideoPlayRateObserver* iFPObserver; + TUint8 iSkippedFramesCountingBuffer[64]; + TUint8 iSkippedFramesInLast64Frames; + TUint8 iCurrentPosInFramesCountingBuffer; + TUncompressedVideoFormat iVideoFormat; + //---------- utility variables ------- + // Image source format + TUint8 iSourceFormat; + + //Image range + TUint8 iSourceRange; + + //-- members for PostInitializeRequest support -- + MMmfPostInitializeResponse* iPostInitializeResponse; + TBool iIsExternalChunk; +}; + +/** + * Timer of Posting + */ + +class CNGAPostProcTimer: public CTimer + { +public: + static CNGAPostProcTimer* NewL( CNGAPostProcHwDevice& aParent ); + ~CNGAPostProcTimer(); + +protected: + void RunL(); + +private: + CNGAPostProcTimer( CNGAPostProcHwDevice& aParent ); + void ConstructL(); + +private: + CNGAPostProcHwDevice& iParent; +}; + +#endif //__NGAPOSTPROCHWDEVICE_H__ + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice_UID.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice_UID.hrh Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +/* +******************************************************************************* +Product : NGA MDF Plugins +Module : NGA Post processor HwDevice +File : NGAPostProcHwDevice_UID.hrh +Description : hrh file containing definitions of UIDS used in NGA Post processor + HwDevice +******************************************************************************* +*/ + + +#ifndef __NGAPOSTPROCHWDEVICE_HRH__ +#define __NGAPOSTPROCHWDEVICE_HRH__ + +#define KUidNGAPostProcHwDeviceImplUid 0x2003162A // 0x10273417 //0x200195B0 +#define KUidNGAPostProcHwDeviceDllUid 0x20031629 // 0x10273416 //0x200195AF + +#endif //__NGAPOSTPROCHWDEVICE_HRH__ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcNotifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcNotifier.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGAPOSTPROCNOTIFIER_H__ +#define __NGAPOSTPROCNOTIFIER_H__ + +#include + +class CNGAPostProcSessionManager; + +class CNGAPostProcNotifier: public CActive + { +public: + static CNGAPostProcNotifier* NewL( CNGAPostProcSessionManager& aParent ); + ~CNGAPostProcNotifier(); + void SetBufferId(TInt aBufId); + void Activate(); + +private: + void RunL(); + void DoCancel(); + TInt RunError( TInt aError ); + +private: + CNGAPostProcNotifier( CNGAPostProcSessionManager& aParent ); + void ConstructL(); + +private: + CNGAPostProcSessionManager& iParent; + TInt iBufferId; +}; + +#endif //__NGAPOSTPROCNOTIFIER_H__ \ No newline at end of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSessionManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSessionManager.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGAPOSTPROCSESSIONMANAGER_H__ +#define __NGAPOSTPROCSESSIONMANAGER_H__ + +#include //TSurfaceId +#include //RSurfaceManager +#include +#include + +class RSurfaceUpdateSession; +class MNGAPostProcSessionManagerObserver; +class CNGAPostProcNotifier; + +class CNGAPostProcSessionManager: public CBase +{ +friend class CNGAPostProcNotifier; + +public: + // === Constructors and destructor === + /** + * Two-phased constructor. + * @return pointer to an instance of CNGAPostProcSessionManager + */ + static CNGAPostProcSessionManager* NewL(); + + /** + * Destructor. + */ + ~CNGAPostProcSessionManager(); + +public: + + /** + submits buffer to GCE for displaying. + + @param "aBufId" "ID of the buffer that needs to be displayed." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + TInt PostPicture(const TSurfaceId& aSurfaceId, TInt aBufId, TBool aNotifyRequired); + + + + /** + Removes display from the system, if it is already existing. + + @param "aDisplayId" "ID of the display that needs to be removed from the system" + */ + void HandleBufferRelease(TInt aBufId, TInt aStatus); + + /** + Removes display from the system, if it is already existing. + + @param "aDisplayId" "ID of the display that needs to be removed from the system" + */ + void SetObserver(MNGAPostProcSessionManagerObserver& aObserver); + + + void CreateNotifierL(TInt aNumSurfaceBuffers); + + void CancelNotifiers(); + +protected: + CNGAPostProcSessionManager(); + /** + * Symbian 2nd phase constructor . + */ + void ConstructL(); + +private: + /** + Cancels Surface Update Notifications + */ + void CancelUpdate(); + +private: + + RSurfaceUpdateSession* iSurfaceUpdateSession; + MNGAPostProcSessionManagerObserver* iObserver; + RPointerArray iAOList; +}; + +#endif //__NGAPOSTPROCSESSIONMANAGER_H__ \ No newline at end of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSessionManagerObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSessionManagerObserver.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGAPOSTPROCSESSIONMANAGEROBSERVER_H__ +#define __NGAPOSTPROCSESSIONMANAGEROBSERVER_H__ + +/** +@internal + +The class is a mixin and is intended to support for communicating buffers availablity +after buffer has been released by GCE. +*/ +class MNGAPostProcSessionManagerObserver +{ +public: + /** + This method can be called from session manager, whenever a buffer is released by GCE. + + @param "aBufId Id of the buffer that got released by GCE. This buffer can be used to get + more data from decoder" + */ + virtual void BufferAvailable(TInt aBufId, TInt aStatus) = 0; + +}; + +#endif //__NGAPOSTPROCSESSIONMANAGEROBSERVER_H__ \ No newline at end of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSurfaceHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcSurfaceHandler.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,143 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGAPOSTPROCSURFACEHANDLER_H__ +#define __NGAPOSTPROCSURFACEHANDLER_H__ + +#include +#include + +class RSurfaceManager; + +class CNGAPostProcSurfaceHandler: public CBase +{ + +public: + // === Constructors and destructor === + /** + * Two-phased constructor. + * @return pointer to an instance of CMMFVideoPostProcHwDevice + */ + static CNGAPostProcSurfaceHandler* NewL(); + + /** + * Destructor. + */ + ~CNGAPostProcSurfaceHandler(); + +public: + + /** + Sets the device input format to an uncompressed video format. + + @param "aFormat" "The input format to use." + @leave "The method will leave if an error occurs. Typical error codes used: + * KErrNotSupported - The input format is not supported." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + TInt CreateSurface(const RSurfaceManager::TSurfaceCreationAttributes & aAttributes, TSurfaceId& aSurfaceId, const RChunk& aChunk); + TInt CreateSurface(const RSurfaceManager::TSurfaceCreationAttributesBuf & aAttributes, TSurfaceId& aSurfaceId); + + /** + Sets the decoder device that will write data to this post-processor. Decoded pictures will be + written with WritePictureL() or through a custom interface. After pictures have been processed, + they must be returned to the decoder using ReturnPicture(). + + @param "aDevice" "The decoder source plug-in to use." + @pre "This method can only be called before the hwdevice has been initialized with Initialize()." + */ + TInt OpenSurface(const TSurfaceId& aSurfaceId); + + /** + Writes an uncompressed video picture to the post-processor. The picture must be returned to the + client or source plug-in after it has been used. + + @param "aPicture" "The picture to write." + @leave "This method may leave with one of the system-wide error codes." + @pre "This method can only be called after the hwdevice has been initialized with Initialize()." + */ + TInt MapSurface(const TSurfaceId& aSurfaceId, RChunk& aHandle); + + /** + Retrieves post-processing information about this hardware device. + The device creates a CPostProcessorInfo structure, fills it with correct data, pushes it + to the cleanup stack and returns it. The client will delete the object when it is no + longer needed. + + @return "Post-processor information as a CPostProcessorInfo object. + The object is pushed to the cleanup stack, and must be deallocated by the caller." + @leave "This method may leave with one of the system-wide error codes. + */ + TInt SurfaceInfo(const TSurfaceId& aSurfaceId, RSurfaceManager::TInfoBuf& aInfo); + + /** + Retrieves the list of the output formats that the device supports. The list is ordered in + plug-in preference order, with the preferred formats at the beginning of the list. The list + can depend on the device source format, and therefore SetSourceFormatL() must be called before + calling this method. + + @param "aFormats" "An array for the result format list. The array must be created and destroyed by the caller." + @leave "This method may leave with one of the system-wide error codes. + @pre "This method may only be called before the hwdevice has been initialized using Initialize()." + */ + TInt DestroySurface(const TSurfaceId& aSurfaceId); + + /** + Get the offset of the specified buffer from the base address of the underlying + chunk. + + To obtain the address of the buffer, the offset returned must be added onto the + base address of the RChunk returned in a call to MapSurface(). Note that + buffer offsets are immutable during the lifetime of the surface. + @param aParam The input parameters including the surface ID and buffer index. + @pre The surface is open in the calling process. + @return KErrNone if successful, KErrArgument if aSurfaceId or aBuffer are invalid, + KErrAccessDenied if the surface is not open in the current process, KErrNotSupported if + the surface is not mappable, otherwise a system wide error code. + */ + TInt GetBufferOffset(const TSurfaceId& aSurfaceId, TInt aBuffer, TInt& aOffset); + + /** + Adds a Surface hint to the video surface. + + */ + TInt AddSurfaceHint(const TSurfaceId& aSurfaceId,const RSurfaceManager::THintPair& aHint); + + /** + Updates an existing Surface hint. + + */ + TInt SetSurfaceHint(const TSurfaceId& aSurfaceId,const RSurfaceManager::THintPair& aHint); + +protected: + CNGAPostProcSurfaceHandler(); + /** + * Symbian 2nd phase constructor . + */ + void ConstructL(); + +private: + + RSurfaceManager* iSurfaceManager; + + RSurfaceManager::TSurfaceCreationAttributesBuf iSurfaceAttributesBuf; + // A surface attribute. + RSurfaceManager::TSurfaceCreationAttributes& iSurfaceAttributes; +}; + +#endif //__NGAPOSTPROCSURFACEHANDLER_H__ \ No newline at end of file diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/common.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/common.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2008 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: +* +*/ + +#ifndef INCLUDE_COMMON +#define INCLUDE_COMMON + + +typedef signed char int8; +typedef unsigned char uint8; +typedef short int int16; +typedef unsigned short int uint16; +typedef int int32; +typedef unsigned int uint32; + +typedef float flt32; +typedef double flt64; + +typedef unsigned char tBool; +typedef signed int tError; + + +#define E_TRUE 1 +#define E_FALSE 0 + +#define E_ON 1 +#define E_OFF 0 + +#define E_DEBUG 1 +#define E_RELEASE 0 + +#define E_SUCCESS 0 +#define E_FAILURE (-1) +#define E_OUT_OF_MEMORY (-2) +#define E_OUT_OF_RANGE (-3) +#define E_FILE_CREATE_FAIL (-4) +#define E_UNDEFINED_FLAG (-5) +#define E_ERROR_ARGUMENT (-16) + +#define E_USER_ERROR_BASE (-1000) + +#define mIsSuccess(code) ((code)>=0) +#define mIsFailure(code) ((code)<0) + +/* These define the srcImageFormats */ +#define EYuv420Chroma1_Planar 0x01 +#define EYuv420Chroma2_Planar 0x02 +#define EYuv420Chroma3_Planar 0x03 +#define EYuv422Chroma1_LE 0x04 +#define EYuv422Chroma2_LE 0x05 +#define EYuv422Chroma1_BE 0x06 +#define EYuv422Chroma2_BE 0x07 + +/* These define the dstImageFormats */ +#define EBitmapColor4k_DitherOrdered 0x01 +#define EBitmapColor4k_DitherErrDiff 0x02 +#define EBitmapColor64k_DitherOrdered 0x03 +#define EBitmapColor64k_DitherErrDiff 0x04 +#define EBitmapColor16M 0x05 +#define EBitmapColor16MU 0x06 + +/* These define the various color conversion schemes */ +#define EITU601_5_FULLRANGE 0X01 +#define EITU601_5_REDUCEDRANGE 0X02 +#define EB709_FULLRANGE 0X03 +#define EB709_REDUCEDRANGE 0X04 + +#define COLOR_CONV_PRECISION 14 +#define COLOR_CONV_ROUND 8192 +/* This is the data structure for the output video frame buffer */ +typedef struct BaseVideoFrame +{ + uint8 *lum; /* Luminance pointer */ + uint8 *cb; /* Cb pointer */ + uint8 *cr; /* Cr pointer */ + uint16 width; /* Width of the frame */ + uint16 height; /* Height of the frame */ + uint32 timeStamp; /* Playback Timestamp */ + +} tBaseVideoFrame; + +typedef enum {YUV422INT_LE, YUV422INT_BE} EBufferLayout422; + +/* Crop window structure */ +typedef struct WndParam +{ + uint16 xOffset; + uint16 yOffset; + uint32 wndWidth; + uint32 wndHeight; +}tWndParam; + +#endif /* INCLUDE_COMMON */ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/devvideosurfacehandlecustominterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/devvideosurfacehandlecustominterface.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2010 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: +* +*/ + +#ifndef DEVVIDEOSURFACEHANDLECUSTOMINTERFACE_H +#define DEVVIDEOSURFACEHANDLECUSTOMINTERFACE_H + +#include +#include +#include + +/** +DevVideo SurfaceHandle Custom Interface UID. + +@publishedPartner +@prototype +*/ +const TUid KUidMMFVideoSurfaceHandleControl = { 0x10286486 }; + +/** +Video play surface handle custom interface. This interface can be used by +a H/W device which creates a surface to pass the surface handle to +another H/W device. Alternatively, a H/W device may create resources for the +surface, for example, chunks and pass details to another H/W device to +create surface based on the chunk information. +Typically implemented by the post processor and used by a decoder. + +@publishedPartner +@prototype +*/ +class MMmfVideoSurfaceHandleControl + { + public: + + /** + @param aSurfaceHandle Surface handle for the new surface. + */ + virtual void MmvshcSetSurfaceHandle(const TSurfaceId& aSurfaceHandle) = 0; + + /** + @param aRedrawBuffer Buffer for the redrawing of the last picture. The + memory of this buffer is owned by the caller and ownerhship of this memory + is not transerred as part of this call. Also, the memory may not be valid + after the call completes. + */ + virtual void MmvshcRedrawBufferToSurface(TPtrC8& aRedrawBuffer) = 0; + + /** + This is used to get th esurface create dbased on an ixisting chunk. Typically, + the chunk would be created by the caller of this method and surface would be + created by the implementer. + + @param aAttributes Info necessary to create surface based on existing chunk. + @param aHandle Handle of the existing chunk + @param aSurfaceId Surface Id created as on output of this method. + + @return error code + */ + virtual TInt MmvshcCreateSurface(const RSurfaceManager::TSurfaceCreationAttributes& aAttributes, TInt aHandle, TSurfaceId& aSurfaceId) = 0; + + }; + + +#endif // DEVVIDEOSURFACEHANDLECUSTOMINTERFACE_H + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/fetchframecustominterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/fetchframecustominterface.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,51 @@ +// Copyright (c) 2010 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: +// + +#ifndef FETCHFRAMECUSTOMINTERFACE_H +#define FETCHFRAMECUSTOMINTERFACE_H + +/** +FetchFrame Custom Interface UID. + +@publishedPartner +@prototype +*/ +const TUid KUidMMFVideoFetchFrame = { 0x20024343 }; + +/** +This interface can be used to fetch the frame data using the buffer id. +This interface can be used by a H/W device which needs to send the frame +data back to application. + +@publishedPartner +@prototype +*/ +class MMmfVideoFetchFrame + { + public: + + /** + Set the handle for the surface + + @param aBufId Buffer id whose frame data needs to be returned. + + returns pointer to a frame data. memory is allocated by the Custom interface + implementor to hold the frame data on the host side. ownership of the memory + would be transfered to the caller of this method. + */ + virtual TUint8* MmvffGetFrame(TInt aBufId) = 0; + }; + +#endif // FETCHFRAMECUSTOMINTERFACE_H diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/postinitializeci.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/postinitializeci.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2010 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: +* +*/ + +#ifndef POSTINITIALIZECI_H_ +#define POSTINITIALIZECI_H_ + +#include + +static const TUid KUidMmfPostInitializeRequest = { 0x20031dac }; // allocated properly + +class MMmfPostInitializeResponse + { +public: + virtual void MmpirPostInitializeResponseL() = 0; + }; + +class MMmfPostInitializeRequest + { +public: + virtual void MmpirPostInitializeRequest(MMmfPostInitializeResponse& aResponse) = 0; + }; + +#endif /* POSTINITIALIZECI_H_ */ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/surface_hints.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/surface_hints.h Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,194 @@ +/* +* Copyright (c) 2008 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: +* Surface Manager API +*/ + +#ifndef __SURFACE_HINTS_LOCAL_H__ +#define __SURFACE_HINTS_LOCAL_H__ + +//- Include Files ---------------------------------------------------------- + +#include + + +//- Namespace --------------------------------------------------------------- + +namespace surfaceHints +{ + +//- Constants --------------------------------------------------------------- + +/** Hint of the surface content. + @see TSurfaceContent for possible values +*/ +const TInt KSurfaceContent = 0x1; + +/** Hint of the expected update rate of the surface content. + Value for a surface containing e.g. 25 fps video the value should be 25. + For a static UI element the value should be 0. + @see TSurfaceUpdate +*/ +const TInt KSurfaceUpdate = 0x2; + +/** Hint whether the surface content is copy protected and can it be + shown on external displays. + @see TSurfaceProtection for possible values. +*/ +const TInt KSurfaceProtection = 0x3; + + +/** Values used for the KSurfaceContent key */ +enum TSurfaceContent + { + /** No specific use-case */ + EGeneric, + /** Camera viewfinder frames */ + EViewFinder, + /** Images captured by camera */ + EStillImage, + /** Decoded video frames */ + EVideoPlayback, + /** Video frames from video telephony */ + EVideoTelephony, + /** EGL surface */ + EGfx, + /** Main UI surface */ + EUi, + /** Composition target surface */ + ECompositionTarget, + /** Indicates that the surface has to accessible by ARM. + This can be orr'ed with other TSurfaceContent enumerations. */ + EArmAccess = 0x80000000 + }; + + +/** Values used for the KSurfaceProtection key. The values are bitmasks and can be combined +* e.g. EAllowAnalogProtectionRequired | EAllowDigitalProtectionRequired. +*/ +enum TSurfaceProtection + { + /** + * Not allowed on external outputs + */ + EAllowInternalOnly = 0x00000000, + + /** + * Allowed on all external outputs + */ + EAllowAllExternals = 0xFFFFFFFF, + + /** + * Allow passing content over analog outputs, + * e.g. composite and S-video + */ + EAllowAnalog = 0x00000010, + + /** + * Allow output over an analog output channel which has a protection + * mechanism + */ + EAllowAnalogProtectionRequired = 0x00000020, + + /** + * Allow passing content over digital outputs, + * e.g. DVI and HDMI + */ + EAllowDigital = 0x00000200, + + /** + * Licensed product must attempt to engage HDCP to protect the content. + * However it should be passed through to HDMI even if HDCP is not engaged or fails to engage. + */ + EAllowDigitalProtectionRequested = 0x00000400, + + /** + * Licensed product is required to engage HDCP to protect the content. + * If HDCP is not engaged or can not be engaged the content must not be passed through to HDMI. + */ + EAllowDigitalProtectionRequired = 0x00000800, + }; + + +class TSurfaceUpdate + { + /** Constructor. + @param aUpdateRate How often the surface content is redrawn per second. + @param aTearingFree When ETrue surface updates should be synchronized + with display refresh rate, otherwise surface can + be updated as fast as possible. + */ + inline TSurfaceUpdate(TUint aUpdateRate, TBool aTearingFree); + + /** Converts a value to TSurfaceUpdate */ + inline TSurfaceUpdate(TInt aValue); + + /** Converts TSurfaceUpdate to a signed integer, so it can be used as + a value for KSurfaceUpdate key. */ + inline operator TInt() const; + + /** Getter for surface update rate. + @return updates per second + */ + inline TUint UpdateRate() const; + + /** Getter for surface update synchronization. + @return ETrue - updates should be synchronized with display refresh rate, + EFalse - surface can be updated as fast as possible. + */ + inline TBool TearingFree() const; + + private: + TUint iValue; + }; + + +//- Forward Declarations ---------------------------------------------------- + + +//- Class Definitions ------------------------------------------------------- + + +//- Inline Functions -------------------------------------------------------- + +TSurfaceUpdate::TSurfaceUpdate(TUint aUpdateRate, TBool aTearingFree) + : iValue( ( aUpdateRate & 0xFFFF ) | ( aTearingFree ? 0x80000000 : 0x0 ) ) + { + } +TSurfaceUpdate::TSurfaceUpdate(TInt aValue) + : iValue( static_cast( aValue ) ) + { + } + +TSurfaceUpdate::operator TInt() const + { + return static_cast( iValue ); + } + +TUint TSurfaceUpdate::UpdateRate() const + { + return ( iValue & 0xFFFF ); + } + +TBool TSurfaceUpdate::TearingFree() const + { + return ( iValue & 0x80000000 ) ? ETrue : EFalse; + } + +}; //namespace surfaceHints + +#endif //__SURFACE_HINTS_LOCAL_H__ + +// End of File + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/rom/NGA_MDF_Postprocessor.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/rom/NGA_MDF_Postprocessor.iby Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +#ifndef __NGA_MDF_POSTPROCESSOR_IBY__ +#define __NGA_MDF_POSTPROCESSOR_IBY__ + +data=ZSYSTEM\install\nga_mdf_postprocessor_stub.sis \System\install\nga_mdf_postprocessor_stub.sis + +ECOM_PLUGIN(NGAPostProcHwDevice110.dll, NGAPostProcHwDevice110.rsc) + + +#endif // __NGA_MDF_POSTPROCESSOR_IBY__ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/200195AF.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/200195AF.rss Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + +//200195AF.rss +// Description - Resource File for the Video PostProc HwDevice + + +#include +#include +#include "NGAPostProcHwDevice_UID.hrh" + +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = KUidNGAPostProcHwDeviceDllUid; + interfaces = + { + INTERFACE_INFO + { + interface_uid = KUidDevVideoPostProcessorHwDeviceDefine; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = KUidNGAPostProcHwDeviceImplUid; + version_no = 1; + display_name = "S60 CS NGA PostProc HW Device"; + default_data = "" ; // n/a + opaque_data = "0x0000005D"; + } + }; + } + }; + } + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/Colorspace_conv_yuv.c --- /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; + } +} + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/ImplementationProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/ImplementationProxy.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2008 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 "NGAPostProcHwDevice.h" +#include "NGAPostProcHwDevice_UID.hrh" +#include + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KUidNGAPostProcHwDeviceImplUid, CNGAPostProcHwDevice::NewL) + }; + + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + + +#ifndef EKA2 +GLDEF_C TInt E32Dll(TDllReason /*aReason*/) + { + return(KErrNone); + } +#endif diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcHwDevice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcHwDevice.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,2689 @@ +/* +* Copyright (c) 2006 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 "NGAPostProcHwDevice.h" +#include "NGAPostProcSessionManager.h" +#include "NGAPostProcSurfaceHandler.h" + +//currently this uid only used if not under WINSCW environment since the only hw to use is bridge +#define EStUidPixelFormatYUV_420MB 0x2001FBC1 +// post-processor info +const TUid KUidVideoPostProcHwDevice = {KUidNGAPostProcHwDeviceImplUid}; +_LIT(KManufacturer, "Nokia Inc."); +_LIT(KIdentifier, "Nokia S60 Video Post Processor Hardware Device Plugin"); + +// --- Constants --- +const TInt KMaxVBMBuffers = 4; +const TInt KMinVBMInputWidth = 32; +const TInt KMinVBMInputHeight = 32; +const TInt KMaxVBMInputWidth = 1280; +const TInt KMaxVBMInputHeight = 720; +const TInt KRenderAhead = 50000; +const TInt KMaxRenderDelay = 50000; +const TInt KPostingOfset = 0; +const TInt KColorConversionBuffers = 3; +const TInt KMaxBuffersGceCanHold = 3; +const TInt KDefPlayRate = 100; +const TInt KMaxAllowedSkipInNFrames = 40; +#ifdef __cplusplus +extern "C" +{ +#endif + +int32 gColorConvYUVtoYUV422Int (tBaseVideoFrame *yuv420Frame, tBaseVideoFrame* yuv422Frame, + uint8 outClrFmt, int16 stride); + +int32 Emz_VDec_gColorConv_YUVtoRGB ( + tBaseVideoFrame *srcImage, uint8 *dstImage, tWndParam *srcWindow, + tWndParam *dstWindow, uint8 srcImageFormat, uint8 dstImageFormat, + uint8 colorConvScheme); + +#ifdef __cplusplus +} +#endif + +//************************************************** + +CMMFVideoPostProcHwDevice* CNGAPostProcHwDevice::NewL() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice::NewL() ++")); + + CNGAPostProcHwDevice* self = new (ELeave) CNGAPostProcHwDevice; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + PP_DEBUG(_L("CNGAPostProcHwDevice::NewL() --")); + return (CMMFVideoPostProcHwDevice*)self; +} + +void CNGAPostProcHwDevice::ConstructL() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::ConstructL() ++"), this); + + // support for VBM buffer interface + iVBMBufferOptions.iNumInputBuffers = KMaxVBMBuffers; + iVBMBufferOptions.iBufferSize = TSize(KMaxVBMInputWidth, KMaxVBMInputHeight); + iPostingTimer = CNGAPostProcTimer::NewL(*this); + User::LeaveIfError(iWsSession.Connect()); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::ConstructL() --"), this); +} + +CNGAPostProcHwDevice::CNGAPostProcHwDevice() + : iProxy(NULL), + iInputDecoderDevice(NULL), + iCurrentPlaybackPosition(TTimeIntervalMicroSeconds(0)), + iPPState(EInitializing), + iSurfaceHandler(NULL), + iSessionManager(NULL), + iIsInputEnded(EFalse), + iPostingTimer(NULL), + iFirstPictureUpdated(EFalse), + iUsingExternalSurface(EFalse), + iIsColorConversionNeeded(EFalse), + iSurfaceCreatedEventPublished(EFalse), + iOverflowPictureCounter(0), + iVideoFrameBufSize(0), + iResourceLost(EFalse), + iRedrawDone(EFalse), + iRedrawSurfaceInUse(EFalse), + iVBMObserver(NULL), + iVBMEnabled(EFalse), + count(0), + iSurfaceMask(surfaceHints::EAllowAllExternals), + iSurfaceKey(TUid::Uid(surfaceHints::KSurfaceProtection)), + iVideoSurfaceObserver(NULL), + iVPObserver(NULL), + iPicSize(0,0), + iAspectRatioNum(1), + iAspectRatioDenom(1), + iStepFrameCount(0), + iPlayRate(KDefPlayRate), + iKeyFrameMode(EFalse), + iFPObserver(NULL), + iIsExternalChunk(EFalse) +{ + iSurfaceId = TSurfaceId::CreateNullId(); + +#if defined __WINSCW__ + iAttributes().iPixelFormat = EUidPixelFormatYUV_422Interleaved; +#else + iAttributes().iPixelFormat = (TUidPixelFormat) EStUidPixelFormatYUV_420MB; +#endif +} + +CNGAPostProcHwDevice::~CNGAPostProcHwDevice() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::~CNGAPostProcHwDevice() ++"), this); + if (iSessionManager) + { + iSessionManager->CancelNotifiers(); + delete iSessionManager; + iSessionManager = NULL; + } + + while (iSupportedInputFormats.Count()>0) + { + iSupportedInputFormats.Remove(0); + } + + while (iProcessQ.Count()>0) + { + iProcessQ.Remove(0); + } + + if(iPostingTimer) + { + iPostingTimer->Cancel(); + delete iPostingTimer; + iPostingTimer = NULL; + } + + while (iVBMBufferReferenceQ.Count()>0) + { + TVideoPicture* pic = iVBMBufferReferenceQ[0]; + iVBMBufferReferenceQ.Remove(0); + if (iColorConversionQ.Count()>0) + { + iColorConversionQ.Remove(0); + } + + if (pic->iHeader) delete pic->iHeader; + delete pic->iData.iRawData; + delete pic; + } + + iSupportedInputFormats.Reset(); + iSupportedInputFormats.Close(); + + iVBMBufferReferenceQ.Reset(); + iVBMBufferReferenceQ.Close(); + + iColorConversionQ.Reset(); + iColorConversionQ.Close(); + + iVBMBufferQ.Reset(); + iVBMBufferQ.Close(); + + iProcessQ.Reset(); + iProcessQ.Close(); + + iInputQ.Reset(); + iInputQ.Close(); + + if (iSurfaceHandler) + { + if(!iSurfaceId.IsNull()) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::UnregisterSurface"), this); + TInt numScreens = iWsSession.NumberOfScreens(); + for(TInt i=0;i < numScreens;i++) + { + iWsSession.UnregisterSurface(i, iSurfaceId); + } + iWsSession.Flush(); + TInt err = iSurfaceHandler->DestroySurface(iSurfaceId); + } + delete iSurfaceHandler; + iSurfaceHandler = NULL; + } + + iWsSession.Close(); + if(!iIsExternalChunk) + { + iChunk.Close(); + } + + RDebug::Printf("------ Statistics of Post Processor ------"); + RDebug::Printf(" Pictures Received : %d", iPictureCounters.iTotalPictures); + RDebug::Printf(" Pictures Displayed: %d", iPictureCounters.iPicturesDisplayed); + RDebug::Printf(" Pictures Skipped : %d", iPictureCounters.iPicturesSkipped); + RDebug::Printf(" Pictures overflow : %d", iOverflowPictureCounter); + RDebug::Printf("------------------------------------------"); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:~() --"), this); +} + +void CNGAPostProcHwDevice::SetInputFormatL(const TUncompressedVideoFormat& aFormat) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputFormatL() Pattern= %x ++"), this, aFormat.iYuvFormat.iPattern); + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputFormatL() FAILED: Unexpected state"), this); + User::Leave(KErrNotReady); + } + + iVideoFormat = aFormat; + if( ((iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma1) || + (iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma2) || + (iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma3) )) + { + iVideoFormat.iYuvFormat.iCoefficients = EYuvBt709Range1; + iVideoFormat.iYuvFormat.iPattern = EYuv422Chroma1; + iVideoFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE; + +#if defined __WINSCW__ + iIsColorConversionNeeded = ETrue; +#else + iAttributes().iPixelFormat = (TUidPixelFormat) EStUidPixelFormatYUV_420MB; +#endif + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputFormatL() WARNING: -- Not Found!"), this); +} + + +void CNGAPostProcHwDevice::SetInputDevice(CMMFVideoDecodeHwDevice* aDevice) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputDevice() ++"), this); + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputDevice() FAILED: unexpected state"), this); + return; + } + + iInputDecoderDevice = aDevice; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputDevice() --"), this); +} + +void CNGAPostProcHwDevice::GetOutputFormatListL(RArray& ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetOutputFormatListL() ++"), this); + + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetOutputFormatListL() --"), this); +} + +void CNGAPostProcHwDevice::SetOutputFormatL(const TUncompressedVideoFormat& ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetOutputFormatL() ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetOutputFormatL() --"), this); +} + +void CNGAPostProcHwDevice::SetClockSource(MMMFClockSource* aClock) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetClockSource() ++"), this); + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetClockSource() FAILED: Unexpected state"), this); + return; + } + iClockSource = aClock; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetClockSource() --"), this); +} + +void CNGAPostProcHwDevice::SetVideoDestScreenL(TBool /*aScreen*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetVideoDestScreenL() ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetVideoDestScreenL() --"), this); +} + +void CNGAPostProcHwDevice::SetProxy(MMMFDevVideoPlayProxy& aProxy) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetProxy() ++"), this); + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetProxy() FAILED: Unexpected state"), this); + return; + } + + iProxy = &aProxy; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetProxy() --"), this); +} + +void CNGAPostProcHwDevice::Initialize() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize ++")); + TInt err = KErrNone; + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize() FAILED: Unexpected state"), this); + if (iProxy) + { + iProxy->MdvppInitializeComplete(this, KErrNotReady); + } + return; + } + if (!iSurfaceHandler) + { + TRAP(err, iSurfaceHandler = CNGAPostProcSurfaceHandler::NewL()); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create SurfaceHandler."), this); + if (iProxy) + { + iProxy->MdvppInitializeComplete(this, err); + } + return; + } + } + if (!iSessionManager) + { + TRAP(err, iSessionManager = CNGAPostProcSessionManager::NewL()); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create SessionManager."), this); + if (iProxy) + { + iProxy->MdvppInitializeComplete(this, err); + } + return; + } + iSessionManager->SetObserver(*this); + } + + if (iInputDecoderDevice) + { + MMmfVideoResourceHandler* handler = NULL; + handler = (MMmfVideoResourceHandler*)iInputDecoderDevice->CustomInterface(KUidMmfVideoResourceManagement); + if (handler) + { + handler->MmvrhSetObserver((MMmfVideoResourceObserver*)this); + } + else + { + PP_DEBUG(_L("ppHwDev[%x]:Initialize() decoder yet to implement MMmfVideoResourceHandler CI"), this); + } + + MMmfVideoPropertiesNotifier* VPHandler = NULL; + VPHandler = (MMmfVideoPropertiesNotifier*)iInputDecoderDevice->CustomInterface(KUidMmfVideoPropertiesManagement); + if (VPHandler) + { + PP_DEBUG(_L("ppHwDev[%x]:Initialize() Register for video property changes"), this); + VPHandler->MmvpnSetObserver((MMmfVideoPropertiesObserver*)this); + } + else + { + PP_DEBUG(_L("ppHwDev[%x]:Initialize() decoder yet to implement MMmfVideoPropertiesNotifier CI"), this); + } + } + + // Initialize picture counters + iPictureCounters.iPicturesSkipped = 0; + iPictureCounters.iPicturesDisplayed = 0; + iPictureCounters.iTotalPictures = 0; + iOverflowPictureCounter = 0; + + iPPState = EInitialized; + if(iPostInitializeResponse) + { + + TRAP(err, iPostInitializeResponse->MmpirPostInitializeResponseL()); + } + + if(!err) + { + TRAP(err, iSessionManager->CreateNotifierL(iInfo().iBuffers)); + } + else + { + iPPState = EInitializing; + } + + if (iProxy) + { + iProxy->MdvppInitializeComplete(this, err); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize --"), this); +} + +void CNGAPostProcHwDevice::WritePictureL(TVideoPicture* aPicture) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePicture bufId = %d"), this,GetID(aPicture)); + TVideoPicture* pic; + if (iPPState==EInitializing || iPPState==EStopped || iIsInputEnded) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePictureL() FAILED: Unexpected state"), this); + User::Leave(KErrNotReady); + } + + if(!aPicture) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePictureL() FAILED: Invalid argument"), this); + User::Leave(KErrArgument); + } + pic = aPicture; + iPictureCounters.iTotalPictures++; + if((iPPState != EPlaying) && (iFirstPictureUpdated)) + { + //If decoder is fast enough, it can happen between Initialize->Start time gap between + //DecodeHwDevice and PostProc_HwDevice. OR between Pause->Resume time gap as well. + AddToQ(pic); + } + else if( iInputQ.Count() > 0 ) + { + AddToQ(pic); + AttemptToPost(); + } + else + { + TTimeToPost timeToPost = EPostIt; + TInt64 delta = 0; + if(iFirstPictureUpdated) + { + timeToPost = (TTimeToPost)IsTimeToPost(pic, delta); + if(!IsGceReady()) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePictureL GCE not ready"), this ); + if(timeToPost == EPostIt) + { + timeToPost = EDelayIt; + } + } + if (delta > 0x7FFFFFFF) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePictureL Too large delta .. skipping"), this ); + timeToPost = ESkipIt; + } + } + else + { + if(!iSurfaceCreatedEventPublished) + { + PublishSurfaceCreated(); + } + iFirstPictureUpdated = ETrue; + } + + + switch(timeToPost) + { + case EDelayIt: + { + if(AddToQ(pic) != 0) + { + break; + } + iPostingTimer->Cancel(); + SetTimer(delta); + } + break; + case EPostIt: + { + + if(iIsColorConversionNeeded) + { + TVideoPicture* ccPic; + ccPic = DoColorConvert(pic); // output will be in ccPic + pic = ccPic; + } + + #ifdef _DUMP_YUV_FRAMES + captureYuv(pic); + #endif + TInt err = iSessionManager->PostPicture(iSurfaceId, GetID(pic), ETrue); + if(err == KErrNone) + { + iProcessQ.Append(pic); + iCurrentPlaybackPosition = pic->iTimestamp; + } + else + { + ReleasePicture(pic); + } + } + break; + case ESkipIt: + { + ReleasePicture(pic); + PicturesSkipped(); + } + break; + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePicture --"), this); +} + + +CPostProcessorInfo* +CNGAPostProcHwDevice::PostProcessorInfoLC() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PostProcessorInfoLC() ++"), this); + TUncompressedVideoFormat yuvFormat; + RArray SupportedPostProcess; + TBool SupportedHwAcceleration = ETrue; //Non-Accelerated ETrue, + TYuvToRgbCapabilities SupportedYuvToRgbCapab; + TInt32 SupportedRotations = ERotateNone; // no rotation supported + + TBool SupportedArbitraryScaling = EFalse; // no scaling supported + RArray SupportedScaleFactors; + TBool SupportedAntiAliasing = EFalse; + + //default + yuvFormat.iDataFormat = EYuvRawData; + yuvFormat.iYuvFormat.iYuv2RgbMatrix = 0; + yuvFormat.iYuvFormat.iRgb2YuvMatrix = 0; + yuvFormat.iYuvFormat.iAspectRatioNum = 1; + yuvFormat.iYuvFormat.iAspectRatioDenom = 1; + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range1; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE; + + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range0; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range0; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedLE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range1; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedLE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range0; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range1; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range0; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedLE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range1; + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedLE; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv422Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + //YUV 420 planar + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range1; + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataPlanar; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma3; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt709Range0; + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataPlanar; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma3; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range1; + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataPlanar; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma3; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iCoefficients = EYuvBt601Range0; + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma1; + yuvFormat.iYuvFormat.iDataLayout = EYuvDataPlanar; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma2; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + yuvFormat.iYuvFormat.iPattern = EYuv420Chroma3; + User::LeaveIfError(iSupportedInputFormats.Append(yuvFormat)); + + CPostProcessorInfo* postProcessorInfo = CPostProcessorInfo::NewL( + KUidVideoPostProcHwDevice, + KManufacturer, + KIdentifier, + TVersion(1, 0, 0), + iSupportedInputFormats.Array(), + SupportedPostProcess.Array(), + SupportedHwAcceleration, + ETrue, //Direct Display + SupportedYuvToRgbCapab, + SupportedRotations, + SupportedArbitraryScaling, + SupportedScaleFactors.Array(), + SupportedAntiAliasing); + + CleanupStack::PushL(postProcessorInfo); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PostProcessorInfoLC() --"), this); + return postProcessorInfo; +} + +void CNGAPostProcHwDevice::MmvprcGetPlayRateCapabilitiesL(TVideoPlayRateCapabilities& aCap) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcGetPlayRateCapabilitiesL ++"), this); + aCap.iPlayForward = ETrue; + aCap.iPlayBackward = ETrue; + aCap.iStepForward = ETrue; + aCap.iStepBackward = ETrue; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcGetPlayRateCapabilitiesL --"), this); +} + +void CNGAPostProcHwDevice::MmvprcSetPlayRateL(const TInt aRate) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcSetPlayRateL ++"), this); + iPlayRate = aRate; + if (iPlayRate<0) + { + iKeyFrameMode = ETrue; + } + else + { + iKeyFrameMode = EFalse; + ResetCountingBuffer(); + } + //In fast forward go direct to key frame mode if speed >4X = + if (iPlayRate>KDefPlayRate*4) + { + if (iFPObserver) + { + iFPObserver->MmvproKeyFrameModeRequest(); + iKeyFrameMode=ETrue; + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcSetPlayRateL=%d --"), this, aRate); +} + +TInt CNGAPostProcHwDevice::MmvprcPlayRateL() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcPlayRateL= ++"), this); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcPlayRateL= --"), this); + return iPlayRate; +} + +void CNGAPostProcHwDevice::MmvprcStepFrameL(const TInt aStep) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcStepFrameL= ++"), this); + iStepFrameCount = aStep; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcStepFrameL=%d --"), this, aStep); +} + +void CNGAPostProcHwDevice::MmvprcSetObserver(MMmfVideoPlayRateObserver& aObserver) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcSetObserver ++"), this); + iFPObserver = &aObserver; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvprcSetObserver --"), this); +} + +void CNGAPostProcHwDevice::MmvsoSetSecureOutputL(TBool aSecure) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvsoSetSecureOutputL aSecure = %d++"), this, aSecure); + TInt err = KErrNone; + if(aSecure) + { + iSurfaceMask = surfaceHints::EAllowInternalOnly; + } + else + { + iSurfaceMask = surfaceHints::EAllowAllExternals; + } + if(!iSurfaceId.IsNull()) + { + err = AddHints(); + if(err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvsoSetSecureOutputL -- leaving err = %d"), this, err); + User::Leave(err); + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvsoSetSecureOutputL --"), this); +} + +void CNGAPostProcHwDevice::MmavsoSetAllowedOutputL(TUint aAllowedOutputMask) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmavsoSetAllowedOutputL aAllowedOutputMask=0x%08x ++"), this,aAllowedOutputMask); + TInt err = KErrNone; + iSurfaceMask = surfaceHints::EAllowInternalOnly; + if (aAllowedOutputMask == EVideoAllowAll) + { + iSurfaceMask = surfaceHints::EAllowAllExternals; + } + else if (aAllowedOutputMask == EVideoAllowInternalOnly) + { + iSurfaceMask = surfaceHints::EAllowInternalOnly; + } + else + { + // we hope to find some valid output prefs + if (aAllowedOutputMask & EVideoAllowAnalog) + { + iSurfaceMask |= surfaceHints::EAllowAnalog; + } + if (aAllowedOutputMask & EVideoAllowMacroVision) + { + iSurfaceMask |= surfaceHints::EAllowAnalogProtectionRequired; + } + if (aAllowedOutputMask & EVideoAllowHDMI) + { + iSurfaceMask |= surfaceHints::EAllowDigital; + } + if (aAllowedOutputMask & EVideoAllowHdmiHdcpRequested) + { + iSurfaceMask |= surfaceHints::EAllowDigitalProtectionRequested; + } + if (aAllowedOutputMask & EVideoAllowHdmiHdcpRequired) + { + iSurfaceMask |= surfaceHints::EAllowDigitalProtectionRequired; + } + } + + if((!iSurfaceId.IsNull())) + { + err = AddHints(); + if(err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmavsoSetAllowedOutputL -- leaving err = %d"), this, err); + User::Leave(err); + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmavsoSetAllowedOutputL --"), this); +} + +void CNGAPostProcHwDevice::SetPostProcessTypesL(TUint32 /*aCombination*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetPostProcessTypesL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetPostProcessTypesL --"), this); +} + +void CNGAPostProcHwDevice::SetInputCropOptionsL(const TRect& /*aRect*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputCropOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetInputCropOptionsL --"), this); +} + +void CNGAPostProcHwDevice::SetYuvToRgbOptionsL( const TYuvToRgbOptions& /*aOptions*/, const TYuvFormat& /*aYuvFormat*/, TRgbFormat /*aRgbFormat*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetYuvToRgbOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetYuvToRgbOptionsL --"), this); +} + +void CNGAPostProcHwDevice::SetYuvToRgbOptionsL(const TYuvToRgbOptions& /*aOptions*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetYuvToRgbOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetYuvToRgbOptionsL --"), this); +} + +void CNGAPostProcHwDevice::SetRotateOptionsL(TRotationType ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetRotateOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetRotateOptionsL --")); +} + +void CNGAPostProcHwDevice::SetScaleOptionsL(const TSize& /*aTargetSize*/, TBool /*aAntiAliasFiltering*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetScaleOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetScaleOptionsL --"), this); +} + +void CNGAPostProcHwDevice::SetOutputCropOptionsL(const TRect& /*aRect*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetOutputCropOptionsL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetOutputCropOptionsL --"), this); +} + +void CNGAPostProcHwDevice::SetPostProcSpecificOptionsL(const TDesC8& ) +{ + //ignore +} + +void CNGAPostProcHwDevice::CommitL() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CommitL ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CommitL --"), this); +} + +void CNGAPostProcHwDevice::Revert() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Revert ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Revert --"), this); +} + +void CNGAPostProcHwDevice::StartDirectScreenAccessL( const TRect& /*aVideoRect*/, CFbsScreenDevice& /*aScreenDevice*/, const TRegion& /*aClipRegion*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:StartDSA ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:StartDSA --"), this); +} + +void CNGAPostProcHwDevice::AbortDirectScreenAccess() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AbortDSA ++"), this); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AbortDSA --"), this); +} + +void CNGAPostProcHwDevice::SetScreenClipRegion(const TRegion& /*aRegion*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetScreenClipRegion ++"), this); + + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetScreenClipRegion --"), this); +} + +void CNGAPostProcHwDevice::SetPauseOnClipFail(TBool ) +{ + //ignore. Post Processor will always behave as aPause==False. +} + +TBool CNGAPostProcHwDevice::IsPlaying() +{ + if( iPPState == EPlaying) + { + return ETrue; + } + else + { + return EFalse; + } +} + +void CNGAPostProcHwDevice::Redraw() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw ++"), this); + TInt err = KErrNone; + if(iRedrawSurfaceInUse && !iRedrawDone) + { + err = AddHints(); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw -- failed to AddHints %d"), + this, err); + iProxy->MdvppFatalError(this, err); + return; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw registering the temp surface"), this); + err = RegisterSurface(iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw -- failed to Register Surface %d"), + this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + iProxy->MdvppFatalError(this, err); + return; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw registering the temp surface done"), this); + err = iSessionManager->PostPicture(iSurfaceId, 0, EFalse); + if (err != KErrNone) + { + iProxy->MdvppFatalError(this, err); + return; + } + PublishSurfaceCreated(); + iRedrawDone = ETrue; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Redraw --"), this); +} + +void CNGAPostProcHwDevice::Start() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Start ++"), this); + iPPState = EPlaying; + + //TBC: when buffers given to post proc even before start. + //Even the buffers must be available to PostProc but not displayed. + //This will happen only when neighbouring decodeHwDevice decodes earlier than Start() + //call. Need to check if MDF guidelines allow this. + AttemptToPost(); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Start --"), this); +} + +void CNGAPostProcHwDevice::Stop() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Stop ++"), this); + iPPState = EStopped; + if (iSessionManager) + { + iSessionManager->CancelNotifiers(); + } + if (iPostingTimer) + { + iPostingTimer->Cancel(); + } + ReleaseProcessQ(); + ReleaseInputQ(); + + //Stop must keep on displaying the last frame. Blank Screen must not be visible + //to client. No Unregistering of surface should happen here. + //This Req is not necessary anymore. Only applicable to Pause. + + RDebug::Printf("------ Statistics of Post Processor ------"); + RDebug::Printf(" Pictures Received : %d", iPictureCounters.iTotalPictures); + RDebug::Printf(" Pictures Displayed: %d", iPictureCounters.iPicturesDisplayed); + RDebug::Printf(" Pictures Skipped : %d", iPictureCounters.iPicturesSkipped); + RDebug::Printf("------------------------------------------"); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Stop --"), this); +} + +void CNGAPostProcHwDevice::Pause() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Pause ++"), this); + iPPState = EPaused; + iPostingTimer->Cancel(); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Pause --"), this); +} + +void CNGAPostProcHwDevice::Resume() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Resume ++"), this); + iPPState = EPlaying; + AttemptToPost(); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Resume --"), this); +} + +void CNGAPostProcHwDevice::SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetPosition ++"), this); + + if (iPPState == EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetPosition FAILED: Unexpected state"), this); + return; + } + if (iPPState == EPaused) + { + iFirstPictureUpdated = EFalse; + } + iCurrentPlaybackPosition = aPlaybackPosition; + + ReleaseInputQ(); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetPosition --"), this); +} + +void CNGAPostProcHwDevice::FreezePicture(const TTimeIntervalMicroSeconds& ) +{ + //TODO: +} + +void CNGAPostProcHwDevice::ReleaseFreeze(const TTimeIntervalMicroSeconds& ) +{ + //TODO: +} + +TTimeIntervalMicroSeconds +CNGAPostProcHwDevice::PlaybackPosition() +{ + if (iPPState == EInitializing) + { + return TTimeIntervalMicroSeconds(0); + } + + return iCurrentPlaybackPosition; +} + +TUint CNGAPostProcHwDevice::PictureBufferBytes() +{ //TODO + return 0; +} + +void CNGAPostProcHwDevice::GetPictureCounters( CMMFDevVideoPlay::TPictureCounters& aCounters) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetPictureCounters ++"), this); + + if (iPPState == EInitializing) + return; + aCounters = iPictureCounters; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetPictureCounters --"), this); +} + +void CNGAPostProcHwDevice::SetComplexityLevel(TUint ) +{ + //not required +} + +TUint CNGAPostProcHwDevice::NumComplexityLevels() +{ + //not required + return 1; +} + +void CNGAPostProcHwDevice::GetComplexityLevelInfo(TUint , CMMFDevVideoPlay::TComplexityLevelInfo& ) +{ + //not required +} + +void CNGAPostProcHwDevice::ReturnPicture(TVideoPicture* ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReturnPicture +-"), this); + //not required for direct rendering +} + +TBool CNGAPostProcHwDevice::GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& /*aFormat*/) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetSnapshotL %d %d ++"), this, iVBMEnabled, iProcessQ.Count()); + TVideoPicture* pic = NULL; + TInt err = KErrNone; + TBool frameAvailable =EFalse; + tWndParam inputCropWindow; + tWndParam outputCropWindow; + tBaseVideoFrame inputFrame; + inputFrame.lum = NULL; + + if(aPictureData.iDataFormat == ERgbFbsBitmap) + { + if(iProcessQ.Count()) + { + pic = iProcessQ[0]; //frame already submitted for display + } + else if(iInputQ.Count()) + { + pic = iInputQ[0]; //frame yet to be displayed + } + if(pic) + { + if (iVBMEnabled) + { + inputFrame.lum = (TUint8*)pic->iData.iRawData->Ptr(); + } + else + { + if (iInputDecoderDevice) + { + MMmfVideoFetchFrame* VFHandler = NULL; + VFHandler = (MMmfVideoFetchFrame*)iInputDecoderDevice->CustomInterface(KUidMMFVideoFetchFrame); + if (VFHandler) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetSnapshotL() fetch frame"), this); + inputFrame.lum = (TUint8*)VFHandler->MmvffGetFrame(GetID(pic)); + } + else + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetSnapshotL() decoder yet to implement MMmfVideoFetchFrame CI"), this); + } + } + } + } + if(inputFrame.lum) + { + inputFrame.cb = inputFrame.lum + iPicSize.iWidth * iPicSize.iHeight; + + if( ((iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma1) || + (iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma2) || + (iVideoFormat.iYuvFormat.iPattern == EYuv420Chroma3) )) + { + inputFrame.cr = inputFrame.lum + (iPicSize.iWidth * iPicSize.iHeight*5)/4; + } + else + { + inputFrame.cr = inputFrame.lum + (iPicSize.iWidth * iPicSize.iHeight*3)/2; + } + + inputFrame.width = (unsigned short)iPicSize.iWidth; + inputFrame.height = (unsigned short)iPicSize.iHeight; + + outputCropWindow.wndHeight = iPicSize.iHeight; + outputCropWindow.wndWidth = iPicSize.iWidth; + outputCropWindow.xOffset = 0; + outputCropWindow.yOffset = 0; + + inputCropWindow.wndHeight = iPicSize.iHeight; + inputCropWindow.wndWidth = iPicSize.iWidth; + inputCropWindow.xOffset = 0; + inputCropWindow.yOffset = 0; + + RFbsSession fbs; + User::LeaveIfError(fbs.Connect()); + CFbsBitmap* iOutBitmap = aPictureData.iRgbBitmap; + TInt status = iOutBitmap->Resize(iPicSize); + if (status == KErrNone) + { + // Lock the heap to prevent the FBS server from invalidating the address + iOutBitmap->LockHeap(); + TUint8* dataAddress = (TUint8*)iOutBitmap->DataAddress(); + err = ColorConvert(&inputFrame, dataAddress, &inputCropWindow, &outputCropWindow); + iOutBitmap->UnlockHeap(); + frameAvailable = ETrue; + } + fbs.Disconnect(); + } + } + else + { + err = KErrNotSupported; + } + if(err != KErrNone) + { + User::Leave(err); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:GetSnapshotL --"), this); + return(frameAvailable); +} + +void CNGAPostProcHwDevice::InputEnd() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:InputEnd ++"), this); + + if (iPPState!=EPlaying && iPPState!=EPaused) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:InputEnd FAILED: Unexpected state"), this); + return; + } + iIsInputEnded = ETrue; + + if( (iProcessQ.Count() <= 1) && (iInputQ.Count() == 0)) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:InputEnd() Stream end"), this); + iProxy->MdvppStreamEnd(); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:InputEnd --"), this); +} + +TAny* CNGAPostProcHwDevice::CustomInterface(TUid aInterface) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CustomInterface UID = %d ++"), this, aInterface.iUid); + + if (aInterface == KUidMmfVideoBufferManagement) + { + return (MMmfVideoBufferManagement *)this; + } + if (aInterface == KUidMMFVideoSurfaceSupport) + { + return (MMMFVideoSurfaceSupport *)this; + } + if (aInterface == KUidMMFVideoSurfaceHandleControl) + { + return (MMmfVideoSurfaceHandleControl *)this; + } + if (aInterface == KUidMmfVideoPlayRateControl) + { + return (MMmfVideoPlayRateControl *)this; + } + if (aInterface == KMmfVideoAdvancedSecureOutputUid) + { + return (MMmfAdvancedVideoSecureOutput *)this; + } + if (aInterface == KUidMmfVideoResourceManagement) + { + return (MMmfVideoResourceObserver *)this; + } + if (aInterface == KUidMmfPostInitializeRequest) + { + return (MMmfPostInitializeRequest *)this; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CustomInterface --"), this); + return NULL; +} + +void CNGAPostProcHwDevice::BufferAvailable(TInt aBufId, TInt aStatus) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CNGAPostProcHwDevice::BufferAvailable aStatus = %d aBufId = %d++"), this, aStatus, aBufId); + TVideoPicture* pic = NULL; + if((aStatus != KErrNone) && (aStatus != KErrOverflow) && (aStatus != KErrNotVisible)) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:BufferAvailable FAILED: aStatus = %d"), this, aStatus); + iProxy->MdvppFatalError(this, aStatus); + } + + if(aStatus == KErrOverflow) + { + iOverflowPictureCounter++; + PicturesSkipped(); + } + + if (iVBMEnabled) + { + for(TInt i=0; i < iProcessQ.Count(); i++) + { + if(iVBMBufferReferenceQ[aBufId] == iProcessQ[i]) + { + pic = iProcessQ[i]; + iProcessQ.Remove(i); + ReturnPicToDecoder(pic); + if (iIsColorConversionNeeded) + { + AddPictureToColorConversionQ(pic); + } + else + { + AddPictureToVBMQ(pic); + } + break; + } + } + } + else + { + for(TInt i=0; i < iProcessQ.Count(); i++) + { + TInt bufId; + if (iUsingExternalSurface) + { + bufId = GetExternalBufferID(iProcessQ[i]); + } + else + { + bufId = GetID(iProcessQ[i]); + } + + if (aBufId == bufId) + { + pic = iProcessQ[i]; + iProcessQ.Remove(i); + ReturnPicToDecoder(pic); + break; + } + } + } + + if(aStatus == KErrNone) + { + if (!iKeyFrameMode && iPlayRate>KDefPlayRate) + { + if (iSkippedFramesCountingBuffer[iCurrentPosInFramesCountingBuffer]==1) + { + iSkippedFramesCountingBuffer[iCurrentPosInFramesCountingBuffer] = 0; + iSkippedFramesInLast64Frames--; + } + iCurrentPosInFramesCountingBuffer = ++iCurrentPosInFramesCountingBuffer%64; + } + iPictureCounters.iPicturesDisplayed++; + if (iStepFrameCount != 0) + { + iStepFrameCount > 0 ? iStepFrameCount-- : iStepFrameCount++; + if (iStepFrameCount==0 && iFPObserver) + { + iFPObserver->MmvproStepFrameComplete(pic->iTimestamp); + } + } + } + + if(iPPState == EPlaying) + { + AttemptToPost(); + } + + if( iIsInputEnded && (iProcessQ.Count() <= 1) && (iInputQ.Count() == 0)) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:BufferAvailable() Stream end"), this); + iProxy->MdvppStreamEnd(); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:CNGAPostProcHwDevice::BufferAvailable --"), this); +} + +//=== MMmfVideoBufferManagement === +void CNGAPostProcHwDevice::MmvbmSetObserver(MMmfVideoBufferManagementObserver* aObserver) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetObserver() ++"), this); + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetObserver FAILED: Unexpected state"), this); + iProxy->MdvppFatalError(this, KErrNotReady); + } + + iVBMObserver = aObserver; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetObserver() --"), this); +} + + +void CNGAPostProcHwDevice::MmvbmEnable(TBool aEnable) +{ + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmEnable FAILED: Unexpected state"), this); + iProxy->MdvppFatalError(this, KErrNotReady); + } + + iVBMEnabled = aEnable; +} + +void CNGAPostProcHwDevice::MmvbmSetBufferOptionsL(const TBufferOptions& aOptions) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetBufferOptionsL ++"), this); + + if (iPPState != EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetBufferOptionsL FAILED: Unexpected state"), this); + User::Leave(KErrNotReady); + } + + // why limiting the number of buffers? any particular reason for this? + //if (aOptions.iNumInputBuffers > KMaxVBMBuffers || aOptions.iNumInputBuffers <= 1) //at least two buffers + if (aOptions.iNumInputBuffers <= 1) //at least two buffers + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetBufferOptionsL FAILED: Input buffer count limit"), this); + User::Leave(KErrNotSupported); + } + + if (aOptions.iNumInputBuffers == 0 + || aOptions.iBufferSize.iWidth <= KMinVBMInputWidth + || aOptions.iBufferSize.iHeight <= KMinVBMInputHeight + || aOptions.iBufferSize.iWidth > KMaxVBMInputWidth + || aOptions.iBufferSize.iHeight > KMaxVBMInputHeight) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetBufferOptionsL FAILED: Unexpected buffer size"), this); + User::Leave(KErrArgument); + } + + iVBMBufferOptions.iNumInputBuffers = aOptions.iNumInputBuffers; + iVBMBufferOptions.iBufferSize = aOptions.iBufferSize; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmSetBufferOptionsL --"), this); +} + +void CNGAPostProcHwDevice::MmvbmGetBufferOptions(TBufferOptions& aOptions) +{ + if (iPPState == EInitializing) + { + aOptions = iVBMBufferOptions; + } + else + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferOptions FAILED: Unexpected state"), this); + iProxy->MdvppFatalError(this, KErrNotReady); + } +} + +TVideoPicture* CNGAPostProcHwDevice::MmvbmGetBufferL(const TSize& aSize) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() ++"), this); + + TInt err = KErrNone; + TVideoPicture* lPic = NULL; + + if (iPPState == EInitializing) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() FAILED: Unexpected state"), this); + User::Leave(KErrNotReady); + } + + if (aSize.iWidth < KMinVBMInputWidth + || aSize.iHeight < KMinVBMInputHeight + || aSize.iWidth > iVBMBufferOptions.iBufferSize.iWidth + || aSize.iHeight > iVBMBufferOptions.iBufferSize.iHeight) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() FAILED: Unexpected buffer size w=%d h=%d "), this,aSize.iWidth,aSize.iHeight ); + User::Leave(KErrNotSupported); + } + + if(iVBMBufferReferenceQ.Count() == 0) + { + iPicSize = aSize; + err = SetupSurface(); + if(err) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() Surface Setup Failed %d"), this, err); + User::Leave(err); + } + } + + if(!iVBMBufferQ.Count()) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() WARNING: Queue buffer count zero"), this); + return NULL; + } + + lPic = iVBMBufferQ[0]; + iVBMBufferQ.Remove(0); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmGetBufferL() -- %d"), this, lPic); + return lPic; +} + +void CNGAPostProcHwDevice::MmvbmReleaseBuffer(TVideoPicture* aBuffer) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmReleaseBuffer() ++"), this); + + if(!aBuffer) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmReleaseBuffer() FAILED: Invalid buffer ptr"), this); + iProxy->MdvppFatalError(this, KErrArgument); + } + + TInt err = iVBMBufferQ.Append(aBuffer); + if (err) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmReleaseBuffer() FAILED: Failed to append"), this); + iProxy->MdvppFatalError(this, err); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvbmReleaseBuffer() --"), this); +} + +//=== MMMFVideoSurfaceSupport === + +void CNGAPostProcHwDevice::MmvssUseSurfaces() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssUseSurfaces() ++"), this); + // do nothing + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssUseSurfaces() --"), this); +} + +TInt CNGAPostProcHwDevice::MmvshcCreateSurface(const RSurfaceManager::TSurfaceCreationAttributes& aAttributes, TInt aHandle, TSurfaceId& aSurfaceId) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcCreateSurface() ++"), this); + TInt err(KErrNone); + + if(!iSurfaceId.IsNull()) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssCreateSurface Cleaning Surface"), this); + + if (iVideoSurfaceObserver && iSurfaceCreatedEventPublished) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcCreateSurface - Telling client to remove old surface"), this); + iVideoSurfaceObserver->MmvsoRemoveSurface(); + iSurfaceCreatedEventPublished = EFalse; + } + else + { + // We never told the client about the surface, so we must destroy it ourselves + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface - Destroying old surface"), this); + TInt numScreens = iWsSession.NumberOfScreens(); + for(TInt i=0;i < numScreens;i++) + { + iWsSession.UnregisterSurface(i, iSurfaceId); + } + iWsSession.Flush(); + iSurfaceHandler->DestroySurface(iSurfaceId); + } + //remove any handle to chunk. not needed perhaps + iChunk.Close(); + + } + + // Create the surface handler if it doesn't exist. + if (!iSurfaceHandler) + { + TRAP(err, iSurfaceHandler = CNGAPostProcSurfaceHandler::NewL()); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssCreateSurface -- failed to create SurfaceHandler."), this); + return err; + } + } + + iChunk.SetHandle(aHandle); + err = iSurfaceHandler->CreateSurface(aAttributes, aSurfaceId, iChunk); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssCreateSurface -- failed to create surface %d"), this, err); + return err; + } + iSurfaceId = aSurfaceId; + iIsExternalChunk = ETrue; + + err = RegisterSurface(iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssCreateSurface -- failed RegisterSurface %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + + err = iSurfaceHandler->SurfaceInfo(iSurfaceId, iInfo); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssCreateSurface -- failed to get Surface info %d"), this, err); + return err; + } + + if(iAttributes().iPixelFormat == EUidPixelFormatYUV_422Interleaved) + { + iVideoFrameBufSize = iInfo().iSize.iWidth * iInfo().iSize.iHeight * 2; + } + else + {//EStUidPixelFormatYUV_420MB + // EUidPixelFormatYUV_420Planar + iVideoFrameBufSize = iInfo().iSize.iWidth * iInfo().iSize.iHeight * 3/2; + } + + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcCreateSurface err=%d"), this, err); + return err; + } + +void CNGAPostProcHwDevice::MmvssSetObserver(MMMFVideoSurfaceObserver& aObserver) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssSetObserver() ++"), this); + iVideoSurfaceObserver = &aObserver; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssSetObserver() --"), this); +} + +void CNGAPostProcHwDevice::MmvssGetSurfaceParametersL(TSurfaceId& aSurfaceId, + TRect& aCropRect, TVideoAspectRatio& aPixelAspectRatio) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssGetSurfaceParametersL() ++"), this); + + iSurfaceHandler->SurfaceInfo(iSurfaceId, iInfo); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssGetSurfaceParametersL() \ + surfaceWidth = %d surfaceHeight = %d SurfaceId = 0x%x --"), + this, iInfo().iSize.iWidth, iInfo().iSize.iHeight, iSurfaceId); + aSurfaceId = iSurfaceId; + aCropRect = TRect(0, 0, iInfo().iSize.iWidth, iInfo().iSize.iHeight); + if((iPicSize.iWidth > 0) && (iPicSize.iHeight > 0)) + { + aCropRect.Intersection( iPicSize); + } + aPixelAspectRatio = TVideoAspectRatio(iAspectRatioNum,iAspectRatioDenom); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssGetSurfaceParametersL() \ + cropRectWidth = %d cropRectHeight = %d"), this, aCropRect.Width(), aCropRect.Height()); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssGetSurfaceParametersL() \ + PAR Num = %d PAR Denom = %d"), this, aPixelAspectRatio.iNumerator, aPixelAspectRatio.iDenominator); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssGetSurfaceParametersL() --"), this); +} + +void CNGAPostProcHwDevice::MmvssSurfaceRemovedL(const TSurfaceId& aSurfaceId) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssSurfaceRemovedL()++"), this); + if(!aSurfaceId.IsNull()) + { + if(iSurfaceId == aSurfaceId) + {//closing down top surface....current surface. + if(iSessionManager) + { + iSessionManager->CancelNotifiers(); + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssSurfaceRemovedL(): UnregisterSurface ID = 0x%x"), this, aSurfaceId ); + TInt numScreens = iWsSession.NumberOfScreens(); + for(TInt i=0;i < numScreens;i++) + { + iWsSession.UnregisterSurface(i, aSurfaceId); + } + iWsSession.Flush(); + iSurfaceHandler->DestroySurface(aSurfaceId); + if(iSurfaceId == aSurfaceId) + { + iSurfaceCreatedEventPublished = EFalse; + iSurfaceId = TSurfaceId::CreateNullId(); + if(!iIsExternalChunk) + { + iChunk.Close(); + } + } + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvssSurfaceRemovedL() --"), this); +} + +// === MMmfVideoPropertiesObserver === + +void CNGAPostProcHwDevice::MmvpoUpdateVideoProperties(const TYuvFormat& aYuvFormat, const TSize& aPictureSize) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvpoUpdateVideoProperties ++"), this); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvpoUpdateVideoProperties PAR \ + iAspectRatioNum = %d, iAspectRatioDenom = %d"), this, + aYuvFormat.iAspectRatioNum,aYuvFormat.iAspectRatioDenom); + iPicSize = aPictureSize; + iAspectRatioNum = aYuvFormat.iAspectRatioNum; + iAspectRatioDenom = aYuvFormat.iAspectRatioDenom; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvpoUpdateVideoProperties Picture Size \ + iWidth = %d, iHeight = %d, iSurfaceCreatedEventPublished = %d"), + this, iPicSize.iWidth,iPicSize.iHeight, iSurfaceCreatedEventPublished?1:0); + + if(iVPObserver) + { + iVPObserver->MmvpoUpdateVideoProperties(aYuvFormat, aPictureSize); + } + if(iVideoSurfaceObserver && iSurfaceCreatedEventPublished) + { + iVideoSurfaceObserver->MmvsoSurfaceParametersChanged(); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvpoUpdateVideoProperties --"), this); +} + +// === MMmfVideoResourceObserver === + +void CNGAPostProcHwDevice::MmvroResourcesLost(TUid ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvroResourcesLost ++"), this); + if(!iResourceLost) + { + iResourceLost = ETrue; + iRedrawDone = EFalse; + Pause(); + ReleaseInputQ(); + iSessionManager->CancelNotifiers(); + ReleaseProcessQ(); + if(iVideoSurfaceObserver && iSurfaceCreatedEventPublished) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvroResourcesLost - Telling client to remove surface"), this); + iVideoSurfaceObserver->MmvsoRemoveSurface(); + iSurfaceCreatedEventPublished = EFalse; + } + } + else if(iResourceLost && iRedrawDone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvroResourcesLost ResourceLost happening \ + while Postprocessor is already in ResourceLoss state"), + this); + iProxy->MdvppFatalError(this, KErrHardwareNotAvailable); + return; + } + else + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvroResourcesLost Ignoring the \ + duplicate ResourceLoss call"), + this); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvroResourcesLost --"), this); +} + +// === MMmfVideoPropertiesNotifier === + +void CNGAPostProcHwDevice::MmvpnSetObserver(MMmfVideoPropertiesObserver* aObserver) +{ + PP_DEBUG(_L("ppHwDev[%x]::MmvpnSetObserver ++"), this); + iVPObserver = aObserver; + PP_DEBUG(_L("ppHwDev[%x]::MmvpnSetObserver --"), this); +} + +void CNGAPostProcHwDevice::MmvroResourcesRestored(TUid ) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvroResourcesRestored ++"), this); + iFirstPictureUpdated = EFalse; + iResourceLost = EFalse; + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvroResourcesRestored state=%d --"), + this, iPPState); +} + +void CNGAPostProcHwDevice::MmvshcSetSurfaceHandle(const TSurfaceId &aSurfaceID) +{ + + SetupExternalSurface(aSurfaceID); + +} + +void CNGAPostProcHwDevice::MmvshcRedrawBufferToSurface(TPtrC8& aRedrawBuffer) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface ++"), this); + + TUint8* lPtr; + TInt offset; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface -- Creating %d x %d surface"), this, iPicSize.iWidth, iPicSize.iHeight); + + TInt err = KErrNone; + SetSurfaceAttributes(iPicSize, 1); + + err = iSurfaceHandler->CreateSurface(iAttributes, iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcRedrawBufferToSurface -- failed to create Surface %d"), + this, err); + iProxy->MdvppFatalError(this, err); + return; + } + + err = iSurfaceHandler->SurfaceInfo(iSurfaceId, iInfo); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcRedrawBufferToSurface -- failed to get Surface info %d"), + this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + iProxy->MdvppFatalError(this, err); + return; + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcRedrawBufferToSurface() \ + surfaceWidth = %d surfaceHeight = %d surfaceStride = %d"), this, iInfo().iSize.iWidth, iInfo().iSize.iHeight, iInfo().iStride); + + TInt redrawBufferSize = aRedrawBuffer.Size(); + TInt surfaceSize = iInfo().iStride * iInfo().iSize.iHeight; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface RedrawBuffer size= %d Surface size = %d"), this, redrawBufferSize, surfaceSize); + + // Check whether redraw buffer will fit onto the surface. + // If this check fails then we won't raise a fatal error - We just won't create the redraw surface + if (redrawBufferSize > surfaceSize) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface Redraw buffer size larger than surface size"), this); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return; + } + + err = iSurfaceHandler->MapSurface(iSurfaceId, iChunk); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:MmvshcRedrawBufferToSurface -- failed to map Surface %d"), + this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + iProxy->MdvppFatalError(this, err); + return; + } + iIsExternalChunk = EFalse; + if((err = iSurfaceHandler->GetBufferOffset(iSurfaceId, 0, offset)) != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface offset query failed %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + iChunk.Close(); + iProxy->MdvppFatalError(this, err); + return; + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface offset = %d"), this, offset); + + lPtr = reinterpret_cast(iChunk.Base() + offset); + memcpy((TAny *)lPtr, (TAny *)aRedrawBuffer.Ptr(), redrawBufferSize); + + iRedrawSurfaceInUse = ETrue; + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface(): New surface = 0x%x"), this, iSurfaceId); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::MmvshcRedrawBufferToSurface error = %d --"), this, err); +} + +TInt CNGAPostProcHwDevice::SetupExternalSurface(const TSurfaceId &aSurfaceID) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface(): aSurfaceID = 0x%x"), this, aSurfaceID ); + + TInt err = KErrNone; + + if(!iSurfaceId.IsNull()) + { + if (iVideoSurfaceObserver && iSurfaceCreatedEventPublished) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface - Telling client to remove old surface"), this); + iVideoSurfaceObserver->MmvsoRemoveSurface(); + iSurfaceCreatedEventPublished = EFalse; + } + else + { + // We never told the client about the surface, so we must destroy it ourselves + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface - Destroying old surface"), this); + TInt numScreens = iWsSession.NumberOfScreens(); + for(TInt i=0;i < numScreens;i++) + { + iWsSession.UnregisterSurface(i, iSurfaceId); + } + iWsSession.Flush(); + iSurfaceHandler->DestroySurface(iSurfaceId); + } + + iChunk.Close(); + } + + iSurfaceId = aSurfaceID; + iUsingExternalSurface = ETrue; + iRedrawSurfaceInUse = EFalse; + + // Create the surface handler if it doesn't exist. + if (!iSurfaceHandler) + { + TRAP(err, iSurfaceHandler = CNGAPostProcSurfaceHandler::NewL()); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface -- failed to create SurfaceHandler."), this); + return err; + } + } + + err = iSurfaceHandler->OpenSurface(iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface -- failed OpenSurface %d"), + this, err); + return err; + } + err = AddHints(); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface -- failed to AddHints %d"), + this, err); + return err; + } + err = RegisterSurface(iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface -- failed RegisterSurface %d"), + this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + + err = iSurfaceHandler->SurfaceInfo(iSurfaceId, iInfo); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface -- failed to get Surface info %d"), + this, err); + return err; + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetupExternalSurface err=%d"), this, err); + return err; +} + +//=== Internal === +TVideoPicture* CNGAPostProcHwDevice::CreateBuffersL(TInt aBufId) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateBuffersL ++"), this); + + TVideoPicture* lVideoPicture = NULL; + TUint8* lPtr; + TPtr8* lTemp; + TInt offset; + + lVideoPicture = new (ELeave) TVideoPicture; + CleanupStack::PushL(lVideoPicture); + if(TInt err = iSurfaceHandler->GetBufferOffset(iSurfaceId, aBufId, offset) != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateBuffersL offset query failed %d"), this, err); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateBuffersL offset = %d id =%d --"), this, offset, aBufId); + + lPtr = reinterpret_cast(iChunk.Base() + offset); + + lTemp = new (ELeave) TPtr8(lPtr, 0, (iVideoFrameBufSize )); + CleanupStack::PushL(lTemp); + + lVideoPicture->iData.iRawData = lTemp; + lVideoPicture->iHeader = NULL ; + lVideoPicture->iLayerBitRates = NULL ; + + CleanupStack::Pop(2); + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateVBMBuffersL --"), this); + return lVideoPicture; +} + +void CNGAPostProcHwDevice::CreateVBMBuffersL() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateVBMBuffersL ++"), this); + + TInt err = KErrNone; + TVideoPicture* pic = NULL; + iVBMBufferReferenceQ.Reset(); + iVBMBufferQ.Reset(); + iColorConversionQ.Reset(); + + for(TInt i = 0; i < iVBMBufferOptions.iNumInputBuffers; i++) + { + TRAP(err, pic = CreateBuffersL(i)); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create VBM buffer %d"), this, err); + User::Leave(err); + } + + // This will hold the references which will be used in destructor + User::LeaveIfError(iVBMBufferReferenceQ.Append(pic)); + User::LeaveIfError(iVBMBufferQ.Append(pic)); + } + if(iIsColorConversionNeeded) + { + for(TInt i = iVBMBufferOptions.iNumInputBuffers ; + i < (iVBMBufferOptions.iNumInputBuffers + KColorConversionBuffers ); i++) + { + TRAP(err, pic = CreateBuffersL(i)); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create VBM buffer %d"), this, err); + User::Leave(err); + } + + // This will hold the references which will be used in destructor + User::LeaveIfError(iVBMBufferReferenceQ.Append(pic)); + User::LeaveIfError(iColorConversionQ.Append(pic)); + } + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]::CreateVBMBuffersL --"), this); +} + +void CNGAPostProcHwDevice::ReturnPicToDecoder(TVideoPicture* aPic) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReturnPicToDecoder ++"), this); + if (aPic == NULL) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputPicture FAILED: Invalid pic ptr."), this); + return; + } + + if (iInputDecoderDevice) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputPicture .. before return picture. 2"), this); + iInputDecoderDevice->ReturnPicture(aPic); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReturnPicToDecoder --"), this); +} + +TInt CNGAPostProcHwDevice::AttemptToPost() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AttemptToPost ++ Q:%d"), this, iInputQ.Count()); + if (iPPState == EPaused) + { + return KErrNone; + } + + TInt err = KErrNotReady; + TInt count = iInputQ.Count(); + TBool bDone = EFalse; + TVideoPicture* pic = PeekQ(); + while(pic && !bDone) + { + if(!IsGceReady()) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AttemptToPost GCE not ready"), this ); + return err; //no need to catch this error + } + TInt64 delta = 0; + TTimeToPost timeToPost = (TTimeToPost)IsTimeToPost(pic, delta); + switch(timeToPost) + { + case EDelayIt: + { + iPostingTimer->Cancel(); + SetTimer(delta); + bDone = ETrue; + } + break; + case EPostIt: + { + RemoveFromQ(); // remove the pic that was returned by PeekQ + if(iIsColorConversionNeeded) + { + TVideoPicture* ccPic; + ccPic = DoColorConvert(pic); // output will be in ccPic + pic = ccPic; + } + + #ifdef _DUMP_YUV_FRAMES + captureYuv(pic); + #endif + TInt err = iSessionManager->PostPicture(iSurfaceId, GetID(pic), ETrue); + if(err == KErrNone) + { + iProcessQ.Append(pic); + iCurrentPlaybackPosition = pic->iTimestamp; + if(!iFirstPictureUpdated) + { + iFirstPictureUpdated = ETrue; + if(!iSurfaceCreatedEventPublished) + { + PublishSurfaceCreated(); + } + } + } + else + { + ReleasePicture(pic); + } + + + } // end of postit + break; + case ESkipIt: + { + RemoveFromQ(); + ReleasePicture(pic); + PicturesSkipped(); + } + break; + } // end of switch + + // get the next picture + pic = PeekQ(); + } // end of while + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AttemptToPost --"), this); + return err; +} + +TInt CNGAPostProcHwDevice::IsTimeToPost(TVideoPicture* frame, TInt64& delta) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost ++"), this); + + if (!frame) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost FAILED: Invalid frame ptr."), this); + return KErrGeneral; + } + + TInt resp = EPostIt; + // Frame presentation time + TInt64 uPresTime = frame->iTimestamp.Int64(); + + // Check if this is an out of order frame in case of forward playback + if((iCurrentPlaybackPosition.Int64() > uPresTime) && (iPlayRate > 0)) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost : Out of order frame (forward playback) Tfm=%d"), this,(TInt)uPresTime); + resp = ESkipIt; //drop + } // Check if this is an out of order frame in case of backward playback + else if((iCurrentPlaybackPosition.Int64() < uPresTime) && (iPlayRate < 0)) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost : Out of order frame (backward playback) Tfm=%d"), this,(TInt)uPresTime); + resp = ESkipIt; //drop + } + else if (iClockSource) + { + // The time to sync with. + TInt64 uSyncTime = iClockSource->Time().Int64(); + + delta = uPresTime - uSyncTime; + if (( delta > KRenderAhead ) && (iPlayRate > 0)) // Delay condition not checked for + { // backward playback + resp = EDelayIt; //wait + } + else if ( (delta < (-KMaxRenderDelay) && (iPlayRate > 0)) + || ((delta > KMaxRenderDelay) && (iPlayRate < 0))) + { + resp = ESkipIt; //drop + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost .. Tfm=%d, Tcs=%d, delta=%d"), this, (TInt)uPresTime, (TInt)uSyncTime, (TInt)delta); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:IsTimeToPost -- %d BufID = %d"), this, resp, GetID(frame)); + return resp; +} + +void CNGAPostProcHwDevice::ReleaseInputQ() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputQ ++ Q = %d"), this, iInputQ.Count()); + while (iInputQ.Count()>0) + { + ReleasePicture(iInputQ[0]); + iInputQ.Remove(0); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputQ --"), this); +} + +void CNGAPostProcHwDevice::ReleaseProcessQ() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseProcessQ ++ Q = %d"), this, iProcessQ.Count() ); + TVideoPicture* pic = NULL; + + while (iProcessQ.Count()>0) + { + pic = iProcessQ[0]; + iProcessQ.Remove(0); + ReturnPicToDecoder(pic); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseProcessQ --"), this); +} + +void CNGAPostProcHwDevice::ReleasePicture(TVideoPicture *pic) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleasePicture ++"), this); + if (pic == NULL) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputPicture FAILED: Invalid pic ptr."), this); + return; + } + + if (iInputDecoderDevice) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleaseInputPicture .. before return picture. 2"), this); + iInputDecoderDevice->ReturnPicture(pic); + } + if (iVBMEnabled) + { + iVBMBufferQ.Append(pic); + + if ( !iIsInputEnded && iPPState != EStopped ) + { + iVBMObserver->MmvbmoNewBuffers(); + } + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ReleasePicture --"), this); +} + +void CNGAPostProcHwDevice::PublishSurfaceCreated() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PublishSurfaceCreated ++"), this); + if(iVideoSurfaceObserver) + { + iVideoSurfaceObserver->MmvsoSurfaceCreated(); + iSurfaceCreatedEventPublished = ETrue; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PublishSurfaceCreated --"), this); +} + +TInt CNGAPostProcHwDevice::SetupSurface() +{ + TInt err = KErrNone; + if(iVBMEnabled && iVBMObserver) + { + SetSurfaceAttributes(iVBMBufferOptions.iBufferSize, iVBMBufferOptions.iNumInputBuffers); + + err = iSurfaceHandler->CreateSurface(iAttributes, iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create Surface %d"), this, err); + return err; + } + err = iSurfaceHandler->MapSurface(iSurfaceId, iChunk); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to map Surface %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + err = iSurfaceHandler->SurfaceInfo(iSurfaceId, iInfo); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to get Surface info %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + TRAP(err, CreateVBMBuffersL()); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to create VBM buffer %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + err = AddHints(); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to AddHints %d"), this, err); + return err; + } + err = RegisterSurface(iSurfaceId); + if (err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:Initialize -- failed to RegisterSurface %d"), this, err); + iSurfaceHandler->DestroySurface(iSurfaceId); + iSurfaceId = TSurfaceId::CreateNullId(); + return err; + } + + } + return err; +} + +void CNGAPostProcHwDevice::SetSurfaceAttributes(const TSize& aSize, TInt aNumBuf) +{ + iAttributes().iSize = aSize; // size of the video frame + iAttributes().iBuffers = aNumBuf; + + /* The stride needs to be calculated for the surface manager to know + how much memory to allocate */ + + if(iAttributes().iPixelFormat == EUidPixelFormatYUV_420Planar) + { + iAttributes().iStride = aSize.iWidth * 3/2; + iVideoFrameBufSize = aSize.iWidth * aSize.iHeight * 3/2; + } + else + { + iAttributes().iStride = aSize.iWidth * 2; + iVideoFrameBufSize = aSize.iWidth * aSize.iHeight * 2; + } + + if(iIsColorConversionNeeded) + { + iAttributes().iBuffers = aNumBuf + KColorConversionBuffers; + } + else + { + iAttributes().iBuffers = aNumBuf; + } + + iAttributes().iOffsetToFirstBuffer = 0; +#if defined __WINSCW__ + iAttributes().iAlignment = 4; +#else //on hw, its always better to have page aligned chunks + iAttributes().iAlignment = -1; +#endif + iAttributes().iContiguous = ETrue; + iAttributes().iHintCount = 0; + iAttributes().iMappable = ETrue; +} + +TInt CNGAPostProcHwDevice::GetID(TVideoPicture *aPicture) +{ + if (iUsingExternalSurface) + { + return GetExternalBufferID(aPicture); + } + else + { + TUint8* aPtr = (TUint8*) aPicture->iData.iRawData->Ptr(); + return( (TInt) ((aPtr - iChunk.Base() - iAttributes().iOffsetToFirstBuffer) / + (iVideoFrameBufSize ))); + } +} + +TInt CNGAPostProcHwDevice::GetExternalBufferID(TVideoPicture *aPicture) +{ + // currently type cast the pointer as buffer ID. + // FIXME once the new data structure is available. + return( (TInt) aPicture->iData.iRawData->Ptr()); +} + +TInt CNGAPostProcHwDevice::RegisterSurface(const TSurfaceId& aSurfaceId) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:RegisterSurface(): RegisterSurface ID = 0x%x"), this, aSurfaceId); + TInt err = KErrNone; + TInt numScreens = iWsSession.NumberOfScreens(); + for(TInt i=0; (i < numScreens && err == KErrNone); i++) + { + err = iWsSession.RegisterSurface(i, aSurfaceId); + } + return(err); +} + +TInt CNGAPostProcHwDevice::IsGceReady() +{ + if(iProcessQ.Count() >= KMaxBuffersGceCanHold) + { + return EFalse; + } + return ETrue; +} + +void CNGAPostProcHwDevice::SetTimer(TInt64 aDelta) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetTimer .. aDelta=%d"), this, (TInt)aDelta); + if(aDelta <= KRenderAhead) + { + if(aDelta < 0) + { + iPostingTimer->After(aDelta * -1); + } + else + { + iPostingTimer->After((aDelta - KRenderAhead) * -1); + } + } + else + { + iPostingTimer->After(aDelta - KRenderAhead - KPostingOfset); + } +} +// +// Convert YUV420 to YUV422InterLeaved. +// +TInt CNGAPostProcHwDevice::ConvertPostProcBuffer(TVideoPicture* pSrc, TVideoPicture* pDest) +{ + PP_DEBUG(_L("CMdfPostingSurfaceProxy::ConvertPostProcBuffer ++")); + TInt err = KErrNone; + if (!pDest && !pSrc) + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ConvertPostProcBuffer FAILED: Invalid pic pSrc %x pDest %x."), this, pSrc, pDest); + return KErrArgument; + } + + // --- Prepare wrappers --- + tBaseVideoFrame tFrame420, tFrame422; + TInt frameSize = pSrc->iData.iDataSize.iWidth * pSrc->iData.iDataSize.iHeight; + + PP_DEBUG(_L("CMdfPostingSurfaceProxy::ConvertPostProcBuffer .. w=%d, h=%d"), pSrc->iData.iDataSize.iWidth, pSrc->iData.iDataSize.iHeight); + + tFrame420.width = pSrc->iData.iDataSize.iWidth; + tFrame420.height= pSrc->iData.iDataSize.iHeight; + tFrame420.lum = (TUint8*)pSrc->iData.iRawData->Ptr(); + tFrame420.cb = (TUint8*)tFrame420.lum + frameSize; + tFrame420.cr = (TUint8*)tFrame420.lum + (frameSize*5)/4; + + tFrame422.width = pSrc->iData.iDataSize.iWidth; + tFrame422.height= pSrc->iData.iDataSize.iHeight; + tFrame422.lum = (TUint8*)pDest->iData.iRawData->Ptr(); + tFrame422.cb = 0; + tFrame422.cr = 0; + + // --- Convertion to posting buffer --- + TInt stride = pSrc->iData.iDataSize.iWidth * 2; + EBufferLayout422 layout = YUV422INT_BE; + + err = gColorConvYUVtoYUV422Int(&tFrame420, &tFrame422, layout, stride); + if(err != KErrNone) + { + PP_DEBUG(_L("CNGAPostProcHwDevice::ConvertPostProcBuffer .. err= %d."), err); + } + return err; +} + +void CNGAPostProcHwDevice::AddPictureToVBMQ(TVideoPicture *pic) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddPictureToVBMQ ++"), this); + iVBMBufferQ.Append(pic); + + if ( !iIsInputEnded && iPPState != EStopped ) + { + iVBMObserver->MmvbmoNewBuffers(); + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddPictureToVBMQ --"), this); +} + +void CNGAPostProcHwDevice::AddPictureToColorConversionQ(TVideoPicture *pic) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddPictureToColorConversionQ ++"), this); + iColorConversionQ.Append(pic); + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddPictureToColorConversionQ --"), this); +} + +#ifdef _DUMP_YUV_FRAMES +void CNGAPostProcHwDevice::captureYuv(TVideoPicture* aPicture) +{ + char buf[128]; + sprintf(buf, "c:\\fb%d.yuv", count++); + FILE *fp = ::fopen(buf, "w"); + TInt size = aPicture->iData.iRawData->Size(); + //{FILE* f1 = fopen(MY_LOG_FILE_NAME, "a+"));if(f1){fprintf(f1, "Size %d \n"), size );fclose(f1); }} + + ::fwrite(aPicture->iData.iRawData->Ptr(), 1, size, fp); + ::fclose(fp); +} +#endif + +void CNGAPostProcHwDevice::ResetCountingBuffer() +{ + memset(iSkippedFramesCountingBuffer,0,sizeof(iSkippedFramesCountingBuffer)); + iSkippedFramesInLast64Frames = 0; + iCurrentPosInFramesCountingBuffer = 0; +} + +void CNGAPostProcHwDevice::PicturesSkipped() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PicturesSkipped ++"), this); + iPictureCounters.iPicturesSkipped++; + if (!iKeyFrameMode && iPlayRate>KDefPlayRate) + { + if (iSkippedFramesCountingBuffer[iCurrentPosInFramesCountingBuffer]==0) + { + iSkippedFramesCountingBuffer[iCurrentPosInFramesCountingBuffer] = 1; + iSkippedFramesInLast64Frames++; + if (iSkippedFramesInLast64Frames>KMaxAllowedSkipInNFrames && iFPObserver ) + { + iFPObserver->MmvproKeyFrameModeRequest(); + iKeyFrameMode=ETrue; + ResetCountingBuffer(); + } + } + iCurrentPosInFramesCountingBuffer = ++iCurrentPosInFramesCountingBuffer%64; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:PicturesSkipped --"), this); +} + +TVideoPicture* CNGAPostProcHwDevice::DoColorConvert(TVideoPicture* aPicture) +{ + TVideoPicture *pOutPicture = aPicture; + + if(iColorConversionQ.Count()) + { + pOutPicture = iColorConversionQ[0]; + iColorConversionQ.Remove(0); + ConvertPostProcBuffer(aPicture, pOutPicture); + pOutPicture->iTimestamp = aPicture->iTimestamp; + ReleasePicture(aPicture); + } + else + { + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:WritePictureL() FAILED: color conversion"), this); + } + + return pOutPicture; +} + +TInt CNGAPostProcHwDevice::AddToQ(TVideoPicture* aPicture) +{ + TVideoPicture* pic = aPicture; + TInt pos = -1; + if(iInputQ.Count() == 0) + { + iInputQ.Append(pic); + } + else + { + pos = iInputQ.Count()-1; + for(; pos >= 0; pos--) + { + if(pic->iTimestamp.Int64() > iInputQ[pos]->iTimestamp.Int64()) + { + break; + } + } + if(iInputQ.Count() == pos+1) + { + iInputQ.Append(pic); + } + else + { + iInputQ.Insert(pic, pos+1); + } + } + return pos+1; +} + +void CNGAPostProcHwDevice::RemoveFromQ() +{ + if(iInputQ.Count()) + { + if(iPlayRate > 0) + { + iInputQ.Remove(0); + } + else + { + iInputQ.Remove(iInputQ.Count()-1); + } + } +} + +TVideoPicture* CNGAPostProcHwDevice::PeekQ() +{ + TVideoPicture *pic = NULL; + if(iInputQ.Count()) + { + if(iPlayRate > 0) + { + pic = iInputQ[0]; + } + else + { + pic = iInputQ[iInputQ.Count()-1]; + } + } + return pic; +} + +TInt CNGAPostProcHwDevice::AddHints() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddHints iSurfaceMask 0x%08x ++"), this, iSurfaceMask); + TInt err = KErrNone; + iHint.Set(iSurfaceKey,iSurfaceMask,ETrue); + err = iSurfaceHandler->AddSurfaceHint(iSurfaceId,iHint); + if(err == KErrAlreadyExists) + { + err = KErrNone; + err = iSurfaceHandler->SetSurfaceHint(iSurfaceId,iHint); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddHints. err = %d --"), this,err); + iHint.iKey.iUid = surfaceHints::KSurfaceContent; + iHint.iValue = surfaceHints::EVideoPlayback; + iHint.iMutable = ETrue; + err = iSurfaceHandler->AddSurfaceHint(iSurfaceId,iHint); + if(err == KErrAlreadyExists) + { + err = KErrNone; + err = iSurfaceHandler->SetSurfaceHint(iSurfaceId,iHint); + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:AddHints. err = %d --"), this,err); + return err; +} + +TInt CNGAPostProcHwDevice::ColorConvert(tBaseVideoFrame* aInputFrame, TUint8* aDestPtr, tWndParam* aInputCropWindow, tWndParam* aOutputCropWindow) +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ColorConvert ++"), this); + __ASSERT_ALWAYS(aDestPtr, User::Invariant()); + TInt lError = E_SUCCESS; + TInt err = KErrNone; + + err = SetSourceFormat(); + if(err == KErrNone) + { + err = SetSourceRange(); + if(err == KErrNone) + { + + lError = Emz_VDec_gColorConv_YUVtoRGB(aInputFrame,aDestPtr, + aInputCropWindow, aOutputCropWindow, iSourceFormat, + EBitmapColor16MU, iSourceRange); + + if(lError) + { + if(lError == E_OUT_OF_MEMORY) + { + err = KErrNoMemory; + } + else if(lError == E_FAILURE) + { + err = KErrNotSupported; + } + else + { + err = KErrGeneral; + } + } + } + } + + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:ColorConvert --"), this); + return err; +} + +TInt CNGAPostProcHwDevice::SetSourceFormat() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetSourceFormatL ++"), this); + TInt err = KErrNone; + switch (iVideoFormat.iYuvFormat.iPattern) + { + case EYuv420Chroma1: + iSourceFormat = EYuv420Chroma1_Planar; + break; + case EYuv420Chroma2: + iSourceFormat = EYuv420Chroma2_Planar; + break; + case EYuv420Chroma3: + iSourceFormat = EYuv420Chroma3_Planar; + break; + case EYuv422Chroma1: + if( iVideoFormat.iYuvFormat.iDataLayout == EYuvDataInterleavedLE) + iSourceFormat = EYuv422Chroma1_LE; + else if( iVideoFormat.iYuvFormat.iDataLayout == EYuvDataInterleavedBE ) + iSourceFormat = EYuv422Chroma1_BE; + else + err = KErrArgument; + break; + case EYuv422Chroma2: + if( iVideoFormat.iYuvFormat.iDataLayout == EYuvDataInterleavedLE) + iSourceFormat = EYuv422Chroma2_LE; + else if( iVideoFormat.iYuvFormat.iDataLayout == EYuvDataInterleavedBE ) + iSourceFormat = EYuv422Chroma2_BE; + else + err = KErrArgument; + break; + default: + err = KErrNotSupported; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetSourceFormatL --"), this); + return err; +} + + +TInt CNGAPostProcHwDevice::SetSourceRange() +{ + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetSourceRangeL ++"), this); + TInt err = KErrNone; + switch (iVideoFormat.iYuvFormat.iCoefficients) + { + case EYuvBt601Range0: + iSourceRange = EITU601_5_REDUCEDRANGE; + break; + case EYuvBt601Range1: + iSourceRange = EITU601_5_FULLRANGE; + break; + case EYuvBt709Range0: + iSourceRange = EB709_REDUCEDRANGE; + break; + case EYuvBt709Range1: + iSourceRange = EB709_FULLRANGE; + break; + default: + err = KErrNotSupported; + } + PP_DEBUG(_L("CNGAPostProcHwDevice[%x]:SetSourceRangeL --"), this); + return err; +} + +CNGAPostProcTimer::CNGAPostProcTimer( CNGAPostProcHwDevice& aParent ) +:CTimer(EPriorityHigh),iParent(aParent) +{ + CActiveScheduler::Add(this); +} + +CNGAPostProcTimer::~CNGAPostProcTimer() +{ + PP_DEBUG(_L("CNGAPostProcTimer[%x]:~CNGAPostProcTimer ++"), this); + Cancel(); + PP_DEBUG(_L("CNGAPostProcTimer[%x]:~CNGAPostProcTimer --"), this); +} + +CNGAPostProcTimer* CNGAPostProcTimer::NewL( CNGAPostProcHwDevice& aParent ) +{ + CNGAPostProcTimer* self = new (ELeave)CNGAPostProcTimer(aParent); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; +} + +void CNGAPostProcTimer::ConstructL() +{ + CTimer::ConstructL(); +} + +void CNGAPostProcTimer::RunL() +{ + PP_DEBUG(_L("CNGAPostProcTimer[%x]:RunL ++"), this); + if (iStatus ==KErrCancel) + { + PP_DEBUG(_L("CNGAPostProcNotifier[%x]:CNGAPostProcNotifier:RunL State canceled"), this); + return; + } + iParent.AttemptToPost(); + PP_DEBUG(_L("CNGAPostProcTimer[%x]:RunL --"), this); +} + +void CNGAPostProcHwDevice::MmpirPostInitializeRequest(MMmfPostInitializeResponse& aResponse) + { + iPostInitializeResponse = &aResponse; + } diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcNotifier.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2006 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 "NGAPostProcNotifier.h" +#include "NGAPostProcSessionManager.h" +#include "MdfRDebug.h" + +CNGAPostProcNotifier::CNGAPostProcNotifier( CNGAPostProcSessionManager& aParent ) +:CActive(CActive::EPriorityStandard),iParent(aParent) +{ + CActiveScheduler::Add(this); +} + +CNGAPostProcNotifier::~CNGAPostProcNotifier() +{ + Cancel(); +} + +CNGAPostProcNotifier* CNGAPostProcNotifier::NewL( CNGAPostProcSessionManager& aParent ) +{ + CNGAPostProcNotifier* self = new (ELeave)CNGAPostProcNotifier(aParent); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; +} + +void CNGAPostProcNotifier::ConstructL() +{ + // No Impl +} + +void CNGAPostProcNotifier::SetBufferId(TInt aBufId) +{ + iBufferId = aBufId; +} + +void CNGAPostProcNotifier::Activate() +{ + PP_DEBUG(_L("CNGAPostProcNotifier:Activate ++")); + if(!IsActive()) + { + PP_DEBUG(_L("CNGAPostProcNotifier:Activate SetActive")); + SetActive(); + } + PP_DEBUG(_L("CNGAPostProcNotifier:Activate --")); +} + +void CNGAPostProcNotifier::RunL() +{ + PP_DEBUG(_L("CNGAPostProcNotifier:RunL ++")); + //KErrCancel should never get invoked Since cancellation handled syncronously under AO's + //DoCancel. + iParent.HandleBufferRelease(iBufferId, iStatus.Int()); + + PP_DEBUG(_L("CNGAPostProcNotifier:RunL --")); +} + +void CNGAPostProcNotifier::DoCancel() +{ + iParent.CancelUpdate(); +} + +TInt CNGAPostProcNotifier::RunError( TInt /*aError*/ ) +{ + PP_DEBUG(_L("CNGAPostProcNotifier[%x]:CNGAPostProcNotifier::RunError "), this); + return KErrNone; +} diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcSessionManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcSessionManager.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,187 @@ +/* +* Copyright (c) 2006 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 +#include //RSurfaceUpdateSession +#include //RSurfaceManager +#include //KAllScreens + +#include "NGAPostProcSessionManager.h" +#include "NGAPostProcSessionManagerObserver.h" +#include "MdfRDebug.h" +#include "NGAPostProcNotifier.h" + +// --- Constants --- +const TInt KMessageSlots = 4; + +//************************************************** + +CNGAPostProcSessionManager* CNGAPostProcSessionManager::NewL() +{ + PP_DEBUG(_L("CNGAPostProcSessionManager:NewL() ++")); + + CNGAPostProcSessionManager* self = new (ELeave) CNGAPostProcSessionManager; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + PP_DEBUG(_L("CNGAPostProcSessionManager:NewL() --")); + return self; +} + +CNGAPostProcSessionManager::CNGAPostProcSessionManager() +:iSurfaceUpdateSession(NULL), + iObserver(NULL) + +{ +} + +void CNGAPostProcSessionManager::ConstructL() +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:ConstructL() ++"), this); + + iSurfaceUpdateSession = new (ELeave) RSurfaceUpdateSession(); + User::LeaveIfError(iSurfaceUpdateSession->Connect(KMessageSlots)); + + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:ConstructL() --"), this); +} + +void CNGAPostProcSessionManager::CreateNotifierL(TInt aNumSurfaceBuffers) + { + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CreateNotifierL() ++"), this); + + CNGAPostProcNotifier* notifier; + for(TInt index = 0; index < aNumSurfaceBuffers; ++index) + { + notifier = CNGAPostProcNotifier::NewL(*this); + CleanupStack::PushL(notifier); + + iAOList.AppendL(notifier); + + CleanupStack::Pop(); + } + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CreateNotifierL() --"), this); + } + +CNGAPostProcSessionManager::~CNGAPostProcSessionManager() +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:~() ++"), this); + //Its safer to destry notifiers before surfaceupdatesession object since notifiers + //guarantee synchronous cancellation. + iAOList.ResetAndDestroy(); + + if(iSurfaceUpdateSession) + { + CancelUpdate(); + iSurfaceUpdateSession->Close(); + delete iSurfaceUpdateSession; + iSurfaceUpdateSession = NULL; + } + + + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:~() --"), this); +} + +TInt CNGAPostProcSessionManager::PostPicture(const TSurfaceId& aSurfaceId, + TInt aBufId, TBool aNotifyRequired) +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:PostPicture() ++"), this); + TInt err = KErrNone; + if(aNotifyRequired) + { + CNGAPostProcNotifier* notifier = NULL; + for(TInt j=0; j < iAOList.Count(); j++) + { + //notifier = iAOList[j]; + if(!iAOList[j]->IsActive()) + { + notifier = iAOList[j]; + iAOList.Remove(j); + //iAOList.Compress(); //why this is required? may create fragmentation. + break; + } + } + if(!notifier) + { + + return KErrInUse; + + } + + notifier->SetBufferId(aBufId); + notifier->Activate(); + iSurfaceUpdateSession->NotifyWhenAvailable(notifier->iStatus); + iAOList.Append(notifier); + + + } + err = iSurfaceUpdateSession->SubmitUpdate(KAllScreens, aSurfaceId, aBufId); + + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:PostPicture() -- err = %d"), this, err); + return err; +} + +void CNGAPostProcSessionManager::CancelUpdate() +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelUpdate() ++"), this); + iSurfaceUpdateSession->CancelAllUpdateNotifications(); + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelUpdate() --"), this); +} + +void CNGAPostProcSessionManager::CancelNotifiers() +{ + + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelNotifiers() ++"), this); + TInt notifierCount = iAOList.Count(); + for (TInt i = notifierCount - 1; i >= 0; --i) //reverse loop since the active notifier is appended to the list + { + if (iAOList[i]->IsActive()) + { + iAOList[i]->Cancel(); + } + else + { + break; + } + } + + + + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelNotifiers() --"), this); + + + +} + +void CNGAPostProcSessionManager::HandleBufferRelease(TInt aBufId, TInt aStatus) +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:HandleBufferRelease() ++"), this); + if(iObserver) + { + iObserver->BufferAvailable(aBufId, aStatus); + } + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:HandleBufferRelease() --"), this); +} + +void CNGAPostProcSessionManager::SetObserver(MNGAPostProcSessionManagerObserver& aObserver) +{ + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:SetClockSource() ++"), this); + iObserver = &aObserver; + PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:SetClockSource() --"), this); +} + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcSurfaceHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcSurfaceHandler.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2006 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 +#include //TSurfaceId +#include //RSurfaceManager +#include "MdfRDebug.h" + +#include "NGAPostProcSurfaceHandler.h" + +//************************************************** + +CNGAPostProcSurfaceHandler* CNGAPostProcSurfaceHandler::NewL() +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler:NewL() ++")); + + CNGAPostProcSurfaceHandler* self = new (ELeave) CNGAPostProcSurfaceHandler; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + PP_DEBUG(_L("CNGAPostProcSurfaceHandler:NewL() --")); + return self; +} + +void CNGAPostProcSurfaceHandler::ConstructL() +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:ConstructL() ++"), this); + iSurfaceManager = new (ELeave) RSurfaceManager(); + User::LeaveIfError(iSurfaceManager->Open()); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:ConstructL() --"), this); +} + +CNGAPostProcSurfaceHandler::CNGAPostProcSurfaceHandler() +:iSurfaceManager(NULL), + iSurfaceAttributes(iSurfaceAttributesBuf()) +{ +} + +CNGAPostProcSurfaceHandler::~CNGAPostProcSurfaceHandler() +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:~() ++"), this); + if (iSurfaceManager) + { + iSurfaceManager->Close(); + delete iSurfaceManager; + iSurfaceManager = NULL; + } + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:~() --"), this); +} + +TInt CNGAPostProcSurfaceHandler::CreateSurface( + const RSurfaceManager::TSurfaceCreationAttributes & aAttributes, + TSurfaceId& aSurfaceId, const RChunk& aChunk) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:CreateSurface() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:CreateSurface() --"), this); + + + iSurfaceAttributes = aAttributes; + return(iSurfaceManager->CreateSurface(iSurfaceAttributesBuf, aSurfaceId, aChunk)); +} +TInt CNGAPostProcSurfaceHandler::CreateSurface( + const RSurfaceManager::TSurfaceCreationAttributesBuf & aAttributes, + TSurfaceId& aSurfaceId) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:CreateSurface() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:CreateSurface() --"), this); + return(iSurfaceManager->CreateSurface(aAttributes, aSurfaceId)); +} + + +TInt CNGAPostProcSurfaceHandler::OpenSurface(const TSurfaceId& aSurfaceId) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:OpenSurface() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:OpenSurface() --"), this); + return(iSurfaceManager->OpenSurface(aSurfaceId)); + +} + +TInt CNGAPostProcSurfaceHandler::MapSurface(const TSurfaceId& aSurfaceId, RChunk& aHandle) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:MapSurface() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:MapSurface() --"), this); + return(iSurfaceManager->MapSurface(aSurfaceId, aHandle)); +} + +TInt CNGAPostProcSurfaceHandler::SurfaceInfo(const TSurfaceId& aSurfaceId, + RSurfaceManager::TInfoBuf& aInfo) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:SurfaceInfo() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:SurfaceInfo() --"), this); + return(iSurfaceManager->SurfaceInfo(aSurfaceId, aInfo)); +} + +TInt CNGAPostProcSurfaceHandler::DestroySurface(const TSurfaceId& aSurfaceId) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:DestroySurface() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:DestroySurface() --"), this); + return(iSurfaceManager->CloseSurface(aSurfaceId)); +} + +TInt CNGAPostProcSurfaceHandler::GetBufferOffset(const TSurfaceId& aSurfaceId, TInt aBuffer, TInt& aOffset) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:GetBufferOffset() aBuffer = %d++"), this, aBuffer); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:GetBufferOffset() --"), this); + return(iSurfaceManager->GetBufferOffset(aSurfaceId, aBuffer, aOffset)); +} + +TInt CNGAPostProcSurfaceHandler::AddSurfaceHint(const TSurfaceId& aSurfaceId,const RSurfaceManager::THintPair& aHint) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:AddSurfaceHint() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:AddSurfaceHint() --"), this); + return(iSurfaceManager->AddSurfaceHint(aSurfaceId, aHint)); +} + +TInt CNGAPostProcSurfaceHandler::SetSurfaceHint(const TSurfaceId& aSurfaceId,const RSurfaceManager::THintPair& aHint) +{ + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:SetSurfaceHint() ++"), this); + PP_DEBUG(_L("CNGAPostProcSurfaceHandler[%x]:SetSurfaceHint() --"), this); + return(iSurfaceManager->SetSurfaceHint(aSurfaceId, aHint)); +} + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/colorconversion.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/colorconversion.c Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,63648 @@ +/* +* Copyright (c) 2010 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 +#include +#include "Colorconversion.h" + +/* +****************************************************************************** +Name : Emz_VDec_gColorConv_YUVtoRGB +Description : Converts YUV picture data to RGB data. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) + uint8 srcImageFmt : Specifies the color format of src data (i/p, o/p). + uint8 dstImageFmt : Specifies the color format of dst data (i/p, o/p). + uint8 colorConvScheme : Specifies the color conversion standard.(i/p) +Return Value : int32 +****************************************************************************** +*/ +int32 Emz_VDec_gColorConv_YUVtoRGB + (tBaseVideoFrame *srcImage, uint8 *dstImage, tWndParam *srcWindow, + tWndParam *dstWindow, uint8 srcImageFmt, uint8 dstImageFmt, + uint8 colorConvScheme) +{ + tWndParam lSrcWindow, lDstWindow; + + if( (NULL == srcImage) || (NULL == srcImage->lum) || + (NULL == dstImage) || (srcWindow == NULL)|| (dstWindow == NULL) ) + + { + return E_OUT_OF_MEMORY; + } + + if( (EYuv422Chroma2_BE != srcImageFmt) && (EYuv422Chroma2_LE != srcImageFmt) + && (EYuv422Chroma1_BE != srcImageFmt) && (EYuv422Chroma1_LE != srcImageFmt)) + { + if( (NULL == srcImage->cb) || (NULL == srcImage->cr) ) + { + return E_OUT_OF_MEMORY; + } + } + + lSrcWindow.xOffset = srcWindow->xOffset; + lSrcWindow.yOffset = srcWindow->yOffset; + lSrcWindow.wndWidth = srcWindow->wndWidth; + lSrcWindow.wndHeight = srcWindow->wndHeight; + + lDstWindow.xOffset = dstWindow->xOffset; + lDstWindow.yOffset = dstWindow->yOffset; + lDstWindow.wndWidth = dstWindow->wndWidth; + lDstWindow.wndHeight = dstWindow->wndHeight; + + lSrcWindow.xOffset = (uint16) ((lSrcWindow.xOffset >> 1) << 1); + lSrcWindow.yOffset = (uint16) ((lSrcWindow.yOffset >> 1) << 1); + lDstWindow.wndWidth = (lDstWindow.wndWidth >> 1) << 1; + lDstWindow.wndHeight = (lDstWindow.wndHeight >> 1) << 1; + + switch (srcImageFmt) + { + + case EYuv420Chroma1_Planar : + + switch (dstImageFmt) + { + + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr1toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr1toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv420Chroma2_Planar : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr2toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr2toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv420Chroma3_Planar : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV420Chr3toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV420Chr3toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv422Chroma1_BE : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr1toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr1toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv422Chroma2_BE : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422BEChr2toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422BEChr2toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv422Chroma1_LE : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr1toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr1toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + case EYuv422Chroma2_LE : + + switch (dstImageFmt) + { + case EBitmapColor4k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor4k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherOrdered : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor64k_DitherErrDiff : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16M : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor16M_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor16M_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor16M_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor16M_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + case EBitmapColor16MU : + + switch (colorConvScheme) + { + case EB709_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor16MU_709_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_FULLRANGE : + sEmz_VDec_YUV422LEChr2toColor16MU_601_5_FR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EB709_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor16MU_709_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + case EITU601_5_REDUCEDRANGE : + sEmz_VDec_YUV422LEChr2toColor16MU_601_5_RR + (srcImage, dstImage, &lSrcWindow, &lDstWindow); + break; + + default : + return E_FAILURE; + } + break; + + default : + return E_FAILURE; + } + + break; + + default : + return E_FAILURE; + } + + return E_SUCCESS; +} + + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** Start of Chroma2 format *******************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + + + +/****** Functions for YUV420 input *******/ +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_FR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_FR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_RR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_RR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16M_709_FR +Description : Converts YUV420 Chroma2 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16M_601_5_FR +Description : Converts YUV420 Chroma2 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16M_709_RR +Description : Converts YUV420 Chroma2 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16M_601_5_RR +Description : Converts YUV420 Chroma2 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16MU_709_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16MU_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16MU_601_5_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16MU_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16MU_709_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16MU_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor16MU_601_5_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor16MU_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCr = lCrPtr[j >> 1]; + lCb = lCbPtr[j >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/**** End of YUV420 input *****/ + + + +/**** Start of YUV422BE input *****/ +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16M_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16M_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16M_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16M_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16MU_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16MU_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16MU_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor16MU_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/***** End of YUV422BE input ****/ + + + +/**** Start of YUV422LE input *****/ +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16M_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16M_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16M_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16M_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16MU_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16MU_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16MU_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor16MU_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < lWidth; j += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/***** End of YUV422LE input ****/ + + + + + + + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_FR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_RR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma2 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCr = lCrPtr[k >> 1]; + lCb = lCbPtr[k >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr = lCrPtr[(k + lLumWidth) >> 1]; + lCb = lCbPtr[(k + lLumWidth) >> 1]; + + lCr -= 128; + lCb -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr2toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[0]; + lCr = lYuyvPtr[2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth]; + lCr = lYuyvPtr[lLumWidth + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1)]; + lCr = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (25801 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb) + (7670 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (22973 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb) + (11699 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (29374 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb) + (8731 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr2toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr, lCb; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < lWidth; k += 2) + { + lCb = lYuyvPtr[3]; + lCr = lYuyvPtr[1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[lLumWidth + 3]; + lCr = lYuyvPtr[lLumWidth + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lCb = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb -= 128; + lCr -= 128; + + lTemp1 = (26748 * lCr) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb) + (13621 * lCr)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** End of Chroma2 format *********************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + + + + + + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** Start of Chroma1 format *******************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_FR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_FR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_RR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_RR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16M_709_FR +Description : Converts YUV420 Chroma1 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16M_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16M_601_5_FR +Description : Converts YUV420 Chroma1 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16M_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16M_709_RR +Description : Converts YUV420 Chroma1 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16M_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16M_601_5_RR +Description : Converts YUV420 Chroma1 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16M_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_FR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_FR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_RR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_RR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16MU_709_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16MU_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16MU_601_5_FR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16MU_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16MU_709_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16MU_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor16MU_601_5_RR +Description : Converts YUV420 Chroma2 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor16MU_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + + +/************** End of YUV420 input *************/ + +/************** Start of YUV422BE input ********/ + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16M_709_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16M_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16M_709_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16M_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16MU_709_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16MU_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16MU_709_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor16MU_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/************** End of YUV422BE input *******************/ + + + + + +/************** Start of YUV422LE input ********/ + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16M_709_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16M_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16M_709_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16M_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to RGB888 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1 ; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = (lY1 + lTemp1); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = (lY1 - lTemp2); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[4] = (uint8) lTemp; + + /*B component*/ + lTemp = (lY1 + lTemp3); + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr[5] = (uint8) lTemp; + + lYuyvPtr += 4; + lRGBFramePtr += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_Ordered_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Third Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)lTemp4; + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)lTemp4; + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16MU_709_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16MU_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16MU_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16MU_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16MU_709_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16MU_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor16MU_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma1 Interleaved to XRGB (8:8:8:8) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor16MU_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lYuyvPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + + for(i = 0; i < lHeight; i++) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)lTemp4; + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)lTemp4; + + lYuyvPtr += 4; + lRGBFramePtr += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + lRGBFramePtr += (wndWidth - lTempWidth); + } + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/************** End of YUV422LE input *******************/ + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_FR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_RR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma1 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_FR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_RR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma1 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 4); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[(k + lLumWidth) >> 1 + 1]; + lCb2 = lCbPtr[(k + lLumWidth) >> 1 + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Seventh Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1)) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Eighth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 2) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + (lSrcWidth << 1) + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + (lSrcWidth << 1) + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + (lSrcWidth << 1) + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_FR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_RR +Description : Converts YUV422 BE (UYVY) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422BEChr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb2 = lYuyvPtr[4]; + lCr2 = lYuyvPtr[6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb2 = lYuyvPtr[lLumWidth + 4]; + lCr2 = lYuyvPtr[lLumWidth + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 4]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 6]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[0]; + lCr1 = lYuyvPtr[2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth]; + lCr1 = lYuyvPtr[lLumWidth + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth << 1]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to RGB565 Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + + + + + + + + + + + + + + + + + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_FR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_RR +Description : Converts YUV422 LE (YVYU) Chroma2 Interleaved to XRGB (4:4:4:4) Interleaved format. +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV422LEChr1toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lYuyvPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 diff1, diff2, diff3; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, k, extraCol, extraRow; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lYuyvPtr = srcImage->lum + (srcYOffset * (lLumWidth << 1)) + (srcXOffset << 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + lLumWidth <<= 1; + + for(i = 0; i < lHeight; i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb2 = lYuyvPtr[7]; + lCr2 = lYuyvPtr[5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*First Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb2 = lYuyvPtr[lLumWidth + 7]; + lCr2 = lYuyvPtr[lLumWidth + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + /*Third Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb2 = lYuyvPtr[(lLumWidth << 1) + 7]; + lCr2 = lYuyvPtr[(lLumWidth << 1) + 5]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCb2 -= 128; + lCr2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + } + + lCb1 = lYuyvPtr[3]; + lCr1 = lYuyvPtr[1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lYuyvPtr[2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lYuyvPtr[0]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[lLumWidth + 3]; + lCr1 = lYuyvPtr[lLumWidth + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lYuyvPtr[lLumWidth + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lYuyvPtr[lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCb1 = lYuyvPtr[(lLumWidth << 1) + 3]; + lCr1 = lYuyvPtr[(lLumWidth << 1) + 1]; + + lCb1 -= 128; + lCr1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1) + 2]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lYuyvPtr[(lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lYuyvPtr += 4; + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lYuyvPtr += ((lLumWidth - lWidth) << 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** End of Chroma1 format *********************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + + + + + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** Start of Chroma3 format *******************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_FR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_FR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_RR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_RR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 16-bit + {5,6,5} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,3,2} {4,0,6} | + | {6,1,4} {2,2,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 6; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1 + 4; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 3); + + /*G component*/ + lTemp = lY1 - lTemp2 + 2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 2) << 5; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 3) << 11; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_Ordered_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + /* This function performs YUV to RGB conversion with dithering for 12-bit + {4,4,4} RGB. The 2x2 dither pattern used for {R,G,B} colors is as follows: + + | {0,15,5} {10,0,15} | + | {15,5,10} {5,10,0} | */ + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + /*First Pixel*/ + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[0] = (uint16)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr[1] = (uint16)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 15; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[0] = (uint16)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3 + 5; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (lTemp >> 4); + + /*G component*/ + lTemp = lY1 - lTemp2 + 10; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 4; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= (lTemp >> 4) << 8; + + lRGBFramePtr1[1] = (uint16)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16M_709_FR +Description : Converts YUV420 Chroma3 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16M_709_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16M_601_5_FR +Description : Converts YUV420 Chroma3 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16M_601_5_FR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16M_709_RR +Description : Converts YUV420 Chroma3 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16M_709_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16M_601_5_RR +Description : Converts YUV420 Chroma3 Planar to RGB888 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16M_601_5_RR + (tBaseVideoFrame *srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint8 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth * 3; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + dstXOffset *= 3; + wndWidth *= 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = dstImage + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[2] = (uint8) lTemp; + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[4] = (uint8) lTemp; + + + /*B component*/ + lTemp = lY1 + lTemp3; + + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr[5] = (uint8) lTemp; + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[0] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[1] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[2] = (uint8) lTemp; + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[3] = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lRGBFramePtr1[4] = (uint8) lTemp; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + + lRGBFramePtr1[5] = (uint8) lTemp; + + lRGBFramePtr += 6; + lRGBFramePtr1 += 6; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr = lRGBFramePtr[-3]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + *lRGBFramePtr1 = lRGBFramePtr1[-3]; + lRGBFramePtr1++; + + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth * 3; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + } + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16MU_709_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16MU_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16MU_601_5_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16MU_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16MU_709_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16MU_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor16MU_601_5_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (8:8:8:8) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor16MU_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint32 *lRGBFramePtr, *lRGBFramePtr1; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + int32 lLumWidth, lWidth, lHeight, lTempWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3, lTemp4; + int32 i, j, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + lRGBFramePtr = (uint32*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + lRGBFramePtr1 = lRGBFramePtr + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + for(j = 0; j < (lWidth - 2); j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr2 = lCrPtr[(j >> 1) + 1]; + lCb2 = lCbPtr[(j >> 1) + 1]; + + lCr3 = lCrPtr[(j >> 1) + (lLumWidth >> 1)]; + lCb3 = lCbPtr[(j >> 1) + (lLumWidth >> 1)]; + + lCr4 = lCrPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + lCb4 = lCbPtr[(j >> 1) + (lLumWidth >> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + } + + + for(j = 0; j < lWidth; j += 2) + { + lCr1 = lCrPtr[j >> 1]; + lCb1 = lCbPtr[j >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[j]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[0] = (uint32)(lTemp4); + + /*Second Pixel*/ + lY1 = lLumPtr[j + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr[1] = (uint32)(lTemp4); + + + /*Third Pixel*/ + lY1 = lLumPtr[j + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[0] = (uint32)(lTemp4); + + /*Fourth Pixel*/ + lY1 = lLumPtr[j + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + /*B component*/ + lTemp = lY1 + lTemp3; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 = (uint8) lTemp; + + /*G component*/ + lTemp = lY1 - lTemp2; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 8; + + /*R component*/ + lTemp = lY1 + lTemp1; + if (lTemp < 0) + lTemp = 0; + if (lTemp > 255) + lTemp = 255; + lTemp4 |= lTemp << 16; + + lRGBFramePtr1[1] = (uint32)(lTemp4); + + lRGBFramePtr += 2; + lRGBFramePtr1 += 2; + } + + if(extraCol) + { + *lRGBFramePtr = lRGBFramePtr[-1]; + lRGBFramePtr++; + *lRGBFramePtr1 = lRGBFramePtr1[-1]; + lRGBFramePtr1++; + } + + lRGBFramePtr += ((wndWidth << 1) - lTempWidth); + lRGBFramePtr1 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + lRGBFramePtr1 = lRGBFramePtr - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *lRGBFramePtr++ = *lRGBFramePtr1++; + *lRGBFramePtr++ = *lRGBFramePtr1++; + } + if(extraCol) + { + *lRGBFramePtr = *lRGBFramePtr1; + } + } + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_FR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_RR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma3 Planar to RGB565 Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor64k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 3 | (*(src1 + 1) >> 2) << 5 | (*src1 >> 3) << 11); + diff1 = *src1 & 0x7; + diff2 = *(src1 + 1) & 0x3; + diff3 = *(src1 + 2) & 0x7; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 3 | (*(src1 + 4) >> 2) << 5 | (*(src1 + 3) >> 3) << 11); + diff1 = *(src1 + 3) & 0x7; + diff2 = *(src1 + 4) & 0x3; + diff3 = *(src1 + 5) & 0x7; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 3 | (*(src2 + 1) >> 2) << 5 | (*src2 >> 3) << 11); + diff1 = *src2 & 0x7; + diff2 = *(src2 + 1) & 0x3; + diff3 = *(src2 + 2) & 0x7; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 3 | (*(src2 + 4) >> 2) << 5 | (*(src2 + 3) >> 3) << 11); + diff1 = *(src2 + 3) & 0x7; + diff2 = *(src2 + 4) & 0x3; + diff3 = *(src2 + 5) & 0x7; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (25801 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb4) + (7670 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (25801 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb3) + (7670 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (25801 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb2) + (7670 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (25801 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3072 * lCb1) + (7670 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (30397 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_FR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_FR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (22973 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb4) + (11699 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (22973 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb3) + (11699 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (22973 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb2) + (11699 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (22973 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((5637 * lCb1) + (11699 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (29032 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 255) ? 255 : ((lTemp < 0) ? 0 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_709_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (29374 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb4) + (8731 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (29374 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb3) + (8731 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (29374 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb2) + (8731 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (29374 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((3494 * lCb1) + (8731 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (34603 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_RR +Description : Converts YUV420 Chroma3 Planar to XRGB (4:4:4:4) Interleaved format +Parameter : tBaseVideoFrame *srcImage : Pointer to the source frame (i/p), + uint8 *dstImage : Pointer to rgb data (o/p). + tWndParam *srcWindow : Pointer to structure containing source window + parameters like xOffset,yOffset,cropWidth, + cropHeight. (i/p) + tWndParam *dstWindow : Pointer to structure containing destination window + parameters like xOffset,yOffset,windWidth, + windHeight. (i/p) +Return Value : void +****************************************************************************** +*/ + +void sEmz_VDec_YUV420Chr3toColor4k_ErrDiff_601_5_RR + (tBaseVideoFrame* srcImage, uint8* dstImage, + tWndParam* srcWindow, tWndParam* dstWindow) +{ + uint16 *dest1, *dest2; + uint8 *lLumPtr, *lCrPtr, *lCbPtr; + uint8 *lBuffer; + uint8 *src1, *src2; + uint8 *lPtr1, *lPtr2; + int32 lLumWidth, lWidth, lHeight, lTempWidth, lSrcWidth; + int32 lY1, lCr1, lCb1, lCr2, lCb2, lCr3, lCb3, lCr4, lCb4; + int32 lTemp, lTemp1, lTemp2, lTemp3; + int32 diff1, diff2, diff3; + int32 i, j, k, extraRow, extraCol; + int32 srcXOffset,srcYOffset,dstXOffset,dstYOffset, + cropWidth,cropHeight,wndWidth,wndHeight; + + srcXOffset = srcWindow->xOffset; + srcYOffset = srcWindow->yOffset; + cropWidth = srcWindow->wndWidth; + cropHeight = srcWindow->wndHeight; + + dstXOffset = dstWindow->xOffset; + dstYOffset = dstWindow->yOffset; + wndWidth = dstWindow->wndWidth; + wndHeight = dstWindow->wndHeight; + + if ((srcImage->width - srcXOffset) >= cropWidth) + { + lWidth = cropWidth; + } + else + { + lWidth = srcImage->width - srcXOffset; + } + + if ((srcImage->height - srcYOffset) >= cropHeight) + { + lHeight = cropHeight; + } + else + { + lHeight = srcImage->height - srcYOffset; + } + + if (lWidth > (wndWidth - dstXOffset)) + { + lWidth = wndWidth - dstXOffset; + } + + if (lHeight > (wndHeight - dstYOffset)) + { + lHeight = wndHeight - dstYOffset; + } + + extraCol = lWidth & 0x01; + extraRow = lHeight & 0x01; + + lTempWidth = lWidth; + lWidth = (lWidth >> 1) << 1; + lHeight = (lHeight >> 1) << 1; + + lBuffer = (uint8*) malloc(lWidth * 3 * 3); + + lSrcWidth = lWidth * 3; + + lLumWidth = (srcImage->width >> 1) << 1; + lLumPtr = srcImage->lum + (srcYOffset * lLumWidth) + srcXOffset; + lCbPtr = srcImage->cb + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + lCrPtr = srcImage->cr + (((srcYOffset * (lLumWidth >> 1)) + srcXOffset) >> 1); + + dest1 = (uint16*)(dstImage) + (dstYOffset * wndWidth) + dstXOffset; + dest2 = dest1 + wndWidth; + + for(i = 0; i < (lHeight - 2); i += 2) + { + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = lCrPtr[((k + lLumWidth)>> 1) + 1]; + lCb4 = lCbPtr[((k + lLumWidth)>> 1) + 1]; + + lCr4 = (lCr1 + lCr2 + lCr3 + lCr4) >> 2; + lCb4 = (lCb1 + lCb2 + lCb3 + lCb4) >> 2; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + lCr3 = (lCr1 + lCr3) >> 1; + lCb3 = (lCb1 + lCb3) >> 1; + + /*First Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + /*Third Pixel*/ + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr1 = lCrPtr[(k + lLumWidth) >> 1]; + lCb1 = lCbPtr[(k + lLumWidth) >> 1]; + + lCr2 = lCrPtr[((k + lLumWidth) >> 1) + 1]; + lCb2 = lCbPtr[((k + lLumWidth) >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + /*Fifth Pixel*/ + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr3 = lCrPtr[(k + lLumWidth)>> 1]; + lCb3 = lCbPtr[(k + lLumWidth)>> 1]; + + lCr4 = (lCr1 + lCr3) >> 1; + lCb4 = (lCb1 + lCb3) >> 1; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr4 -= 128; + lCb4 -= 128; + + lTemp1 = (26748 * lCr4) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb4) + (13621 * lCr4)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb4) >> COLOR_CONV_PRECISION; + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr3 -= 128; + lCb3 -= 128; + + lTemp1 = (26748 * lCr3) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb3) + (13621 * lCr3)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb3) >> COLOR_CONV_PRECISION; + + /*Fifth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1)]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Sixth Pixel*/ + lY1 = lLumPtr[k + (lLumWidth << 1) + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + lSrcWidth + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + lSrcWidth + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + lSrcWidth + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + lLumPtr += (lLumWidth << 1); + lCrPtr += (lLumWidth >> 1); + lCbPtr += (lLumWidth >> 1); + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + } + + + lPtr1 = src1 = lBuffer; + lPtr2 = src2 = src1 + lSrcWidth; + + for(k = 0; k < (lWidth - 2); k += 2) + { + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr2 = lCrPtr[(k >> 1) + 1]; + lCb2 = lCbPtr[(k >> 1) + 1]; + + lCr2 = (lCr1 + lCr2) >> 1; + lCb2 = (lCb1 + lCb2) >> 1; + + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + + lCr2 -= 128; + lCb2 -= 128; + + lTemp1 = (26748 * lCr2) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb2) + (13621 * lCr2)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb2) >> COLOR_CONV_PRECISION; + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + } + + lCr1 = lCrPtr[k >> 1]; + lCb1 = lCbPtr[k >> 1]; + + lCr1 -= 128; + lCb1 -= 128; + + lTemp1 = (26748 * lCr1) >> COLOR_CONV_PRECISION; + lTemp2 = ((6563 * lCb1) + (13621 * lCr1)) >> COLOR_CONV_PRECISION; + lTemp3 = (33802 * lCb1) >> COLOR_CONV_PRECISION; + + /*First Pixel*/ + lY1 = lLumPtr[k]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src1 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Second Pixel*/ + lY1 = lLumPtr[k + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src1 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src1 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src1 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Third Pixel*/ + lY1 = lLumPtr[k + lLumWidth]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *src2 = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 1) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 2) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + /*Fourth Pixel*/ + lY1 = lLumPtr[k + lLumWidth + 1]; + lY1 -= 16; + lY1 = (lY1 * 19075) >> COLOR_CONV_PRECISION; + + lTemp = lY1 + lTemp1; + *(src2 + 3) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 - lTemp2; + *(src2 + 4) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + lTemp = lY1 + lTemp3; + *(src2 + 5) = (uint8)((lTemp > 235) ? 235 : ((lTemp < 16) ? 16 : lTemp)); + + src1 += 6; + src2 += 6; + + + src1 = lPtr1; + src2 = lPtr2; + + for(j = 0; j < lWidth; j += 2) + { + /* First Pixel */ + *dest1 = (uint16) (*(src1 + 2) >> 4 | (*(src1 + 1) >> 4) << 4 | (*src1 >> 4) << 8); + diff1 = *src1 & 0xf; + diff2 = *(src1 + 1) & 0xf; + diff3 = *(src1 + 2) & 0xf; + + // diffuse the error + sDiffuse(i,j,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + /* Second Pixel */ + *(dest1 + 1) = (uint16) (*(src1 + 5) >> 4 | (*(src1 + 4) >> 4) << 4 | (*(src1 + 3) >> 4) << 8); + diff1 = *(src1 + 3) & 0xf; + diff2 = *(src1 + 4) & 0xf; + diff3 = *(src1 + 5) & 0xf; + // diffuse the error + sDiffuse(i,j+1,diff1,lWidth,lHeight,lPtr1,lSrcWidth, 3); //r + sDiffuse(i,j+1,diff2,lWidth,lHeight,lPtr1 + 1,lSrcWidth, 3); //g + sDiffuse(i,j+1,diff3,lWidth,lHeight,lPtr1 + 2,lSrcWidth, 3); //b + + src1 += 6; + dest1 += 2; + + /* Third Pixel */ + *dest2 = (uint16) (*(src2 + 2) >> 4 | (*(src2 + 1) >> 4) << 4 | (*src2 >> 4) << 8); + diff1 = *src2 & 0xf; + diff2 = *(src2 + 1) & 0xf; + diff3 = *(src2 + 2) & 0xf; + //diffuse the error + sDiffuse(i+1,j,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + /* Fourth Pixel */ + *(dest2 + 1) = (uint16) (*(src2 + 5) >> 4 | (*(src2 + 4) >> 4) << 4 | (*(src2 + 3) >> 4) << 8); + diff1 = *(src2 + 3) & 0xf; + diff2 = *(src2 + 4) & 0xf; + diff3 = *(src2 + 5) & 0xf; + //diffuse the error + sDiffuse(i+1,j+1,diff1,lWidth,lHeight,lPtr2,lSrcWidth, 3); //r + sDiffuse(i+1,j+1,diff2,lWidth,lHeight,lPtr2 + 1,lSrcWidth, 3); //g + sDiffuse(i+1,j+1,diff3,lWidth,lHeight,lPtr2 + 2,lSrcWidth, 3); //b + + src2 += 6; + dest2 += 2; + } + + if(extraCol) + { + *dest1 = dest1[-1]; + dest1++; + *dest2 = dest2[-1]; + dest2++; + } + + dest1 += ((wndWidth << 1) - lTempWidth); + dest2 += ((wndWidth << 1) - lTempWidth); + + if(extraRow) + { + dest2 = dest1 - wndWidth; + for(j = 0; j < lWidth; j += 2) + { + *dest1++ = *dest2++; + *dest1++ = *dest2++; + } + if(extraCol) + { + *dest1 = *dest2; + } + } + + free(lBuffer); + return; +} + +/* +****************************************************************************** +Name : sDiffuse +Description : Diffuses the quantization error to the neighbouring pixels. +Parameter : int32 i : x position of the current pixel. + int32 j : y position of the current pixel. + int32 diff : error to be diffused. + int32 actWidth : Source Width + int32 actHeight : Source Height + uint8 *lLumPtr : + int32 lLumWidth : + uint8 skip : + +Return Value : void +****************************************************************************** +*/ + +void sDiffuse(int32 i, int32 j, int32 diff, int32 actWidth, int32 actHeight, uint8 *lLumPtr, + int32 lLumWidth, uint8 skip) +{ + int32 tmp; + + if(i < actHeight - 2) + { + if(j < actWidth - 2) + { + if(j > 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else if(j > 0) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + } + else if(j < actWidth - 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + } + else if(i < actHeight - 1) + { + if(j < actWidth - 2) + { + if(j > 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else if(j > 0) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + } + else if(j < actWidth - 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[(j + 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j + 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + tmp = lLumPtr[(j - 1) * skip + lLumWidth] + ((diff << 3) >> 6); + lLumPtr[(j - 1) * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + tmp = lLumPtr[j * skip + lLumWidth] + ((diff << 4) >> 6); + lLumPtr[j * skip + lLumWidth] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + } + else + { + if(j < actWidth - 2) + { + if(j > 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else if(j > 0) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + } + else if(j < actWidth - 1) + { + tmp = lLumPtr[(j + 1) * skip] + ((diff * 24) >> 6); + lLumPtr[(j + 1) * skip] = (uint8)((tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp)); + + } + else + { + return; + } + } + + return; +} + +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ +/**************** End of Chroma3 format *********************/ +/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ + + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/myfopen.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/myfopen.c Thu Sep 16 18:57:38 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2009 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 +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif +void winscw_workaround() +{ + fopen(0,0); + fread(0,0,0,0); + iscntrl(0); + realloc(0,0); + calloc(0,0); +} +#ifdef __cplusplus + +} +#endif diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/inc/AudioRoutingTestClass.h --- a/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/inc/AudioRoutingTestClass.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/inc/AudioRoutingTestClass.h Thu Sep 16 18:57:38 2010 +0100 @@ -399,10 +399,10 @@ TInt CreateVideoWindow(); TInt DeleteVideoWindow(); TInt CreateSessionAndScreen(); - TInt CreateVideoObject( CStifItemParser& aItem ); + TInt CreateVideoObject(); TInt CreateWindowGroup(); TInt EndDrawing(); - + TInt CreateVideoRecorderObject(); TInt AudioInput(); TInt SetAudioInputL(); TInt AudioOutput(); diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocks.cpp --- a/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocks.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocks.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -566,21 +566,16 @@ else if (object == KTagVideoPlayer) { aItem.GetNextString ( object ); - if(object==_L("Input")) - { - isInput = ETrue; - } - else if(object==_L("Output")) - { - isInput = EFalse; - } error = KErrNone; TRAP(error, CreateSessionAndScreen()); TRAP(error, CreateWindowGroup()); TRAP(error, CreateVideoWindow()); - TRAP(error, CreateVideoObject(aItem)); - + TRAP(error, CreateVideoObject()); } + else if(object == KTagVideoRecord) + { + TRAP(error, CreateVideoRecorderObject()); + } if (error == KErrNone) { AddExpectedEvent(EInitializeComplete, KMediumTimeout); @@ -606,8 +601,7 @@ if ( object == KTagVideoRecord ) { FTRACE(FPrint(_L("CAudioRoutingTest::CAudioInput"))); - iLog->Log(_L("CAudioRoutingTest::CAudioInput")); - iVideoRecord = NULL; + iLog->Log(_L("CAudioRoutingTest::CAudioInput")); TRAP(error, iAudioInput = CAudioInput::NewL(*iVideoRecord)); if (error == KErrNone) { @@ -768,7 +762,7 @@ } if (error != KErrNone) { - iLog->Log(_L("CAudioRoutingTestClass::CreateAudioInput ERROR [%d]"),error); + iLog->Log(_L("CAudioRoutingTestClass::CreateAudioInput ERROR [%d] for [%s]"),error,&object); } return error; } @@ -866,36 +860,46 @@ return error; } -TInt CAudioRoutingTestClass::CreateVideoObject( CStifItemParser& aItem ) +TInt CAudioRoutingTestClass::CreateVideoObject( ) { - TInt error = KErrNone; - TPtrC object; - aItem.GetNextString ( object ); - TRAP(error, iVideoPlayerUtility = CVideoPlayerUtility::NewL ( *this, - EMdaPriorityNormal, - EMdaPriorityPreferenceNone, - iWindowSession, - *iScreenDevice, - iWindow, - iRect, - iRect)); - if (error == KErrNone) - { - TRAP(error, iVideoPlayerUtility->OpenFileL(K3gpTestFile)); - if (error == KErrNone) - { - if (!(isInput)) - { - TRAP(error, iVideoRecord = CVideoRecorderUtility::NewL(*this)); - } - } - } + TInt error = KErrNone; + + + TRAP(error, iVideoPlayerUtility = CVideoPlayerUtility::NewL ( *this, + EMdaPriorityNormal, + EMdaPriorityPreferenceNone, + iWindowSession, + *iScreenDevice, + iWindow, + iRect, + iRect)); + if (error == KErrNone) + { + TRAP(error, iVideoPlayerUtility->OpenFileL(K3gpTestFile)); + // AddExpectedEvent(EInitializeComplete, 6000); + CActiveScheduler::Start(); + } if (error == KErrNone) - { - EndDrawing(); - iWindow.Close(); - iWindowGroup.Close(); - } + { + EndDrawing(); + iWindow.Close(); + iWindowGroup.Close(); + } + return error; + + } +TInt CAudioRoutingTestClass::CreateVideoRecorderObject() + { + TInt error = KErrNone; + TRAP(error, iVideoRecord = CVideoRecorderUtility::NewL(*this)); + + if (error == KErrNone) + { +// const TUid KVidTstControllerUid = {0x101F8503}; + TUid NULLUid ={0}; + + TRAP(error,iVideoRecord->OpenFileL(K3gpTestFile, NULL, NULLUid, NULLUid)); + } return error; } @@ -1010,12 +1014,21 @@ TInt CAudioRoutingTestClass::SetSecureOutputL() { + TInt err; if(iAudioOutput) - { - iAudioOutput->SetSecureOutputL(EFalse); - } - iLog->Log(_L("iAudioOutput - SetSecureOutputL ")); - return KErrNone; + { + TRAP(err,iAudioOutput->SetSecureOutputL(EFalse)); + } + if(err == KErrNotSupported) + { + iLog->Log(_L("SetsecureoutputL is deprecated,so not supported")); + return KErrNone; + } + else + { + return KErrGeneral; + } + } TInt CAudioRoutingTestClass::UnregisterObserver() diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocksCallbacks.cpp --- a/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocksCallbacks.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mm_plat/audio_routing_api/tsrc/AudioRoutingTestClass/src/AudioRoutingTestClassBlocksCallbacks.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -304,9 +304,8 @@ iLog->Log(_L("Ready!")); } if (isInput != EFalse) - { - - } + {} + CActiveScheduler::Stop(); } void CAudioRoutingTestClass::MvpuoPrepareComplete(TInt aError) diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_plat/audio_routing_api/tsrc/Conf/AudioRoutingTestClass.cfg --- a/mm_plat/audio_routing_api/tsrc/Conf/AudioRoutingTestClass.cfg Thu Sep 16 18:39:58 2010 +0100 +++ b/mm_plat/audio_routing_api/tsrc/Conf/AudioRoutingTestClass.cfg Thu Sep 16 18:57:38 2010 +0100 @@ -44,6 +44,8 @@ [Test] title 1.2. Create AudioRouting CAudioInput - VideoRecorder create AudioRoutingTestClass AudioRoutingTest +AudioRoutingTest CreateObject VideoRecord + AudioRoutingTest AudioInput VideoRecord delete AudioRoutingTest [Endtest] @@ -253,7 +255,7 @@ [Test] title 17. Create AudioRouting CAudioOutput - VideoPlayer create AudioRoutingTestClass AudioRoutingTest -AudioRoutingTest CreateObject VideoPlayer Output +AudioRoutingTest CreateObject VideoPlayer waittestclass AudioRoutingTest AudioRoutingTest AudioInput VideoPlayer AudioRoutingTest AudioInputs @@ -264,7 +266,7 @@ [Test] title 18. Create AudioRouting CAudioOutput - VideoPlayer create AudioRoutingTestClass AudioRoutingTest -AudioRoutingTest CreateObject VideoPlayer Input +AudioRoutingTest CreateObject VideoPlayer waittestclass AudioRoutingTest AudioRoutingTest AudioInput VideoPlayer AudioRoutingTest DefaultAudioOutput diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_pub/drm_audio_player_api/tsrc/data/mmc/drm/test3gp.dcf diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mm_pub/drm_audio_player_api/tsrc/data/mmc/drm/testmp3.dcf diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmhais/refacladapt/src/audiostream/audiostream.cpp --- a/mmhais/refacladapt/src/audiostream/audiostream.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmhais/refacladapt/src/audiostream/audiostream.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -655,6 +655,9 @@ iCurrentStreamState = aPreviousState; iDesiredStreamState = aDesiredState; + // Ensure that there is no dereference of a NULL pointer + ASSERT(iDesiredStreamState < EInitialized || iDesiredStreamState > EActive || iCodec); + switch (iDesiredStreamState) { case EInitialized: diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/Recogniser/src/filereader.cpp --- a/mmlibs/mmfw/Recogniser/src/filereader.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/Recogniser/src/filereader.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -93,7 +93,8 @@ { // We need to seek to the start and fill the buffer. iFilePos = 0; - TInt err = iFile->Seek(ESeekStart, iFilePos); + TInt filepos = 0; + TInt err = iFile->Seek(ESeekStart, filepos); if (err == KErrNone) { err = iFile->Read(iFileBuffer); @@ -135,18 +136,31 @@ // void CFileReader::SeekL(TInt64 aOffset) { - if (aOffset < (TInt64)KMinTInt) + if (aOffset < KMinTInt64) { User::Leave(KErrNotSupported); } - if (aOffset > (TInt64)KMaxTInt) + if (aOffset > KMaxTInt64) { User::Leave(KErrNotSupported); } - - TInt low = (TInt)I64LOW(aOffset); - SeekL(low); + + if (aOffset < (TInt64)KMaxTInt) + { + TInt low = (TInt)I64LOW(aOffset); + SeekL(low); + } + else + { + TInt err = CReader::Seek(aOffset); + if (err == KErrUnderflow) + { + TInt64 bufPos = CBufferReader::Position(); + aOffset += bufPos - iFileBuffer.Length(); + User::LeaveIfError(PhysicallySeekAndRead(aOffset)); + } + } } // @@ -161,7 +175,31 @@ CBufferReader::Reset(); iFilePos = aOffset; - err = iFile->Seek(ESeekCurrent, iFilePos); + err = iFile->Seek(ESeekCurrent, aOffset); + + if (err != KErrNone) + { + return err; + } + + err = iFile->Read(iFileBuffer); + if (err != KErrNone) + { + return err; + } + return (iFileBuffer.Length() == 0 ? KErrEof : KErrNone); + } +TInt CFileReader::PhysicallySeekAndRead(TInt64 aOffset) + { + TInt err; + // New buffer contents so read from the start of it. + CBufferReader::Reset(); + + iFilePos = aOffset; + RFile64* tempfile; + tempfile = static_cast (iFile); + + err = tempfile->Seek(ESeekCurrent, iFilePos); if (err != KErrNone) { return err; diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/Recogniser/src/mpeg4parser.cpp --- a/mmlibs/mmfw/Recogniser/src/mpeg4parser.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/Recogniser/src/mpeg4parser.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -71,6 +71,7 @@ #define KMPEG4VideoBit KBit2 // 00000100 static const TInt KMPEG4BoxIntroLen = 8; +static const TInt KMPEG4Box64BitIntroLen = 16; // // In order to find out the type of MPEG4 file it is @@ -284,8 +285,14 @@ iIsFinished = ETrue; return; } - - iReader.SeekL(iSize - KMPEG4BoxIntroLen); + if(iSizeIn32bit) + { + iReader.SeekL(iSize - KMPEG4BoxIntroLen); + } + else + { + iReader.SeekL(iSize - KMPEG4Box64BitIntroLen); + } } @@ -522,11 +529,13 @@ case 1: // Size is specified in a 64-bit field. + iSizeIn32bit = EFalse; iReader.Read64L(iSize); break; default: // It's an actual 32-bit size. + iSizeIn32bit = ETrue; iSize = MAKE_TINT64(0, word1); } diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/Recogniser/src/parsers.h --- a/mmlibs/mmfw/Recogniser/src/parsers.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/Recogniser/src/parsers.h Thu Sep 16 18:57:38 2010 +0100 @@ -122,6 +122,7 @@ TInt iBrandIndex; TBool iIsFinished; TInt64 iSize; // The current box's size. + TBool iSizeIn32bit; CReader& iReader; TFlags& iFlags; TBool iVideoAssumed; diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/Recogniser/src/reader.cpp --- a/mmlibs/mmfw/Recogniser/src/reader.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/Recogniser/src/reader.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -172,6 +172,20 @@ return KErrNone; } - +// +// Skips forwards or backwards aOffset number of bytes. +// +TInt CReader::Seek(TInt64 aOffset) + { + TInt64 newBufPos = iBufPos + aOffset; + + if ((newBufPos < 0) || (newBufPos >= iBuffer.Length())) + { + // Trying to seek past the bounds of the buffer. + return KErrUnderflow; + } + + iBufPos += aOffset; + return KErrNone; + } - diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/Recogniser/src/readers.h --- a/mmlibs/mmfw/Recogniser/src/readers.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/Recogniser/src/readers.h Thu Sep 16 18:57:38 2010 +0100 @@ -105,6 +105,7 @@ // Non-leaving Seek // TInt Seek(TInt aOffset); + TInt Seek(TInt64 aOffset); private: const TDesC8& iBuffer; // The buffer that contains the source data. @@ -163,10 +164,10 @@ // Seeks to a new file location and fills the buffer from there. // TInt PhysicallySeekAndRead(TInt aAmount); - + TInt PhysicallySeekAndRead(TInt64 aOffset); private: RFile* iFile; - TInt iFilePos; + TInt64 iFilePos; TBuf8 iFileBuffer; }; diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/inc/mmf/server/mmfdatapath2.h --- a/mmlibs/mmfw/inc/mmf/server/mmfdatapath2.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/inc/mmf/server/mmfdatapath2.h Thu Sep 16 18:57:38 2010 +0100 @@ -135,6 +135,7 @@ TBool iGetTimePlayedSupported; TBool iIsResumeSupported; TBool iIsUsingResumeSupport; + TBool iPauseCalledInsilence; }; #endif diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp --- a/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -1037,7 +1037,10 @@ } else { - iAsyncCallback->MatoPlayStarted(KErrNone); + if(iPlayStartObserver) + { + iAsyncCallback->MatoPlayStarted(KErrNone); + } } } @@ -1129,32 +1132,57 @@ void CMMFMdaAudioToneObserverCallback::MatoPrepareComplete(TInt aError) { - iAction = EPrepareComplete; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPrepareComplete; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + // Since the default granularity is 8, failing of Append() is unusual, hence ignoring the return err. + iCallBackQueue.Append(EPrepareComplete); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::MatoPlayComplete(TInt aError) { - iAction = EPlayComplete; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPlayComplete; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + iCallBackQueue.Append(EPlayComplete); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::MatoPlayStarted(TInt aError) { - iAction = EPlayStarted; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPlayStarted; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + iCallBackQueue.Append(EPlayStarted); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::RunL() @@ -1175,6 +1203,17 @@ iPlayStartCallback.MatoPlayStarted(iErrorCode); break; } + if(iCallBackQueue.Count() > 0 & !IsActive() ) + { + iAction = TMMFAudioToneObserverCallbackAction(iCallBackQueue[0]); + iCallBackQueue.Remove(0); + iErrorCode = iCallBackQueueError[0]; + iCallBackQueueError.Remove(0); + + TRequestStatus* s = &iStatus; + User::RequestComplete(s, KErrNone); + SetActive(); + } } void CMMFMdaAudioToneObserverCallback::DoCancel() diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.h --- a/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.h Thu Sep 16 18:57:38 2010 +0100 @@ -57,6 +57,8 @@ MMdaAudioTonePlayStartObserver& iPlayStartCallback; TMMFAudioToneObserverCallbackAction iAction; TInt iErrorCode; + RArray iCallBackQueue; + RArray iCallBackQueueError; }; class CMMFToneConfig; diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/src/Client/Utility/mmfclientutility.cpp --- a/mmlibs/mmfw/src/Client/Utility/mmfclientutility.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/src/Client/Utility/mmfclientutility.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -2235,7 +2235,12 @@ } void CMMFFindAndOpenController::UseSecureDRMProcessL(TBool& aIsSecureDrmProcess) - { + { + if(iHasDrmCapability)//if client has DRM capability, we never use Secure DRM Process + { + aIsSecureDrmProcess = EFalse; + return; + } TBool isDataProtected = EFalse; ContentAccess::CContent* content = NULL; TControllerMode mode = iCurrentConfig->iControllerMode; @@ -2283,72 +2288,8 @@ User::Leave(error); } - if(!isDataProtected) - { - CleanupStack::PopAndDestroy(content); - return;//returning cause if data is not protected, we need not evaluate the type of rights. - } - - RArray agents; - TAgent drmAgent; - - CManager* manager = CManager::NewLC(); - CleanupClosePushL( agents ); - manager->ListAgentsL( agents ); - - for ( TInt i = 0; i < agents.Count(); i++ ) - { - if ( agents[i].Name().Compare( content->Agent().Name() ) == 0 ) - { - drmAgent = agents[i]; - break; - } - } - - CleanupStack::PopAndDestroy( &agents ); - RStreamablePtrArray infoArray; - CRightsManager* rightsManager = manager->CreateRightsManagerL(drmAgent); - CleanupStack::PushL(rightsManager); - - if(iFileName.Length()) - { - if(iUniqueId) - { - TVirtualPathPtr pathPtr(iFileName, *iUniqueId); - TRAP(error,rightsManager->ListRightsL(infoArray, pathPtr) ); - } - else - { - TRAP(error,rightsManager->ListRightsL(infoArray, iFileName ) ); - } - } - else if (iUseFileHandle && iOwnFileHandle) - { - if(iUniqueId) - { - TRAP(error,rightsManager->ListRightsL(infoArray, iFileHandle, *iUniqueId) ); - } - else - { - TRAP(error,rightsManager->ListRightsL(infoArray, iFileHandle, KNullDesC) ); - } - } - - if(error) - { - infoArray.Close(); - User::Leave(error); - } - TInt consumableRights = 0; - if(infoArray.Count() > 0) - consumableRights = (ContentAccess::ERightsTypeConsumable) & infoArray[0]->RightsType(); - - - CleanupStack::PopAndDestroy( rightsManager ); - infoArray.Close(); - CleanupStack::PopAndDestroy( manager ); CleanupStack::PopAndDestroy(content); - if(isDataProtected && !iHasDrmCapability && mode == EPlayback && !consumableRights) + if(isDataProtected && !iHasDrmCapability && mode == EPlayback) {//only when the Data is protected and client does not have the DRM capability, we need secure DRM process aIsSecureDrmProcess = ETrue; } diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/src/server/BaseClasses/mmfdatapath2.cpp --- a/mmlibs/mmfw/src/server/BaseClasses/mmfdatapath2.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/src/server/BaseClasses/mmfdatapath2.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -490,7 +490,14 @@ if (!iSourceBuffer->BufferSize() || iSourceBuffer->LastBuffer() || (((iState == EConverting) || (iState == EPlaying)) && (iPlayWindowEndPosition < iCachedSourceDuration) && ( InputPosition() >= iPlayWindowEndPosition ))) { - iNumberOfTimesPlayed++; + //When it resumes in silence , position of the buffer is in end so we need to skip the increament. + if(!iPauseCalledInsilence) + { + iNumberOfTimesPlayed++; + }else + { + iPauseCalledInsilence=EFalse; + } if ((iNumberOfTimesPlayed <= iNumberOfTimesToRepeat) || iNumberOfTimesToRepeat == KMdaRepeatForever) { iSourceBuffer->SetLastBuffer(EFalse); @@ -899,6 +906,10 @@ // should be updated, MDataSource position should be changed iStartPosition = Position(); iIsUsingResumeSupport = ETrue; + if(iRepeatTrailingSilenceTimer->IsActive()) + { + iPauseCalledInsilence=ETrue; + } // If we wait for the sink to complete play, then we do not proceed with supplying the buffers to the sink // In this case we need to reset the buffers so that InitializeSinkL won't attempt bringing in new ones if (iTransferState == EWaitSink) @@ -964,6 +975,7 @@ iGetTimePlayedSupported = devSound.IsGetTimePlayedSupported(); iIsResumeSupported = devSound.IsResumeSupported(); iIsUsingResumeSupport = EFalse; + iPauseCalledInsilence = EFalse; } } @@ -990,7 +1002,11 @@ if(iPauseCalled) //sink and source will have been stopped, and we will not have been re-primed { - iDataSink->SinkPrimeL(); //propagate change down to sink + //When pause is called silence,we need to send the buffer while resume so icansendbuffer should enabled + if(!iPauseCalledInsilence) + { + iDataSink->SinkPrimeL(); //propagate change down to sink + } iPauseCalled = EFalse; } diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/group/tsi_mmf_vclnt_data.pkg --- a/mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/group/tsi_mmf_vclnt_data.pkg Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/group/tsi_mmf_vclnt_data.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -17,11 +17,26 @@ //ini "\epoc32\data\c\video.ini" - "c:\video.ini" +// Scripts for SecureDRM +"\epoc32\data\c\rta\rta.ini" - "c:\rta\rta.ini" +"\epoc32\data\c\rta\rta.script" - "c:\rta.script",testexecute.exe +"\epoc32\data\c\securedrm_video_testdata.ini" - "c:\securedrm_video_testdata.ini" +"\epoc32\data\c\securedrm_video.ini" - "c:\securedrm_video.ini" +"\epoc32\data\c\tsi_mmf_securedrm_video_testdata.script" - "c:\tsi_mmf_securedrm_video_testdata.script",testexecute.exe + // scripts "\epoc32\data\c\TSI_MMF_VCLNT_WM.script" - "c:\TSI_MMF_VCLNT_WM.script" "\epoc32\data\c\TSI_MMF_VCLNT_OF.script" - "c:\TSI_MMF_VCLNT_OF.script" "\epoc32\data\c\TSI_MMF_VCLNT_OF_ALLOC.script" - "c:\TSI_MMF_VCLNT_OF_ALLOC.script" +// SecureDRM test data +"\epoc32\data\c\rta\videocontentnorights.xml" - "c:\rta\videocontentnorights.xml" +"\epoc32\data\c\rta\videocontent.xml" - "c:\rta\videocontent.xml" +"\epoc32\data\c\rta\videorights.xml" - "c:\rta\videorights.xml" +"\epoc32\data\c\securedrm\videocontent2.xml" - "c:\securedrm\videocontent2.xml" +"\epoc32\data\c\securedrm\videorights2.xml" - "c:\securedrm\videorights2.xml" +"\epoc32\data\c\securedrm\xvidonly.avi" - "c:\securedrm\xvidonly.avi" + // data files "\epoc32\data\c\VclntITestData\longvideo.dummy" - "c:\VclntITestData\longvideo.dummy" "\epoc32\data\c\VclntITestData\shortvideo.dummy" - "c:\VclntITestData\shortvideo.dummy" diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/scripts/TSI_MMF_VCLNT_WM.script --- a/mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/scripts/TSI_MMF_VCLNT_WM.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfintegrationtest/vclnt/scripts/TSI_MMF_VCLNT_WM.script Thu Sep 16 18:57:38 2010 +0100 @@ -30,7 +30,8 @@ //! @SYMTestCaseID MM-MMF-VCLNT-I-0001-CP RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0001-CP c:\video.ini -TEST_COMPLETE +TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.4 REQ172.2.8 REQ172.2.10 # Play video descriptor @@ -38,6 +39,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0002-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.28 # Set and enquire framerate @@ -45,6 +47,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0010-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.13 REQ172.2.14 # set position and play form this position. @@ -52,6 +55,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0011-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.25 # Video priority @@ -59,6 +63,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0012-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.25 # Enquire video duration @@ -66,7 +71,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0015-HP c:\video.ini TEST_COMPLETE - +DELAY 5000 #Req. under test REQ172.2.16 REQ172.2.17 REQ172.2.18 # Set the volume to the maximum. @@ -74,6 +79,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0016-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.4 REQ172.2.5 REQ172.2.6 # Open a clip, close the clip and open a new clip. @@ -81,6 +87,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0017-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.10 REQ172.2.11 @@ -89,7 +96,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0018-HP c:\video.ini TEST_COMPLETE - +DELAY 5000 #Req. under test REQ172.2.30 REQ172.2.31 # Set and Enquire balance @@ -97,6 +104,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0019-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.21 REQ172.2.22 # Set the play window, delete the play window. @@ -104,6 +112,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0020-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.20 @@ -112,6 +121,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0021-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.27 @@ -120,7 +130,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0022-HP c:\video.ini TEST_COMPLETE - +DELAY 5000 #Req. under test REQ172.2.23 # Set number of time to repeat play @@ -128,6 +138,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0023-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. not mapped # Query the MIME type @@ -135,6 +146,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0031-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. not mapped # Register for rebuffering @@ -142,6 +154,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0032-LP c:\video.ini TEST_COMPLETE +DELAY 5000 ###################### NEGATIVE TEST ############### @@ -151,6 +164,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1001-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.28 # Set invalid framerate @@ -158,6 +172,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1002-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.13 REQ172.2.14 # Set invalid video position and play (above maximum). @@ -165,6 +180,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1003-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.13 REQ172.2.14 # Set invalid video position and play (below minimum). @@ -172,6 +188,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1004-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.16 REQ172.2.17 REQ172.2.18 # Set invalid volume. @@ -179,6 +196,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1005-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.16 REQ172.2.17 REQ172.2.18 # Set invalid volume. @@ -186,6 +204,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1010-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.30 REQ172.2.31 # Set invalid balance @@ -193,6 +212,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1006-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.30 REQ172.2.31 # Set invalid balance @@ -200,6 +220,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1011-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.21 REQ172.2.22 # Set invalid play window. @@ -207,6 +228,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1007-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.2.4 REQ172.2.7 REQ172.2.10 # Load corrupted file. @@ -231,6 +253,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0502-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.3 REQ172.16.7 REQ172.16.9 # Open descriptor based clip and record. @@ -238,6 +261,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0503-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.3 REQ172.16.8 # Open URL-based clip. @@ -245,6 +269,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0504-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.3 REQ172.16.6 REQ172.16.4 REQ172.16.5 # Open file-based clip. Close the clip and then open the clip again. @@ -252,6 +277,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0505-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.11 REQ172.16.9 # Configure the recorded file and record. @@ -259,6 +285,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0506-CP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.9 REQ172.16.10 # Start recording then stop on request. @@ -266,6 +293,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0507-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.14 # Check duration @@ -273,6 +301,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0509-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.15 # Query record time @@ -280,6 +309,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0510-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.16 # Crop clip @@ -287,6 +317,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0511-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.17 REQ172.16.18 REQ172.16.19 # Set gain to maximum and enquire. @@ -294,6 +325,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0512-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.20 # Set meta-information. @@ -301,6 +333,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0513-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.22 # Set priority @@ -308,6 +341,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0514-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.23 REQ172.16.24 # Set balance and enquire the balance. @@ -315,6 +349,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0515-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.26 # Specify maximum clip size in bytes. @@ -322,6 +357,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0516-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. not mapped # Set / get audio / video types. @@ -329,6 +365,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-0521-LP c:\video.ini TEST_COMPLETE +DELAY 5000 ###################### NEGATIVE TEST ############### @@ -338,6 +375,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1501-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.11 REQ172.16.9 # Record utility - Delete object before record operation has completed. @@ -345,6 +383,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1502-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.17 REQ172.16.18 REQ172.16.19 # set gain to invalid gain value (above maximum) @@ -352,6 +391,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1503-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.17 REQ172.16.18 REQ172.16.19 # set gain to invalid gain value (below minimum) @@ -359,6 +399,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1504-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.23 REQ172.16.24 # Set invalid balance (above maximum) @@ -366,6 +407,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1507-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.23 REQ172.16.24 # Set invalid balance (below minimum). @@ -373,6 +415,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1508-HP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ172.16.26 # Set invalid maximum length of file in bytes and record @@ -380,6 +423,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1510-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ1952 # get Frame from unprotected video file:c:\VclntITestData\LongVideo.avi @@ -387,6 +431,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1600-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ1952 # Get a frame from a DRM protected file @@ -394,6 +439,7 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1601-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ1952 # Open DRM protected file with no rights set @@ -401,10 +447,13 @@ RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1602-LP c:\video.ini TEST_COMPLETE +DELAY 5000 #Req. under test REQ1952 # Open DRM protected video and play MIME type provide by Agent //! @SYMTestCaseID MM-MMF-VCLNT-I-1603-LP RUN_TEST_STEP -1, VCLNT, MM-MMF-VCLNT-I-1603-LP c:\video.ini -TEST_COMPLETE \ No newline at end of file +TEST_COMPLETE +DELAY 5000 + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfintegrationtest/vclntavi/group/tsi_mmf_vclntavi_data.pkg --- a/mmlibs/mmfw/tsrc/mmfintegrationtest/vclntavi/group/tsi_mmf_vclntavi_data.pkg Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfintegrationtest/vclntavi/group/tsi_mmf_vclntavi_data.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -18,6 +18,14 @@ "\epoc32\data\c\vclntavi\video_avi.ini" - "c:\vclntavi\video_avi.ini" "\epoc32\data\c\vclntavi\video_avi_bc.ini" - "c:\vclntavi\video_avi_bc.ini" +// Scripts for SecureDRM +"\epoc32\data\c\rta\rta.ini" - "c:\rta\rta.ini" +"\epoc32\data\c\rta\rta.script" - "c:\rta.script",testexecute.exe +"\epoc32\data\c\securedrm_video_testdata.ini" - "c:\securedrm_video_testdata.ini" +"\epoc32\data\c\securedrm_video.ini" - "c:\securedrm_video.ini" +"\epoc32\data\c\tsi_mmf_securedrm_video_testdata.script" - "c:\tsi_mmf_securedrm_video_testdata.script",testexecute.exe +"\epoc32\data\c\tsi_mmf_securedrm_video_mmddcap.script" - "c:\tsi_mmf_securedrm_video_mmddcap.script" + //scripts "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_play.script" - "c:\tsi_mmf_vclntavi_play.script" "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_rec.script" - "c:\tsi_mmf_vclntavi_rec.script" @@ -31,8 +39,8 @@ "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_apr.script" - "c:\tsi_mmf_vclntavi_apr.script" "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_apr_alloc.script" - "c:\tsi_mmf_vclntavi_apr_alloc.script" "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_play_secdisp.script" - "c:\tsi_mmf_vclntavi_play_secdisp.script" +"\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_dummy_controller.script" - "c:\tsi_mmf_vclntavi_dummy_controller.script" "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_par_audio.script" - "c:\tsi_mmf_vclntavi_par_audio.script" -"\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_dummy_controller.script" - "c:\tsi_mmf_vclntavi_dummy_controller.script" // Graphics surface tests "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_surf.script" - "c:\tsi_mmf_vclntavi_surf.script" @@ -52,13 +60,10 @@ "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_subtitles_urel.script" - "c:\tsi_mmf_vclntavi_subtitles_urel.script" "\epoc32\data\c\vclntavi\tsi_mmf_vclntavi_subtitles_alloc.script" - "c:\tsi_mmf_vclntavi_subtitles_alloc.script" -// Scripts for SecureDRM -"\epoc32\data\c\securedrm_video_testdata.ini" - "c:\securedrm_video_testdata.ini" -"\epoc32\data\c\securedrm_video.ini" - "c:\securedrm_video.ini" -"\epoc32\data\c\tsi_mmf_securedrm_video_testdata.script" - "c:\tsi_mmf_securedrm_video_testdata.script" -"\epoc32\data\c\tsi_mmf_securedrm_video_mmddcap.script" - "c:\tsi_mmf_securedrm_video_mmddcap.script" - // SecureDRM test data +"\epoc32\data\c\rta\videocontentnorights.xml" - "c:\rta\videocontentnorights.xml" +"\epoc32\data\c\rta\videocontent.xml" - "c:\rta\videocontent.xml" +"\epoc32\data\c\rta\videorights.xml" - "c:\rta\videorights.xml" "\epoc32\data\c\securedrm\videocontent2.xml" - "c:\securedrm\videocontent2.xml" "\epoc32\data\c\securedrm\videorights2.xml" - "c:\securedrm\videorights2.xml" "\epoc32\data\c\securedrm\xvidonly.avi" - "c:\securedrm\xvidonly.avi" @@ -83,3 +88,7 @@ "\epoc32\data\c\vclntavi\xvid_subtitle_corrupt.srt"-"c:\vclntavi\xvid_subtitle_corrupt.srt" "\epoc32\data\c\vclntavi\xvid_subtitle.avi"-"c:\vclntavi\xvid_subtitle.avi" "\epoc32\data\c\vclntavi\xvid_subtitle.srt"-"c:\vclntavi\xvid_subtitle.srt" + +//record tests require txt file for testcameraapp +"\epoc32\data\c\102070CC.txt"-"c:\102070CC.txt" + diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfunittest/VCLNT/TSU_MMF_VCLNT_01/src/TestStepAllocFailVidPlayer.cpp --- a/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/TSU_MMF_VCLNT_01/src/TestStepAllocFailVidPlayer.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/TSU_MMF_VCLNT_01/src/TestStepAllocFailVidPlayer.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -1,4 +1,4 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2002-2010 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" @@ -230,6 +230,7 @@ __UHEAP_SETFAIL(RHeap::ENone ,0); DeInitWserv(); + User::After(2000000); if (completed) { diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfunittest/VCLNT/group/tsu_mmf_vclnt_data.pkg --- a/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/group/tsu_mmf_vclnt_data.pkg Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/group/tsu_mmf_vclnt_data.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -18,6 +18,13 @@ "\epoc32\data\c\mm\TSU_MMF_VCLNT_01.ini" - "c:\mm\TSU_MMF_VCLNT_01.ini" "\epoc32\data\c\mm\TSU_MMF_VCLNT_01_gce_unavailable.ini" - "c:\mm\TSU_MMF_VCLNT_01_gce_unavailable.ini" +// Scripts for SecureDRM +"\epoc32\data\c\rta\rta.ini" - "c:\rta\rta.ini" +"\epoc32\data\c\rta\rta.script" - "c:\rta.script",testexecute.exe +"\epoc32\data\c\securedrm_video_testdata.ini" - "c:\securedrm_video_testdata.ini" +"\epoc32\data\c\securedrm_video.ini" - "c:\securedrm_video.ini" +"\epoc32\data\c\tsi_mmf_securedrm_video_testdata.script" - "c:\tsi_mmf_securedrm_video_testdata.script",testexecute.exe + "\epoc32\data\c\mm\TSU_MMF_VCLNT_01_WM_CAF_V2.script" - "c:\TSU_MMF_VCLNT_01_WM_CAF_V2.script" "\epoc32\data\c\mm\TSU_MMF_VCLNT_01_WM_CAF_V2_priority.script" - "c:\TSU_MMF_VCLNT_01_WM_CAF_V2_priority.script" "\epoc32\data\c\mm\TSU_MMF_VCLNT_01_Alloc_WM.script" - "c:\TSU_MMF_VCLNT_01_Alloc_WM.script" @@ -40,17 +47,21 @@ // For winscw use only // "\epoc32\data\c\mm\TSU_MMF_vclnt_u_01_subtitle_gce_on_urel.script" - "c:\TSU_MMF_vclnt_u_01_subtitle_gce_on_urel.script" +// SecureDRM test data +"\epoc32\data\c\rta\videocontentnorights.xml" - "c:\rta\videocontentnorights.xml" +"\epoc32\data\c\rta\videocontent.xml" - "c:\rta\videocontent.xml" +"\epoc32\data\c\rta\videorights.xml" - "c:\rta\videorights.xml" +"\epoc32\data\c\securedrm\videocontent2.xml" - "c:\securedrm\videocontent2.xml" +"\epoc32\data\c\securedrm\videorights2.xml" - "c:\securedrm\videorights2.xml" +"\epoc32\data\c\securedrm\xvidonly.avi" - "c:\securedrm\xvidonly.avi" + // data files "\epoc32\data\c\mm\mmf\testfiles\vclnt\small2.wav" - "c:\mm\mmf\testfiles\vclnt\small2.wav" "\epoc32\data\c\mm\mmf\testfiles\vclnt\smallv.wav" - "c:\mm\mmf\testfiles\vclnt\smallv.wav" "\epoc32\data\c\mm\mmf\testfiles\vclnt\clock.dummy" - "c:\mm\mmf\testfiles\vclnt\clock.dummy" -"\epoc32\data\c\mm\mmf\testfiles\vclnt\Video.content" - "c:\mm\mmf\testfiles\vclnt\Video.content" -"\epoc32\data\c\mm\mmf\testfiles\vclnt\VideoContentNoRights.content" - "c:\mm\mmf\testfiles\vclnt\VideoContentNoRights.content" "\epoc32\data\c\mm\mmf\testfiles\vclnt\LongVideo.dummy" - "c:\mm\mmf\testfiles\vclnt\LongVideo.dummy" "\epoc32\data\c\mm\mmf\testfiles\vclnt\ShortVideo.dummy" - "c:\mm\mmf\testfiles\vclnt\ShortVideo.dummy" "\epoc32\data\c\mm\mmf\testfiles\vclnt\AudVid.avi" - "c:\mm\mmf\testfiles\vclnt\AudVid.avi" "\epoc32\data\c\mm\mmf\testfiles\vclnt\Vid.avi" - "c:\mm\mmf\testfiles\vclnt\Vid.avi" "\epoc32\data\c\mm\mmf\testfiles\vclnt\xvidonly.avi" - "c:\mm\mmf\testfiles\vclnt\xvidonly.avi" "\epoc32\data\c\mm\mmf\testfiles\vclnt\clock2.dummy" - "c:\mm\mmf\testfiles\vclnt\clock2.dummy" - - diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_ALLOC_WM.script --- a/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_ALLOC_WM.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_ALLOC_WM.script Thu Sep 16 18:57:38 2010 +0100 @@ -32,8 +32,8 @@ //! @SYMTestCaseID MM-MMF-VCLNT-U-0100-CP -RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0100-CP -TEST_COMPLETE +//RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0100-CP +//TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0101-CP DELAY 5000 @@ -46,19 +46,19 @@ TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0103-CP -DELAY 5000 -RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0103-CP -TEST_COMPLETE +//DELAY 5000 +//RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0103-CP +//TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0300-CP -DELAY 5000 -RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0300-CP -TEST_COMPLETE +//DELAY 5000 +//RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0300-CP +//TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0301-CP -DELAY 5000 -RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0301-CP -TEST_COMPLETE +//DELAY 5000 +//RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0301-CP +//TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0304-CP DELAY 5000 diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_WM_CAF_V2.script --- a/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_WM_CAF_V2.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_01_WM_CAF_V2.script Thu Sep 16 18:57:38 2010 +0100 @@ -170,9 +170,10 @@ TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0050-LP -DELAY 5000 -RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0050-LP -TEST_COMPLETE +// This test is commented out as it has Techview dependencies +//DELAY 5000 +//RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0050-LP +//TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0051-LP DELAY 5000 diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_DRM_ALLOC.script --- a/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_DRM_ALLOC.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmfunittest/VCLNT/scripts/TSU_MMF_VCLNT_DRM_ALLOC.script Thu Sep 16 18:57:38 2010 +0100 @@ -29,6 +29,6 @@ TEST_COMPLETE //! @SYMTestCaseID MM-MMF-VCLNT-U-0506-HP - +DELAY 5000 RUN_TEST_STEP -1, TSU_MMF_VCLNT_01, MM-MMF-VCLNT-U-0506-HP C:\MM\TSU_MMF_VCLNT_01.ini TEST_COMPLETE diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/group/tsi_mvs_agents_data.pkg --- a/mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/group/tsi_mvs_agents_data.pkg Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/group/tsi_mvs_agents_data.pkg Thu Sep 16 18:57:38 2010 +0100 @@ -18,18 +18,18 @@ "\epoc32\data\c\mvs\tsi_mvs_agents.ini" - "c:\mvs\tsi_mvs_agents.ini" //scripts -"\epoc32\data\c\mvs\tsi_mvs_audioagent.script" - "c:\tsi_mvs_audioagent.script" -"\epoc32\data\c\mvs\tsi_mvs_audioagent_alloc.script" - "c:\tsi_mvs_audioagent_alloc.script" +;"\epoc32\data\c\mvs\tsi_mvs_audioagent.script" - "c:\tsi_mvs_audioagent.script" +;"\epoc32\data\c\mvs\tsi_mvs_audioagent_alloc.script" - "c:\tsi_mvs_audioagent_alloc.script" "\epoc32\data\c\mvs\tsi_mvs_videoagent.script" - "c:\tsi_mvs_videoagent.script" +"\epoc32\data\c\mvs\tsi_mvs_agents_bc.ini" - "c:\mvs\tsi_mvs_agents_bc.ini" "\epoc32\data\c\mvs\tsi_mvs_videoagent_alloc.script" - "c:\tsi_mvs_videoagent_alloc.script" -"\epoc32\data\c\mvs\tsi_mvs_plugin.script" - "c:\tsi_mvs_plugin.script" +;"\epoc32\data\c\mvs\tsi_mvs_plugin.script" - "c:\tsi_mvs_plugin.script" "\epoc32\data\c\mvs\tsi_mvs_videoagent_secdisp.script" - "c:\tsi_mvs_videoagent_secdisp.script" "\epoc32\data\c\mvs\tsi_mvs_videoagent_apr.script" - "c:\tsi_mvs_videoagent_apr.script" // Graphics surface tests "\epoc32\data\c\mvs\tsi_mvs_videoagent_surf.script" - "c:\tsi_mvs_videoagent_surf.script" "\epoc32\data\c\mvs\tsi_mvs_videoagent_surf_bc.script" - "c:\tsi_mvs_videoagent_surf_bc.script" -"\epoc32\data\c\mvs\tsi_mvs_agents_bc.ini" - "c:\mvs\tsi_mvs_agents_bc.ini" // test data files "\epoc32\data\c\mvs\aud_vid.avi" - "c:\mvs\aud_vid.avi" @@ -47,3 +47,4 @@ "\epoc32\data\c\mvs\textfile.ogg" - "c:\mvs\textfile.ogg" "\epoc32\data\c\mvs\wavtest01.wav" - "c:\mvs\wavtest01.wav" "\epoc32\data\c\mvs\wavtest02.wav" - "c:\mvs\wavtest02.wav" +"..\..\..\mmfcharacterisationvalidation\data\mainTst.wav" - "c:\AclntITestData\mainTst.wav" diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/scripts/tsi_mvs_videoagent.script --- a/mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/scripts/tsi_mvs_videoagent.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/tsrc/mmvalidationsuite/mvsintegrationtest/scripts/tsi_mvs_videoagent.script Thu Sep 16 18:57:38 2010 +0100 @@ -35,8 +35,8 @@ //!@SYMTestActions 1. Open an AVI (Xvid) file. 2. Set position 3. Play 4. Pause after 1 second, check if KErrNotSupported is returned. 5. Get //! Position 6. Set to some other position (before the current position) 7. Play till end. //!@SYMTestExpectedResults Video file, opened and played successfully, without any errors -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0001-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0001-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0002-HP @@ -47,8 +47,8 @@ //!@SYMTestActions 1. Open an AVI (Xvid) file, without giving the Video Controller UID. 2. Set Rotation 3. Play 4. Set Rotation 5. Get the //! rotation value and check 6. Stop Playback. 6. Play again till end. //!@SYMTestExpectedResults Video file, opened and played successfully, without any errors -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0002-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0002-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0003-HP @@ -84,8 +84,8 @@ //! rate 5. Set Audio Enabled 6. Set Video / Audio Type 7. Record, Stop after 5 seconds. 8. Play using play agent 9. After Playing, get the various settings //! and compare with the actuals. //!@SYMTestExpectedResults Record completes with KErrNone. The recorded file is played and all callbacks received -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0005-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0005-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0006-HP @@ -120,8 +120,8 @@ //!@SYMTestActions 1. Empty the contents of the log file 2. Create a new AVI File 3. Record for 2 seconds 4. Compare the log file with the //! reference log file. //!@SYMTestExpectedResults The Log file is checked for modification dates, and the existance of a sample string. -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0010-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0010-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0011-HP @@ -132,8 +132,8 @@ //!@SYMTestActions 1. Empty the contents of the log file 2. Open the recorded AVI File 3. Play using the Video Play Agent 4. Compare the log //! file with the reference log file. //!@SYMTestExpectedResults The Log file is checked for modification dates, and the existance of a sample string. -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0011-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0011-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0021-HP @@ -142,8 +142,8 @@ //!@SYMTestPriority 2 //!@SYMTestActions 1. Open the AVI File 2. Set & get the crop region 3. Play using the Video Play Agent //!@SYMTestExpectedResults The video plays with the newly set crop region -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0021-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0021-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE ////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////// VIDEO CLIENT AGENTS :: Negative Testing //////////////////////// @@ -168,8 +168,8 @@ //!@SYMTestPriority 2 //!@SYMTestActions Attempt to load and initilise a file that has an unsupported codec. //!@SYMTestExpectedResults Any of the predefined error codes. -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0013-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0013-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0014-HP @@ -179,8 +179,8 @@ //!@SYMTestPriority 2 //!@SYMTestActions Attempt to load a file containing text data without giving the controller UID //!@SYMTestExpectedResults Invalid File. -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0014-HP \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0014-HP \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE // //!@SYMTestCaseID MM-MVS-VIDEOAGENT-I-0015-HP @@ -211,5 +211,5 @@ //!@SYMTestActions 1. Open an AVI (Xvid) file. 2. Record 3. Pause after 1 second, check if KErrNone //! is returned. 4. Start Recording again. 5. Record till end. //!@SYMTestExpectedResults Video file, opened and recorded successfully, without any errors -RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0017 \mvs\tsi_mvs_agents.ini -TEST_COMPLETE +//RUN_TEST_STEP 600000 TSI_MVS_AGENTS MM-MVS-VIDEOAGENT-I-0017 \mvs\tsi_mvs_agents.ini +//TEST_COMPLETE diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gp/impl/inc/filewriter.h --- a/mmplugins/lib3gp/impl/inc/filewriter.h Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gp/impl/inc/filewriter.h Thu Sep 16 18:57:38 2010 +0100 @@ -21,10 +21,10 @@ #include "mp4atom.h" // CONSTANTS -const TInt KFileWriterBufferSizeSmall = 2048; -const TInt KFileWriterBufferSizeLarge = (2*65536); -const TInt KFileWriterSoftBufLimit = 10; -const TInt KFileWriterHardBufLimit = 15; +const TInt KFileWriterBufferSizeSmall = 65536; +const TInt KFileWriterBufferSizeLarge = (4*65536); +const TInt KFileWriterSoftBufLimit = 12; +const TInt KFileWriterHardBufLimit = 16; const TInt KFileWriterMinBufferCount = 4; // shouldn't be less than 4 // FORWARD DECLARATIONS @@ -50,7 +50,7 @@ /** * Two-phased constructor. */ - static CFileWriter* NewL( RFile64& aFile ); + static CFileWriter* NewL( RFile64& aFile, TInt aInitSetSize = 0, TInt aOutputBufferSizeSmall = KFileWriterBufferSizeSmall, TInt aOutputBufferSizeLarge = KFileWriterBufferSizeLarge ); /** * Destructor. @@ -89,7 +89,12 @@ * @since 3.0 * @param aHandle MP4Handle. */ - void SetOutputBufferCount( MP4Handle aHandle ); + void SetOutputBufferCount( MP4Handle aHandle ); + + inline TInt64 OutputFileSize() const + { + return iOutputFileSize; + } protected: // Functions from base classes @@ -108,7 +113,7 @@ /** * C++ default constructor. */ - CFileWriter(); + CFileWriter( TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge ); /** * By default Symbian 2nd phase constructor is private. @@ -128,6 +133,12 @@ * @since 2.6 */ void AllocateBuffersL(); + + /** + * Updates output file size and reserves extra space for following writing if iSetSize is set. + * Takes into account if the position in the file was changed. + */ + void UpdateOutputFileSize(); private: // Whether we are flushing after async write. @@ -139,16 +150,24 @@ // Flag whether init has been done TBool iMemReadyForWriting; - // Write error code. - TInt iError; + // Write error code. + TInt iError; + + // Current set file size + TInt64 iSetSize; + // Current output file size + TInt64 iOutputFileSize; + + TInt iOutputBufferSizeSmall; + TInt iOutputBufferSizeLarge; + // Output buffer size. TInt iOutputBufferSize; // Hard limit for max output buffers TInt iMaxOutputBufHardLimit; // Soft limit for max output buffers TInt iMaxOutputBufSoftLimit; - // Current output file size - TInt64 iOutputFileSize; + // Output file for writes. RFile64* iOutputFile; diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gp/impl/src/file.cpp --- a/mmplugins/lib3gp/impl/src/file.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gp/impl/src/file.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -185,9 +185,77 @@ return -1; } + TBuf8<16> buf; + buf.Copy(fp.Drive()); + buf.LowerCase(); + TInt drvNum = (*buf.Ptr()) - 'a'; + PRINT((_L("drvNum = %d"), drvNum)); + + TVolumeInfo volInfo; + error = fs->Volume(volInfo, drvNum); + if (error != KErrNone) + { + return -1; + } + + PRINT((_L("volInfo.iFree = %Ld"), volInfo.iFree)); + PRINT((_L("volInfo.iSize = %Ld"), volInfo.iSize)); + + TVolumeIOParamInfo ioInfo; + error = fs->VolumeIOParam(drvNum, ioInfo); + if (error != KErrNone) + { + return -1; + } + + PRINT((_L("ioInfo.iBlockSize = %d"), ioInfo.iBlockSize)); + PRINT((_L("ioInfo.iClusterSize = %d"), ioInfo.iClusterSize)); + + if (ioInfo.iClusterSize <= 0 || (ioInfo.iClusterSize & 0x1)) // if for some reason we got wrong value for the cluster - ignore it + { + PRINT(_L("Wrong cluster size, set 0x8000")); + ioInfo.iClusterSize = 0x8000; + } + + // We want to have size of writing buffer to be a multiple of cluster size. Small buffer should be 1 cluster, large buffer should be 8 clusters. + TInt writeBufferSizeSmall = ioInfo.iClusterSize; + TInt writeBufferSizeLarge = ioInfo.iClusterSize * 8; + + // Now need to make sure that writeBufferSizeLarge is not too small (<128K) or too big (>256K) whilst keeping it a multiple of cluster size + if (writeBufferSizeLarge < KFileWriterBufferSizeLarge/2) + { + writeBufferSizeLarge = KFileWriterBufferSizeLarge/2; + } + + if (writeBufferSizeLarge > KFileWriterBufferSizeLarge) + { + writeBufferSizeLarge = (KFileWriterBufferSizeLarge / ioInfo.iClusterSize) * ioInfo.iClusterSize; + } + + if (writeBufferSizeLarge < ioInfo.iClusterSize) + { + writeBufferSizeLarge = ioInfo.iClusterSize; + } + + PRINT((_L("writeBufferSizeLarge = %d"), writeBufferSizeLarge)); + + TInt incSetSize = writeBufferSizeLarge * (KFileWriterHardBufLimit >> 1); // 2Mb if cluster size if 32767 + TInt initSetSize = incSetSize * 1; // set initial set size for 2Mb + + if (initSetSize > volInfo.iFree) + { + initSetSize = (volInfo.iFree / incSetSize) * incSetSize; + } + + PRINT((_L("initSetSize = %d"), initSetSize)); + + PRINT((_L("e_SetSize 1"))); + file->SetSize(initSetSize); + PRINT((_L("e_SetSize 0"))); + handle->file = handle->rfile; - TRAP(error, handle->filewriter = CFileWriter::NewL( *file )); + TRAP(error, handle->filewriter = CFileWriter::NewL( *file, initSetSize, writeBufferSizeSmall, writeBufferSizeLarge)); if ( error != KErrNone ) { return -1; @@ -266,7 +334,11 @@ PRINT((_L("e_closefile_flush_filewriter 1"))); (handle->filewriter)->Flush(KNullDesC8); PRINT((_L("e_closefile_flush_filewriter 0"))); - delete handle->filewriter; + PRINT((_L("e_SetSize 1"))); + ((RFile64 *)(handle->file))->SetSize((handle->filewriter)->OutputFileSize()); + PRINT((_L("e_SetSize 0: iOutputFileSize = %Ld"), (handle->filewriter)->OutputFileSize())); + + delete handle->filewriter; handle->filewriter = NULL; } } @@ -1316,26 +1388,54 @@ TFileName path; TInt error; - // Create a directory for the files - if ( handle->fileName ) - { - filename = (TText *)handle->fileName; + TDriveList driveList; + TBool pathSet = EFalse; + + // As ram drive access is faster, try to set temp file directory to available ram drive. + if (((RFs *)(handle->fs))->DriveList(driveList) == KErrNone) + { + for ( TInt i = 0; i < driveList.Length(); i++ ) + { + TDriveInfo driveInfo; + if (((RFs *)(handle->fs))->Drive(driveInfo, i) == KErrNone) + { + if (driveInfo.iType == EMediaRam) + { + TChar driveLetter; + ((RFs *)(handle->fs))->DriveToChar(i, driveLetter); + path.Append(driveLetter); + path.Append(_L(":")); + path.Append(KTmpDirectoryName); + pathSet = ETrue; + break; + } + } + } + } + + // If no ram drive was found create a directory for the files on current drive + if (!pathSet) + { + if ( handle->fileName ) + { + filename = (TText *)handle->fileName; - TParse fp; - path = KTmpDirectoryName; - if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone) - return -1; - path.Insert(0, fp.Drive()); - } - else - { - TChar drive; - if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone ) - return -1; - path.Append( drive ); - path.Append( _L(":") ); - path.Append( KTmpDirectoryName ); - } + TParse fp; + path = KTmpDirectoryName; + if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone) + return -1; + path.Insert(0, fp.Drive()); + } + else + { + TChar drive; + if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone ) + return -1; + path.Append( drive ); + path.Append( _L(":") ); + path.Append( KTmpDirectoryName ); + } + } // Try to delete the temp folder from leftovers // If other instance is using it then delete will just fail diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gp/impl/src/filewriter.cpp --- a/mmplugins/lib3gp/impl/src/filewriter.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gp/impl/src/filewriter.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -38,7 +38,11 @@ // might leave. // ----------------------------------------------------------------------------- // -CFileWriter::CFileWriter() : CActive( EPriorityHigh ) +CFileWriter::CFileWriter( TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge ): + CActive( EPriorityHigh ), + iSetSize( aInitSetSize ), + iOutputBufferSizeSmall( aOutputBufferSizeSmall ), + iOutputBufferSizeLarge( aOutputBufferSizeLarge ) { } @@ -52,6 +56,7 @@ PRINT((_L("CFileWriter::ConstructL() in"))); iFlush = EFalse; iError = KErrNone; + iOutputFile = &aFile; iWritingStarted = EFalse; iOutputBufferSize = KFileWriterBufferSizeSmall; @@ -73,9 +78,9 @@ // Two-phased constructor. // ----------------------------------------------------------------------------- // -CFileWriter* CFileWriter::NewL( RFile64& aFile ) +CFileWriter* CFileWriter::NewL( RFile64& aFile, TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge ) { - CFileWriter* self = new(ELeave) CFileWriter; + CFileWriter* self = new(ELeave) CFileWriter( aInitSetSize, aOutputBufferSizeSmall, aOutputBufferSizeLarge ); CleanupStack::PushL(self); self->ConstructL( aFile ); CleanupStack::Pop(self); @@ -111,6 +116,37 @@ PRINT((_L("CFileWriter::~CFileWriter() out"))); } +// ----------------------------------------------------------------------------- +// CFileWriter::UpdateOutputFileSize() +// Updates output file size and reserves extra space for following writing +// if iSetSize is set. +// Takes into account if the position in the file was changed. +// ----------------------------------------------------------------------------- +// +void CFileWriter::UpdateOutputFileSize() + { + TInt64 pos = 0; + PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 1"))); + iOutputFile->Seek(ESeekCurrent, pos); + PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 0"))); + + PRINT((_L("CFileWriter::UpdateOutputFileSize() pos: %Ld"), pos)); + PRINT((_L("CFileWriter::UpdateOutputFileSize() iOutputFileSize: %Ld"), iOutputFileSize)); + PRINT((_L("CFileWriter::UpdateOutputFileSize() iSetSize: %Ld"), iSetSize)); + + if (pos > iOutputFileSize) + { + iOutputFileSize = pos; + } + + while (iOutputFileSize >= iSetSize) + { + iSetSize += static_cast(iOutputBufferSize) * (static_cast(iMaxOutputBufHardLimit) >> 1); + PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 1"))); + iOutputFile->SetSize( iSetSize ); + PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 0"))); + } + } // ----------------------------------------------------------------------------- // CFileWriter::Write( const TDesC8& aBuf ) @@ -233,6 +269,7 @@ PRINT((_L("e_cfilewriter_flush_remove_buf 1"))); if ( error == KErrNone ) { + UpdateOutputFileSize(); iFullBufferQueue[0]->Des().Zero(); if ( iEmptyBufferQueue.Append( iFullBufferQueue[0] ) ) { @@ -257,6 +294,7 @@ PRINT((_L("e_cfilewriter_flush_writeinput_sync 0"))); if ( error == KErrNone ) { + UpdateOutputFileSize(); iInputBuf->Des().Zero(); } else @@ -293,11 +331,11 @@ if ( aBufferSize == EBufferSizeSmall ) { - size = KFileWriterBufferSizeSmall; + size = iOutputBufferSizeSmall; } else if ( aBufferSize == EBufferSizeLarge ) { - size = KFileWriterBufferSizeLarge; + size = iOutputBufferSizeLarge; } else if ( aBufferSize == EBufferSizeCustom ) { @@ -373,7 +411,7 @@ while (byteswritten < aBuf.Length() ) { - available = (iInputBuf->Des()).MaxLength() - iInputBuf->Length(); + available = iOutputBufferSize - iInputBuf->Length(); if (available > 0) { @@ -468,7 +506,7 @@ if ( iStatus == KErrNone ) { - iOutputFileSize += iFullBufferQueue[0]->Des().Length(); + UpdateOutputFileSize(); iFullBufferQueue[0]->Des().Zero(); iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] ); if ( iError ) @@ -487,7 +525,7 @@ return; } - PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); + PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); if ( iFlush ) { @@ -505,7 +543,7 @@ PRINT((_L("e_cfilewriter_runl_write 0"))); if ( iError == KErrNone ) { - iOutputFileSize += iFullBufferQueue[0]->Des().Length(); + UpdateOutputFileSize(); iFullBufferQueue[0]->Des().Zero(); iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] ); if ( iError ) @@ -516,7 +554,7 @@ return; } iFullBufferQueue.Remove( 0 ); - PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); + PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); } else { @@ -533,7 +571,7 @@ PRINT((_L("e_cfilewriter_runl_outfile_write 0"))); if ( iError == KErrNone ) { - iOutputFileSize += iFullBufferQueue[0]->Des().Length(); + UpdateOutputFileSize(); iFullBufferQueue[0]->Des().Zero(); iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] ); if ( iError ) @@ -544,7 +582,7 @@ return; } iFullBufferQueue.Remove( 0 ); - PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); + PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize )); } else { diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_api_te.script --- a/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_api_te.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_api_te.script Thu Sep 16 18:57:38 2010 +0100 @@ -381,7 +381,7 @@ //! 8. Close one of composers. //! 9. Repeat Step 7 - 8 until all composers are closed. //! @SYMTestExpectedResults Test should complete without any error -RUN_TEST_STEP -1 tsu_3gplibrary 3GPComposeMultiComposers C:\mm\tsu_3gp_compose_api_te.ini MM-3GP-COMP-U-0115-CP-1 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPComposeMultiComposers C:\mm\tsu_3gp_compose_api_te.ini MM-3GP-COMP-U-0115-CP-1 END_TESTCASE MM-3GP-COMP-U-0115-CP RUN_UTILS DeleteDirectory C:\3gplibrary\temp\MM-3GP-COMP-U-0116-CP\ diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3g2_te.script --- a/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3g2_te.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3g2_te.script Thu Sep 16 18:57:38 2010 +0100 @@ -28,10 +28,10 @@ //! @SYMTestPriority 3 //! @SYMTestActions Parse all files contained in the specified directory. //! @SYMTestExpectedResults Parser returns error while retrieving data from the files. -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-1 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-2 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-3 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-4 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-5 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-6 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-1 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-2 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-3 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-4 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-5 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0503-CP-6 END_TESTCASE MM-3GP-COMP-U-0503-CP diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3gp_te.script --- a/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3gp_te.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_3gp_te.script Thu Sep 16 18:57:38 2010 +0100 @@ -28,11 +28,11 @@ //! @SYMTestPriority 3 //! @SYMTestActions Parse all files contained in the specified directory. //! @SYMTestExpectedResults Parser returns error while retrieving data from the files. -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-1 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-2 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-3 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-4 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-5 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-6 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-1 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-2 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-3 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-4 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-5 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0501-CP-6 END_TESTCASE MM-3GP-COMP-U-0501-CP diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_mp4_te.script --- a/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_mp4_te.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gpunittest/scripts/tsu_3gp_compose_format_mp4_te.script Thu Sep 16 18:57:38 2010 +0100 @@ -28,10 +28,10 @@ //! @SYMTestPriority 3 //! @SYMTestActions Parse all files contained in the specified directory. //! @SYMTestExpectedResults Parser returns error while retrieving data from the files. -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-1 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-2 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-3 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-4 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-5 -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-6 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-1 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-2 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-3 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-4 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-5 +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_compose_format_te.ini MM-3GP-COMP-U-0502-CP-6 END_TESTCASE MM-3GP-COMP-U-0502-CP diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmplugins/lib3gpunittest/scripts/tsu_3gp_performance_te.script --- a/mmplugins/lib3gpunittest/scripts/tsu_3gp_performance_te.script Thu Sep 16 18:39:58 2010 +0100 +++ b/mmplugins/lib3gpunittest/scripts/tsu_3gp_performance_te.script Thu Sep 16 18:57:38 2010 +0100 @@ -38,6 +38,6 @@ //! @SYMTestPriority 3 //! @SYMTestActions Parse all files contained in the specified directory. //! @SYMTestExpectedResults Parser returns error while retrieving data from the files. -RUN_TEST_STEP -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_performance_te.ini MM-3GP-PERFORMANCE-U-0102-CP +RUN_TEST_STEP !Heap=0xC00000 -1 tsu_3gplibrary 3GPParseComposeFile C:\mm\tsu_3gp_performance_te.ini MM-3GP-PERFORMANCE-U-0102-CP END_TESTCASE MM-3GP-PERFORMANCE-U-0102-CP diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 package_definition.xml --- a/package_definition.xml Thu Sep 16 18:39:58 2010 +0100 +++ b/package_definition.xml Thu Sep 16 18:57:38 2010 +0100 @@ -385,6 +385,9 @@ + + +