OMX_ERRORTYPE EnableDataFlow::freeHandles()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    DBGT_ASSERT(NULL != mArmIvProc, "mArmIvProc is NULL");
    DBGT_ASSERT(NULL != mSwJpegEnc, "mSwJpegEnc is NULL");

    DBGT_PTRACE("Sending ArmIv to unloaded State");
    err = mOmxUtils.interface()->GetpOMX_FreeHandle()(mArmIvProc);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("GetpOMX_FreeHandle ArmIVProc failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mArmIvProc = NULL ;

    DBGT_PTRACE("Sending SwJpegEnc to unloaded State");
    err = mOmxUtils.interface()->GetpOMX_FreeHandle()(mSwJpegEnc);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("GetpOMX_FreeHandle SwJpegenc failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mSwJpegEnc = NULL ;

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::setupTunneling()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    //make tunnel between output port1 of ARMIV Proc and input port of SW JPEG Enc
    DBGT_PTRACE("ARM IV  port: %lu SW JPEG ENcport: %lu", mParamArmIvOutput.nPortIndex, mParamSwJpegInput.nPortIndex);
    err = (mOmxUtils.interface()->GetpOMX_SetupTunnel())(mArmIvProc, mParamArmIvOutput.nPortIndex,
            mSwJpegEnc, mParamSwJpegInput.nPortIndex);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL(" OMX_SetupTunnel failed between ARMIV Proc and SW JPEGEnc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    //make tunnel between Output port of  SWJPEGENC with input port 0 of EXIF MIxer
    DBGT_PTRACE("SW JPEG ENcport: %lu EXIF Mixer POrt: %lu", mParamSwJpegOutput.nPortIndex, mParamExifInput.nPortIndex);
    err = (mOmxUtils.interface()->GetpOMX_SetupTunnel())(mSwJpegEnc, mParamSwJpegOutput.nPortIndex,
            mExifMixer, mParamExifInput.nPortIndex);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL(" OMX_SetupTunnel failed between SWJPEGENC and EXIFMIXER err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE DeviceRotation::doConfiguration()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    if(mSTECamera->mPictureInfo.swapParams()) {
        err = mSTECamera->getThumbnailHandler()->configure(mSTECamera->mThumbnailInfo,
                                                           mSTECamera->mPreviewInfo);
        if(OMX_ErrorNone != err) {
            DBGT_CRITICAL("configure() failed err = %d", err);
            DBGT_EPILOG("");
            return err;
        }

        err = mSTECamera->ReconfigureStill(mSTECamera->mPictureInfo, false);
        if(OMX_ErrorNone != err) {
            DBGT_CRITICAL("ReconfigureStill() failed err = %d", err);
            DBGT_EPILOG("");
            return err;
        }
    }
    err = setupRotationProcessing();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("setupRotationProcessing() err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mSTECamera->mPictureInfo.resetSwapParams();
    mSTECamera->mThumbnailInfo.resetSwapParams();

    DBGT_EPILOG("");
    return err;
}
int STENativeWindow::dequeueBuffer(buffer_handle_t **ppBuffer, int *pStride)
{
    DBGT_PROLOG("");
    if (!mInitialized) {
        DBGT_CRITICAL("mInitialized = %d", mInitialized);
        DBGT_EPILOG("");
        return -1;
    }

    int stride;
    status_t error = mPreviewWindow->dequeue_buffer(
                        mPreviewWindow,
                        ppBuffer,
                        &stride);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }
    if (pStride) {
        *pStride = stride;
    }

    DBGT_EPILOG("");
    return 0;
}
OMX_ERRORTYPE FixedFocusHandler::setUpFocus(const char* const aFocus)
{
    DBGT_PROLOG("Focus: %s", aFocus);
    DBGT_ASSERT(NULL != aFocus, "Focus is NULL");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    //Setting Focus Control
    OmxUtils::StructContainer<OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE> focusControl;
    focusControl.ptr()->nPortIndex = OMX_ALL;

    err = OMX_GetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    focusControl.ptr()->eFocusControl = OMX_IMAGE_FocusControlOff;
    focusControl.ptr()->nFocusStepIndex = 0;
    focusControl.ptr()->nFocusSteps = 100;
    DBGT_PTRACE("Setting Control %u", focusControl.ptr()->eFocusControl);

    err = OMX_SetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::resetComponents()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    DBGT_PTRACE("Sending Command StateIdle to SwJpegEnc");
    err = OMX_SendCommand(mSwJpegEnc, OMX_CommandStateSet, OMX_StateIdle, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Sending OMX_StateIdle failed for SwJpegEnc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_PTRACE("Sending Command StateIdle to ArmIv");
    err = OMX_SendCommand(mArmIvProc, OMX_CommandStateSet, OMX_StateIdle, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Sending OMX_StateIdle failed for ArmIVProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mStateArmIvSem.wait();
    mStateSWJpegSem.wait();

    DBGT_PTRACE("Sending Command StateLoaded to ArmIv");
    err = OMX_SendCommand(mArmIvProc, OMX_CommandStateSet, OMX_StateLoaded, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Sending OMX_StateLoaded failed for ArmIVProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_PTRACE("Sending Command StateLoaded to SwJpegEnc");
    err = OMX_SendCommand(mSwJpegEnc, OMX_CommandStateSet, OMX_StateLoaded, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Sending OMX_StateLoaded failed for SwJpegEnc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    err = freeBuffers();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Free buffers err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mStateSWJpegSem.wait();
    mStateArmIvSem.wait();

    DBGT_EPILOG("");
    return err;
}
int STENativeWindow::init(
        int width,
        int height,
        int pixelFormat,
        int usage)
{
    DBGT_PROLOG("");
    if (mPreviewWindow == NULL) {
        DBGT_CRITICAL("mPreviewWindow = %p", mPreviewWindow);
        DBGT_EPILOG("");
        return -1;
    }
    if (mInitialized)
    {
        DBGT_EPILOG("");
        return 0;
    }

    status_t error
        = mPreviewWindow->set_buffers_geometry(
                mPreviewWindow,
                width,
                height,
                pixelFormat);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }

    error = mPreviewWindow->get_min_undequeued_buffer_count(
                mPreviewWindow, &mMinUndequeuedCount);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }

    error = mPreviewWindow->set_usage(
                mPreviewWindow,
                usage);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }

    mInitialized = true;
    DBGT_EPILOG("");
    return 0;
}
OMX_ERRORTYPE EnableDataFlow::sendComponentToExecuting()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    DBGT_PTRACE("Sending Command StateIdle to ArmIv");
    err = OMX_SendCommand(mArmIvProc, OMX_CommandStateSet, OMX_StateIdle, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_CommandStateSet IDLE failed for mArmIvProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_PTRACE("Sending Command StateIdle to SWJpeg");
    err = OMX_SendCommand(mSwJpegEnc, OMX_CommandStateSet, OMX_StateIdle, NULL);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_CommandStateSet IDLE failed for mSwJpegEnc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    mStateArmIvSem.wait();
    mStateSWJpegSem.wait();

    DBGT_PTRACE("Sending Command StateExecuting to ArmIv");
    err = OMX_SendCommand(mArmIvProc, OMX_CommandStateSet, OMX_StateExecuting, NULL);
     if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_CommandStateSet EXECUTING failed for mArmIvProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_PTRACE("Sending Command StateExecuting to SWJpeg");
    err = OMX_SendCommand(mSwJpegEnc, OMX_CommandStateSet, OMX_StateExecuting, NULL);
     if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_CommandStateSet EXECUTING failed for mSwJpegEnc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }


    mStateArmIvSem.wait();
    mStateSWJpegSem.wait();

    DBGT_EPILOG("");
    return err;
}
STEOMXCodecsPlugin::STEOMXCodecsPlugin() {
    DBGT_PROLOG();

    OMX_ERRORTYPE err = OMX_ErrorNone;

    mHandle = dlopen(STEOMXINT_SO_FILE, RTLD_NOW);
    if ( NULL == mHandle ) {
        DBGT_CRITICAL("dlopen() failed %s", dlerror());
        goto dl_close;
    }

    DBGT_PINFO("dlopen passed");

    typedef OMXCoreInterface* (*pGetCoreInterface)();

    pGetCoreInterface temp;
    temp = (pGetCoreInterface)dlsym(mHandle, "GetOMXCoreInterface");
    mInterface  = (*temp)();
    if (mInterface == NULL) {
        DBGT_CRITICAL("dlsym(GetOMXCoreInterface) failed, err=%s", dlerror());
        goto dl_close;
    }

    err = (mInterface->GetpOMX_Init())();

    if (err != OMX_ErrorNone) {
        DBGT_CRITICAL("GetpOMX_Init failed, err=%s",
                      OMX_TYPE_TO_STR(OMX_ERRORTYPE, err));
        goto clean_interface;
    }

    DBGT_PINFO("GetpOMX_Init passed for interface=%p", mInterface);

    DBGT_EPILOG();
    return;

clean_interface:
    mInterface = NULL;
dl_close:
    dlclose(mHandle);
    mHandle = NULL ;

    DBGT_EPILOG("error, %s %s", mHandle?"":"mHandle=NULL",
                mInterface?"":"mInterface=NULL");
    return;

}
OMX_ERRORTYPE DeviceHwRotation::setupRotationProcessing()
{
    DBGT_PROLOG("");

    DBGT_ASSERT(NULL != mSTECamera->mCam, "Camera Handle is Null");

    int rotation = mSTECamera->mPictureInfo.getRotation();
    DBGT_ASSERT(180 != rotation, "Invalid rotation for Hw Processing");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    /*Setup Hardware Processing*/
    OmxUtils::StructContainer<OMX_SYMBIAN_CONFIG_ORIENTATIONTYPE> stillOrientationConfig;

    stillOrientationConfig.ptr()->nPortIndex = paramPortVPB1.nPortIndex;

    err = OMX_GetConfig(mSTECamera->mCam, mSTECamera->mOmxILExtIndex->getIndex(OmxILExtIndex::EOrientationScene), stillOrientationConfig.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Orientation Scene OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    if (0 == rotation) {
        stillOrientationConfig.ptr()->eOrientation = OMX_SYMBIAN_OrientationRowTopColumnLeft;
    } else if (90 == rotation) {   /*< Frame is 90 degrees CW rotated */
        stillOrientationConfig.ptr()->eOrientation = OMX_SYMBIAN_OrientationRowRightColumnTop;
    } else if (270 == rotation) {  /*< Frame is 270 degrees CW rotated */
        stillOrientationConfig.ptr()->eOrientation = OMX_SYMBIAN_OrientationRowLeftColumnBottom;
    } else
        DBGT_CRITICAL("Cant Happen");

    err = OMX_SetConfig(mSTECamera->mCam, mSTECamera->mOmxILExtIndex->getIndex(OmxILExtIndex::EOrientationScene), stillOrientationConfig.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Orientation Scene OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    /*Setup Software Processing*/
    mSTECamera->mISPImageOmxBuffInfo.mSwRotation = NULL;

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::configure(const ImageInfo &aThumbnailInfo,
                                        const ImageInfo &aPreviewInfo)
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    /* check whether mArmIvProc and mSwJpegEnc are in executing state or not,
     * if not, send them to executing first.
     * This being the case when without doing setParameters(), startPreview()
     * is called. As thumbnailhandler is setup for disableDataFlow, when a
     * setParameters() is done with some valid thumbnail size, enableDataFlow's
     * sendComponentToExecuting() is not called leading to a deadlock.
     */
    OMX_STATETYPE armIvProcState, swJpegEncState;
    OMX_GetState(mArmIvProc, &armIvProcState);
    OMX_GetState(mSwJpegEnc, &swJpegEncState);

    if(OMX_StateExecuting != armIvProcState || OMX_StateExecuting != swJpegEncState){
        err = sendComponentToExecuting();
        if(OMX_ErrorNone != err) {
            DBGT_CRITICAL("sendComponentToExecuting failed err = %d", err);
            DBGT_EPILOG("");
            return err;
        }
    }

    err = configPorts(aThumbnailInfo, aPreviewInfo);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("configPorts() failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    err = enablePorts();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("enablePorts failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
/**
 *  Undo MMIO initializations.
 *  @param slot indicates which camera to de-init
 *  @return OMX_ErrorNone or other OMX error codes
 */
OMX_ERRORTYPE CSiaPlatformManager::deinit(
        enumExtCameraSlot slot)
{
    OMX_ERRORTYPE error=OMX_ErrorNone;

    //-------------------------------------------------------
    // PowerOff the sensor
    //-------------------------------------------------------
    error = MMIO_Camera::powerSensor(OMX_FALSE);
    if (error) {
        DBGT_PTRACE("ERROR in MMIO_Camera::powerSensor(OFF) !");
        return error;
    }

#ifndef MMIO_ENABLE_NEW_IF
    //-------------------------------------------------------
    // Switch OFF extClk
    //-------------------------------------------------------
    error = MMIO_Camera::setExtClk(OMX_FALSE);
    if (error) {
        DBGT_PTRACE("ERROR in MMIO_Camera::setExtClk(OFF) !");
        return error;
    }
#endif //MMIO_ENABLE_NEW_IF

    //-------------------------------------------------------
    // Desinit board
    //-------------------------------------------------------
    error = MMIO_Camera::desinitBoard();
    if (error) {
        DBGT_PTRACE("ERROR in MMIO_Camera::deinitBoard !");
        return error;
    }

    //-------------------------------------------------------
    // Release driver
    //-------------------------------------------------------
#ifdef MMIO_ENABLE_NEW_IF
    error = MMIO_Camera::releaseDriver();
    if (error) {
        DBGT_CRITICAL("ERROR in MMIO_Camera::releaseDriver!");
    }
#else
    if(slot ==ePrimaryExtCamera)
        error = MMIO_Camera::releasePrimaryCameraHWInterface();
    else
        error = MMIO_Camera::releaseSecondaryCameraHWInterface();
    if (error) {
        DBGT_PTRACE("ERROR in MMIO_Camera::releasePrimary/SecondaryCameraHWInterface !");
    }
#endif

    return error;
}
int STENativeWindow::setBufferCount(int count)
{
    DBGT_PROLOG("");
    if (!mInitialized || count < mMinUndequeuedCount) {
        DBGT_CRITICAL("mInitialized = %d, count = %d", mInitialized, count);
        DBGT_EPILOG("");
        return -1;
    }

    status_t error = mPreviewWindow->set_buffer_count(
                        mPreviewWindow, count);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }

    DBGT_EPILOG("");
    return 0;
}
OMX_ERRORTYPE EnableDataFlow::setAutoRotate(OMX_BOOL aEnaleAutoRotate)
{
    DBGT_PROLOG("aEnaleAutoRotate: %d", aEnaleAutoRotate);

    DBGT_ASSERT(NULL != mArmIvProc, "mArmIvProc is NULL");
    DBGT_ASSERT(1 == mParamArmIvOutput.nPortIndex, "mParamArmIvOutput.nPortIndex is invalid");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    OMX_INDEXTYPE index;

    OmxUtils::StructContainer<OMX_SYMBIAN_CONFIG_BOOLEANTYPE> autoRotate;

    err = OMX_GetExtensionIndex(mArmIvProc, (char *)OMX_SYMBIAN_INDEX_CONFIG_COMMON_AUTOROTATIONCONTROL_NAME, &index);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Still Auto Rotation OMX_GetExtensionIndex failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    autoRotate.ptr()->nPortIndex = mParamArmIvOutput.nPortIndex;

    err = OMX_GetConfig(mArmIvProc, index, autoRotate.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Auto Rotation OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    autoRotate.ptr()->bEnabled = aEnaleAutoRotate;

    err = OMX_SetConfig(mArmIvProc, index, autoRotate.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Auto Rotation OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
int STENativeWindow::lockBuffer(buffer_handle_t &pBuffer)
{
    DBGT_PROLOG("");
    if (!mInitialized) {
        DBGT_CRITICAL("mInitialized = %d", mInitialized);
        DBGT_EPILOG("");
        return -1;
    }

    status_t error = mPreviewWindow->lock_buffer(
                        mPreviewWindow,
                        &pBuffer);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }

    DBGT_EPILOG("");
    return 0;
}
int STENativeWindow::setCrop(int left, int top, int right, int bottom)
{
    DBGT_PROLOG("");
    if (!mInitialized) {
        DBGT_CRITICAL("mInitialized = %d", mInitialized);
        DBGT_EPILOG("");
        return -1;
    }
    status_t error = mPreviewWindow->set_crop(
                        mPreviewWindow,
                        left, top,
                        right, bottom);
    if (OK != error) {
        DBGT_CRITICAL("error = %d", error);
        DBGT_EPILOG("");
        return -1;
    }
    
    DBGT_EPILOG("");
    return 0;
}
OMX_ERRORTYPE ImageRotHandler::setAutoRotate(OMX_HANDLETYPE aHandle, int aPort, OMX_BOOL aEnaleAutoRotate)
{
    DBGT_PROLOG("aHandle: %p aPort: %d aEnaleAutoRotate: %d", aHandle, aPort, aEnaleAutoRotate);

    DBGT_ASSERT(NULL != aHandle, "aHandle is NULL");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    OMX_INDEXTYPE index;

    OmxUtils::StructContainer<OMX_SYMBIAN_CONFIG_BOOLEANTYPE> autoRotate;

    err = OMX_GetExtensionIndex(aHandle, (char *)OMX_SYMBIAN_INDEX_CONFIG_COMMON_AUTOROTATIONCONTROL_NAME, &index);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Still Auto Rotation OMX_GetExtensionIndex failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    autoRotate.ptr()->nPortIndex = aPort;

    err = OMX_GetConfig(aHandle, index, autoRotate.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Auto Rotation OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    autoRotate.ptr()->bEnabled = aEnaleAutoRotate;

    err = OMX_SetConfig(aHandle, index, autoRotate.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Auto Rotation OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE FocusHandler::doFocus()
{
    DBGT_PROLOG("");

    mSTECamera->mAutoFocusThreadData->mEnabled = OMX_TRUE;

    OmxUtils::StructContainer<OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE> focusControl;
    focusControl.ptr()->nPortIndex = OMX_ALL;

    DBGT_ASSERT(OMX_IMAGE_FocusControlOff != g_STECamFocusProp[mFocusModeIndex].eFocusType,
                        "Focussing not permitted in this mode");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    err = mSTECamera->mOmxReqCbHandler.enable(OmxReqCbHandler::EAutoFocusLock);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Enable reqcb failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    err = OMX_GetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    focusControl.ptr()->eFocusControl = OMX_IMAGE_FocusControlOn;

    err = OMX_SetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE DeviceSwRotation::setupRotationProcessing()
{
    DBGT_PROLOG("");

    DBGT_ASSERT(NULL != mSTECamera->mCam, "Camera Handle is Null");

    int rotation = mSTECamera->mPictureInfo.getRotation();
    DBGT_ASSERT(rotation == 180, "Invalid rotation for Sw Processing");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    /*Setup Hardware Processing*/
    OmxUtils::StructContainer<OMX_SYMBIAN_CONFIG_ORIENTATIONTYPE> stillOrientationConfig;

    stillOrientationConfig.ptr()->nPortIndex = paramPortVPB1.nPortIndex;

    err = OMX_GetConfig(mSTECamera->mCam, mSTECamera->mOmxILExtIndex->getIndex(OmxILExtIndex::EOrientationScene), stillOrientationConfig.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Orientation Scene OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    stillOrientationConfig.ptr()->eOrientation = OMX_SYMBIAN_OrientationRowBottomColumnRight;

    err = OMX_SetConfig(mSTECamera->mCam, mSTECamera->mOmxILExtIndex->getIndex(OmxILExtIndex::EOrientationScene), stillOrientationConfig.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("Orientation Scene OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    /*Setup Software Processing*/
    mSTECamera->mISPImageOmxBuffInfo.mSwRotation = CamSwRoutines::YUV420MB_180_rotation_inplace;

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE ImageRotHandler::doConfigAutoRotate(OMX_BOOL aEnaleAutoRotate)
{
    DBGT_PROLOG("aEnaleAutoRotate: %d", aEnaleAutoRotate);

    OMX_ERRORTYPE err = OMX_ErrorNone;

    err = setAutoRotate(mSTECamera->mISPProc, paramISPoutput.nPortIndex, aEnaleAutoRotate);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("SetAutoRotate failed for mISPProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    err = mSTECamera->mEnableDataFlow->setAutoRotate(aEnaleAutoRotate);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("SetAutoRotate failed for mISPProc err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE FocusHandler::cancelFocus()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    OmxUtils::StructContainer<OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE> focusControl;

    focusControl.ptr()->nPortIndex = OMX_ALL;

    err = OMX_GetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    setupFocusControl(focusControl.ref());

    err = OMX_SetConfig(mSTECamera->mCam, (OMX_INDEXTYPE)(OMX_IndexConfigFocusControl), focusControl.ptr());
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_SetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    err = getFocusStatus();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("getFocusStatus failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::release()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    err = disablePorts();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("disablePorts() failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE DeviceSwRotation::handleBuffer(const OMX_BUFFERHEADERTYPE* const aOmxBuffHdr)
{
    DBGT_PROLOG("aOmxBuffHdr: %p", aOmxBuffHdr);

    mSTECamera->doPictureSwRotProcessing(aOmxBuffHdr, mSTECamera->mISPImageOmxBuffInfo.m_pMMHwBuffer);

    OMX_ERRORTYPE err = updateExtraDataOrientation(aOmxBuffHdr);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("updateExtraDataOrientation failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE ExifRotation::doConfiguration()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    err = setupRotationProcessing();
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("setupRotationProcessing() err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE DeviceRotation::configAutoRotate()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    // Configure ISPproc and ARMIV for auto-rotation:on
    err = doConfigAutoRotate(OMX_TRUE);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("doConfigAutoRotate failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::handleBuffer(OMX_U32 aFilledLen, OMX_U32 aFlags)
{
    DBGT_PROLOG("aFilledLen: 0x%08x aFlags: 0x%08x", (unsigned int)aFilledLen, (unsigned int)aFlags);

    OMX_ERRORTYPE err = OMX_ErrorNone;

    mArmIvInBuffer->nFilledLen = aFilledLen;
    mArmIvInBuffer->nFlags = aFlags;

    err = OMX_EmptyThisBuffer(mArmIvProc, mArmIvInBuffer);
    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_EmptyThisBuffer failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::freeBuffers()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    if (NULL != mArmIvInBuffer) {
        err = OMX_FreeBuffer(mArmIvProc, (OMX_U32)( 0 ), mArmIvInBuffer);
        if(OMX_ErrorNone != err) {
            DBGT_CRITICAL("OMX_FreeBuffer failed for ArmIVProc input port err = %d", err);
            DBGT_EPILOG("");
            return err;
        }

        mArmIvInBuffer = NULL;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE FocusHandler::getFocusStatus()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    if(OMX_IMAGE_FocusControlOff != g_STECamFocusProp[mFocusModeIndex].eFocusType)
        err = OMX_GetConfig(mSTECamera->mCam, mSTECamera->mOmxILExtIndex->getIndex(OmxILExtIndex::EFocusStatus), &mExtFocusStatus.mFocusStatus);
    else
        DBGT_PINFO("Autofocus not done in this mode: OMX_IMAGE_FocusControlOff");

    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_GetConfig failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE ExifRotation::handleBuffer(const OMX_BUFFERHEADERTYPE* const aOmxBuffHdr)
{
    DBGT_PROLOG("aOmxBuffHdr: %p", aOmxBuffHdr);

    OMX_ERRORTYPE err = OMX_ErrorNone;

    int rotation = mSTECamera->mPictureInfo.getRotation();

    DBGT_PROLOG("rotation = %d", rotation);

    if (180 == rotation) {
        err = updateExtraDataOrientation(aOmxBuffHdr);
        if(OMX_ErrorNone != err) {
            DBGT_CRITICAL("updateExtraDataOrientation failed err = %d", err);
            DBGT_EPILOG("");
            return err;
        }
    }
    DBGT_EPILOG("");
    return err;
}
OMX_ERRORTYPE EnableDataFlow::useBuffer()
{
    DBGT_PROLOG("");

    OMX_ERRORTYPE err = OMX_ErrorNone;

    DBGT_PTRACE("\n Calling OMX_SetConfig before OMX_UseBuffer ArmIV  Chunk\n");
    err = OMX_SetConfig(mArmIvProc, (OMX_INDEXTYPE)OMX_OsiIndexConfigSharedChunkMetadata, &mChunkData_ArmIvProc);

    if (err != OMX_ErrorNone) {
        DBGT_PTRACE("OMX_SetConfig Failed  \n");
    }

    mArmIvInBuffer = NULL;
    DBGT_PTRACE("usebuffer mArmIvProc ");

    err = OMX_UseBuffer(mArmIvProc,    // hComponent
                        &mArmIvInBuffer,    // address where ptr to buffer header will be stored
                        0,          // port index (for port for which buffer is provided)
                        (void *)(&mArmIvOmxBuffInfo),    // App. private data = pointer to beginning of allocated data
                        // to have a context when component returns with a callback (i.e. to know
                        // what to free etc.
                        (OMX_U32)(mParamArmIvInput.nBufferSize),        // buffer size
                        (OMX_U8 *)(mArmIvOmxBuffInfo.mMMHwBufferInfo.iLogAddr) // buffer data ptr
                       );

    if(OMX_ErrorNone != err) {
        DBGT_CRITICAL("OMX_UseBuffer failed for mArmIvProc port 0 failed err = %d", err);
        DBGT_EPILOG("");
        return err;
    }

    DBGT_ASSERT(NULL != mArmIvInBuffer->pBuffer, "Buffer is NULL");

    mArmIvOmxBuffInfo.mCamMemoryBase.get()->setOmxBufferHeaderType(mArmIvInBuffer);

    DBGT_EPILOG("");
    return err;
}