camerauis/cameraxui/cxengine/src/cxestillcapturecontrolsymbian.cpp
changeset 48 42ba2d16bf40
parent 37 64817133cd1d
child 60 a289dde0a1d6
equal deleted inserted replaced
37:64817133cd1d 48:42ba2d16bf40
    20 #include <exception>
    20 #include <exception>
    21 #include <QPixmap>
    21 #include <QPixmap>
    22 #include <coemain.h>
    22 #include <coemain.h>
    23 #include <ECamOrientationCustomInterface2.h>
    23 #include <ECamOrientationCustomInterface2.h>
    24 #include <ecamfacetrackingcustomapi.h>
    24 #include <ecamfacetrackingcustomapi.h>
       
    25 #include <ecamusecasehintcustomapi.h>
    25 
    26 
    26 #include "cxestillcapturecontrolsymbian.h"
    27 #include "cxestillcapturecontrolsymbian.h"
    27 #include "cxeimagedataqueuesymbian.h"
    28 #include "cxeimagedataqueuesymbian.h"
    28 #include "cxefilenamegenerator.h"
    29 #include "cxefilenamegenerator.h"
    29 #include "cxefilesavethread.h"
    30 #include "cxefilesavethread.h"
    41 #include "cxeautofocuscontrol.h"
    42 #include "cxeautofocuscontrol.h"
    42 #include "cxesensoreventhandler.h"
    43 #include "cxesensoreventhandler.h"
    43 #include "cxesensoreventhandler.h"
    44 #include "cxesensoreventhandler.h"
    44 #include "cxequalitypresetssymbian.h"
    45 #include "cxequalitypresetssymbian.h"
    45 #include "cxediskmonitor.h"
    46 #include "cxediskmonitor.h"
       
    47 #include "cxeexception.h"
    46 
    48 
    47 #include "OstTraceDefinitions.h"
    49 #include "OstTraceDefinitions.h"
    48 #ifdef OST_TRACE_COMPILER_IN_USE
    50 #ifdef OST_TRACE_COMPILER_IN_USE
    49 #include "cxestillcapturecontrolsymbianTraces.h"
    51 #include "cxestillcapturecontrolsymbianTraces.h"
    50 #endif
    52 #endif
   207     if (state() == Uninitialized) {
   209     if (state() == Uninitialized) {
   208         // nothing to do
   210         // nothing to do
   209         return;
   211         return;
   210     }
   212     }
   211 
   213 
   212     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_DEINIT_IN, "msg: e_CX_STILL_CAPCONT_DEINIT 1" );
   214     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_DEINIT_IN, "msg: e_CX_STILLCAPCONT_DEINIT 1" );
   213 
   215 
   214     // Stop monitoring disk space.
   216     // Stop monitoring disk space.
   215     mDiskMonitor.stop();
   217     mDiskMonitor.stop();
   216     disconnect(&mDiskMonitor, SIGNAL(diskSpaceChanged()), this, SLOT(handleDiskSpaceChanged()));
   218     disconnect(&mDiskMonitor, SIGNAL(diskSpaceChanged()), this, SLOT(handleDiskSpaceChanged()));
   217 
   219 
   227 
   229 
   228     mSnapshotControl.stop();
   230     mSnapshotControl.stop();
   229 
   231 
   230     setState(Uninitialized);
   232     setState(Uninitialized);
   231 
   233 
   232     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_DEINIT_OUT, "msg: e_CX_STILL_CAPCONT_DEINIT 0" );
   234     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_DEINIT_OUT, "msg: e_CX_STILLCAPCONT_DEINIT 0" );
   233     CX_DEBUG_EXIT_FUNCTION();
   235     CX_DEBUG_EXIT_FUNCTION();
   234 }
   236 }
   235 
   237 
   236 
   238 
   237 /*!
   239 /*!
   244     if (state() != Uninitialized) {
   246     if (state() != Uninitialized) {
   245         // wrong state and we return
   247         // wrong state and we return
   246         return;
   248         return;
   247     }
   249     }
   248 
   250 
   249     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPARE_IN, "msg: e_CX_STILLCAPCONT_PREPARE 1" );
   251     OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_PREPARE_IN, "msg: e_CX_STILLCAPCONT_PREPARE 1");
   250 
   252 
   251     int err = KErrNone;
   253     CxeError::Id status(CxeError::None);
   252     CxeError::Id cxErr = getImageQualityDetails(mCurrentImageDetails);
   254 
   253     int ecamStillResolutionIndex = 0;
   255     try {
   254 
   256         // Update capture parameters
   255     if (cxErr == CxeError::None) {
   257         updateStillCaptureParameters();
   256         int imageWidth =  mCurrentImageDetails.mWidth;
       
   257         int imageHeight = mCurrentImageDetails.mHeight;
       
   258         CX_DEBUG(("CxeStillCaptureControlSymbian::prepare <> resolution = (%d, %d)", imageWidth, imageHeight));
       
   259 
       
   260         TSize imageSize;
       
   261         imageSize.SetSize(imageWidth, imageHeight);
       
   262 
       
   263         if (mECamSupportedImageResolutions.count() > 0) {
       
   264             ecamStillResolutionIndex = mECamSupportedImageResolutions.indexOf(imageSize);
       
   265         }
       
   266 
       
   267         if (ecamStillResolutionIndex < 0) {
       
   268             CX_DEBUG(("CxeStillCaptureControlSymbian::prepare - WARNING! resolution not supported, falling back to index 0"));
       
   269             ecamStillResolutionIndex = 0;
       
   270         }
       
   271 
   258 
   272         // Prepare Image capture
   259         // Prepare Image capture
   273         CCamera::TFormat imgFormat = supportedStillFormat(mCameraDeviceControl.cameraIndex());
   260         CX_DEBUG(("Calling PrepareImageCaptureL, resolution index = %d", mSizeIndex));
   274         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPARE_MID1, "msg: e_CX_PREPARE_IMAGE_CAPTURE 1");
   261         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_PREPARE_MID1, "msg: e_CX_PREPARE_IMAGE_CAPTURE 1");
   275         TRAP(err, mCameraDevice.camera()->PrepareImageCaptureL(imgFormat, ecamStillResolutionIndex));
   262         QT_TRAP_THROWING(mCameraDevice.camera()->PrepareImageCaptureL(mCaptureFormat, mSizeIndex));
   276         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPARE_MID2, "msg: e_CX_PREPARE_IMAGE_CAPTURE 0");
   263         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_PREPARE_MID2, "msg: e_CX_PREPARE_IMAGE_CAPTURE 0");
   277 
   264 
   278         CX_DEBUG(("PrepareImageCaptureL done, err=%d, resolution index = %d", err, ecamStillResolutionIndex));
       
   279 
       
   280         if (!err) {
       
   281             // still capture prepare went fine, try preparing snapshot
       
   282             err = prepareStillSnapshot();
       
   283         }
       
   284     } else {
       
   285         err = KErrNotFound;
       
   286     }
       
   287 
       
   288     if (!err) {
       
   289         // Start viewfinder before claiming to be ready,
   265         // Start viewfinder before claiming to be ready,
   290         // as e.g. pending capture might be started by state change,
   266         // as e.g. pending capture might be started by state change,
   291         // and viewfinder start might have problems with just started capturing.
   267         // and viewfinder start might have problems with just started capturing.
   292         // If viewfinder is already running, this call does nothing.
   268         // If viewfinder is already running, this call does nothing.
   293         mViewfinderControl.start();
   269         mViewfinderControl.start();
   294 
   270 
       
   271         // Prepare snapshot
       
   272         prepareSnapshot();
       
   273 
   295         // Start monitoring disk space.
   274         // Start monitoring disk space.
   296         mDiskMonitor.start();
   275         mDiskMonitor.start();
   297         connect(&mDiskMonitor, SIGNAL(diskSpaceChanged()), this, SLOT(handleDiskSpaceChanged()));
   276         connect(&mDiskMonitor, SIGNAL(diskSpaceChanged()), this, SLOT(handleDiskSpaceChanged()));
   298 
       
   299 
   277 
   300         // Enable AF reticule drawing by adaptation
   278         // Enable AF reticule drawing by adaptation
   301         MCameraFaceTracking *faceTracking = mCameraDevice.faceTracking();
   279         MCameraFaceTracking *faceTracking = mCameraDevice.faceTracking();
   302         if (faceTracking) {
   280         if (faceTracking) {
   303             TRAP_IGNORE(faceTracking->EnableFaceIndicatorsL(ETrue));
   281             TRAP_IGNORE(faceTracking->EnableFaceIndicatorsL(ETrue));
   306         // Still capture and still snapshot are OK.
   284         // Still capture and still snapshot are OK.
   307         // We can safely set state to READY.
   285         // We can safely set state to READY.
   308         setState(Ready);
   286         setState(Ready);
   309 
   287 
   310         // inform zoom control to prepare zoom
   288         // inform zoom control to prepare zoom
   311         emit prepareZoomForStill(ecamStillResolutionIndex);
   289         emit prepareZoomForStill(mSizeIndex);
   312     } else {
   290 
   313         CX_DEBUG(("Image Prepare FAILED! symbian error = %d", err));
   291     } catch (const std::exception &e) {
   314         // release resources
   292         // Exception encountered, free resources.
       
   293         CX_DEBUG(("Image Prepare FAILED! symbian error = %d", qt_symbian_exception2Error(e)));
       
   294         status = CxeErrorHandlingSymbian::map(qt_symbian_exception2Error(e));
   315         deinit();
   295         deinit();
   316     }
   296     }
   317 
   297 
   318     // Inform interested parties that image mode has been prepared for capture
   298     // Inform interested parties that image mode has been prepared for capture
   319     emit imagePrepareComplete(CxeErrorHandlingSymbian::map(err));
   299     emit imagePrepareComplete(status);
   320 
   300 
   321     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPARE_OUT, "msg: e_CX_STILLCAPCONT_PREPARE 0" );
   301     OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_GOTOSTILL, "msg: e_CX_GO_TO_STILL_MODE 0");
   322 
   302     OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_PREPARE_OUT, "msg: e_CX_STILLCAPCONT_PREPARE 0");
   323     CX_DEBUG_EXIT_FUNCTION();
   303     CX_DEBUG_EXIT_FUNCTION();
   324 }
   304 }
   325 
   305 
   326 
   306 
   327 
   307 
   328 /*!
   308 /*!
   329  Prepare still snapshot
   309  Prepare still snapshot
   330  Returns symbian error code.
   310  Throws exception on error.
   331  */
   311  */
   332 int CxeStillCaptureControlSymbian::prepareStillSnapshot()
   312 void CxeStillCaptureControlSymbian::prepareSnapshot()
   333 {
   313 {
   334     CX_DEBUG_ENTER_FUNCTION();
   314     CX_DEBUG_ENTER_FUNCTION();
   335     OstTrace0( camerax_performance, DUP4_CXESTILLCAPTURECONTROLSYMBIAN_PREPARE, "msg: e_CX_PREPARE_SNAPSHOT 1" );
   315     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROL_PREPARESNAP_1, "msg: e_CX_PREPARE_SNAPSHOT 1" );
   336 
   316 
   337     int status(KErrNone);
   317     QSize snapshotSize = mSnapshotControl.calculateSnapshotSize(
   338     try {
   318                             mViewfinderControl.deviceDisplayResolution(),
   339         QSize snapshotSize = mSnapshotControl.calculateSnapshotSize(
   319                             mCurrentImageDetails.mAspectRatio);
   340                                 mViewfinderControl.deviceDisplayResolution(),
   320     mSnapshotControl.start(snapshotSize);
   341                                 mCurrentImageDetails.mAspectRatio);
   321 
   342         mSnapshotControl.start(snapshotSize);
   322     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROL_PREPARESNAP_2, "msg: e_CX_PREPARE_SNAPSHOT 0" );
   343     } catch (...) {
   323     CX_DEBUG_EXIT_FUNCTION();
   344         status = KErrGeneral;
   324 }
   345     }
   325 
   346     OstTrace0( camerax_performance, DUP5_CXESTILLCAPTURECONTROLSYMBIAN_PREPARE, "msg: e_CX_PREPARE_SNAPSHOT 0" );
   326 
   347 
   327 /*!
   348     CX_DEBUG_EXIT_FUNCTION();
   328     Update image capture parameters. mCurrentImageDetails, mCaptureFormat and
   349     return status;
   329     mSizeIndex are updated based on the current settings.
   350 }
   330 */
   351 
   331 void CxeStillCaptureControlSymbian::updateStillCaptureParameters()
   352 
   332 {
   353 /*!
   333     CX_DEBUG_ENTER_FUNCTION();
   354  imageInfo contains image qualities details
   334     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROL_UPDATESTILLCAPTUREPARAMETERS_1, "msg: e_CX_UPDATE_STILL_CAPTURE_PARAMETERS 1" );
   355  Returns CxeError error code.
       
   356  */
       
   357 CxeError::Id CxeStillCaptureControlSymbian::getImageQualityDetails(CxeImageDetails &imageInfo)
       
   358 {
       
   359     CX_DEBUG_ENTER_FUNCTION();
       
   360 
   335 
   361     int imageQuality = 0;
   336     int imageQuality = 0;
   362     CxeError::Id err = CxeError::None;
   337     CxeError::Id err = CxeError::None;
   363     if (mCameraDeviceControl.cameraIndex() == Cxe::PrimaryCameraIndex) {
   338     if (mCameraDeviceControl.cameraIndex() == Cxe::PrimaryCameraIndex) {
   364         err = mSettings.get(CxeSettingIds::IMAGE_QUALITY, imageQuality);
   339         try {
   365 
   340             imageQuality = mSettings.get<int>(CxeSettingIds::IMAGE_QUALITY);
   366         bool validQuality = (imageQuality >= 0 && imageQuality < mIcmSupportedImageResolutions.count());
   341 
   367 
   342             bool validQuality = (imageQuality >= 0 &&
   368         if (err == CxeError::None && validQuality ) {
   343                                  imageQuality < mIcmSupportedImageResolutions.count());
   369             // get image quality details
   344 
   370             imageInfo = mIcmSupportedImageResolutions.at(imageQuality);
   345             if (validQuality ) {
   371         } else {
   346                 // get image quality details
   372             err = CxeError::NotFound;
   347                 mCurrentImageDetails = mIcmSupportedImageResolutions.at(imageQuality);
   373             CX_DEBUG(("Invalid ImageQuality = %d", imageQuality));
   348             } else {
       
   349                 err = CxeError::NotFound;
       
   350                 CX_DEBUG(("Invalid ImageQuality = %d", imageQuality));
       
   351             }
       
   352         } catch (CxeException &e) {
       
   353             err = (CxeError::Id) e.error();
   374         }
   354         }
   375     } else {
   355     } else {
   376         // we are in secondary camera
   356         // we are in secondary camera
   377         // get secondary camera image quality details
   357         // get secondary camera image quality details
   378        imageInfo = mIcmSupportedImageResolutions.at(imageQuality);
   358        mCurrentImageDetails = mIcmSupportedImageResolutions.at(imageQuality);
   379     }
   359     }
   380 
   360 
   381     CX_DEBUG_EXIT_FUNCTION();
   361     mSizeIndex = 0;
   382     return err;
   362 
       
   363     if (err == CxeError::None) {
       
   364         int imageWidth = mCurrentImageDetails.mWidth;
       
   365         int imageHeight = mCurrentImageDetails.mHeight;
       
   366         CX_DEBUG(("CxeStillCaptureControlSymbian::updateStillCaptureParameters <> resolution = (%d, %d)", imageWidth, imageHeight));
       
   367 
       
   368         TSize imageSize;
       
   369         imageSize.SetSize(imageWidth, imageHeight);
       
   370 
       
   371         if (mECamSupportedImageResolutions.count() > 0) {
       
   372             mSizeIndex = mECamSupportedImageResolutions.indexOf(imageSize);
       
   373         }
       
   374 
       
   375         if (mSizeIndex < 0) {
       
   376             CX_DEBUG(("CxeStillCaptureControlSymbian::updateStillCaptureParameters - WARNING! resolution not supported, falling back to index 0"));
       
   377             mSizeIndex = 0;
       
   378         }
       
   379 
       
   380         mCaptureFormat = supportedStillFormat(mCameraDeviceControl.cameraIndex());
       
   381     }
       
   382 
       
   383     OstTrace0( camerax_performance, CXESTILLCAPTURECONTROL_UPDATESTILLCAPTUREPARAMETERS_2, "msg: e_CX_UPDATE_STILL_CAPTURE_PARAMETERS 0" );
       
   384     CX_DEBUG_EXIT_FUNCTION();
   383 }
   385 }
   384 
   386 
   385 /*!
   387 /*!
   386  * Command to start image capture now.
   388  * Command to start image capture now.
   387  * @sa handleCameraEvent
   389  * @sa handleCameraEvent
   450 void CxeStillCaptureControlSymbian::handleSnapshotReady(CxeError::Id status, const QImage &snapshot)
   452 void CxeStillCaptureControlSymbian::handleSnapshotReady(CxeError::Id status, const QImage &snapshot)
   451 {
   453 {
   452     CX_DEBUG_ENTER_FUNCTION();
   454     CX_DEBUG_ENTER_FUNCTION();
   453     if (mCameraDeviceControl.mode() == Cxe::ImageMode) {
   455     if (mCameraDeviceControl.mode() == Cxe::ImageMode) {
   454 
   456 
   455         OstTrace0( camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_HANDLESNAPSHOTEVENT, "msg: e_CX_HANDLE_SNAPSHOT 1" );
   457         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_HANDLESNAPSHOT_1, "msg: e_CX_HANDLE_SNAPSHOT 1");
   456 
   458 
   457         QPixmap ss = QPixmap::fromImage(snapshot);
   459         QPixmap ss = QPixmap::fromImage(snapshot);
   458         // Get image container for current snapshot index.
   460         // Get image container for current snapshot index.
   459         // Remember to increment counter.
   461         // Remember to increment counter.
   460         CxeStillImageSymbian* stillImage = getImageForIndex(mNextSnapshotIndex++);
   462         CxeStillImageSymbian* stillImage = getImageForIndex(mNextSnapshotIndex++);
   469         if (stillImage->filename().isEmpty()) {
   471         if (stillImage->filename().isEmpty()) {
   470             // Error ignored at this point, try again when image data arrives.
   472             // Error ignored at this point, try again when image data arrives.
   471             prepareFilename(stillImage);
   473             prepareFilename(stillImage);
   472         }
   474         }
   473 
   475 
   474         OstTrace0( camerax_performance, DUP1_CXESTILLCAPTURECONTROLSYMBIAN_HANDLESNAPSHOTEVENT, "msg: e_CX_HANDLE_SNAPSHOT 0" );
   476         OstTrace0(camerax_performance, CXESTILLCAPTURECONTROL_HANDLESNAPSHOT_2, "msg: e_CX_HANDLE_SNAPSHOT 0");
   475     }
   477     }
   476 
   478 
   477     CX_DEBUG_EXIT_FUNCTION();
   479     CX_DEBUG_EXIT_FUNCTION();
   478 }
   480 }
   479 
   481 
   542         //! @todo: this does a deep copy... we want to avoid this for performance/memory consumption reasons
   544         //! @todo: this does a deep copy... we want to avoid this for performance/memory consumption reasons
   543         QByteArray byteArray( reinterpret_cast<const char*>( data->Ptr() ), data->Size() );
   545         QByteArray byteArray( reinterpret_cast<const char*>( data->Ptr() ), data->Size() );
   544         data = NULL;
   546         data = NULL;
   545 
   547 
   546         // get geotagging setting value and check if we have to add location trail to image data.
   548         // get geotagging setting value and check if we have to add location trail to image data.
   547         int value = Cxe::GeoTaggingOff;
   549         Cxe::GeoTagging value = mSettings.get<Cxe::GeoTagging>(CxeSettingIds::GEOTAGGING, Cxe::GeoTaggingOff);
   548         mSettings.get(CxeSettingIds::GEOTAGGING, value);
   550 
   549 
   551 
   550         // Save the image data
   552         // Save the image data
   551         CxeImageDataItemSymbian* dataItem = mImageDataQueue->startSave(byteArray,
   553         CxeImageDataItemSymbian* dataItem = mImageDataQueue->startSave(byteArray,
   552                                                                        stillImage->filename(),
   554                                                                        stillImage->filename(),
   553                                                                        stillImage->id(),
   555                                                                        stillImage->id(),
   742  * behaviour is required in rare cases where image data arrives before snapshot.
   744  * behaviour is required in rare cases where image data arrives before snapshot.
   743  */
   745  */
   744 CxeError::Id
   746 CxeError::Id
   745 CxeStillCaptureControlSymbian::prepareFilename(CxeStillImageSymbian *stillImage)
   747 CxeStillCaptureControlSymbian::prepareFilename(CxeStillImageSymbian *stillImage)
   746 {
   748 {
       
   749     OstTrace0(camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPAREFILENAME_1, "msg: e_CX_PREPARE_FILENAME 1" );
       
   750 
   747     CxeError::Id err = CxeError::None;
   751     CxeError::Id err = CxeError::None;
   748     if (stillImage->filename().isEmpty()) {
   752     if (stillImage->filename().isEmpty()) {
   749         QString path;
   753         QString path;
   750 
   754 
   751         QString fileExt = mCurrentImageDetails.mImageFileExtension;
   755         QString fileExt = mCurrentImageDetails.mImageFileExtension;
   765             //! @todo: Error ID can be returned by this function.
   769             //! @todo: Error ID can be returned by this function.
   766             // Also error can be detected from empty filename string.
   770             // Also error can be detected from empty filename string.
   767             CX_DEBUG(("ERROR in filename generation. err:%d", err));
   771             CX_DEBUG(("ERROR in filename generation. err:%d", err));
   768         }
   772         }
   769     }
   773     }
       
   774 
       
   775     OstTrace0(camerax_performance, CXESTILLCAPTURECONTROLSYMBIAN_PREPAREFILENAME_2, "msg: e_CX_PREPARE_FILENAME 0" );
   770     return err;
   776     return err;
   771 }
   777 }
   772 
   778 
   773 /*!
   779 /*!
   774 * Helper method to set orientation data from the orientation sensor
   780 * Helper method to set orientation data from the orientation sensor
   859     CX_DEBUG_EXIT_FUNCTION();
   865     CX_DEBUG_EXIT_FUNCTION();
   860 }
   866 }
   861 
   867 
   862 
   868 
   863 /*!
   869 /*!
       
   870     Use ECam Use Case Hint Custom API to inform ECam of our intended use case
       
   871     before calling Reserve().
       
   872 */
       
   873 void CxeStillCaptureControlSymbian::hintUseCase()
       
   874 {
       
   875     CX_DEBUG_ENTER_FUNCTION();
       
   876 
       
   877     // Make sure ECam knows we're doing still image capture so it can prepare
       
   878     // for the correct use case.
       
   879     if (mCameraDeviceControl.mode() == Cxe::ImageMode) {
       
   880         MCameraUseCaseHint *useCaseHintApi = mCameraDevice.useCaseHintApi();
       
   881         if (useCaseHintApi) {
       
   882             updateStillCaptureParameters();
       
   883             TRAP_IGNORE(useCaseHintApi->HintStillCaptureL(mCaptureFormat,
       
   884                                                           mSizeIndex));
       
   885         }
       
   886     }
       
   887 
       
   888     CX_DEBUG_EXIT_FUNCTION();
       
   889 }
       
   890 
       
   891 /*!
   864 * Returns supported image qualities based on the camera index
   892 * Returns supported image qualities based on the camera index
   865 * (primary/secondary).
   893 * (primary/secondary).
   866 */
   894 */
   867 QList<CxeImageDetails> CxeStillCaptureControlSymbian::supportedImageQualities()
   895 QList<CxeImageDetails> CxeStillCaptureControlSymbian::supportedImageQualities()
   868 {
   896 {