diff -r 000000000000 -r 58be5850fb6c omxilcomp/omxilgeneric/filesink/src/omxilfilesink.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxilcomp/omxilgeneric/filesink/src/omxilfilesink.cpp Thu Sep 02 20:13:57 2010 +0300 @@ -0,0 +1,284 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// +// Description: +// + + + +#include +#include +#include + +#include "omxilfilesink.h" +#include "omxilfilesinkprocessingfunction.h" +#include "omxilfilesinkconfigmanager.h" +#include "omxilfilesink.hrh" + + +#ifdef OMXIL_AUDIO_FILESINK +#include "omxilaudiofilesinkapb0port.h" +_LIT8(KNokiaOMXFileSinkComponentName, "OMX.NOKIA.AUDIO.FILESINK"); +_LIT8(KNokiaOMXFileSinkRole, "audio_writer.binary"); +OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidNokiaOmxILAudioFileSink); + +#elif defined(OMXIL_VIDEO_FILESINK) +#include "omxilvideofilesinkvpb0port.h" +_LIT8(KNokiaOMXFileSinkComponentName, "OMX.NOKIA.VIDEO.FILESINK"); +_LIT8(KNokiaOMXFileSinkRole, "video_writer.binary"); +OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidNokiaOmxILVideoFileSink); + +#elif defined(OMXIL_IMAGE_FILESINK) +#include "omxilimagefilesinkipb0port.h" +_LIT8(KNokiaOMXFileSinkComponentName, "OMX.NOKIA.IMAGE.FILESINK"); +_LIT8(KNokiaOMXFileSinkRole, "image_writer.binary"); +OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidNokiaOmxILImageFileSink); + +#elif defined(OMXIL_OTHER_FILESINK) +#include "omxilotherfilesinkopb0port.h" +_LIT8(KNokiaOMXFileSinkComponentName, "OMX.NOKIA.OTHER.FILESINK"); +_LIT8(KNokiaOMXFileSinkRole, "other_writer.binary"); +OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidSymbianOmxILOtherFileSink); + +#endif + +const TUint8 KComponentVersionMajor = 1; +const TUint8 KComponentVersionMinor = 1; +const TUint8 KComponentVersionRevision = 0; +const TUint8 KComponentVersionStep = 0; + +static const TInt KMinBuffers = 1; +static const TInt KMinBufferSize = 15360; + + +// Component Entry Point +OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE aComponent) + { + TRAPD(err, COmxILFileSink::CreateComponentL(aComponent)); + if (err == KErrNone) + { + return OMX_ErrorNone; + } + else + { + return err == KErrNoMemory ? OMX_ErrorInsufficientResources : OMX_ErrorUndefined; + } + } + +void COmxILFileSink::CreateComponentL(OMX_HANDLETYPE aComponent) + { + COmxILFileSink* self = new (ELeave) COmxILFileSink(); + CleanupStack::PushL(self); + self->ConstructL(aComponent); + CleanupStack::Pop(self); + } + +COmxILFileSink::COmxILFileSink() + { + // nothing to do + } + +COmxILFileSink::~COmxILFileSink() + { + } + +void COmxILFileSink::ConstructL(OMX_HANDLETYPE aComponent) + { + // STEP 1: Initialize the data received from the IL Core + COmxILComponent::ConstructL(aComponent); + + // STEP 2: Create the call backs manager... + MOmxILCallbackNotificationIf* callbackNotificationIf=CreateCallbackManagerL(COmxILComponent::EOutofContext); + + // STEP 3: Create the file sink-specific Processing Function... + COmxILFileSinkProcessingFunction* pProcessingFunction = COmxILFileSinkProcessingFunction::NewL(*callbackNotificationIf); + RegisterProcessingFunction(pProcessingFunction); + + // STEP 4: Create Port manager... + +#ifdef OMXIL_AUDIO_FILESINK + CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager, + TOmxILSpecVersion(), // OMX Version + 1, // The number of audio ports in this component + 0, // The starting audio port index + 0, // The number of image ports in this component + 0, // The starting image port index + 0, // The number of video ports in this component + 0, // The starting video port index + 0, // The number of other ports in this component + 0 // The starting other port index + ); + +#elif defined(OMXIL_VIDEO_FILESINK) + CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager, + TOmxILSpecVersion(), // OMX Version + 0, // The number of audio ports in this component + 0, // The starting audio port index + 0, // The number of image ports in this component + 0, // The starting image port index + 1, // The number of video ports in this component + 0, // The starting video port index + 0, // The number of other ports in this component + 0 // The starting other port index + ); + +#elif defined(OMXIL_IMAGE_FILESINK) + CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager, + TOmxILSpecVersion(), // OMX Version + 0, // The number of audio ports in this component + 0, // The starting audio port index + 1, // The number of image ports in this component + 0, // The starting image port index + 0, // The number of video ports in this component + 0, // The starting video port index + 0, // The number of other ports in this component + 0 // The starting other port index + ); + + +#elif defined(OMXIL_OTHER_FILESINK) + CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager, + TOmxILSpecVersion(), // OMX Version + 0, // The number of audio ports in this component + 0, // The starting audio port index + 0, // The number of image ports in this component + 0, // The starting image port index + 0, // The number of video ports in this component + 0, // The starting video port index + 1, // The number of other ports in this component + 0 // The starting other port index + ); +#endif + + // STEP 5: Create the File Sink component port... + COmxILPort* pPort = ConstructPortL(); + CleanupStack::PushL(pPort); + + // STEP 6: Add to the port manager... + User::LeaveIfError(AddPort(pPort, OMX_DirInput)); + CleanupStack::Pop(); //pPort + + // STEP 7: Create the non-port related configuration manager... + RPointerArray componentRoles; + CleanupClosePushL(componentRoles); + + componentRoles.AppendL(&KNokiaOMXFileSinkRole); + COmxILFileSinkConfigManager* pConfigManager = COmxILFileSinkConfigManager::NewL( + KNokiaOMXFileSinkComponentName, + TOmxILVersion(KComponentVersionMajor, + KComponentVersionMinor, + KComponentVersionRevision, + KComponentVersionStep), + componentRoles, + *pProcessingFunction); + RegisterConfigurationManager(pConfigManager); + CleanupStack::PopAndDestroy(&componentRoles); + + // STEP 9: Finally, let's get everything started + InitComponentL(); + } + +COmxILPort* COmxILFileSink::ConstructPortL() const + { + OMX_U32 thisPortIndex = 0; + //const TUint32 KBufferAlignment = 4; +#ifdef OMXIL_AUDIO_FILESINK + RArray supportedAudioFormats; + CleanupClosePushL(supportedAudioFormats); + supportedAudioFormats.AppendL(OMX_AUDIO_CodingUnused); + COmxILAudioFileSinkAPB0Port* pPort = COmxILAudioFileSinkAPB0Port::NewL( + TOmxILCommonPortData ( + TOmxILSpecVersion(), // OMX specification version information + thisPortIndex, // Port number the structure applies to + OMX_DirInput, // Direction of this port + KMinBuffers, // The minimum number of buffers this port requires + KMinBufferSize, // Minimum size, in bytes, for buffers to be used for this port + OMX_PortDomainAudio, // Domain of the port + OMX_FALSE, // Buffers contiguous requirement (true or false) + 0, // Buffer aligment requirements + OMX_BufferSupplyOutput, // supplier preference when tunneling between two ports + COmxILPort::KBufferMarkPropagationPortNotNeeded), + supportedAudioFormats, + static_cast(*GetProcessingFunction())); + CleanupStack::PopAndDestroy(&supportedAudioFormats); + return pPort; + +#elif defined(OMXIL_VIDEO_FILESINK) + RArray supportedVideoFormats; + CleanupClosePushL(supportedVideoFormats); + RArray supportedColourFormats; + CleanupClosePushL(supportedColourFormats); + COmxILVideoFileSinkVPB0Port* pPort = COmxILVideoFileSinkVPB0Port::NewL( + TOmxILCommonPortData ( + TOmxILSpecVersion(), // OMX specification version information + thisPortIndex, // Port number the structure applies to + OMX_DirInput, // Direction of this port + KMinBuffers, // The minimum number of buffers this port requires + KMinBufferSize, // Minimum size, in bytes, for buffers to be used for this port + OMX_PortDomainVideo, // Domain of the port + OMX_FALSE, // Buffers contiguous requirement (true or false) + 0, // Buffer aligment requirements + OMX_BufferSupplyOutput, // supplier preference when tunneling between two ports + COmxILPort::KBufferMarkPropagationPortNotNeeded), + supportedVideoFormats, + supportedColourFormats, + static_cast(*GetProcessingFunction())); + CleanupStack::PopAndDestroy(2); + return pPort; + +#elif defined(OMXIL_IMAGE_FILESINK) + RArray supportedImageFormats; + CleanupClosePushL(supportedImageFormats); + //supportedImageFormats.AppendL(OMX_IMAGE_CodingUnused); + RArray supportedColourFormats; + CleanupClosePushL(supportedColourFormats); + COmxILImageFileSinkIPB0Port* pPort = COmxILImageFileSinkIPB0Port::NewL( + TOmxILCommonPortData ( + TOmxILSpecVersion(), // OMX specification version information + thisPortIndex, // Port number the structure applies to + OMX_DirInput, // Direction of this port + KMinBuffers, // The minimum number of buffers this port requires + KMinBufferSize, // Minimum size, in bytes, for buffers to be used for this port + OMX_PortDomainImage, // Domain of the port + OMX_FALSE, // Buffers contiguous requirement (true or false) + 0, // Buffer aligment requirements + OMX_BufferSupplyOutput, // supplier preference when tunneling between two ports + COmxILPort::KBufferMarkPropagationPortNotNeeded), + supportedImageFormats, + supportedColourFormats, + static_cast(*GetProcessingFunction())); + CleanupStack::PopAndDestroy(2); + return pPort; + +#elif defined(OMXIL_OTHER_FILESINK) + RArray supportedOtherFormats; + CleanupClosePushL(supportedOtherFormats); + supportedOtherFormats.AppendL(OMX_OTHER_FormatBinary); + COmxILOtherFileSinkOPB0Port* pPort = COmxILOtherFileSinkOPB0Port::NewL( + TOmxILCommonPortData ( + TOmxILSpecVersion(), // OMX specification version information + thisPortIndex, // Port number the structure applies to + OMX_DirInput, // Direction of this port + KMinBuffers, // The minimum number of buffers this port requires + KMinBufferSize, // Minimum size, in bytes, for buffers to be used for this port + OMX_PortDomainOther, // Domain of the port + OMX_FALSE, // Buffers contiguous requirement (true or false) + 0, // Buffer aligment requirements + OMX_BufferSupplyOutput, // supplier preference when tunneling between two ports + COmxILPort::KBufferMarkPropagationPortNotNeeded), + supportedOtherFormats, + static_cast(*GetProcessingFunction())); + CleanupStack::PopAndDestroy(&supportedOtherFormats); + return pPort; + +#endif + }