os/mm/mmdevicefw/mdf/src/video/encoderadapter/mdfvideoencodehwdeviceadapter.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include "mdfvideoencodehwdeviceadapter.h"
    17 #include <mmf/server/mmfdatabuffer.h>
    18 #include <mmf/devvideo/devvideobase.h>
    19 #include <mmf/devvideo/devvideopuconfig.h>
    20 #include <mmf/server/mmfdatabuffer.h>
    21 
    22 // Literal descriptor for the encoder's info
    23 _LIT8(KEncoderInfoCSInfo, "Coded by Symbian");
    24 // Literal descriptor for the encoder's implementation info
    25 _LIT8(KEncoderInfoISInfo, "Implemented by Symbian");
    26 // Literal descriptor for the video encoder panic
    27 _LIT(KDevVideoEncoderPanicCategory, "DevVideoEncoder");
    28 
    29 // Processing unit's input port index
    30 const TInt KEncoderPUInputPortIndex  = 0;
    31 // Processing unit's output port index
    32 const TInt KEncoderPUOutputPortIndex = 0;
    33 // Processing unit's major version number
    34 const TInt KEncoderPUInfoVersionMaj = 0;
    35 // Processing unit's minor version number
    36 const TInt KEncoderPUInfoVersionMin = 1;
    37 // Processing unit's build version number
    38 const TInt KEncoderPUInfoVersionBuild = 1;
    39 // Bytes per pixel
    40 const TInt KBytesPerPixel = 3;
    41 
    42 void DevVideoEncoderPanic(TInt aReason)
    43 	{
    44 	User::Panic(KDevVideoEncoderPanicCategory, aReason);
    45 	}
    46 
    47 
    48 /** 
    49  Constructs a new instance of CMdfVideoEncodeHwDeviceAdapter.
    50  @return    "CMdfVideoEncodeHwDeviceAdapter*"
    51             A pointer to the newly constructed HwDevice
    52  */
    53 CMdfVideoEncodeHwDeviceAdapter* CMdfVideoEncodeHwDeviceAdapter::NewL()
    54 	{
    55 	CMdfVideoEncodeHwDeviceAdapter* self = new(ELeave) CMdfVideoEncodeHwDeviceAdapter;
    56 	CleanupStack::PushL(self);
    57 	self->ConstructL();
    58 	CleanupStack::Pop(self);
    59 	return self;
    60 	}
    61 
    62 /**
    63  Default constructor
    64 */
    65 CMdfVideoEncodeHwDeviceAdapter::CMdfVideoEncodeHwDeviceAdapter()
    66 	{
    67 	}
    68 
    69 /**
    70  Safe contructor for CMdfVideoEncodeHwDeviceAdapter.
    71 */
    72 void CMdfVideoEncodeHwDeviceAdapter::ConstructL()
    73 	{
    74 	// Load the PU Loader plugin
    75 	iPuLoader = static_cast<CMdfPuLoader*>
    76 		(REComSession::CreateImplementationL(TUid::Uid(KUidPuLoaderImplementation), iPuLoaderDtorKey));
    77 	}
    78 
    79 /**
    80  Default destructor
    81 */
    82 CMdfVideoEncodeHwDeviceAdapter::~CMdfVideoEncodeHwDeviceAdapter()
    83 	{
    84 	if(iEncoderPU) 
    85 		{
    86 		iPuLoader->UnloadProcessingUnit(iEncoderPU);		
    87 		}
    88 
    89 	delete iPuLoader;
    90 	delete iPuData;
    91 	delete iManufacturer;
    92 	REComSession::DestroyedImplementation(iPuLoaderDtorKey);
    93 
    94 	for (TInt i = 0; i < iOutputVideoFormats.Count(); i++)
    95 		{
    96 		delete iOutputVideoFormats[i];
    97 		}
    98 		
    99 	iEncoderPUOutputPortsArray.Reset();
   100 	iEncoderPUOutputPortsArray.Close();
   101 	
   102 	iEncoderPUInputPortsArray.Reset();
   103 	iEncoderPUInputPortsArray.Close();
   104 	
   105 	iPictureRates.Reset();
   106 	iPictureRates.Close();
   107 	
   108 	iInputVideoFormats.Reset();
   109 	iInputVideoFormats.Close();
   110 	
   111 	iOutputVideoFormats.Reset();
   112 	iOutputVideoFormats.Close();
   113 		
   114 	for (TInt i = 0; i < iDataBuffers.Count(); i++)
   115 		{
   116 		User::Free((TAny*)iDataBuffers[i].iData.Ptr());
   117 		}
   118 	iDataBuffers.Reset();
   119 	iDataBuffers.Close();
   120 	
   121 	delete iInputBuffer;
   122 	delete iOutputBuffer;
   123 	}
   124 
   125 void CMdfVideoEncodeHwDeviceAdapter::LoadProcessingUnitL(const CImplementationInformation& aImplInfo)
   126 	{
   127 	iPuUid = aImplInfo.ImplementationUid();
   128 	
   129 	iEncoderPU = iPuLoader->LoadProcessingUnitL(*this,iPuUid);
   130 	// store the opaque data associated with this PU so we can extract information about 
   131 	// the PU later
   132 	iPuData = CCodecApiVideoOpaqueData::NewL(aImplInfo.OpaqueData());
   133 	iManufacturer = HBufC::NewL(iPuData->Manufacturer().Length());
   134 	iManufacturer->Des().Copy(iPuData->Manufacturer());
   135 	}
   136 
   137 // private method : body of Initialize()
   138 void CMdfVideoEncodeHwDeviceAdapter::InitializeL()
   139 	{
   140 	if (!iEncoderPU)
   141 		{
   142 		iProxy->MdvrpInitializeComplete(this, KErrNotFound);
   143 		return;	
   144 		}
   145 	
   146 	// we have to pre-check that the image format is set correctly,
   147 	// else an attempt to set it into the config will panic.
   148 	switch(iFormat.iDataFormat) 
   149 		{
   150 		case 0:
   151 			User::Leave(KErrNotReady);
   152 			break;
   153 		case ERgbRawData:
   154 		case ERgbFbsBitmap:
   155 		case EYuvRawData:
   156 			break;
   157 		default:
   158 			User::Leave(KErrNotSupported);
   159 			break;
   160 		}
   161 
   162 	// get the encoder input ports
   163 	User::LeaveIfError(iEncoderPU->GetInputPorts(iEncoderPUInputPortsArray));
   164 
   165 	// set the observer for the encoder input ports
   166 	for(TInt i = 0; i < iEncoderPUInputPortsArray.Count(); i++)
   167 		{
   168 		iEncoderPUInputPortsArray[i]->MipSetObserver(*this);
   169 		}
   170 		
   171 	// get the encoder output ports
   172 	User::LeaveIfError(iEncoderPU->GetOutputPorts(iEncoderPUOutputPortsArray));
   173 
   174 	// set the observer for the encoder input ports
   175 	for(TInt i = 0; i < iEncoderPUOutputPortsArray.Count(); i++)
   176 		{
   177 		iEncoderPUOutputPortsArray[i]->MopSetObserver(*this);
   178 		}
   179 
   180 	TInt bufSize = iPictureSize.iHeight * iPictureSize.iWidth * KBytesPerPixel;
   181 	iDataBuffers.Reset();
   182 
   183 	// create the buffer. zero out all fields
   184 	TVideoOutputBuffer buf;
   185 	memset(&buf, 0, sizeof(buf));
   186 
   187 	TUint8* bufData = (TUint8*)User::AllocL(bufSize);
   188 	CleanupStack::PushL(bufData);
   189 	
   190 	buf.iData.Set(bufData, bufSize);
   191 	iDataBuffers.AppendL(buf);
   192 	
   193 	CleanupStack::Pop(bufData); // don't destroy - owned by iDataBuffers
   194 
   195 	TDevVideoRecordPuConfig config;
   196 	config.iFrameSize = iPictureSize;
   197 	config.iImageFormat = iFormat;
   198 	config.iFrameRate = iFrameRate;
   199 		
   200 	TPuConfigDevVideoRecord puConfig(config);
   201 
   202 	// initialize with config info.
   203 	iEncoderPU->Configure(puConfig);
   204 	
   205 	// create input buffer
   206 	iInputBuffer = CMMFDescriptorBuffer::NewL(bufSize);
   207 	iEncoderPUInputPortsArray[KEncoderPUInputPortIndex]->MipUseBuffer(*iInputBuffer);
   208 			
   209 	// create output buffer 
   210 	TUint32 outputPortBufferSize = 
   211 		iEncoderPUOutputPortsArray[KEncoderPUOutputPortIndex]->MopBufferSize();
   212 	iOutputBuffer = CMMFDescriptorBuffer::NewL(outputPortBufferSize);
   213 	iEncoderPUOutputPortsArray[KEncoderPUOutputPortIndex]->MopUseBuffer(*iOutputBuffer);
   214 	
   215 	// initialize the encoder PU
   216 	iEncoderPU->Initialize();
   217 	
   218 	}
   219 
   220 /**
   221  @see CMMFVideoHwDevice
   222  */
   223 TAny* CMdfVideoEncodeHwDeviceAdapter::CustomInterface(TUid aInterface)
   224 	{
   225 	if (aInterface.iUid == KUidDevVideoHwDeviceAdapterSetup)
   226 		{
   227 		return static_cast<MDevVideoHwDeviceAdapterSetup*>(this);
   228 		}
   229 	return NULL;
   230 	}
   231 
   232 /**
   233  @see CMMFVideoRecordHwDevice
   234  */
   235 CPreProcessorInfo* CMdfVideoEncodeHwDeviceAdapter::PreProcessorInfoLC()
   236 	{
   237 	// we have no preprocessor info
   238 	return NULL;
   239 	}
   240 
   241 /**
   242  @see CMMFVideoRecordHwDevice
   243  */
   244 void CMdfVideoEncodeHwDeviceAdapter::SetInputFormatL(const TUncompressedVideoFormat& aFormat, const TSize& aPictureSize)
   245 	{
   246 	iFormat = aFormat;
   247 	iPictureSize = aPictureSize;
   248 	}
   249 
   250 /**
   251  @see CMMFVideoRecordHwDevice
   252  */
   253 void CMdfVideoEncodeHwDeviceAdapter::SetSourceCameraL(TInt /* aCameraHandle */, TReal /* aPictureRate */)
   254 	{
   255 	User::Leave(KErrNotSupported);
   256 	}
   257 
   258 /**
   259  @see CMMFVideoRecordHwDevice
   260  */
   261 void CMdfVideoEncodeHwDeviceAdapter::SetSourceMemoryL(TReal aMaxPictureRate, TBool /* aConstantPictureRate */, TBool /* aProcessRealtime */)
   262 	{
   263 	iFrameRate = (TInt)aMaxPictureRate;
   264 	}
   265 
   266 /**
   267  @see CMMFVideoRecordHwDevice
   268  */
   269 void CMdfVideoEncodeHwDeviceAdapter::Initialize()
   270 	{
   271 	TRAPD(err, InitializeL());
   272 	if(err != KErrNone) 
   273 		{
   274 		iProxy->MdvrpInitializeComplete(this, err);
   275 		}
   276 	}
   277 	
   278 /**
   279  @see CMMFVideoRecordHwDevice
   280  */
   281 void CMdfVideoEncodeHwDeviceAdapter::WritePictureL(TVideoPicture* aPicture)
   282 	{
   283 	__ASSERT_ALWAYS(iEncoderPU, DevVideoEncoderPanic(0));
   284 	
   285 	if(!aPicture) 
   286 		{
   287 		User::Leave(KErrArgument);
   288 		}
   289 		
   290 	// the picture size MUST be the same as the size the encoder has
   291 	// been initialized with. 
   292 	if(aPicture->iData.iDataSize != iPictureSize) 
   293 	{
   294 		User::Leave(KErrArgument);
   295 	}
   296 	
   297 	// Picture received : increment picture count
   298 	iPictureCounters.iInputPictures++;
   299 	iCurrentPicture = aPicture;
   300 	TDes8& data = iInputBuffer->Data();
   301 	data.SetLength((*aPicture->iData.iRawData).Length());
   302 	data.Copy(*aPicture->iData.iRawData);
   303 	iEncoderPUInputPortsArray[KEncoderPUInputPortIndex]->MipWriteData(*iInputBuffer);
   304 	iEncoderPUOutputPortsArray[KEncoderPUOutputPortIndex]->MopReadData(*iOutputBuffer);	
   305 	
   306 	// Picture encoded : increment picture count
   307 	iPictureCounters.iPicturesProcessed++;
   308 	}
   309 
   310 /**
   311  @see CMMFVideoRecordHwDevice
   312  */
   313 void CMdfVideoEncodeHwDeviceAdapter::InputEnd()
   314 	{
   315 	// The client has notified us it has reached the end of the input stream
   316 	iInputStreamEnd = ETrue;
   317 	iProxy->MdvrpStreamEnd();
   318 	}
   319 
   320 /**
   321  @see CMMFVideoRecordHwDevice
   322  */
   323 void CMdfVideoEncodeHwDeviceAdapter::Start()
   324 	{
   325 	__ASSERT_ALWAYS(iEncoderPU, DevVideoEncoderPanic(0));
   326 	iEncoderPU->Execute();
   327 	}
   328 
   329 /**
   330  @see CMMFVideoRecordHwDevice
   331  */
   332 void CMdfVideoEncodeHwDeviceAdapter::Stop()
   333 	{
   334 	iProxy->MdvrpFatalError(this, KErrNotSupported);
   335 	}
   336 
   337 /**
   338  @see CMMFVideoRecordHwDevice
   339  */
   340 void CMdfVideoEncodeHwDeviceAdapter::Pause()
   341 	{
   342 	iProxy->MdvrpFatalError(this, KErrNotSupported);
   343 	}
   344 
   345 /**
   346  @see CMMFVideoRecordHwDevice
   347  */
   348 void CMdfVideoEncodeHwDeviceAdapter::Resume()
   349 	{
   350 	iProxy->MdvrpFatalError(this, KErrNotSupported);
   351 	}
   352 
   353 /**
   354  @see CMMFVideoRecordHwDevice
   355  */
   356 void CMdfVideoEncodeHwDeviceAdapter::Freeze()
   357 	{
   358 	iProxy->MdvrpFatalError(this, KErrNotSupported);
   359 	}
   360 
   361 /**
   362  @see CMMFVideoRecordHwDevice
   363  */
   364 void CMdfVideoEncodeHwDeviceAdapter::ReleaseFreeze()
   365 	{
   366 	iProxy->MdvrpFatalError(this, KErrNotSupported);
   367 	}
   368 
   369 /**
   370  @see CMMFVideoRecordHwDevice
   371  */
   372 TTimeIntervalMicroSeconds CMdfVideoEncodeHwDeviceAdapter::RecordingPosition()
   373 	{
   374 	// return picture count times frame rate
   375 	return iPictureCounters.iPicturesProcessed * (1000000 / iFrameRate);
   376 	}
   377 
   378 /**
   379  @see CMMFVideoRecordHwDevice
   380  */
   381 void CMdfVideoEncodeHwDeviceAdapter::GetPictureCounters(CMMFDevVideoRecord::TPictureCounters& aCounters)
   382 	{
   383 	aCounters = iPictureCounters;
   384 	}
   385 
   386 /**
   387  @see CMMFVideoRecordHwDevice
   388  */
   389 void CMdfVideoEncodeHwDeviceAdapter::GetFrameStabilisationOutput(TRect& aRect)
   390 	{
   391 	aRect = TRect(iPictureSize);
   392 	}
   393 
   394 /**
   395  @see CMMFVideoRecordHwDevice
   396  */
   397 TUint CMdfVideoEncodeHwDeviceAdapter::NumComplexityLevels()
   398 	{
   399 	// separate complexity levels are not available; return 1
   400 	return 1;
   401 	}
   402 
   403 /**
   404  @see CMMFVideoRecordHwDevice
   405  */
   406 void CMdfVideoEncodeHwDeviceAdapter::SetComplexityLevel(TUint /* aLevel */)
   407 	{
   408 	}
   409 
   410 /**
   411  @see CMMFVideoEncodeHwDevice
   412  */
   413 CVideoEncoderInfo* CMdfVideoEncodeHwDeviceAdapter::VideoEncoderInfoLC()
   414 	{
   415 	//if PU is not loaded panic
   416 	if(iPuData == NULL)	
   417 		{
   418 		DevVideoEncoderPanic(KErrNotReady);	
   419 		}
   420 	// output formats array
   421 	iOutputVideoFormats.Reset();
   422 	CCompressedVideoFormat* videoCV = NULL;
   423 	videoCV = CCompressedVideoFormat::NewL(iPuData->OutputDataType() , KNullDesC8);
   424 	CleanupStack::PushL(videoCV);
   425 	iOutputVideoFormats.AppendL(videoCV);
   426 	// Note; CCompressedVideo object is destroyed in destructor
   427 	CleanupStack::Pop(videoCV);
   428 	
   429 	// input formats array
   430 	iInputVideoFormats.Reset();
   431 	TUncompressedVideoFormat inputFormats[3];
   432 	inputFormats[0].iDataFormat = ERgbRawData;
   433 	inputFormats[0].iRgbFormat = ERgb16bit565;
   434 	iInputVideoFormats.AppendL(inputFormats[0]);
   435 	inputFormats[1].iDataFormat = ERgbFbsBitmap;
   436 	inputFormats[1].iRgbFormat = EFbsBitmapColor16M;
   437 	iInputVideoFormats.AppendL(inputFormats[1]);
   438 	inputFormats[2].iDataFormat = EYuvRawData;
   439     memset(&inputFormats[2].iYuvFormat, 0, sizeof(TYuvFormat));
   440 	iInputVideoFormats.AppendL(inputFormats[2]);
   441 		
   442 	// construct the video Encoder info object
   443 	CVideoEncoderInfo* vInfo = CVideoEncoderInfo::NewL(
   444 		iPuUid,
   445 		*iManufacturer,
   446 		KNullDesC,
   447 		TVersion(KEncoderPUInfoVersionMaj, KEncoderPUInfoVersionMin, KEncoderPUInfoVersionBuild),
   448 		EFalse, // not accelerated
   449 		EFalse, // does not support direct capture
   450 		iInputVideoFormats.Array(),
   451 		iOutputVideoFormats.Array(),
   452 		iPuData->MaxPictureSize(),
   453 		EDuCodedPicture, // data unit type(s)
   454 		EDuElementaryStream, // data encapsulation type
   455 		1, // num bitrate layers
   456 		EFalse, // does not support supplemental enhancement info
   457 		1, // unequal error protection levels not supported
   458 		KMaxTUint32, // max bitrate supported
   459 		iPuData->MaxPictureRates().Array(),
   460 		1, // in-layer scalability not supported
   461 		0, // no supported picture options
   462 		EFalse, // picture loss not supported,
   463 		EFalse, // slice loss not supported,
   464 		KEncoderInfoCSInfo,
   465 		KEncoderInfoISInfo);
   466 
   467 	CleanupStack::PushL(vInfo);
   468 	return vInfo;
   469 	}
   470 
   471 /**
   472  @see CMMFVideoEncodeHwDevice
   473  */
   474 void CMdfVideoEncodeHwDeviceAdapter::SetOutputFormatL(const CCompressedVideoFormat& /* aFormat */, 
   475 					  TVideoDataUnitType /* aDataUnitType */, 					
   476 					  TVideoDataUnitEncapsulation /* aDataEncapsulation */,
   477 					  TBool /* aSegmentationAllowed */)
   478 	{
   479 	User::Leave(KErrNotSupported);
   480 	}
   481 
   482 /**
   483  @see CMMFVideoEncodeHwDevice
   484  */
   485 void CMdfVideoEncodeHwDeviceAdapter::SetOutputRectL(const TRect& /* aRect */)
   486 	{
   487 	User::Leave(KErrNotSupported);
   488 	}
   489 
   490 /**
   491  @see CMMFVideoEncodeHwDevice
   492  */
   493 void CMdfVideoEncodeHwDeviceAdapter::SetInputDevice(CMMFVideoPreProcHwDevice* /*aDevice*/)
   494 	{
   495 	// Function is not supported.
   496 	}
   497 
   498 /**
   499  @see CMMFVideoEncodeHwDevice
   500  */
   501 void CMdfVideoEncodeHwDeviceAdapter::SetErrorsExpected(TBool /* aBitErrors */, TBool /* aPacketLosses */)
   502 	{
   503 	// Function is not supported.
   504 	}
   505 
   506 /**
   507  @see CMMFVideoEncodeHwDevice
   508  */
   509 void CMdfVideoEncodeHwDeviceAdapter::SetMinRandomAccessRate(TReal /* aRate */)
   510 	{
   511 	// Function is not supported.
   512 	}
   513 
   514 /**
   515  @see CMMFVideoEncodeHwDevice
   516  */
   517 void CMdfVideoEncodeHwDeviceAdapter::SetNumBitrateLayersL(TUint /* aNumLayers */)
   518 	{
   519 	User::Leave(KErrNotSupported);
   520 	}
   521 
   522 /**
   523  @see CMMFVideoEncodeHwDevice
   524  */
   525 void CMdfVideoEncodeHwDeviceAdapter::SetScalabilityLayerTypeL(TUint /* aLayer */, TScalabilityType /* aScalabilityType */)
   526 	{
   527 	User::Leave(KErrNotSupported);
   528 	}
   529 
   530 /**
   531  @see CMMFVideoEncodeHwDevice
   532  */
   533 void CMdfVideoEncodeHwDeviceAdapter::SetGlobalReferenceOptions(TUint /* aMaxReferencePictures */, TUint /* aMaxPictureOrderDelay */)
   534 	{
   535 	// Function is not supported.
   536 	}
   537 
   538 /**
   539  @see CMMFVideoEncodeHwDevice
   540  */
   541 void CMdfVideoEncodeHwDeviceAdapter::SetLayerReferenceOptions(TUint /* aLayer */, TUint /* aMaxReferencePictures */, TUint /* aMaxPictureOrderDelay */)
   542 	{
   543 	// Function is not supported.
   544 	}
   545 
   546 /**
   547  @see CMMFVideoEncodeHwDevice
   548  */
   549 void CMdfVideoEncodeHwDeviceAdapter::SetBufferOptionsL(const TEncoderBufferOptions& /* aOptions */)
   550 	{
   551 	User::Leave(KErrNotSupported);
   552 	}
   553 
   554 /**
   555  @see CMMFVideoEncodeHwDevice
   556  */
   557 void CMdfVideoEncodeHwDeviceAdapter::SetCodingStandardSpecificOptionsL(const TDesC8& /* aOptions */)
   558 	{
   559 	User::Leave(KErrNotSupported);
   560 	}
   561 
   562 /**
   563  @see CMMFVideoEncodeHwDevice
   564  */
   565 void CMdfVideoEncodeHwDeviceAdapter::SetImplementationSpecificEncoderOptionsL(const TDesC8& /* aOptions */)
   566 	{
   567 	User::Leave(KErrNotSupported);
   568 	}
   569 
   570 /**
   571  @see CMMFVideoEncodeHwDevice
   572  */
   573 HBufC8* CMdfVideoEncodeHwDeviceAdapter::CodingStandardSpecificInitOutputLC()
   574 	{
   575 	User::Leave(KErrNotSupported);
   576 	return NULL;
   577 	}
   578 
   579 /**
   580  @see CMMFVideoEncodeHwDevice
   581  */
   582 HBufC8* CMdfVideoEncodeHwDeviceAdapter::ImplementationSpecificInitOutputLC()
   583 	{
   584 	User::Leave(KErrNotSupported);
   585 	return NULL;
   586 	}
   587 
   588 /**
   589  @see CMMFVideoEncodeHwDevice
   590  */
   591 void CMdfVideoEncodeHwDeviceAdapter::SetErrorProtectionLevelsL(TUint /* aNumLevels */, TBool /* aSeparateBuffers */)
   592 	{
   593 	User::Leave(KErrNotSupported);
   594 	}
   595 
   596 /**
   597  @see CMMFVideoEncodeHwDevice
   598  */
   599 void CMdfVideoEncodeHwDeviceAdapter::SetErrorProtectionLevelL(TUint /* aLevel */, TUint /* aBitrate */, TUint /* aStrength */)
   600 	{
   601 	User::Leave(KErrNotSupported);
   602 	}
   603 
   604 /**
   605  @see CMMFVideoEncodeHwDevice
   606  */
   607 void CMdfVideoEncodeHwDeviceAdapter::SetChannelPacketLossRate(TUint /* aLevel */, 
   608 							  TReal /* aLossRate */, 
   609 							  TTimeIntervalMicroSeconds32 /* aLossBurstLength */)
   610 	{
   611 	// Function is not supported.
   612 	}
   613 
   614 /**
   615  @see CMMFVideoEncodeHwDevice
   616  */
   617 void CMdfVideoEncodeHwDeviceAdapter::SetChannelBitErrorRate(TUint /* aLevel */, TReal /* aErrorRate */, TReal /* aStdDeviation */)
   618 	{
   619 	// Function is not supported.
   620 	}
   621 
   622 /**
   623  @see CMMFVideoEncodeHwDevice
   624  */
   625 void CMdfVideoEncodeHwDeviceAdapter::SetSegmentTargetSize(TUint /* aLayer */, TUint /* aSizeBytes */, TUint /* aSizeMacroblocks */)
   626 	{
   627 	// Function is not supported.
   628 	}
   629 
   630 /**
   631  @see CMMFVideoEncodeHwDevice
   632  */
   633 void CMdfVideoEncodeHwDeviceAdapter::SetRateControlOptions(TUint /* aLayer */, const TRateControlOptions& /* aOptions */)
   634 	{
   635 	// Function is not supported.
   636 	}
   637 
   638 /**
   639  @see CMMFVideoEncodeHwDevice
   640  */
   641 void CMdfVideoEncodeHwDeviceAdapter::SetInLayerScalabilityL(TUint /* aLayer */, TUint /* aNumSteps */,
   642 							TInLayerScalabilityType /* aScalabilityType */,
   643 							const TArray<TUint>& /* aBitrateShare */,
   644 							const TArray<TUint>& /* aPictureShare */)
   645 	{
   646 	User::Leave(KErrNotSupported);
   647 	}
   648 
   649 /**
   650  @see CMMFVideoEncodeHwDevice
   651  */
   652 void CMdfVideoEncodeHwDeviceAdapter::SetLayerPromotionPointPeriod(TUint /* aLayer */, TUint /* aPeriod */)
   653 	{
   654 	// Function is not supported.
   655 	}
   656 
   657 /**
   658  @see CMMFVideoEncodeHwDevice
   659  */
   660 HBufC8* CMdfVideoEncodeHwDeviceAdapter::CodingStandardSpecificSettingsOutputLC()
   661 	{
   662 	User::Leave(KErrNotSupported);
   663 	return NULL;
   664 	}
   665 
   666 /**
   667  @see CMMFVideoEncodeHwDevice
   668  */
   669 HBufC8* CMdfVideoEncodeHwDeviceAdapter::ImplementationSpecificSettingsOutputLC()
   670 	{
   671 	User::Leave(KErrNotSupported);
   672 	return NULL;
   673 	}
   674 
   675 /**
   676  @see CMMFVideoEncodeHwDevice
   677  */
   678 void CMdfVideoEncodeHwDeviceAdapter::SendSupplementalInfoL(const TDesC8& /* aData */)
   679 	{
   680 	User::Leave(KErrNotSupported);
   681 	}
   682 
   683 /**
   684  @see CMMFVideoEncodeHwDevice
   685  */
   686 void CMdfVideoEncodeHwDeviceAdapter::SendSupplementalInfoL(const TDesC8& /* aData */, const TTimeIntervalMicroSeconds& /* aTimestamp */)
   687 	{
   688 	User::Leave(KErrNotSupported);
   689 	}
   690 
   691 /**
   692  @see CMMFVideoEncodeHwDevice
   693  */
   694 void CMdfVideoEncodeHwDeviceAdapter::CancelSupplementalInfo()
   695 	{
   696 	// Function is not supported.
   697 	}
   698 
   699 /**
   700  @see CMMFVideoEncodeHwDevice
   701  */
   702 void CMdfVideoEncodeHwDeviceAdapter::GetOutputBufferStatus(TUint& aNumFreeBuffers, TUint& aTotalFreeBytes)
   703 	{
   704 	// We have one output buffer, which has a max size of one raw frame.
   705 	aNumFreeBuffers = 1;
   706 	aTotalFreeBytes = iDataBuffers[0].iData.Size();
   707 	}
   708 
   709 /**
   710  @see CMMFVideoEncodeHwDevice
   711  */
   712 void CMdfVideoEncodeHwDeviceAdapter::ReturnBuffer(TVideoOutputBuffer* /*aBuffer*/)
   713 	{
   714 	// Receive a used output buffer (from DevVideoRecord)
   715 	// We do nothing - we have one buffer, which is going to be re-used.
   716 	}
   717 
   718 /**
   719  @see CMMFVideoEncodeHwDevice
   720  */
   721 void CMdfVideoEncodeHwDeviceAdapter::PictureLoss()
   722 	{
   723 	// Function is not supported.
   724 	}
   725 
   726 /**
   727  @see CMMFVideoEncodeHwDevice
   728  */
   729 void CMdfVideoEncodeHwDeviceAdapter::PictureLoss(const TArray<TPictureId>& /* aPictures */)
   730 	{
   731 	// Function is not supported.
   732 	}
   733 
   734 /**
   735  @see CMMFVideoEncodeHwDevice
   736  */
   737 void CMdfVideoEncodeHwDeviceAdapter::SliceLoss(TUint /* aFirstMacroblock */, TUint /* aNumMacroblocks */, const TPictureId& /* aPicture */)
   738 	{
   739 	// Function is not supported.
   740 	}
   741 
   742 /**
   743  @see CMMFVideoEncodeHwDevice
   744  */
   745 void CMdfVideoEncodeHwDeviceAdapter::ReferencePictureSelection(const TDesC8& /* aSelectionData */)
   746 	{
   747 	// Function is not supported.
   748 	}
   749 
   750 /**
   751  @see CMMFVideoRecordHwDevice
   752  */
   753 void CMdfVideoEncodeHwDeviceAdapter::CommitL()
   754 	{
   755 	User::Leave(KErrNotSupported);
   756 	}
   757 
   758 /**
   759  @see CMMFVideoRecordHwDevice
   760  */
   761 void CMdfVideoEncodeHwDeviceAdapter::Revert()
   762 	{
   763 	// Function is not supported.
   764 	}
   765 
   766 /**
   767  @see CMMFVideoEncodeHwDevice
   768  */
   769 void CMdfVideoEncodeHwDeviceAdapter::SetProxy(MMMFDevVideoRecordProxy& aProxy)
   770 	{
   771 	ASSERT(!iProxy);
   772 	iProxy = &aProxy;
   773 	}
   774 
   775 void CMdfVideoEncodeHwDeviceAdapter::MipoWriteDataComplete(const MMdfInputPort* aInputPort, CMMFBuffer* aBuffer, TInt aErrorCode) 
   776 	{
   777 	if (aErrorCode != KErrNone)
   778 		{
   779 		iProxy->MdvrpFatalError(this, aErrorCode);
   780 		return;
   781 		}
   782 	
   783 	if (aInputPort == iEncoderPUInputPortsArray[KEncoderPUInputPortIndex])
   784 		{
   785 		if (aBuffer->LastBuffer())
   786 			{
   787 			iEncoderPU->Stop();
   788 			}	
   789 		else
   790 			{
   791 			iProxy->MdvrpReturnPicture(iCurrentPicture);
   792 			iCurrentPicture = NULL;		
   793 			}
   794 		}
   795 	}
   796 	
   797 
   798 void CMdfVideoEncodeHwDeviceAdapter::MipoDisconnectTunnelComplete(const MMdfInputPort* /*aInputPort*/, TInt aErrorCode)
   799 	{
   800 	if (aErrorCode != KErrNone)
   801 		{
   802 		iProxy->MdvrpFatalError(this, aErrorCode);
   803 		}	
   804 	}
   805 	
   806 void CMdfVideoEncodeHwDeviceAdapter::MopoDisconnectTunnelComplete(const MMdfOutputPort* /*aOutputPort*/, TInt aErrorCode)
   807 	{
   808 	if (aErrorCode != KErrNone)
   809 		{
   810 		iProxy->MdvrpFatalError(this, aErrorCode);
   811 		}		
   812 	}	
   813 
   814 
   815 void CMdfVideoEncodeHwDeviceAdapter::MopoReadDataComplete(const MMdfOutputPort* aOutputPort, CMMFBuffer* aBuffer, TInt aErrorCode)
   816 	{
   817 	if (aErrorCode != KErrNone)
   818 		{
   819 		iProxy->MdvrpFatalError(this, aErrorCode);
   820 		return;
   821 		}		
   822 	if (aOutputPort == iEncoderPUOutputPortsArray[KEncoderPUOutputPortIndex])
   823 		{
   824 		TVideoOutputBuffer buf;
   825 		CMMFDataBuffer* dataBuffer = static_cast<CMMFDataBuffer*>(aBuffer);
   826 		TUint bufSize = dataBuffer->BufferSize();
   827 		buf.iData.Set(const_cast<TUint8*>((dataBuffer->Data()).Ptr()), dataBuffer->BufferSize());
   828 
   829 		if (aBuffer->LastBuffer())
   830 			{
   831 			iEncoderPU->Stop();
   832 			iProxy->MdvrpStreamEnd();
   833 			}	
   834 		else
   835 			{
   836 					
   837 			if (!iInputStreamEnd)
   838 				{
   839 				// still expecting more buffers, so let client know
   840 				iProxy->MdvrpNewBuffer(&buf);
   841 				}
   842 			else
   843 				{
   844 				dataBuffer->Data().SetLength(0);
   845 				dataBuffer->SetLastBuffer(ETrue);
   846 				// Write a zero sized input buffer to the port, with the last buffer flag set
   847 				iEncoderPUInputPortsArray[KEncoderPUInputPortIndex]->MipWriteData(*iInputBuffer);
   848 				}
   849 			}
   850 		}		
   851 	}
   852 	
   853 
   854 void CMdfVideoEncodeHwDeviceAdapter::InitializeComplete(const CMdfProcessingUnit* /*aPu*/, TInt aErrorCode)
   855 	{
   856 	// KB: We have an error code, so use it not fatal error in this case	
   857 	iProxy->MdvrpInitializeComplete(this, aErrorCode);
   858 	}
   859 	
   860 void CMdfVideoEncodeHwDeviceAdapter::ExecuteComplete(const CMdfProcessingUnit* /*aPu*/, TInt aErrorCode)
   861 	{
   862 	if (aErrorCode != KErrNone)
   863 		{
   864 		iProxy->MdvrpFatalError(this, aErrorCode);
   865 		return;
   866 		}				
   867 	}
   868 	
   869 void CMdfVideoEncodeHwDeviceAdapter::MipoRestartTunnelComplete(const MMdfInputPort* /*aInputPort*/, TInt /*aErrorCode*/)
   870 	{
   871 	// Function is not supported.
   872 	}	
   873 	
   874 void CMdfVideoEncodeHwDeviceAdapter::MopoRestartTunnelComplete(const MMdfOutputPort* /*aOutputPort*/,  TInt /*aErrorCode*/)
   875 	{
   876 	// Function is not supported.
   877 	}
   878 
   879 /**
   880  @see CMMFVideoRecordHwDevice
   881  */
   882 void CMdfVideoEncodeHwDeviceAdapter::SetClockSource(MMMFClockSource* /* aClock */) 
   883 	{
   884 	// Function is not supported.
   885 	}
   886 
   887 /**
   888  @see CMMFVideoRecordHwDevice
   889  */
   890 void CMdfVideoEncodeHwDeviceAdapter::SetPreProcessTypesL(TUint32 /* aPreProcessTypes */)
   891 	{
   892 	User::Leave(KErrNotSupported);
   893 	}
   894 
   895 /**
   896  @see CMMFVideoRecordHwDevice
   897  */
   898 void CMdfVideoEncodeHwDeviceAdapter::SetRgbToYuvOptionsL(TRgbRange /* aRange */, const TYuvFormat& /* aOutputFormat */)
   899 	{
   900 	User::Leave(KErrNotSupported);
   901 	}
   902 
   903 /**
   904  @see CMMFVideoRecordHwDevice
   905  */
   906 void CMdfVideoEncodeHwDeviceAdapter::SetYuvToYuvOptionsL(const TYuvFormat& /* aInputFormat */, const TYuvFormat& /* aOutputFormat */)
   907 	{
   908 	User::Leave(KErrNotSupported);
   909 	}
   910 
   911 /**
   912  @see CMMFVideoRecordHwDevice
   913  */
   914 void CMdfVideoEncodeHwDeviceAdapter::SetRotateOptionsL(TRotationType /* aRotationType */)
   915 	{
   916 	User::Leave(KErrNotSupported);
   917 	}
   918 
   919 /**
   920  @see CMMFVideoRecordHwDevice
   921  */
   922 void CMdfVideoEncodeHwDeviceAdapter::SetScaleOptionsL(const TSize& /* aTargetSize */, TBool /* aAntiAliasFiltering */)
   923 	{
   924 	User::Leave(KErrNotSupported);
   925 	}
   926 
   927 /**
   928  @see CMMFVideoRecordHwDevice
   929  */
   930 void CMdfVideoEncodeHwDeviceAdapter::SetInputCropOptionsL(const TRect& /* aRect */)
   931 	{
   932 	User::Leave(KErrNotSupported);
   933 	}
   934 
   935 /**
   936  @see CMMFVideoRecordHwDevice
   937  */
   938 void CMdfVideoEncodeHwDeviceAdapter::SetOutputCropOptionsL(const TRect& /* aRect */)
   939 	{
   940 	User::Leave(KErrNotSupported);
   941 	}
   942 
   943 /**
   944  @see CMMFVideoRecordHwDevice
   945  */
   946 void CMdfVideoEncodeHwDeviceAdapter::SetOutputPadOptionsL(const TSize& /* aOutputSize */, const TPoint& /* aPicturePos */)
   947 	{
   948 	User::Leave(KErrNotSupported);
   949 	}
   950 
   951 /**
   952  @see CMMFVideoRecordHwDevice
   953  */
   954 void CMdfVideoEncodeHwDeviceAdapter::SetColorEnhancementOptionsL(const TColorEnhancementOptions& /* aOptions */)
   955 	{
   956 	User::Leave(KErrNotSupported);
   957 	}
   958 
   959 /**
   960  @see CMMFVideoRecordHwDevice
   961  */
   962 void CMdfVideoEncodeHwDeviceAdapter::SetFrameStabilisationOptionsL(const TSize& /* aOutputSize */, TBool /* aFrameStabilisation */)
   963 	{
   964 	User::Leave(KErrNotSupported);
   965 	}
   966 
   967 /**
   968  @see CMMFVideoRecordHwDevice
   969  */
   970 void CMdfVideoEncodeHwDeviceAdapter::SetCustomPreProcessOptionsL(const TDesC8& /* aOptions */)
   971 	{
   972 	User::Leave(KErrNotSupported);
   973 	}
   974 
   975