×
Namespaces

Variants
Actions
Revision as of 22:11, 28 September 2012 by lpvalente (Talk | contribs)

Archived:MDFDevVideo Record Symbian API

From Nokia Developer Wiki
Jump to: navigation, search

Archived.pngArchived: This article is archived because it is not considered relevant for third-party developers creating commercial solutions today. If you think this article is still relevant, let us know by adding the template {{ReviewForRemovalFromArchive|user=~~~~|write your reason here}}.

Article Metadata
Code ExampleCompatibility
Platform(s): S60 3rd Edition, FP2
S60 3rd Edition FP2
Article
Keywords: MDFDevVideo Record API
Created: User:Technical writer 1 (07 Jul 2008)
Last edited: lpvalente (28 Sep 2012)

Note.pngNote: This API is not part of the public SDK. It can be found in the SDK API Plug-in.

Contents

Overview

The Video Encoding and Recording API is also known as the DevVideoRecord API. Multimedia Framework (MMF) plug-ins use this interface to access video encoders and preprocessors in a platform and hardware-independent manner.

Header files

   #include <devvideorecord.h>

Link against

 LIBRARY devvideo.lib

Source file

The MMMFDevVideoObserver class defines the observer mixin interface that any client using CMMFDevVideoRecord must implement.

    //MMMFDevVideoRecordObserver
virtual void MdvroReturnPicture(TVideoPicture* aPicture) = 0;
virtual void MdvroSupplementalInfoSent() = 0;
virtual void MdvroNewBuffers() = 0;
virtual void MdvpoError(TInt aError) = 0;
virtual void MdvroInitializeComplete(TInt aError);
Virtual void MdvroStreamEnd();
 
 
 
//NewL()
delete iDvr;
iDvr = NULL;
iDvr = CMMFDevVideoRecord::NewL(*this);
 
// Find an accelerated encoder if possible, non-accelerated if not
RArray<TUid> encs;
iDvr->FindEncodersL(KMime, 0, encs, EFalse);
TUid enc = TUid::Uid(0);
TBool foundAccel = EFalse;
for ( TInt i = 0; i < encs.Count(); i++ ) {
CVideoEncoderInfo *info = iDvr->VideoEncoderInfoLC(encs[i]);
if ( info->Accelerated() ) {
enc = encs[i];
foundAccel = ETrue;
} else if ( !foundAccel ) {
LFPRINT((_L("Not accelerated, but haven't seen one so far --using this")));
enc = encs[i];
} else {
LFPRINT((_L("Not accelerated and already have one -- skipping")));
}
CleanupStack::PopAndDestroy();
}
 
if ( enc.iUid == 0 ) {
User::Leave(KErrNotSupported);
}
 
// Select encoder
iEnc = iDvr->SelectEncoderL(enc);
 
// Input format
TSize size(176, 144);
TUncompressedVideoFormat fmt;
fmt.iDataFormat = EYuvRawData;
fmt.iYuvFormat.iCoefficients = EYuvBt601Range1;
fmt.iYuvFormat.iPattern = EYuv420Chroma2;
fmt.iYuvFormat.iDataLayout = EYuvDataPlanar;
fmt.iYuvFormat.iYuv2RgbMatrix = NULL;
fmt.iYuvFormat.iRgb2YuvMatrix = NULL;
fmt.iYuvFormat.iAspectRatioNum = 1;
fmt.iYuvFormat.iAspectRatioDenom = 1;
iDvr->SetInputFormatL(iEnc, fmt, size);
 
// Output format
CCompressedVideoFormat *cfmt = CCompressedVideoFormat::NewL(KMime);
CleanupStack::PushL(cfmt);
iDvr->SetOutputFormatL(iEnc, *cfmt, EDuCodedPicture,EDuElementaryStream,
EFalse);
CleanupStack::PopAndDestroy(); //cfmt
 
// Buffer options
TEncoderBufferOptions bopt;
bopt.iMaxPreEncoderBufferPictures = 1;
bopt.iHrdVbvSpec = EHrdVbvNone;
bopt.iHrdVbvParams.Set(NULL, 0);
bopt.iMaxOutputBufferSize = 10240;
bopt.iMaxCodedPictureSize = 10240;
bopt.iMaxCodedSegmentSize = 10240; // ignored in non-segmented mode
bopt.iMinNumOutputBuffers = 2;
iDvr->SetBufferOptionsL(bopt);
 
// Source is memory
iDvr->SetSourceMemoryL(15.0, EFalse, EFalse); // not real-time
 
// Initialize
iDvr->Initialize();
 
 
 
//WRITE PIC
// Generate data
TInt y = iPicNum % 14;
Mem::Fill(iYuv, 176*y*10, 200);
Mem::Fill(iYuv + 176*y*10, 176*144 - 176*y*10, 0);
Mem::Fill(iYuv + 176*144, 176*144/2, 128);
 
// Write picture
iPic.iData.iDataFormat = EYuvRawData;
iPic.iData.iDataSize = TSize(176,144);
iPicDataPtr.Set(iYuv, 176*144*3/2, 176*144*3/2);
iPic.iData.iRawData = &iPicDataPtr;
iPic.iOptions = TVideoPicture::ETimestamp;
iPic.iTimestamp = (1000000 * iPicNum) / 15;
TRAPD(err, iDvr->WritePictureL(&iPic));
if ( err != KErrNone ) {
LFPRINT((_L("WritePictureL failed with %d"), err));
TestComplete(err);
}
iPicNum++;


Example project

This application does very basic MPEG-4 video encoding from a memory source and writes the results to a file. It does just about the least amount of work to get everything up and running, and while the settings may be too basic for a real application, it should be useful for comparison purposes. Once the application is running, you can start adding additional rate control and other settings as needed.

Media:DevvideoEx.zip

98 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×