Community: Wiki

你在这里: You Are Here: Olet tässä: Vous êtes ici: Sie befinden sich hier: Tu sei qui: 現在のページ: Você está aqui: Вы здесь: Usted está aquí:
This page was last modified 21:10, 13 October 2008.

CS001065 - MDFDevVideo Record API

From Forum Nokia Wiki



ID CS001065 Creation date July 7, 2008
Platform S60 3rd Edition, FP2 Tested on devices
Category Symbian C++ Subcategory Multimedia, Video


Keywords (APIs, classes, methods, functions): MDFDevVideo Record API


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


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.

Image:DevvideoEx.zip

Rate This

 
Bookmark this page: DeliciousDiggFacebookGoogleYahooStumbleUponRedditFurlTechnocratiMagnoliaTwitter  Share this page Share this page Invite a friend Invite a friend
E-mail Newsletters Press Terms & Conditions Privacy Policy Sitemap Contact Us Regional websites: Chinese Japanese © 2008 Nokia 
RDF Facets: qfnZtypeQUqfnTypeZCommunityContentQ qfnZtypeQUqfnTypeZWebpageQ qfnZtypeQUqfnTypeZWikiContentQ qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX