--- a/videoeditorengine/vedtranscoder/src/Ctrvideoencoderclient.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1824 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "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:
-* Ixonos Plc
-*
-* Description:
-* Video encoder client.
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <devvideorecord.h>
-#include <devvideobase.h>
-#include <devvideoconstants.h>
-#include <H263.h>
-#include <AVC.h>
-#include <Mpeg4Visual.h>
-#include "ctrtranscoder.h"
-#include "ctrvideoencoderclient.h"
-#include "ctrdevvideoclientobserver.h"
-#include "ctrsettings.h"
-#include "ctrhwsettings.h"
-
-
-// MACROS
-#define TRASSERT(x) __ASSERT_DEBUG(x, User::Panic(_L("CTRANSCODERVIDEOENCODERCLIENT"), -10000))
-
-
-// CONSTANTS
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CTRVideoEncoderClient* CTRVideoEncoderClient::NewL(MTRDevVideoClientObserver& aObserver)
- {
- PRINT((_L("CTRVideoEncoderClient::NewL(), In")))
- CTRVideoEncoderClient* self = new (ELeave) CTRVideoEncoderClient(aObserver);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop();
-
- PRINT((_L("CTRVideoEncoderClient::NewL(), Out")))
- return self;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::CTRVideoEncoderClient
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CTRVideoEncoderClient::CTRVideoEncoderClient(MTRDevVideoClientObserver& aObserver) :
- iObserver(aObserver)
- {
- iDevVideoRecord = NULL;
- iOutputMediaBuffer = NULL;
- iCompresedFormat = NULL;
- iUid = TUid::Null();
- iFallbackUid = TUid::Null();
- iRealTime = EFalse;
- iState = ETRNone;
- iCodingOptions.iSyncIntervalInPicture = 0;
- iCodingOptions.iHeaderExtension = 0;
- iCodingOptions.iDataPartitioning = EFalse;
- iCodingOptions.iReversibleVLC = EFalse;
- iSrcRate = 0.0;
- iVolHeaderSent = EFalse;
- iRemoveHeader = EFalse;
- iVolLength = 0;
- iRateOptions.iControl = EBrControlStream;
- iRateOptions.iPictureRate = KTRTargetFrameRateDefault;
- iRateOptions.iBitrate = KTRMaxBitRateH263Level10;
- iBitRateSetting = EFalse;
- iFatalError = KErrNone;
- iErrorRate = 0.0;
- iVolHeader = KNullDesC8;
- iVideoBufferManagementCI = NULL;
- iLastTimestamp = -1;
- iAcceleratedCodecSelected = EFalse;
- iSetRandomAccessPoint = EFalse;
- iNumH264SPSPPS = 0;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::ConstructL()
- {
- iDevVideoRecord = CMMFDevVideoRecord::NewL(*this);
- iOutputMediaBuffer = new(ELeave)CCMRMediaBuffer;
- }
-
-
-// ---------------------------------------------------------
-// CTRVideoEncoderClient::~CTRVideoEncoderClient()
-// Destructor
-// ---------------------------------------------------------
-//
-CTRVideoEncoderClient::~CTRVideoEncoderClient()
- {
- PRINT((_L("CTRVideoEncoderClient::~CTRVideoEncoderClient(), In")))
-
- if (iDevVideoRecord)
- {
- delete iDevVideoRecord;
- iDevVideoRecord = NULL;
- }
-
- if (iCompresedFormat)
- {
- delete iCompresedFormat;
- }
-
- if (iOutputMediaBuffer)
- {
- delete iOutputMediaBuffer;
- }
-
- PRINT((_L("CTRVideoEncoderClient::~CTRVideoEncoderClient(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SupportsInputFormat
-// Checks whether given input format is supported
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CTRVideoEncoderClient::SupportsCodec(const TDesC8& aFormat, const TDesC8& aShortFormat, TInt aUid, TInt aFallbackUid)
- {
- TBool supports = EFalse;
- TBool preferredFound = EFalse;
- TBool fallbackFound = EFalse;
-
- if (iDevVideoRecord)
- {
- RArray<TUid> encoders;
-
- TRAPD( status, iDevVideoRecord->FindEncodersL(aShortFormat, 0/*aPreProcType*/, encoders, EFalse/*aExactMatch*/) );
-
- if( status != KErrNone )
- {
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), status[%d]"), status))
- supports = EFalse;
- }
- else if( encoders.Count() <= 0 )
- {
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), No encoders found")))
- supports = EFalse;
- }
- else
- {
-
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), %d encoders found"), encoders.Count() ))
-
- // Check if any of the found encoders matches with the given Uids
- for( TInt i = 0; i < encoders.Count(); ++i )
- {
-
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), found codec 0x%x"), encoders[i].iUid))
-
- if( encoders[i].iUid == aUid )
- {
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), preferred found")))
- iUid = encoders[i];
- preferredFound = ETrue;
- }
- if( encoders[i].iUid == aFallbackUid )
- {
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), fallback found")))
- iFallbackUid = encoders[i];
- fallbackFound = ETrue;
- }
-
- if( preferredFound && fallbackFound )
- {
- // No need to search anymore
- break;
- }
- }
- }
-
- encoders.Reset();
- encoders.Close();
- }
-
-#if !( defined (__WINS__) || defined (__WINSCW__) )
- if( !preferredFound )
-#else
- if( !preferredFound && !fallbackFound )
-#endif
- {
- // Preferred encoder was not found => Probably the given encoder Uid is wrong
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), No supported encoders found")))
- supports = EFalse;
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::SupportsCodec(), Supported encoder found: 0x%x"), iUid.iUid))
- iMimeType = aFormat;
- iShortMimeType = aShortFormat;
- supports = ETrue;
- }
-
- return supports;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetCodecParametersL
-// Sets codec parameters
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetCodecParametersL(TInt aCodecType, TInt aCodecLevel, const TTRVideoFormat& aInputFormat,
- const TTRVideoFormat& aOutputFormat)
- {
- PRINT((_L("CTRVideoEncoderClient::SetCodecParametersL(), In")))
- TInt status = KErrNone;
- iCodecType = aCodecType;
- iCodecLevel = aCodecLevel;
- iPictureSize = aOutputFormat.iSize;
- iOutputDataType = aOutputFormat.iDataType;
-
- // RAW YUV
- iUncompressedFormat.iDataFormat = EYuvRawData;
-
- // U & V samples are taken from the middle of four luminance samples
- // (as specified in H.263 spec)
- switch ( aInputFormat.iDataType )
- {
- case CTRTranscoder::ETRYuvRawData420:
- {
- iUncompressedFormat.iYuvFormat.iPattern = EYuv420Chroma2;
- break;
- }
-
- case CTRTranscoder::ETRYuvRawData422:
- {
- iUncompressedFormat.iYuvFormat.iPattern = EYuv422Chroma2;
- break;
- }
-
- default:
- {
- iUncompressedFormat.iYuvFormat.iPattern = EYuv420Chroma2;
- break;
- }
- }
-
- // Output format
- if (!iCompresedFormat)
- {
- iCompresedFormat = CCompressedVideoFormat::NewL( iMimeType );
- }
-
- TRAP( status, iAcceleratedCodecSelected = CheckCodecInfoL(iUid) );
-
- if (status != KErrNone)
- {
- // Try again with the fallback encoder if one exists
- if( (iFallbackUid != TUid::Null()) && (iFallbackUid.iUid != iUid.iUid) )
- {
- TRAP( status, iAcceleratedCodecSelected = CheckCodecInfoL(iFallbackUid) );
-
- if (status != KErrNone)
- {
- PRINT((_L("CTRVideoEncoderClient::SetCodecParametersL(), Failed to get codec info")))
- User::Leave(KErrNotSupported);
- }
-
- PRINT((_L("CTRVideoEncoderClient::SetCodecParametersL(), Reverting to fallback encoder")))
-
- // Fallback ok, take it
- iUid = iFallbackUid;
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::SetCodecParametersL(), No suitable encoders found")))
- User::Leave(KErrNotSupported);
- }
- }
-
- // AA Set codec here (final hwdevice Uid should be known before checking CI buffermanag support)
- // Select encoder first
- this->SelectEncoderL();
-
- PRINT((_L("CTRVideoEncoderClient::SetCodecParametersL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::CheckCodecInfoL
-// Checks codec info
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CTRVideoEncoderClient::CheckCodecInfoL(TUid aUid)
- {
- CVideoEncoderInfo* encoderInfo = NULL; // Encoder info for retrieving capabilities
- iMaxFrameRate = 0;
- TInt status = KErrNone;
- TUint32 dataUnitType = 0;
- TBool accelerated = EFalse;
-
- switch(iOutputDataType)
- {
- case CTRTranscoder::ETRDuCodedPicture:
- {
- dataUnitType = EDuCodedPicture;
- break;
- }
-
- case CTRTranscoder::ETRDuVideoSegment:
- {
- dataUnitType = EDuVideoSegment;
- break;
- }
-
- default:
- {
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), should leave at the earlier stage, panic")))
- TRASSERT(0);
- }
- }
-
- // Check encoder
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), getting info from [0x%x]"), aUid.iUid ))
- encoderInfo = iDevVideoRecord->VideoEncoderInfoLC( aUid );
-
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), info [0x%x]"), encoderInfo ))
-
- if (!encoderInfo)
- {
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), getting info from [0x%x] failed[%d]"), aUid.iUid, status ))
- User::Leave(KErrNotSupported);
- }
- else
- {
- // Check input format
- // 1. retrieve supported formats from encoder hwdevice (since exact options are unknown)
- RArray<TUncompressedVideoFormat> supportedInputFormats = encoderInfo->SupportedInputFormats();
-
- TInt formatCount = supportedInputFormats.Count();
-
- if (formatCount <= 0)
- {
- supportedInputFormats.Close();
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), There are no supported input formats") ))
- User::Leave(KErrNotSupported);
- }
- else
- {
- TUncompressedVideoFormat uncFormat;
- TBool found = EFalse;
- TInt pattern1, pattern2;
- TInt dataLayout;
-
- if (iUncompressedFormat.iYuvFormat.iPattern == EYuv420Chroma2)
- {
- pattern1 = EYuv420Chroma1;
- pattern2 = EYuv420Chroma2;
- dataLayout = EYuvDataPlanar;
- }
- else
- {
- pattern1 = EYuv422Chroma1;
- pattern2 = EYuv422Chroma2;
- dataLayout = EYuvDataInterleavedBE;
- }
-
- // Check the most important paramers
- for ( TInt i = 0; i < formatCount; i ++ )
- {
- uncFormat = supportedInputFormats[i];
-
- if ( (uncFormat.iDataFormat == iUncompressedFormat.iDataFormat) &&
- (uncFormat.iYuvFormat.iDataLayout == dataLayout) &&
- ( (uncFormat.iYuvFormat.iPattern == pattern1) ||
- (uncFormat.iYuvFormat.iPattern == pattern2) ) )
- {
- // Assign the rest of parameters
- iUncompressedFormat = uncFormat;
-
- if ( iCodecType != EH263 )
- {
- // Set aspect ratio to 1:1 (square)
- iUncompressedFormat.iYuvFormat.iAspectRatioNum = 1;
- iUncompressedFormat.iYuvFormat.iAspectRatioDenom = 1;
- }
-
- found = ETrue;
- break;
- }
- }
-
- if (!found)
- {
- supportedInputFormats.Close();
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), Supported format is not found") ))
- User::Leave(KErrNotSupported);
- }
- }
-
- /*if ( !encoderInfo->SupportsOutputFormat(*iCompresedFormat) ) // comment until symbian error is fixed
- {
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), Output format is not supported")))
- status = KErrNotSupported;
- }
- else */
- if ( (encoderInfo->SupportedDataUnitTypes() & dataUnitType) != dataUnitType )
- {
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), There's no support for this DUType")))
- status = KErrNotSupported;
- }
- else
- {
- // Get max rate for requested image format
- RArray<TPictureRateAndSize> rateAndSize = encoderInfo->MaxPictureRates();
- TUint rates = rateAndSize.Count();
-
- TSize picSize = iPictureSize;
- if ( picSize == TSize(640, 352) ) // Use VGA max frame rate for VGA 16:9
- picSize = TSize(640, 480);
-
- for ( TUint i = 0; i < rates; i++ )
- {
- if ( rateAndSize[i].iPictureSize == picSize )
- {
- status = KErrNone;
- iMaxFrameRate = rateAndSize[i].iPictureRate;
- PRINT((_L("CTRVideoEncoderClient::CheckCodecInfoL(), Needed picture size found!")))
- break;
- }
-
- status = KErrNotSupported;
- }
- }
- }
-
- accelerated = encoderInfo->Accelerated();
-
- // Delete codec info
- CleanupStack::PopAndDestroy(encoderInfo);
-
- if (status != KErrNone)
- {
- User::Leave(status);
- }
-
- return accelerated;
- }
-
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetBitRate
-// Sets video bitrate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetBitRate(TUint aBitRate)
- {
- if ( (iState == ETRInitialized) || (iState == ETRRunning) || (iState == ETRPaused) )
- {
- iRateOptions.iBitrate = aBitRate;
- iRateOptions.iPictureQuality = KTRPictureQuality;
- iRateOptions.iQualityTemporalTradeoff = KTRQualityTemporalTradeoff;
-
- if (iRealTime)
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffRT;
- }
- else
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffNonRT;
- }
-
- // Set bit rate to Encoder
- iDevVideoRecord->SetRateControlOptions(0/*Layer 0 is supported*/, iRateOptions);
- iBitRateSetting = ETrue;
- }
- else
- {
- // Keep bit rate and set it later
- iRateOptions.iBitrate = aBitRate;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetRealTime
-// Sets encoder mode to operate real-time
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetRealTime(TBool aRealTime)
- {
- iRealTime = aRealTime;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetFrameRate
-// Sets frame rate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetFrameRate(TReal& aFrameRate)
- {
- if ( (iState == ETRInitialized) || (iState == ETRRunning) || (iState == ETRPaused) )
- {
- iRateOptions.iPictureRate = aFrameRate;
-
- // The target frame rate must not be greater than the source frame rate
- if ( (iSrcRate > 0.0) && (iRateOptions.iPictureRate > iSrcRate) )
- {
- iRateOptions.iPictureRate = iSrcRate;
- }
-
- if (iRealTime)
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffRT;
- }
- else
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffNonRT;
- }
-
- // Set framerate rate to Encoder
- iDevVideoRecord->SetRateControlOptions(0/*Layer 0 is supported*/, iRateOptions);
- }
- else
- {
- // Keep frame rate and set it later
- iRateOptions.iPictureRate = aFrameRate;
-
- // The target frame rate must not be greater than the source frame rate
- if ( (iSrcRate > 0.0) && (iRateOptions.iPictureRate > iSrcRate) )
- {
- iRateOptions.iPictureRate = iSrcRate;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetChannelBitErrorRate
-// Sets channel bit error rate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetChannelBitErrorRate(TReal aErrorRate)
- {
- if ( (iState == ETRInitialized) || (iState == ETRRunning) || (iState == ETRPaused) )
- {
- // Run-time setting
- iDevVideoRecord->SetChannelBitErrorRate(0/*Error protection level number*/, aErrorRate, 0.0/*Std deviation*/);
- }
- else
- {
- iErrorRate = aErrorRate;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetVideoCodingOptionsL
-// Sets video coding options
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetVideoCodingOptionsL(TTRVideoCodingOptions& aOptions)
- {
- iCodingOptions = aOptions;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::GetVideoBitRateL
-// Gets video bitrate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUint CTRVideoEncoderClient::GetVideoBitRateL()
- {
- return iRateOptions.iBitrate;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::GetFrameRateL
-// Gets frame rate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TReal CTRVideoEncoderClient::GetFrameRateL()
- {
- return iRateOptions.iPictureRate;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetInputFrameRate
-// Sets source framerate
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetInputFrameRate(TReal aFrameRate)
- {
- iSrcRate = aFrameRate;
-
- // The target frame rate must not be greater than the source frame rate
- if ( (iSrcRate > 0.0) && (iRateOptions.iPictureRate > iSrcRate) )
- {
- iRateOptions.iPictureRate = iSrcRate;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::InitializeL
-// Initializes encoder
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::InitializeL()
- {
- PRINT((_L("CTRVideoEncoderClient::InitializeL(), In")))
- TVideoDataUnitType dataUnitType = EDuCodedPicture;
- TEncoderBufferOptions bufferOptions;
- TUint maxBufferSize = 0;
-
-
- // Give Init settings
- // 1. Set output format. Output format was already set in SetCodecParametersL
- switch(iOutputDataType)
- {
- case CTRTranscoder::ETRDuCodedPicture:
- {
- dataUnitType = EDuCodedPicture;
- bufferOptions.iMinNumOutputBuffers = KTRMinNumberOfBuffersCodedPicture;
- break;
- }
-
- case CTRTranscoder::ETRDuVideoSegment:
- {
- dataUnitType = EDuVideoSegment;
- bufferOptions.iMinNumOutputBuffers = KTRMinNumberOfBuffersVideoSegment;
- break;
- }
-
- default:
- {
- // Should never happend. Encoder does not support uncompressed output format.
- TRASSERT(0);
- }
- }
-
- TVideoDataUnitEncapsulation dataUnitEncapsulation = EDuElementaryStream;
-
- // Use generic payload encapsulation for H.264
- if (iCodecType == EH264)
- {
- dataUnitEncapsulation = EDuGenericPayload;
- }
-
- iDevVideoRecord->SetOutputFormatL(iHwDeviceId, *iCompresedFormat, dataUnitType, dataUnitEncapsulation, EFalse);
-
- // 2. Set input format
- iDevVideoRecord->SetInputFormatL(iHwDeviceId, iUncompressedFormat, iPictureSize);
-
- // 3. Buffer options
- bufferOptions.iMaxPreEncoderBufferPictures = bufferOptions.iMinNumOutputBuffers;
- bufferOptions.iHrdVbvSpec = EHrdVbvNone;
- bufferOptions.iHrdVbvParams.Set(NULL, 0);
-
- // Check max coded picture size for specified codec level
- switch(iCodecLevel)
- {
- case KTRH263CodecLevel10:
- {
- maxBufferSize = KTRMaxBufferSizeLevel10;
- break;
- }
-
- case KTRH263CodecLevel20:
- {
- maxBufferSize = KTRMaxBufferSizeLevel20;
- break;
- }
-
- case KTRH263CodecLevel30:
- {
- maxBufferSize = KTRMaxBufferSizeLevel30;
- break;
- }
-
- case KTRH263CodecLevel40:
- {
- maxBufferSize = KTRMaxBufferSizeLevel40;
- break;
- }
-
- case KTRH263CodecLevel45:
- {
- maxBufferSize = KTRMaxBufferSizeLevel45;
- break;
- }
-
- case KTRH263CodecLevel50:
- {
- maxBufferSize = KTRMaxBufferSizeLevel50;
- break;
- }
-
- case KTRH263CodecLevel60:
- {
- maxBufferSize = KTRMaxBufferSizeLevel60;
- break;
- }
-
- case KTRH263CodecLevel70:
- {
- maxBufferSize = KTRMaxBufferSizeLevel70;
- break;
- }
-
- case KTRH264CodecLevel10:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level10;
- break;
- }
-
- case KTRH264CodecLevel10b:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level10b;
- break;
- }
-
- case KTRH264CodecLevel11:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level11;
- break;
- }
-
- case KTRH264CodecLevel12:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level12;
- break;
- }
-
- case KTRH264CodecLevel13:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level13;
- break;
- }
-
- case KTRH264CodecLevel20:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level20;
- break;
- }
-
- case KTRH264CodecLevel30:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level30;
- break;
- }
-
- case KTRH264CodecLevel31:
- {
- maxBufferSize = KTRMaxBufferSizeH264Level31;
- break;
- }
-
- case KTRMPEG4CodecLevel1:
- case KTRMPEG4CodecLevel0:
- {
- maxBufferSize = KTRMaxBufferSizeLevel0;
- break;
- }
-
- case KTRMPEG4CodecLevel0b:
- {
- maxBufferSize = KTRMaxBufferSizeLevel0b;
- break;
- }
-
- case KTRMPEG4CodecLevel2:
- {
- maxBufferSize = KTRMaxBufferSizeLevel2;
- break;
- }
-
- case KTRMPEG4CodecLevel3:
- {
- maxBufferSize = KTRMaxBufferSizeLevel3;
- break;
- }
-
- case KTRMPEG4CodecLevel4a:
- {
- maxBufferSize = KTRMaxBufferSizeLevel4a;
- break;
- }
-
- default:
- {
- maxBufferSize = KTRMaxBufferSizeLevel0;
- }
- }
-
- bufferOptions.iMaxOutputBufferSize = maxBufferSize;
- bufferOptions.iMaxCodedPictureSize = bufferOptions.iMaxOutputBufferSize;
-
- if ((iCodecType != EH263) && (iCodingOptions.iSyncIntervalInPicture > 0))
- {
- // Set segment target size
- if ( iCodingOptions.iSyncIntervalInPicture < KTRMinSegmentSize )
- {
- bufferOptions.iMaxCodedSegmentSize = KTRMinSegmentSize;
- }
- else if (iCodingOptions.iSyncIntervalInPicture > bufferOptions.iMaxCodedPictureSize)
- {
- bufferOptions.iMaxCodedSegmentSize = bufferOptions.iMaxCodedPictureSize;
- }
- else
- {
- bufferOptions.iMaxCodedSegmentSize = iCodingOptions.iSyncIntervalInPicture;
- }
- }
- else
- {
- // Set segment size to max video coded picture size
- bufferOptions.iMaxCodedSegmentSize = bufferOptions.iMaxCodedPictureSize;
- }
-
- PRINT((_L("CTRVideoEncoderClient::InitializeL(), iMaxOutputBufferSize[%d], iMinNumOutputBuffers[%d]"),
- bufferOptions.iMaxOutputBufferSize, bufferOptions.iMinNumOutputBuffers ))
-
- iDevVideoRecord->SetBufferOptionsL(bufferOptions);
-
- // 4. Random access point
- TReal accessRate = KTRDefaultAccessRate; /* ~0.2 fps */
-
- if (iCodingOptions.iMinRandomAccessPeriodInSeconds > 0)
- {
- accessRate = 1.0 / TReal(iCodingOptions.iMinRandomAccessPeriodInSeconds);
- }
-
- PRINT((_L("CTRVideoEncoderClient::InitializeL(), RandomAcessRate[%f]"), accessRate));
- iDevVideoRecord->SetMinRandomAccessRate(accessRate);
-
- // 5. Other coding options
- if (iCodecType == EH263)
- {
- if (iCodingOptions.iSyncIntervalInPicture > 0)
- {
- TH263VideoMode h263CodingOptions;
-
- h263CodingOptions.iAllowedPictureTypes = EH263PictureTypeI | EH263PictureTypeP;
- h263CodingOptions.iForceRoundingTypeToZero = ETrue;
- h263CodingOptions.iPictureHeaderRepetition = 0;
- h263CodingOptions.iGOBHeaderInterval = iCodingOptions.iSyncIntervalInPicture;
-
- TPckgC<TH263VideoMode> h263OptionsPckg(h263CodingOptions);
- iDevVideoRecord->SetCodingStandardSpecificOptionsL(h263OptionsPckg);
- }
- }
- else if (iCodecType == EH264)
- {
- // H.264 options
- TAvcVideoMode avcCodingOptions;
-
- avcCodingOptions.iAllowedPictureTypes = EAvcPictureTypeI | EAvcPictureTypeP;
- avcCodingOptions.iFlexibleMacroblockOrder = EFalse;
- avcCodingOptions.iRedundantPictures = EFalse;
- avcCodingOptions.iDataPartitioning = iCodingOptions.iDataPartitioning;
- avcCodingOptions.iFrameMBsOnly = ETrue;
- avcCodingOptions.iMBAFFCoding = EFalse;
- avcCodingOptions.iEntropyCodingCABAC = EFalse;
- avcCodingOptions.iWeightedPPrediction = EFalse;
- avcCodingOptions.iWeightedBipredicitonMode = 0;
- avcCodingOptions.iDirect8x8Inference = EFalse;
-
- TPckgC<TAvcVideoMode> avc4OptionsPckg(avcCodingOptions);
- iDevVideoRecord->SetCodingStandardSpecificOptionsL(avc4OptionsPckg);
- }
- else
- {
- // Mpeg4 options
- TMPEG4VisualMode mpeg4CodingOptions;
- mpeg4CodingOptions.iShortHeaderMode = EFalse;
- mpeg4CodingOptions.iMPEG4VisualNormalMPEG4Mode.iHeaderExtension = iCodingOptions.iHeaderExtension;
- mpeg4CodingOptions.iMPEG4VisualNormalMPEG4Mode.iDataPartitioning = iCodingOptions.iDataPartitioning;
- mpeg4CodingOptions.iMPEG4VisualNormalMPEG4Mode.iReversibleVLC = iCodingOptions.iReversibleVLC;
-
- mpeg4CodingOptions.iMPEG4VisualNormalMPEG4Mode.iAllowedVOPTypes = EMPEG4VisualVOPTypeI;
-
- TPckgC<TMPEG4VisualMode> mpeg4OptionsPckg(mpeg4CodingOptions);
- iDevVideoRecord->SetCodingStandardSpecificOptionsL(mpeg4OptionsPckg);
- }
-
- // Set source
- if (iSrcRate <= 0.0)
- {
- iSrcRate = KTRDefaultSrcRate; /* ~15.0 fps */
- }
-
- iDevVideoRecord->SetSourceMemoryL(iSrcRate, ETrue, iRealTime);
-
- // Initialize devVideoRecord
- iDevVideoRecord->Initialize();
-
- // Set media buffer type
- if (iCodecType == EH263)
- {
- // Set H.263
- iBufferType = CCMRMediaBuffer::EVideoH263;
- }
- else if (iCodecType == EH264)
- {
- // Set H.264
- iBufferType = CCMRMediaBuffer::EVideoMPEG4; // : What to set here?
- }
- else
- {
- // Set MPEG4
- iBufferType = CCMRMediaBuffer::EVideoMPEG4;
- }
-
- PRINT((_L("CTRVideoEncoderClient::InitializeL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SelectEncoderL
-// Selects encoder
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SelectEncoderL()
- {
- PRINT((_L("CTRVideoEncoderClient::SelectEncoderL(), In")))
- TInt status = KErrNone;
-
- if (iUid != TUid::Null())
- {
- TRAP(status, iHwDeviceId = iDevVideoRecord->SelectEncoderL(iUid));
- }
- else
- {
- // Probably the error already exists, if iUid == NULL;
- status = KErrAlreadyExists;
- }
-
- if (status != KErrNone)
- {
- // Try again with the fallback encoder if one exists
- if( (iFallbackUid != TUid::Null()) && (iFallbackUid.iUid != iUid.iUid) )
- {
- PRINT((_L("CTRVideoEncoderClient::SelectEncoderL(), Reverting to fallback encoder")))
- iUid = iFallbackUid;
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::SelectDecoderL(), Failed to select encoder")))
- User::Leave(KErrNotSupported);
- }
-
- TRAP( status, iAcceleratedCodecSelected = CheckCodecInfoL(iUid) );
-
- if (status != KErrNone)
- {
- PRINT((_L("CTRVideoEncoderClient::SelectDecoderL(), Failed to get codec info")))
- User::Leave(KErrNotSupported);
- }
-
- TRAP(status, iHwDeviceId = iDevVideoRecord->SelectEncoderL(iUid));
-
- if (status != KErrNone)
- {
- PRINT((_L("CTRVideoEncoderClient::SelectDecoderL(), Failed to select encoder")))
- User::Leave(KErrNotSupported);
- }
- }
-
- PRINT((_L("CTRVideoEncoderClient::SelectEncoderL(), Out")))
- }
-
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroInitializeComplete
-// Informs init status with received error code
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroInitializeComplete(TInt aError)
- {
- if (aError == KErrNone)
- {
- iState = ETRInitialized;
- }
- else if ((aError == KErrHardwareNotAvailable) || (aError == KErrNotSupported))
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroInitializeComplete(), Error in initialization")))
-
- // Map both error codes to the same
- aError = KErrNotSupported;
-
- // Try again with the fallback encoder if one exists
- while( (iFallbackUid != TUid::Null()) && (iFallbackUid.iUid != iUid.iUid) )
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroInitializeComplete(), Reverting to fallback encoder")))
-
- iUid = iFallbackUid;
-
- // Devvideo must be recreated from scratch
- if (iDevVideoRecord)
- {
- delete iDevVideoRecord;
- iDevVideoRecord = NULL;
- }
-
- TRAPD( status, iDevVideoRecord = CMMFDevVideoRecord::NewL(*this) );
- if (status != KErrNone)
- {
- // Something went wrong, let CTRTranscoderImp handle the error
- PRINT((_L("CTRVideoEncoderClient::MdvroInitializeComplete(), Failed to create DevVideoRecord")))
- break;
- }
-
- TRAP( status, iAcceleratedCodecSelected = CheckCodecInfoL(iUid) );
- if (status != KErrNone)
- {
- // Fallback encoder can not be used, let CTRTranscoderImp handle the error
- PRINT((_L("CTRVideoEncoderClient::MdvroInitializeComplete(), Failed to get codec info")))
- break;
- }
-
- TRAP( status, SelectEncoderL() );
- if (status != KErrNone)
- {
- // Fallback encoder can not be used, let CTRTranscoderImp handle the error
- PRINT((_L("CTRVideoEncoderClient::MdvroInitializeComplete(), Failed to select encoder")))
- break;
- }
-
- // We are now ready to reinitialize the encoder, let CTRTranscoderImp do it
- aError = KErrHardwareNotAvailable;
- break;
- }
- }
-
- iObserver.MtrdvcoEncInitializeComplete(aError);
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::StartL
-// Starts encoding
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::StartL()
- {
- PRINT((_L("CTRVideoEncoderClient::StartL(), In")))
-
- if ( (iCodecType == EMpeg4) && (iVolHeader == KNullDesC8) )
- {
- // Before starting the encoder, request config data
- HBufC8* condigDecInfo = iDevVideoRecord->CodingStandardSpecificInitOutputLC();
-
- if (condigDecInfo)
- {
- PRINT((_L("CTRVideoEncoderClient::StartL(), Vol header length[%d]"), condigDecInfo->Length()))
-
- if ( (condigDecInfo->Length() > 0) && (condigDecInfo->Length() <= KMaxDesC8Length /*256*/) )
- {
- iVolHeader.Des().Copy( condigDecInfo->Des() );
-
- // Keep vol length for further use
- iVolLength = iVolHeader.Des().Length();
- PRINT((_L("CTRVideoEncoderClient::StartL(), VolLength[%d]"), iVolLength))
- }
-
- CleanupStack::PopAndDestroy(condigDecInfo);
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::StartL(), Invalid codingDecInfo, leave")))
- User::Leave(KErrAlreadyExists);
- }
-
- PRINT((_L("CTRVideoEncoderClient::StartL(), Out")))
- }
-
-
- // Set Rate control options
- if (!iBitRateSetting)
- {
- iRateOptions.iPictureQuality = KTRPictureQuality;
- iRateOptions.iQualityTemporalTradeoff = KTRQualityTemporalTradeoff;
-
- if (iRealTime)
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffRT;
- }
- else
- {
- iRateOptions.iLatencyQualityTradeoff = KTRLatencyQualityTradeoffNonRT;
- }
-
- iDevVideoRecord->SetRateControlOptions(0/*Layer 0 is supported*/, iRateOptions);
- iBitRateSetting = ETrue;
- }
-
- if ( (iCodecType != EH263) && (iCodingOptions.iSyncIntervalInPicture > 0) )
- {
- // Set resync value (segment target size)
- iDevVideoRecord->SetSegmentTargetSize(0/*aLayer*/,
- iCodingOptions.iSyncIntervalInPicture/*aSizeBytes*/,
- 0/*aSizeMacroblocks*/);
- }
-
- // Start encoding
- if (iFatalError == KErrNone)
- {
- iDevVideoRecord->Start();
- iState = ETRRunning;
- }
-
- // Reset ts monitor
- iLastTimestamp = -1;
-
- iSetRandomAccessPoint = EFalse;
-
- PRINT((_L("CTRVideoEncoderClient::StartL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::EncodePictureL
-// Encodes video picture
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::EncodePictureL(TVideoPicture* aPicture)
- {
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), In")))
-
- if (aPicture)
- {
- if (iFatalError == KErrNone)
- {
- // Set rest of picture options
- aPicture->iOptions = TVideoPicture::ETimestamp;
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), picture timestamp [%d]"), TInt(aPicture->iTimestamp.Int64()) ))
-
- TTimeIntervalMicroSeconds ts = aPicture->iTimestamp;
-
- if ( ts <= iLastTimestamp)
- {
- // Prevent propagation of the error now
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Picture timestamp less than previously encoded")))
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Dropping picture!!!")))
- iObserver.MtrdvcoEncoderReturnPicture(aPicture);
-
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Out")))
- return;
- }
- else
- {
- iLastTimestamp = ts;
- }
-
- // If random access point was requested
- if( iSetRandomAccessPoint )
- {
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Instant Refresh requested")));
- aPicture->iOptions |= TVideoPicture::EReqInstantRefresh;
- iSetRandomAccessPoint = EFalse;
- }
- else
- {
- aPicture->iOptions &= ~(TVideoPicture::EReqInstantRefresh);
- }
-
- aPicture->iData.iDataFormat = EYuvRawData; // Force data format to YUV
-
- iDevVideoRecord->WritePictureL(aPicture);
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Operation is not possible, since FatalError was reported by low-level[%d]"), iFatalError))
- return;
- }
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Picture is not valid, leave")))
- User::Leave(KErrArgument);
- }
-
- PRINT((_L("CTRVideoEncoderClient::EncodePictureL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroReturnPicture
-// Returns picture
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroReturnPicture(TVideoPicture *aPicture)
- {
- iObserver.MtrdvcoEncoderReturnPicture(aPicture);
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroNewBuffers
-// New buffers are available in the system
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroNewBuffers()
- {
- TVideoOutputBuffer* newBuffer = NULL;
- TInt status = KErrNone;
-
-
- if ( (iCodecType == EMpeg4) && (!iVolHeaderSent) && (iVolHeader != KNullDesC8) )
- {
- // Send vol header first to the client
- iOutputMediaBuffer->Set( iVolHeader.Des(),
- CCMRMediaBuffer::EVideoMPEG4DecSpecInfo,
- iVolHeader.Des().Length(),
- 0,
- 0 );
-
- iObserver.MtrdvcoNewBuffer(iOutputMediaBuffer);
- iVolHeaderSent = ETrue;
-
- // VOS+VO+VOL header is now going to be stored to metadata, it must not be included in mediadata so remove it from the next buffer
- iRemoveHeader = ETrue;
- }
-
- // Get new buffer and forward it to the client
- while( iDevVideoRecord->NumDataBuffers() > 0 )
- {
- TRAP(status, newBuffer = iDevVideoRecord->NextBufferL());
- if (status != KErrNone)
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroNewBuffers(), NextBufferL failed[%d]"), status))
- iObserver.MtrdvcoFatalError(status);
- return;
- }
-
- if (newBuffer)
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroNewBuffers(), dataBuffer length[%d]"), newBuffer->iData.Length()))
-
- // Check data length if valid
- if (newBuffer->iData.Length() <= 0)
- {
- // Data length is invalid
- PRINT((_L("CTRVideoEncoderClient::MdvroNewBuffers(), encoder generates invalid bitstream, abort data processing")))
- iObserver.MtrdvcoFatalError(KErrAbort);
- return;
- }
-
- TBool outputMediaBufferSet = EFalse;
-
- // Remove vol header if needed from the bitstream
- if ( iRemoveHeader )
- {
- iRemoveHeader = EFalse;
-
- if ( iCodecType == EMpeg4 )
- {
- // check if we need to remove VOS+VO+VOL header from the bitstream, since it is
- // stored in metadata, and having it in 2 places may cause interoperability problems
-
- // Since the length of the vol is already known, remove that data from the beginning of
- // the first buffer
- if ( (iVolLength > 0) && (iVolLength < newBuffer->iData.Length()) )
- {
- TPtr8* buffer = reinterpret_cast<TPtr8*>(&newBuffer->iData);
- buffer->Delete(0, iVolLength);
- }
- }
-
- else if ( iCodecType == EH264 )
- {
-
- TPtr8* ptr = reinterpret_cast<TPtr8*>(&newBuffer->iData);
- TPtr8& buffer(*ptr);
-
- // Offset to the end
- TInt readOffset = buffer.Length();
- readOffset -= 4;
-
- TInt numNALUnits = 0;
- TInt writeOffset = 0;
- TInt firstFrameStart = 0;
- TInt alignmentBytes = 0;
-
- numNALUnits = TInt(buffer[readOffset]) +
- (TInt(buffer[readOffset + 1]) << 8 ) +
- (TInt(buffer[readOffset + 2]) << 16) +
- (TInt(buffer[readOffset + 3]) << 24);
-
- // figure out the payload length of all NAL's to
- // determine the number of alignment bytes
-
- // point to first length field
- readOffset -= (numNALUnits - 1) * 8;
- readOffset -= 4;
-
- TInt allNALsLength = 0;
-
- for (TInt i = 0; i < numNALUnits; i++)
- {
- TInt len = TInt(buffer[readOffset]) +
- (TInt(buffer[readOffset + 1]) << 8) +
- (TInt(buffer[readOffset + 2]) << 16) +
- (TInt(buffer[readOffset + 3]) << 24);
-
- allNALsLength += len;
- readOffset += 8;
- }
-
- // calculate alignment bytes
- alignmentBytes = (allNALsLength % 4 != 0) * ( 4 - (allNALsLength % 4) );
-
- // get pointer to end of last frame
- writeOffset = buffer.Length() - 4 - numNALUnits * 8;
-
- // get number of frame NAL's
- numNALUnits -= iNumH264SPSPPS;
-
- // point to offset field of first frame
- readOffset = buffer.Length();
- readOffset -= 4;
- readOffset -= numNALUnits * 8;
-
- firstFrameStart = TInt(buffer[readOffset]) +
- (TInt(buffer[readOffset + 1]) << 8) +
- (TInt(buffer[readOffset + 2]) << 16) +
- (TInt(buffer[readOffset + 3]) << 24);
-
- // The buffer should have enough space for the new NAL header
- // if ( frameStart + frameSize + 12 < buffer.Length() )
-
- // point to length field of first frame
- readOffset += 4;
-
- // first frame begins from offset 0
- TInt nalOffset = 0;
- TInt totalLength = 0;
-
- for (TInt i = 0; i < numNALUnits; i++)
- {
-
- // read NAL length
- TInt length = TInt(buffer[readOffset]) +
- (TInt(buffer[readOffset + 1]) << 8) +
- (TInt(buffer[readOffset + 2]) << 16) +
- (TInt(buffer[readOffset + 3]) << 24);
-
- totalLength += length;
-
- // write offset
- buffer[writeOffset + 0] = TUint8(nalOffset & 0xff);
- buffer[writeOffset + 1] = TUint8((nalOffset >> 8) & 0xff);
- buffer[writeOffset + 2] = TUint8((nalOffset >> 16) & 0xff);
- buffer[writeOffset + 3] = TUint8((nalOffset >> 24) & 0xff);
-
- // Write NAL length
- writeOffset +=4;
- buffer[writeOffset + 0] = TUint8(length & 0xff);
- buffer[writeOffset + 1] = TUint8((length >> 8) & 0xff);
- buffer[writeOffset + 2] = TUint8((length >> 16) & 0xff);
- buffer[writeOffset + 3] = TUint8((length >> 24) & 0xff);
-
- writeOffset += 4;
- readOffset += 8;
-
- nalOffset += length;
- }
-
- // Write the number of NAL units
- buffer[writeOffset + 0] = TUint8(numNALUnits & 0xff);
- buffer[writeOffset + 1] = TUint8((numNALUnits >> 8) & 0xff);
- buffer[writeOffset + 2] = TUint8((numNALUnits >> 16) & 0xff);
- buffer[writeOffset + 3] = TUint8((numNALUnits >> 24) & 0xff);
-
- // Get a pointer to the position where the frame starts
- TPtrC8 tmp(buffer.Ptr() + firstFrameStart, totalLength + alignmentBytes + numNALUnits * 8 + 4);
-
- // Set output media buffer
- iOutputMediaBuffer->Set( tmp, static_cast<CCMRMediaBuffer::TBufferType>(iBufferType),
- tmp.Length(), newBuffer->iRandomAccessPoint,
- newBuffer->iCaptureTimestamp );
-
- outputMediaBufferSet = ETrue;
-
- }
- }
-
- if (!outputMediaBufferSet)
- {
- iOutputMediaBuffer->Set( newBuffer->iData, static_cast<CCMRMediaBuffer::TBufferType>(iBufferType),
- newBuffer->iData.Length(), newBuffer->iRandomAccessPoint,
- newBuffer->iCaptureTimestamp );
- }
-
- iObserver.MtrdvcoNewBuffer(iOutputMediaBuffer);
-
- // Return buffer to devvideo here, since observer call is synchronous
- iDevVideoRecord->ReturnBuffer(newBuffer);
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroNewBuffers(), newBuffer is not available, nothing to do")))
- break;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::StopL
-// Stops encoding synchronously
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::StopL()
- {
- PRINT((_L("CTRVideoEncoderClient::StopL(), In")))
-
- if (iFatalError == KErrNone)
- {
- iDevVideoRecord->Stop();
- }
-
- // Reset flags here
- iVolHeaderSent = EFalse;
- iState = ETRStopped;
-
- PRINT((_L("CTRVideoEncoderClient::StopL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::AsyncStopL
-// Stops encoding asynchronoulsy
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::AsyncStopL()
- {
- PRINT((_L("CTRVideoEncoderClient::StopL(), Async In")))
-
- if (iFatalError == KErrNone)
- {
- iDevVideoRecord->InputEnd();
- }
-
- // Reset flags here
- iVolHeaderSent = EFalse;
- iState = ETRStopping;
-
- PRINT((_L("CTRVideoEncoderClient::StopL(), Async Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroStreamEnd
-// End of stream is reached
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroStreamEnd()
- {
- PRINT((_L("CTRVideoEncoderClient::MdvpoStreamEnd()")))
- iState = ETRStopped;
- iObserver.MtrdvcoEncStreamEnd();
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroSupplementalInfoSent
-// Signals that the supplemental info send request has completed. The buffer used for supplemental information can be re-used or freed.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroSupplementalInfoSent()
- {
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MdvroFatalError
-// Reports the fatal error
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MdvroFatalError(TInt aError)
- {
- PRINT((_L("CTRVideoEncoderClient::MdvroFatalError(), error[%d]"), aError))
- iFatalError = aError;
- iObserver.MtrdvcoFatalError(iFatalError);
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::GetCodingStandardSpecificInitOutputLC
-// Requests video encoder codinc options
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-HBufC8* CTRVideoEncoderClient::GetCodingStandardSpecificInitOutputLC()
- {
- if ( iDevVideoRecord )
- {
- HBufC8* condigDecInfo = iDevVideoRecord->CodingStandardSpecificInitOutputLC();
-
- if (condigDecInfo)
- {
- PRINT((_L("CTRVideoEncoderClient::GetCodingStandardSpecificInitOutputLC(), Vol header length[%d]"), condigDecInfo->Length()))
-
- if ( (condigDecInfo->Length() > 0) && (condigDecInfo->Length() <= KMaxDesC8Length /*256*/) )
- {
- iVolHeader.Des().Copy( condigDecInfo->Des() );
-
- // Keep vol length for further use
- iVolLength = iVolHeader.Des().Length();
- PRINT((_L("CTRVideoEncoderClient::GetCodingStandardSpecificInitOutputLC(), VolLength[%d]"), iVolLength))
-
- // VOS+VO+VOL header is now going to be stored to metadata, it must not be included in mediadata so remove it from the next buffer
- iRemoveHeader = ETrue;
- iVolHeaderSent = ETrue;
-
- if ( iCodecType == EH264 )
- {
- TPtr8 temp = condigDecInfo->Des();
-
- // get number of SPS/PPS units to be able to
- // remove them later from a frame buffer
- TInt index = condigDecInfo->Length() - 4;
-
- iNumH264SPSPPS = TInt(temp[index]) +
- (TInt(temp[index + 1]) << 8 ) +
- (TInt(temp[index + 2]) << 16) +
- (TInt(temp[index + 3]) << 24);
-
- }
-
- // Return codingInfo to the client
- return condigDecInfo;
- }
- }
- }
-
- // If condigDecInfo is not valid or something is going wrong, return NULL
- return NULL;
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::UseDataTransferOptimization
-// Client's request to use optimized data transfer via CI
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::UseDataTransferOptimizationL()
- {
- PRINT((_L("CTRVideoEncoderClient::UseDataTransferOptimizationL(), In")))
-
- // Check buffer management custom interface support before initializing
- iVideoBufferManagementCI = (MMmfVideoBufferManagement*)iDevVideoRecord->CustomInterface( iHwDeviceId, KMmfVideoBuffermanagementUid );
- PRINT((_L("CTRVideoEncoderClient::UseDataTransferOptimizationL(), iVideoBufferManagementCI[0x%x]"), iVideoBufferManagementCI))
-
- if (iVideoBufferManagementCI)
- {
- iVideoBufferManagementCI->MmvbmSetObserver(this);
- iVideoBufferManagementCI->MmvbmEnable(ETrue);
-
- // Set buffer options for this mode
- MMmfVideoBufferManagement::TBufferOptions bufferOptionsCI;
- bufferOptionsCI.iNumInputBuffers = KTRPictureBuffersNumberBMCI;
- bufferOptionsCI.iBufferSize = iPictureSize;
- iVideoBufferManagementCI->MmvbmSetBufferOptionsL(bufferOptionsCI);
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::UseDataTransferOptimizationL(), Optimized data transfer is not supported for this hwdevice")))
- User::Leave(KErrNotSupported);
- }
-
- PRINT((_L("CTRVideoEncoderClient::UseDataTransferOptimizationL(), Out")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MmvbmoNewBuffers
-// One or several buffers are available throug CI
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MmvbmoNewBuffers()
- {
- PRINT((_L("CTRVideoEncoderClient::MmvbmoNewBuffers()")))
-
- if (iVideoBufferManagementCI)
- {
- // Call CI observer to the client only in case, if CI was successfully initialized
- iObserver.MtrdvcoNewBuffers();
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MmvbmoReleaseBuffers
-// Release buffers
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MmvbmoReleaseBuffers()
- {
- PRINT((_L("CTRVideoEncoderClient::MmvbmoReleaseBuffers()")))
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::GetTargetVideoPictureL
-// Gets target video picture buffer
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TVideoPicture* CTRVideoEncoderClient::GetTargetVideoPictureL()
- {
- if (iVideoBufferManagementCI)
- {
- return iVideoBufferManagementCI->MmvbmGetBufferL(iPictureSize);
- }
- else
- {
- PRINT((_L("CTRVideoEncoderClient::GetTargetVideoPictureL(), optimized data transfer is not supported")))
- User::Leave(KErrNotSupported);
-
- // Make compiler happy
- return NULL;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::SetRandomAccessPoint
-// Requests to set random access point to bitstream
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::SetRandomAccessPoint()
- {
- PRINT((_L("CTRVideoEncoderClient::SetRandomAccessPoint(), In")))
-
- // There are several ways to requestI-Frame:
- // 1. Pause() and immediately resume() should force to encoder to generate I-Frame.
- // 2. Set TVideoPictureOption: some of encoders don't support this
- // 3. PictureLoss(): some of encoders don't support this
-
- // Use TVideoPictureOption to request the I-frame later
- iSetRandomAccessPoint = ETrue;
-
- PRINT((_L("CTRVideoEncoderClient::SetRandomAccessPoint(), Out")))
- }
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::EstimateEncodeFrameTimeL
-// Returns a time estimate on long it takes to encode one frame
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TReal CTRVideoEncoderClient::EstimateEncodeFrameTimeL(const TTRVideoFormat& aOutput, TInt aCodecType)
- {
- if (iUid == TUid::Null())
- {
- PRINT((_L("CTRVideoEncoderClient::EstimateEncodeFrameTimeL(), no encoder selected yet")))
- User::Leave(KErrNotReady);
- }
-
- TReal time = 0.0;
-
- // Select the predefined constant using the current settings
- if (aCodecType == EH263)
- {
- time = iAcceleratedCodecSelected ? KTREncodeTimeFactorH263HW : KTREncodeTimeFactorH263SW;
- }
- else if (aCodecType == EH264)
- {
- time = iAcceleratedCodecSelected ? KTREncodeTimeFactorH264HW : KTREncodeTimeFactorH264SW;
- }
- else
- {
- time = iAcceleratedCodecSelected ? KTREncodeTimeFactorMPEG4HW : KTREncodeTimeFactorMPEG4SW;
- }
-
- // Multiply the time by the resolution of the output frame
- time *= static_cast<TReal>(aOutput.iSize.iWidth + aOutput.iSize.iHeight) * KTRTimeFactorScale;
-
- PRINT((_L("CTRVideoEncoderClient::EstimateEncodeFrameTimeL(), encode frame time: %.2f"), time))
-
- return time;
- }
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::Pause
-// Pauses encoding
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::Pause()
- {
- if ((iFatalError == KErrNone) && (iState == ETRRunning))
- {
- iDevVideoRecord->Pause();
- iState = ETRPaused;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::Resume
-// Resumes encoding
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::Resume()
- {
- if ((iFatalError == KErrNone) && (iState == ETRPaused))
- {
- iDevVideoRecord->Resume();
- iState = ETRRunning;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::EnableResourceObserver
-// Enable / Disable resourece observer
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::EnableResourceObserver(TBool aEnable)
- {
- PRINT((_L("CTRVideoEncoderClient::EnableResourceObserver(), In")))
-
- iVideoResourceHandlerCI = (MMmfVideoResourceHandler*)iDevVideoRecord->CustomInterface( iHwDeviceId, KUidMmfVideoResourceManagement );
- PRINT((_L("CTRVideoEncoderClient::EnableResourceObserver(), iVideoResourceHandlerCI[0x%x]"), iVideoResourceHandlerCI))
-
- if (iVideoResourceHandlerCI)
- {
- if (aEnable)
- {
- iVideoResourceHandlerCI->MmvrhSetObserver(this);
- PRINT((_L("CTRVideoEncoderClient::EnableResourceObserver(), Enabled")))
- }
- else
- {
- iVideoResourceHandlerCI->MmvrhSetObserver(NULL);
- }
- }
-
- PRINT((_L("CTRVideoEncoderClient::EnableResourceObserver(), Out")))
- }
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MmvroResourcesLost
-// Indicates that a media device has lost its resources
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MmvroResourcesLost(TUid /*aMediaDevice*/)
- {
- iObserver.MtrdvcoResourcesLost(EFalse);
- }
-
-
-// -----------------------------------------------------------------------------
-// CTRVideoEncoderClient::MmvroResourcesRestored
-// Indicates that a media device has regained its resources
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CTRVideoEncoderClient::MmvroResourcesRestored(TUid /*aMediaDevice*/)
- {
- iObserver.MtrdvcoResourcesRestored();
- }
-
-// End of file
-