void Camera::update() { if(connected){ #ifdef TARGET_OSX if (bTryInitLiveView) { if (ofGetElapsedTimeMillis() - initTime > OFX_EDSDK_LIVE_DELAY) { bTryInitLiveView = false; resetLiveView(); } } #endif lock(); if(liveBufferMiddle.size() > 0) { // decoding the jpeg in the main thread allows the capture thread to run in a tighter loop. ofBuffer* middleFront = liveBufferMiddle.front(); liveBufferFront.set(middleFront->getBinaryBuffer(), middleFront->size()); liveBufferMiddle.pop(); unlock(); ofLoadImage(livePixels, liveBufferFront); livePixels.rotate90(rotateMode90); if(liveTexture.getWidth() != livePixels.getWidth() || liveTexture.getHeight() != livePixels.getHeight()) { liveTexture.allocate(livePixels.getWidth(), livePixels.getHeight(), GL_RGB8); } liveTexture.loadData(livePixels); lock(); liveDataReady = true; frameNew = true; unlock(); } else { unlock(); } } }
void Camera::captureLoop() { if(liveViewReady) { if(Eds::DownloadEvfData(camera, *liveBufferBack)) { lock(); fps.tick(); bytesPerFrame = ofLerp(bytesPerFrame, liveBufferBack->size(), .01); swap(liveBufferBack, liveBufferMiddle.back()); liveBufferMiddle.push(); unlock(); } } if(needToTakePhoto) { try { if (shootNoCard) { EdsUInt32 saveTo = kEdsSaveTo_Host; EdsSetPropertyData(camera, kEdsPropID_SaveTo, 0, sizeof(saveTo), &saveTo); EdsCapacity maxCapacity = {0x7FFFFFFF, 0x1000, 1}; EdsSetCapacity(camera, maxCapacity ); } else { EdsUInt32 saveTo = kEdsSaveTo_Camera; EdsSetPropertyData(camera, kEdsPropID_SaveTo, 0, sizeof(saveTo), &saveTo); } Eds::SendCommand(camera, kEdsCameraCommand_TakePicture, 0); lock(); needToTakePhoto = false; unlock(); //ofSendMessage("test"); } catch (Eds::Exception& e) { ofLogError() << "Error while taking a picture: " << e.what(); //ofSendMessage("Error: " + ofToString(e.what())); } } if(needToStartRecording) { try { EdsUInt32 saveTo = kEdsSaveTo_Camera; EdsSetPropertyData(camera, kEdsPropID_SaveTo, 0, sizeof(saveTo) , &saveTo); EdsUInt32 record_start = 4; // Begin movie shooting EdsSetPropertyData(camera, kEdsPropID_Record, 0, sizeof(record_start), &record_start); lock(); needToStartRecording = false; unlock(); } catch (Eds::Exception& e) { ofLogError() << "Error while beginning to record: " << e.what(); } } if(needToStopRecording) { try { EdsUInt32 record_stop = 0; // End movie shooting EdsSetPropertyData(camera, kEdsPropID_Record, 0, sizeof(record_stop), &record_stop); lock(); needToStopRecording = false; unlock(); } catch (Eds::Exception& e) { ofLogError() << "Error while stopping to record: " << e.what(); } } if(needToSendKeepAlive) { try { // always causes EDS_ERR_DEVICE_BUSY, even with live view disabled or a delay // but if it's not here, then the camera shuts down after 5 minutes. Eds::SendStatusCommand(camera, kEdsCameraCommand_ExtendShutDownTimer, 0); } catch (Eds::Exception& e) { ofLogError() << "Error while sending kEdsCameraCommand_ExtendShutDownTimer with Eds::SendStatusCommand: " << e.what(); } lock(); needToSendKeepAlive = false; unlock(); } if(needToDownloadImage) { try { EdsDirectoryItemInfo dirItemInfo = Eds::DownloadImage(directoryItem, photoBuffer); ofLogVerbose() << "Downloaded item: " << (int) (photoBuffer.size() / 1024) << " KB"; lock(); photoDataReady = true; needToDecodePhoto = true; needToUpdatePhoto = true; needToDownloadImage = false; if (dirItemInfo.format == OFX_EDSDK_JPG_FORMAT) { photoNew = true; } else if (dirItemInfo.format == OFX_EDSDK_MOV_FORMAT) { movieNew = true; } unlock(); } catch (Eds::Exception& e) { ofLogError() << "Error while downloading item: " << e.what(); } } float timeSinceLastReset = ofGetElapsedTimef() - lastResetTime; if(timeSinceLastReset > resetIntervalMinutes * 60) { resetLiveView(); } }