sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "postproc.h" sl@0: #include "../TestDevVideoPlayTestData.h" sl@0: sl@0: _LIT(KDevVideoPostProcPanicCategory, "DevVideoPostProcessor"); sl@0: void DevVideoPostProcPanic(TInt aReason) sl@0: { sl@0: User::Panic(KDevVideoPostProcPanicCategory, aReason); sl@0: } sl@0: sl@0: CMMFVideoPostProcHwDevice* CMMFTestVideoPostProcHwDevice::NewL(TAny* /*aInitParams*/) sl@0: { sl@0: CMMFTestVideoPostProcHwDevice* s = new(ELeave) CMMFTestVideoPostProcHwDevice; sl@0: return (STATIC_CAST(CMMFVideoPostProcHwDevice*, s)); sl@0: } sl@0: sl@0: CMMFTestVideoPostProcHwDevice::CMMFTestVideoPostProcHwDevice() sl@0: { sl@0: } sl@0: sl@0: CMMFTestVideoPostProcHwDevice::~CMMFTestVideoPostProcHwDevice() sl@0: { sl@0: iVideoPictures.Close(); sl@0: sl@0: iVidFormats.Reset(); sl@0: iVidFormats.Close(); sl@0: sl@0: iScaleFactors.Reset(); sl@0: iScaleFactors.Close(); sl@0: sl@0: iCombinations.Reset(); sl@0: iCombinations.Close(); sl@0: } sl@0: sl@0: TAny* CMMFTestVideoPostProcHwDevice::CustomInterface(TUid aInterface) sl@0: { sl@0: if (aInterface == KUidCustomInterfaceTwo) sl@0: { sl@0: return this;//just want to return something non-null! sl@0: } sl@0: else sl@0: { sl@0: return NULL; sl@0: } sl@0: } sl@0: sl@0: CPostProcessorInfo* CMMFTestVideoPostProcHwDevice::PostProcessorInfoLC() sl@0: { sl@0: // construct array of test types sl@0: for (TUint i = 0; i < KTestPostProcInfoCount; i++) sl@0: { sl@0: // append the video formats sl@0: TUncompressedVideoFormat vid = KTestPostProcInfoFormatArray[i]; sl@0: User::LeaveIfError(iVidFormats.Append(vid)); sl@0: sl@0: // append the combinations sl@0: TUint32 comb = KTestPostProcInfoCombsArray[i]; sl@0: User::LeaveIfError(iCombinations.Append(comb)); sl@0: sl@0: // append the scale factors sl@0: TScaleFactor scale = KTestPostProcInfoScaleFactorsArray[i]; sl@0: User::LeaveIfError(iScaleFactors.Append(scale)); sl@0: } sl@0: sl@0: // construct the video decoder info object sl@0: CPostProcessorInfo* vInfo = CPostProcessorInfo::NewL( sl@0: KUidDevVideoTestPostProcHwDevice, sl@0: KTestPostProcInfoManufacturer, sl@0: KTestPostProcInfoIdentifier, sl@0: TVersion(KTestPostProcInfoVersionMaj, KTestPostProcInfoVersionMin, KTestPostProcInfoVersionBuild), sl@0: iVidFormats.Array(), sl@0: iCombinations.Array(), sl@0: ETrue, // accelerated sl@0: ETrue, // supports direct display sl@0: KTestPostProcInfoYuvToRgbCaps, sl@0: KTestPostProcInfoRotations, sl@0: ETrue, // scaling sl@0: iScaleFactors.Array(), sl@0: ETrue, // anti-aliasing sl@0: KTestPostProcInfoISInfo ); sl@0: CleanupStack::PushL(vInfo); sl@0: #ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT sl@0: vInfo->AddSupportedScreenL(KPostProcDefaultScreenNumber); sl@0: vInfo->AddSupportedScreenL(KPostProcSecondaryScreenNumber); sl@0: #endif sl@0: vInfo->SetSupportsContentProtected(ETrue); sl@0: return vInfo; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetOutputFormatListL(RArray& aFormats) sl@0: { sl@0: // append in order 3, 2, 1 sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat3)); sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat2)); sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat1)); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetOutputFormatL(const TUncompressedVideoFormat &aFormat) sl@0: { sl@0: if (!(aFormat == KTestVidFormat2)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetPostProcessTypesL(TUint32 aPostProcCombination) sl@0: { sl@0: if (!(aPostProcCombination == KTestProcessType2)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetInputCropOptionsL(const TRect& aRect) sl@0: { sl@0: TRect testRect(KTestInputCropRectD, KTestInputCropRectC, KTestInputCropRectB, KTestInputCropRectA); sl@0: if (!(aRect == testRect)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions, const TYuvFormat& aYuvFormat, TRgbFormat aRgbFormat) sl@0: { sl@0: // check options first sl@0: if (!CompareYuvRgbOptions(aOptions, KTestYuvToRgb2)) sl@0: User::Leave(KErrCorrupt); sl@0: sl@0: // now check formats sl@0: if ( !(CompareYuvFormats(aYuvFormat, KTestYuvFormat2)) || sl@0: !(aRgbFormat == KTestRgbFormat2) ) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions) sl@0: { sl@0: if (!CompareYuvRgbOptions(aOptions, KTestYuvToRgb2)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetRotateOptionsL(TRotationType aRotationType) sl@0: { sl@0: if (!(aRotationType == KTestRotate2)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering) sl@0: { sl@0: TSize testScale(KTestScaleY, KTestScaleX); sl@0: if (!(aTargetSize == testScale) || !aAntiAliasFiltering) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetOutputCropOptionsL(const TRect& aRect) sl@0: { sl@0: TRect testRect(KTestOutputCropRectD, KTestOutputCropRectC, KTestOutputCropRectB, KTestOutputCropRectA); sl@0: if (!(aRect == testRect)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetPostProcSpecificOptionsL(const TDesC8& aOptions) sl@0: { sl@0: if (!(aOptions == KTestPostProcOptions2)) sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetClockSource(MMMFClockSource* aClock) sl@0: { sl@0: __ASSERT_ALWAYS(aClock, DevVideoPostProcPanic(EPostProcPanicClockSource)); sl@0: sl@0: // call Time() to check that clock can be used sl@0: TTimeIntervalMicroSeconds currTime(0); // done this way to remove compiler warning sl@0: currTime = aClock->Time(); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetVideoDestScreenL(TBool aScreen) sl@0: { sl@0: if (aScreen) sl@0: { sl@0: // Must be normal devvideo test. Leave with special number to show we got the sl@0: // value through ok sl@0: User::Leave(KErrHardwareNotAvailable); sl@0: } sl@0: else sl@0: { sl@0: // Special test plugin feature: we're being told to start outputing sl@0: // video pictures up to DevVideo. sl@0: // Create 10 video pictures sl@0: iVideoPictures.Reset(); sl@0: for (TInt i=0; i<10; i++) sl@0: { sl@0: // Create a video picture that only has a valid timestamp sl@0: TVideoPicture picture; sl@0: picture.iTimestamp = TTimeIntervalMicroSeconds(i); sl@0: picture.iOptions = TVideoPicture::ETimestamp; sl@0: User::LeaveIfError(iVideoPictures.Append(picture)); sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Initialize() sl@0: { sl@0: iProxy->MdvppInitializeComplete(this, KErrNone); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::StartDirectScreenAccessL(const TRect& aVideoRect, CFbsScreenDevice& /*aScreenDevice*/, const TRegion& aClipRegion) sl@0: { sl@0: TRect dsaRect(KTestDSARectA, KTestDSARectB, KTestDSARectC, KTestDSARectD); sl@0: TRegionFix<1> dsaReg(dsaRect); sl@0: sl@0: // probably no need to check aScreenDevice sl@0: if ( /*!(&aScreenDevice) || */!(dsaRect == aVideoRect) || sl@0: !(dsaReg.BoundingRect() == aClipRegion.BoundingRect()) ) sl@0: User::Leave(KErrNotSupported); sl@0: sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetScreenClipRegion(const TRegion& aRegion) sl@0: { sl@0: TRect dsaRect(KTestDSARectA, KTestDSARectB, KTestDSARectC, KTestDSARectD); sl@0: TRegionFix<1> dsaReg(dsaRect); sl@0: sl@0: __ASSERT_ALWAYS(dsaReg.BoundingRect() == aRegion.BoundingRect(), sl@0: DevVideoPostProcPanic(EPostProcPanicScreenClipRegion)); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetPauseOnClipFail(TBool aPause) sl@0: { sl@0: __ASSERT_ALWAYS(aPause, DevVideoPostProcPanic(EPostProcPanicPauseClipFail)); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::AbortDirectScreenAccess() sl@0: { sl@0: // do nothing - there is no way to check this sl@0: } sl@0: sl@0: TBool CMMFTestVideoPostProcHwDevice::IsPlaying() sl@0: { sl@0: return iIsPlaying; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Redraw() sl@0: { sl@0: // do nothing - there is no way to check this sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Start() sl@0: { sl@0: // set iIsPlaying flag sl@0: iIsPlaying = ETrue; sl@0: sl@0: // if we're doing the picture tests, start sending pictures to DevVideo sl@0: if (iVideoPictures.Count() > 0) sl@0: { sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[0])); sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Stop() sl@0: { sl@0: iIsPlaying = EFalse; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Pause() sl@0: { sl@0: iIsPlaying = EFalse; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Resume() sl@0: { sl@0: iIsPlaying = ETrue; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition) sl@0: { sl@0: if (aPlaybackPosition == TTimeIntervalMicroSeconds(KTestPositionFatal)) sl@0: { sl@0: iProxy->MdvppFatalError(this, KErrDied); sl@0: } sl@0: else sl@0: { sl@0: __ASSERT_ALWAYS(aPlaybackPosition == TTimeIntervalMicroSeconds(KTestPosition), DevVideoPostProcPanic(EPostProcPanicSetPosition)); sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::FreezePicture(const TTimeIntervalMicroSeconds& aTimestamp) sl@0: { sl@0: __ASSERT_ALWAYS(aTimestamp == TTimeIntervalMicroSeconds(KTestPosition), DevVideoPostProcPanic(EPostProcPanicFreezePicture)); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::ReleaseFreeze(const TTimeIntervalMicroSeconds& aTimestamp) sl@0: { sl@0: __ASSERT_ALWAYS(aTimestamp == TTimeIntervalMicroSeconds(KTestPosition), DevVideoPostProcPanic(EPostProcPanicReleaseFreeze)); sl@0: } sl@0: sl@0: TTimeIntervalMicroSeconds CMMFTestVideoPostProcHwDevice::PlaybackPosition() sl@0: { sl@0: return TTimeIntervalMicroSeconds(KTestPlayPosition); sl@0: } sl@0: sl@0: TUint CMMFTestVideoPostProcHwDevice::PictureBufferBytes() sl@0: { sl@0: return KTestPictureBytes; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetPictureCounters(CMMFDevVideoPlay::TPictureCounters& aCounters) sl@0: { sl@0: aCounters = GetTestPictureCounters(); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetComplexityLevel(TUint aLevel) sl@0: { sl@0: __ASSERT_ALWAYS(aLevel == KTestComplexityLevel2, DevVideoPostProcPanic(EPostProcPanicComplexityLevel)); sl@0: } sl@0: sl@0: TUint CMMFTestVideoPostProcHwDevice::NumComplexityLevels() sl@0: { sl@0: return KTestNumComplexityLevels2; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetComplexityLevelInfo(TUint aLevel, CMMFDevVideoPlay::TComplexityLevelInfo& aInfo) sl@0: { sl@0: __ASSERT_ALWAYS(aLevel == KTestComplexityLevel2, DevVideoPostProcPanic(EPostProcPanicComplexityLevelInfo)); sl@0: sl@0: aInfo = GetTestLevelInfo(aLevel);; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::ReturnPicture(TVideoPicture* /*aPicture*/) sl@0: { sl@0: switch (iCurrentPicture) sl@0: { sl@0: case 0: sl@0: // Send two more pictures sl@0: iCurrentPicture = 1; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[1])); sl@0: iCurrentPicture = 2; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[2])); sl@0: break; sl@0: case 2: sl@0: // Send three more pictures sl@0: iCurrentPicture = 3; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[3])); sl@0: iCurrentPicture = 4; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[4])); sl@0: iCurrentPicture = 5; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[5])); sl@0: break; sl@0: case 5: sl@0: // Send the rest of the pictures sl@0: iCurrentPicture = 6; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[6])); sl@0: iCurrentPicture = 7; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[7])); sl@0: iCurrentPicture = 8; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[8])); sl@0: iCurrentPicture = 9; sl@0: iProxy->MdvppNewPicture(&(iVideoPictures[9])); sl@0: break; sl@0: default: sl@0: break; sl@0: }; sl@0: } sl@0: sl@0: TBool CMMFTestVideoPostProcHwDevice::GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat) sl@0: { sl@0: TBool ret = EFalse; sl@0: sl@0: if (aFormat.iDataFormat == EYuvRawData) sl@0: { sl@0: if (CompareYuvFormats(aFormat.iYuvFormat, KTestYuvFormat1)) sl@0: { sl@0: ret = ETrue; sl@0: aPictureData.iDataFormat = EYuvRawData; sl@0: aPictureData.iDataSize = TSize(KTestPictureDataSizeX, KTestPictureDataSizeY); sl@0: aPictureData.iRawData = NULL; sl@0: } sl@0: } sl@0: sl@0: return ret; sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, const TTimeIntervalMicroSeconds& aPresentationTimestamp) sl@0: { sl@0: if ((aFormat.iDataFormat == EYuvRawData) && (aPresentationTimestamp == TTimeIntervalMicroSeconds(KTestSnapshotTimestamp)) ) sl@0: { sl@0: if (CompareYuvFormats(aFormat.iYuvFormat, KTestYuvFormat1)) sl@0: { sl@0: aPictureData->iDataFormat = EYuvRawData; sl@0: aPictureData->iDataSize = TSize(KTestPictureDataSizeX, KTestPictureDataSizeY); sl@0: aPictureData->iRawData = NULL; sl@0: sl@0: // call the snapshot callback sl@0: iProxy->MdvppTimedSnapshotComplete(KErrNone, aPictureData, aPresentationTimestamp, iPictureId); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, const TPictureId& aPictureId) sl@0: { sl@0: if ((aFormat.iDataFormat == EYuvRawData) && sl@0: (aPictureId.iIdType == KTestSnapshotId.iIdType) && sl@0: (aPictureId.iId == KTestSnapshotId.iId) ) sl@0: { sl@0: if (CompareYuvFormats(aFormat.iYuvFormat, KTestYuvFormat1)) sl@0: { sl@0: aPictureData->iDataFormat = EYuvRawData; sl@0: aPictureData->iDataSize = TSize(KTestPictureDataSizeX, KTestPictureDataSizeY); sl@0: aPictureData->iRawData = NULL; sl@0: sl@0: iPictureTimestamp = 0; sl@0: sl@0: // call the snapshot callback sl@0: iProxy->MdvppTimedSnapshotComplete(KErrNone, aPictureData, iPictureTimestamp, aPictureId); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::CancelTimedSnapshot() sl@0: { sl@0: // call the snapshot callback with error sl@0: iProxy->MdvppTimedSnapshotComplete(KErrAbort, &iPictureData, iPictureTimestamp, iPictureId); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::GetSupportedSnapshotFormatsL(RArray& aFormats) sl@0: { sl@0: // append in order 3, 2, 1 sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat1)); sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat2)); sl@0: User::LeaveIfError(aFormats.Append(KTestVidFormat3)); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::InputEnd() sl@0: { sl@0: iProxy->MdvppStreamEnd(); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetInputFormatL(const TUncompressedVideoFormat& aFormat) sl@0: { sl@0: if (!(aFormat == KTestVidFormat2)) sl@0: { sl@0: User::Leave(KErrCorrupt); sl@0: } sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetInputDevice(CMMFVideoDecodeHwDevice* /*aDevice*/) sl@0: { sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::WritePictureL(TVideoPicture* aPicture) sl@0: { sl@0: iProxy->MdvppReturnPicture(aPicture); sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::CommitL() sl@0: { sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::Revert() sl@0: { sl@0: } sl@0: sl@0: void CMMFTestVideoPostProcHwDevice::SetProxy(MMMFDevVideoPlayProxy& aProxy) sl@0: { sl@0: iProxy = &aProxy; sl@0: } sl@0: