Update contrib.
1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
17 #include "../TestDevVideoPlayTestData.h"
19 _LIT(KDevVideoEncoderPanicCategory, "DevVideoEncoder");
20 void DevVideoEncoderPanic(TInt aReason)
22 User::Panic(KDevVideoEncoderPanicCategory, aReason);
25 CMMFVideoEncodeHwDevice* CMMFTestVideoEncodeHwDevice::NewL(TAny* /*aInitParams*/)
27 CMMFTestVideoEncodeHwDevice* s = new(ELeave) CMMFTestVideoEncodeHwDevice;
28 return (STATIC_CAST(CMMFVideoEncodeHwDevice*, s));
31 CMMFTestVideoEncodeHwDevice::CMMFTestVideoEncodeHwDevice()
35 CMMFTestVideoEncodeHwDevice::~CMMFTestVideoEncodeHwDevice()
40 // destroy objects in RArray
41 for (TInt i = 0; i < iOutputVidFormats.Count(); i++)
43 delete iOutputVidFormats[i];
46 iOutputVidFormats.Reset();
47 iOutputVidFormats.Close();
49 iInputVidFormats.Reset();
50 iInputVidFormats.Close();
52 iPictureRates.Reset();
53 iPictureRates.Close();
56 TAny* CMMFTestVideoEncodeHwDevice::CustomInterface(TUid aInterface)
58 if (aInterface == KUidCustomInterfaceThree)
60 return this;//just want to return something non-null!
68 CPreProcessorInfo* CMMFTestVideoEncodeHwDevice::PreProcessorInfoLC()
73 void CMMFTestVideoEncodeHwDevice::SetInputFormatL(const TUncompressedVideoFormat& aFormat, const TSize& aPictureSize)
75 TSize testSize(KTestInputSize1X, KTestInputSize1Y);
77 if (!(aFormat == KTestVidFormat1) || !(aPictureSize == testSize))
78 User::Leave(KErrCorrupt);
81 void CMMFTestVideoEncodeHwDevice::SetSourceCameraL(TInt aCameraHandle, TReal aPictureRate)
83 if (aCameraHandle == KTestCamHandleFatal)
84 iProxy->MdvrpFatalError(this, KErrDied);
85 else if ((KTestCamHandleEnc != aCameraHandle) || (KTestPictureRate != aPictureRate))
86 User::Leave(KErrCorrupt);
89 void CMMFTestVideoEncodeHwDevice::SetSourceMemoryL(TReal /*aMaxPictureRate*/, TBool /*aConstantPictureRate*/, TBool /*aProcessRealtime*/)
91 DevVideoEncoderPanic(EEncoderPanicSourceMem);
94 void CMMFTestVideoEncodeHwDevice::SetClockSource(MMMFClockSource* aClock)
96 __ASSERT_ALWAYS(aClock, DevVideoEncoderPanic(EEncoderPanicClockSource));
98 // call Time() to check that clock can be used
99 TTimeIntervalMicroSeconds currTime(0); // done this way to remove compiler warning
100 currTime = aClock->Time();
103 void CMMFTestVideoEncodeHwDevice::SetPreProcessTypesL(TUint32 aPreProcessTypes)
105 if (!(aPreProcessTypes == KTestProcessType1))
106 User::Leave(KErrCorrupt);
109 void CMMFTestVideoEncodeHwDevice::SetRgbToYuvOptionsL(TRgbRange aRange, const TYuvFormat& aOutputFormat)
111 // check against test data
112 if ((aRange != KTestRgbRange1) || !CompareYuvFormats(aOutputFormat, KTestYuvFormat1) )
113 User::Leave(KErrCorrupt);
116 void CMMFTestVideoEncodeHwDevice::SetYuvToYuvOptionsL(const TYuvFormat& aInputFormat, const TYuvFormat& aOutputFormat)
118 if (!CompareYuvFormats(aInputFormat, KTestYuvFormat1) || !CompareYuvFormats(aOutputFormat, KTestYuvFormat2) )
119 User::Leave(KErrCorrupt);
122 void CMMFTestVideoEncodeHwDevice::SetRotateOptionsL(TRotationType aRotationType)
124 if (!(aRotationType == KTestRotate1))
125 User::Leave(KErrCorrupt);
128 void CMMFTestVideoEncodeHwDevice::SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering)
130 TSize testScale(KTestScaleX, KTestScaleY);
131 if (!(aTargetSize == testScale) || !aAntiAliasFiltering)
132 User::Leave(KErrCorrupt);
135 void CMMFTestVideoEncodeHwDevice::SetInputCropOptionsL(const TRect& aRect)
137 TRect testRect(KTestInputCropRectA, KTestInputCropRectB, KTestInputCropRectC, KTestInputCropRectD);
138 if (!(aRect == testRect))
139 User::Leave(KErrCorrupt);
142 void CMMFTestVideoEncodeHwDevice::SetOutputCropOptionsL(const TRect& aRect)
144 TRect testRect(KTestOutputCropRectA, KTestOutputCropRectB, KTestOutputCropRectC, KTestOutputCropRectD);
145 if (!(aRect == testRect))
146 User::Leave(KErrCorrupt);
149 void CMMFTestVideoEncodeHwDevice::SetOutputPadOptionsL(const TSize& aOutputSize, const TPoint& aPicturePos)
151 TSize testPad(KTestPadX, KTestPadY);
152 TPoint testPoint(KTestPadPointX, KTestPadPointY);
154 if (!(testPad == aOutputSize) || !(testPoint == aPicturePos))
155 User::Leave(KErrCorrupt);
158 void CMMFTestVideoEncodeHwDevice::SetColorEnhancementOptionsL(const TColorEnhancementOptions& aOptions)
160 if (!CompareColorEnhancements(aOptions, KTestColorEnhance1))
161 User::Leave(KErrCorrupt);
164 void CMMFTestVideoEncodeHwDevice::SetFrameStabilisationOptionsL(const TSize& aOutputSize, TBool aFrameStabilisation)
166 TSize testSize(KTestScaleX, KTestScaleY);
167 if (!(aOutputSize == testSize) || !aFrameStabilisation)
168 User::Leave(KErrCorrupt);
171 void CMMFTestVideoEncodeHwDevice::SetCustomPreProcessOptionsL(const TDesC8& aOptions)
173 if (!(aOptions == KTestCustomPreProc1))
174 User::Leave(KErrCorrupt);
177 void CMMFTestVideoEncodeHwDevice::Initialize()
179 iProxy->MdvrpInitializeComplete(this, KErrNone);
182 void CMMFTestVideoEncodeHwDevice::WritePictureL(TVideoPicture* aPicture)
184 // change the timestamp to the encoder timestamp
185 aPicture->iTimestamp = KTestEncPictureTimestamp;
187 iProxy->MdvrpReturnPicture(aPicture);
190 void CMMFTestVideoEncodeHwDevice::InputEnd()
192 iProxy->MdvrpStreamEnd();
195 void CMMFTestVideoEncodeHwDevice::Start()
197 iRecPosition = KTestRecTimeStartEnc;
198 iIsRecording = ETrue;
200 // if we're doing the buffer tests, start sending buffers to DevVideo
201 if (iDataBuffers.Count() > 0)
203 iProxy->MdvrpNewBuffer(&(iDataBuffers[0]));
207 void CMMFTestVideoEncodeHwDevice::Stop()
209 iRecPosition = KTestRecTimeStop;
210 iIsRecording = EFalse;
213 void CMMFTestVideoEncodeHwDevice::Pause()
215 iRecPosition = KTestRecTimePauseEnc;
216 iIsRecording = EFalse;
219 void CMMFTestVideoEncodeHwDevice::Resume()
221 iRecPosition = KTestRecTimeResumeEnc;
222 iIsRecording = ETrue;
225 void CMMFTestVideoEncodeHwDevice::Freeze()
229 void CMMFTestVideoEncodeHwDevice::ReleaseFreeze()
233 TTimeIntervalMicroSeconds CMMFTestVideoEncodeHwDevice::RecordingPosition()
238 void CMMFTestVideoEncodeHwDevice::GetPictureCounters(CMMFDevVideoRecord::TPictureCounters& aCounters)
240 CMMFDevVideoRecord::TPictureCounters pic = GetTestEncPictureCounters();
242 // adjust picture counters to differentiate encoder from preproc
243 pic.iInputPictures = KTestEncInputPictures;
247 void CMMFTestVideoEncodeHwDevice::GetFrameStabilisationOutput(TRect& aRect)
249 aRect = TRect(KTestFrameStableX1, KTestFrameStableY1, KTestFrameStableX2, KTestFrameStableY2);
252 TUint CMMFTestVideoEncodeHwDevice::NumComplexityLevels()
254 return KTestNumComplexityLevels1;
257 void CMMFTestVideoEncodeHwDevice::SetComplexityLevel(TUint aLevel)
259 __ASSERT_ALWAYS(aLevel == KTestComplexityLevel1, DevVideoEncoderPanic(EEncoderPanicComplexityLevel));
262 CVideoEncoderInfo* CMMFTestVideoEncodeHwDevice::VideoEncoderInfoLC()
264 // construct array of test types
265 for (TUint i = 0; i < KTestEncoderInfoCount; i++)
267 // construct the video types for iOutputVidTypes
268 // use the same test data as for the decoder
269 CCompressedVideoFormat* vidCV = NULL;
270 TPtrC8 mimeType = KTestDecoderInfoMimeArray[i];
271 vidCV = GetTestCVFormatL(mimeType);
272 CleanupStack::PushL(vidCV);
273 User::LeaveIfError(iOutputVidFormats.Append(vidCV));
274 CleanupStack::Pop(vidCV); // CCompressedVideo object is destroyed in destructor
276 // append the uncompressed video formats
277 TUncompressedVideoFormat vidUC = KTestPostProcInfoFormatArray[i];
278 User::LeaveIfError(iInputVidFormats.Append(vidUC));
280 // append the max picture rates
281 TPictureRateAndSize rate;
282 GetTestEncoderInfoRate(i, rate);
283 User::LeaveIfError(iPictureRates.Append(rate));
286 // construct the video Encoder info object
287 CVideoEncoderInfo* vInfo = CVideoEncoderInfo::NewL(
288 KUidDevVideoTestEncodeHwDevice,
289 KTestEncoderInfoManufacturer,
290 KTestEncoderInfoIdentifier,
291 TVersion(KTestEncoderInfoVersionMaj, KTestEncoderInfoVersionMin, KTestEncoderInfoVersionBuild),
292 ETrue, // accelerated
293 ETrue, // supports direct capture
294 iInputVidFormats.Array(),
295 iOutputVidFormats.Array(),
296 TSize(KTestEncoderInfoMaxSizeX, KTestEncoderInfoMaxSizeY),
299 KTestNumBitrateLayers,
300 ETrue, // supports supplemental enhancement info
301 KTestEncoderInfoMaxUEPLevels,
302 KTestEncoderInfoMaxBitrate,
303 iPictureRates.Array(),
304 KTestEncoderInfoMaxILSSteps,
305 KTestEncoderInfoPictureOptions,
306 EFalse, // aSupportsPictureLoss,
307 ETrue, // aSupportsSliceLoss,
308 KTestEncoderInfoCSInfo,
309 KTestEncoderInfoISInfo );
312 CleanupStack::PushL(vInfo);
316 void CMMFTestVideoEncodeHwDevice::SetOutputFormatL(const CCompressedVideoFormat& aFormat,
317 TVideoDataUnitType aDataUnitType,
318 TVideoDataUnitEncapsulation aDataEncapsulation,
319 TBool aSegmentationAllowed)
321 // check expected parameters - TClasses first
322 if (!((aDataUnitType == KTestUnitType1) && (aDataEncapsulation == KTestEncapType1) && aSegmentationAllowed))
323 User::Leave(KErrCorrupt);
325 // construct a temporary compressed video class [will leave on error]
326 CCompressedVideoFormat *compVideo = GetTestCVFormatL(KTestMimeType1);
327 CleanupStack::PushL(compVideo);
329 // compare to received class
330 if (!(aFormat == *compVideo))
331 User::Leave(KErrCorrupt);
333 // destroy temporary class
334 CleanupStack::PopAndDestroy(compVideo);
337 void CMMFTestVideoEncodeHwDevice::SetOutputRectL(const TRect& aRect)
339 TRect testRect1(KTestInputCropRectA, KTestInputCropRectB, KTestInputCropRectC, KTestInputCropRectD);
341 if (!(aRect == testRect1))
342 User::Leave(KErrCorrupt);
345 void CMMFTestVideoEncodeHwDevice::SetInputDevice(CMMFVideoPreProcHwDevice* /*aDevice*/)
349 void CMMFTestVideoEncodeHwDevice::SetErrorsExpected(TBool aBitErrors, TBool aPacketLosses)
351 __ASSERT_ALWAYS(aBitErrors && !aPacketLosses, DevVideoEncoderPanic(EEncoderPanicErrorsExpected));
354 void CMMFTestVideoEncodeHwDevice::SetMinRandomAccessRate(TReal aRate)
356 __ASSERT_ALWAYS(aRate == KTestRandomAccessRate, DevVideoEncoderPanic(EEncoderPanicRandomAccessRate));
359 void CMMFTestVideoEncodeHwDevice::SetNumBitrateLayersL(TUint aNumLayers)
361 if (aNumLayers != KTestNumBitrateLayers)
362 User::Leave(KErrCorrupt);
365 void CMMFTestVideoEncodeHwDevice::SetScalabilityLayerTypeL(TUint aLayer, TScalabilityType aScalabilityType)
367 if ((aLayer != KTestLayer) || (aScalabilityType != KTestScaleType))
368 User::Leave(KErrCorrupt);
371 void CMMFTestVideoEncodeHwDevice::SetGlobalReferenceOptions(TUint aMaxReferencePictures, TUint aMaxPictureOrderDelay)
373 __ASSERT_ALWAYS((aMaxReferencePictures == KTestMaxRefPics) && (aMaxPictureOrderDelay == KTestMaxPicDelay), DevVideoEncoderPanic(EEncoderPanicRandomAccessRate));
376 void CMMFTestVideoEncodeHwDevice::SetLayerReferenceOptions(TUint aLayer, TUint aMaxReferencePictures, TUint aMaxPictureOrderDelay)
378 __ASSERT_ALWAYS((aMaxReferencePictures == KTestMaxRefPics) && (aMaxPictureOrderDelay == KTestMaxPicDelay) && (aLayer == KTestLayer), DevVideoEncoderPanic(EEncoderPanicRandomAccessRate));
381 void CMMFTestVideoEncodeHwDevice::SetBufferOptionsL(const TEncoderBufferOptions& aOptions)
383 if ( !CompareEncBufferOptions(aOptions, GetTestEncBufferOptions()) )
384 User::Leave(KErrCorrupt);
387 void CMMFTestVideoEncodeHwDevice::SetCodingStandardSpecificOptionsL(const TDesC8& aOptions)
389 if (!(aOptions == KTestCSEncoderOptions))
390 User::Leave(KErrCorrupt);
393 void CMMFTestVideoEncodeHwDevice::SetImplementationSpecificEncoderOptionsL(const TDesC8& aOptions)
395 if (aOptions == KTestISEncoderOptions)
397 // running standard test
399 else if (aOptions == KTestISEncBuffers)
401 // Special test plugin feature: we're being told to start outputting
402 // video buffers up to DevVideo.
403 // Create 10 video buffers
404 iDataBuffers.Reset();
405 for (TInt i = 0; i < 10; i++)
407 // Create a video output buffer that only has a valid timestamp
408 TVideoOutputBuffer buf;
409 buf.iCaptureTimestamp = TTimeIntervalMicroSeconds(i);
410 buf.iImplementationSpecificData.Set(KTestISEncBufferData);
411 User::LeaveIfError(iDataBuffers.Append(buf));
416 User::Leave(KErrCorrupt);
420 HBufC8* CMMFTestVideoEncodeHwDevice::CodingStandardSpecificInitOutputLC()
422 HBufC8* bob = KTestCSInitOutput().AllocL();
423 CleanupStack::PushL(bob);
428 HBufC8* CMMFTestVideoEncodeHwDevice::ImplementationSpecificInitOutputLC()
430 HBufC8* fred = KTestISInitOutput().AllocL();
431 CleanupStack::PushL(fred);
436 void CMMFTestVideoEncodeHwDevice::SetErrorProtectionLevelsL(TUint aNumLevels, TBool aSeparateBuffers)
438 if ((aNumLevels != KTestProtectLevels) || !aSeparateBuffers)
439 User::Leave(KErrCorrupt);
442 void CMMFTestVideoEncodeHwDevice::SetErrorProtectionLevelL(TUint aLevel, TUint aBitrate, TUint aStrength)
444 if ((aLevel != KTestLevel) || (aBitrate != KTestBitrate) || (aStrength != KTestStrength))
445 User::Leave(KErrCorrupt);
448 void CMMFTestVideoEncodeHwDevice::SetChannelPacketLossRate(TUint aLevel,
450 TTimeIntervalMicroSeconds32 aLossBurstLength)
452 __ASSERT_ALWAYS((aLevel == KTestLevel) && (aLossRate == KTestLossRate) && (aLossBurstLength == TTimeIntervalMicroSeconds32(KTestLossBurstLength)), DevVideoEncoderPanic(EEncoderPanicPacketLossRate));
455 void CMMFTestVideoEncodeHwDevice::SetChannelBitErrorRate(TUint aLevel, TReal aErrorRate, TReal aStdDeviation)
457 __ASSERT_ALWAYS((aLevel == KTestLevel) && (aErrorRate == KTestErrorRate) && (aStdDeviation == KTestStdDeviation), DevVideoEncoderPanic(EEncoderPanicBitErrorRate));
460 void CMMFTestVideoEncodeHwDevice::SetSegmentTargetSize(TUint aLayer, TUint aSizeBytes, TUint aSizeMacroblocks)
462 __ASSERT_ALWAYS((aLayer == KTestLayer) && (aSizeBytes == KTestSizeBytes) && (aSizeMacroblocks == KTestSizeMacroblocks), DevVideoEncoderPanic(EEncoderPanicSegmentTargetSize));
465 void CMMFTestVideoEncodeHwDevice::SetRateControlOptions(TUint aLayer, const TRateControlOptions& aOptions)
467 __ASSERT_ALWAYS(CompareRateControlOptions(aOptions, GetTestRateControlOptions()) && (aLayer == KTestLayer), DevVideoEncoderPanic(EEncoderPanicRateControlOptions));
470 void CMMFTestVideoEncodeHwDevice::SetInLayerScalabilityL(TUint aLayer, TUint aNumSteps,
471 TInLayerScalabilityType aScalabilityType,
472 const TArray<TUint>& aBitrateShare,
473 const TArray<TUint>& aPictureShare)
475 // check the non-array classes first
476 if ((aLayer != KTestLayer) || (aNumSteps != KTestNumSteps) || (aScalabilityType != KTestLayerScaleType) )
477 User::Leave(KErrCorrupt);
479 TBool successBit = EFalse;
480 TBool successPic = EFalse;
482 // bitrateShare array
483 if (aBitrateShare.Count() == 2)
485 if ((aBitrateShare[0] == KTestBitrateShare1) && (aBitrateShare[1] == KTestBitrateShare2))
491 // pictureShare array
492 if (aPictureShare.Count() == 2)
494 if ((aPictureShare[0] == KTestPictureShare1) && (aPictureShare[1] == KTestPictureShare2))
500 if (!successBit || !successPic)
501 User::Leave(KErrCorrupt);
504 void CMMFTestVideoEncodeHwDevice::SetLayerPromotionPointPeriod(TUint aLayer, TUint aPeriod)
506 __ASSERT_ALWAYS((aLayer == KTestLayer) && (aPeriod == KTestPointPeriod), DevVideoEncoderPanic(EEncoderPanicPointPromPeriod));
509 HBufC8* CMMFTestVideoEncodeHwDevice::CodingStandardSpecificSettingsOutputLC()
511 HBufC8* chaz = KTestCSSettingsOutput().AllocL();
512 CleanupStack::PushL(chaz);
517 HBufC8* CMMFTestVideoEncodeHwDevice::ImplementationSpecificSettingsOutputLC()
519 HBufC8* dave = KTestISSettingsOutput().AllocL();
520 CleanupStack::PushL(dave);
525 void CMMFTestVideoEncodeHwDevice::SendSupplementalInfoL(const TDesC8& aData)
527 if (!(aData == KTestSuppInfo))
528 User::Leave(KErrCorrupt);
530 iProxy->MdvrpSupplementalInfoSent();
533 void CMMFTestVideoEncodeHwDevice::SendSupplementalInfoL(const TDesC8& aData, const TTimeIntervalMicroSeconds& aTimestamp)
535 if (!(aData == KTestSuppInfo))
536 User::Leave(KErrCorrupt);
538 TTimeIntervalMicroSeconds suppTime(KTestSuppTime);
539 TTimeIntervalMicroSeconds suppTimeCancel(KTestSuppTimeCancel);
542 if (!(aTimestamp == TTimeIntervalMicroSeconds(suppTime)) &&
543 !(aTimestamp == TTimeIntervalMicroSeconds(suppTimeCancel) ))
544 User::Leave(KErrCorrupt);
548 // don't send callback if cancel supp time requested
549 if (aTimestamp == suppTime)
550 iProxy->MdvrpSupplementalInfoSent();
553 void CMMFTestVideoEncodeHwDevice::CancelSupplementalInfo()
556 iProxy->MdvrpSupplementalInfoSent();
561 void CMMFTestVideoEncodeHwDevice::GetOutputBufferStatus(TUint& aNumFreeBuffers, TUint& aTotalFreeBytes)
563 aNumFreeBuffers = KTestFreeBuffers;
564 aTotalFreeBytes = KTestFreeBytes;
567 void CMMFTestVideoEncodeHwDevice::ReturnBuffer(TVideoOutputBuffer* /*aBuffer*/)
569 switch (iCurrentBuffer)
572 // Send two more buffers
574 iProxy->MdvrpNewBuffer(&(iDataBuffers[1]));
576 iProxy->MdvrpNewBuffer(&(iDataBuffers[2]));
579 // Send three more buffers
581 iProxy->MdvrpNewBuffer(&(iDataBuffers[3]));
583 iProxy->MdvrpNewBuffer(&(iDataBuffers[4]));
585 iProxy->MdvrpNewBuffer(&(iDataBuffers[5]));
588 // Send the rest of the buffers
590 iProxy->MdvrpNewBuffer(&(iDataBuffers[6]));
592 iProxy->MdvrpNewBuffer(&(iDataBuffers[7]));
594 iProxy->MdvrpNewBuffer(&(iDataBuffers[8]));
596 iProxy->MdvrpNewBuffer(&(iDataBuffers[9]));
603 void CMMFTestVideoEncodeHwDevice::PictureLoss()
607 void CMMFTestVideoEncodeHwDevice::PictureLoss(const TArray<TPictureId>& aPictures)
609 TBool success = EFalse;
611 if (aPictures.Count() == 3)
613 if (ComparePictureIDs(aPictures[0], KTestPictureId1) &&
614 ComparePictureIDs(aPictures[1], KTestPictureId2) &&
615 ComparePictureIDs(aPictures[2], KTestPictureId3) )
621 __ASSERT_ALWAYS(success, DevVideoEncoderPanic(EEncoderPanicPictureLossSpec));
624 void CMMFTestVideoEncodeHwDevice::SliceLoss(TUint aFirstMacroblock, TUint aNumMacroblocks, const TPictureId& aPicture)
626 __ASSERT_ALWAYS((aFirstMacroblock == KTestFirstMacroblock) &&
627 (aNumMacroblocks == KTestNumMacroblocks) &&
628 ComparePictureIDs(aPicture, KTestPictureId1), DevVideoEncoderPanic(EEncoderPanicSliceLoss));
631 void CMMFTestVideoEncodeHwDevice::ReferencePictureSelection(const TDesC8& aSelectionData)
633 __ASSERT_ALWAYS((aSelectionData == KTestRefPictureInfo), DevVideoEncoderPanic(EEncoderPanicRefPictureInfo));
636 void CMMFTestVideoEncodeHwDevice::CommitL()
640 void CMMFTestVideoEncodeHwDevice::Revert()
644 void CMMFTestVideoEncodeHwDevice::SetProxy(MMMFDevVideoRecordProxy& aProxy)
646 ASSERT(iProxy == NULL);