BitmapPtr CMUCamera::getImage(bool bWait) { if (bWait) { unsigned rc = WaitForSingleObject(m_pCamera->GetFrameEvent(), INFINITE); AVG_ASSERT(rc == WAIT_OBJECT_0); } else { unsigned rc = WaitForSingleObject(m_pCamera->GetFrameEvent(), 0); if (rc == WAIT_TIMEOUT) { // No frame yet return BitmapPtr(); } AVG_ASSERT(rc == WAIT_OBJECT_0); } int rc2 = m_pCamera->AcquireImageEx(FALSE, NULL); if (rc2 != CAM_SUCCESS) { throw Exception(AVG_ERR_CAMERA_NONFATAL, "CMUCamera: Could not acquire image from camera. " + CMUErrorToString(rc2)); } unsigned long captureBufferLength; unsigned char* pCaptureBuffer = m_pCamera->GetRawData(&captureBufferLength); BitmapPtr pCamBmp(new Bitmap(getImgSize(), getCamPF(), pCaptureBuffer, captureBufferLength / getImgSize().y, false, "TempCameraBmp")); return convertCamFrameToDestPF(pCamBmp); }
BitmapPtr FWCamera::getImage(bool bWait) { #ifdef AVG_ENABLE_1394_2 bool bGotFrame = false; unsigned char * pCaptureBuffer = 0; dc1394video_frame_t * pFrame; dc1394error_t err; if (bWait) { err = dc1394_capture_dequeue(m_pCamera, DC1394_CAPTURE_POLICY_WAIT, &pFrame); } else { err = dc1394_capture_dequeue(m_pCamera, DC1394_CAPTURE_POLICY_POLL, &pFrame); } if (err == DC1394_SUCCESS && pFrame) { bGotFrame = true; pCaptureBuffer = pFrame->image; } if (bGotFrame) { int lineLen; if (getCamPF() == YCbCr411) { lineLen = getImgSize().x*1.5; } else { lineLen = getImgSize().x*getBytesPerPixel(getCamPF()); } BitmapPtr pCamBmp(new Bitmap(getImgSize(), getCamPF(), pCaptureBuffer, lineLen, false, "TempCameraBmp")); BitmapPtr pDestBmp = convertCamFrameToDestPF(pCamBmp); // cerr << "CamBmp: " << pCamBmp->getPixelFormat() << ", DestBmp: " // << pDestBmp->getPixelFormat() << endl; dc1394_capture_enqueue(m_pCamera, pFrame); return pDestBmp; } else { return BitmapPtr(); } #else return BitmapPtr(); #endif }
void FWCamera::startCapture() { #ifdef AVG_ENABLE_1394_2 int err = dc1394_video_set_transmission(m_pCamera, DC1394_ON); AVG_ASSERT(err == DC1394_SUCCESS); dc1394switch_t status = DC1394_OFF; int i = 0; while (status == DC1394_OFF && i++ < 5) { usleep(50000); err = dc1394_video_get_transmission(m_pCamera, &status); AVG_ASSERT(err == DC1394_SUCCESS); } if (i == 5) { AVG_ASSERT(false); } // Default to turning off any camera sharpness manipulation. setFeature(CAM_FEATURE_SHARPNESS, 0); // Turn off possible auto exposure. dc1394_feature_set_mode(m_pCamera, DC1394_FEATURE_EXPOSURE, DC1394_FEATURE_MODE_MANUAL); dc1394_feature_set_power(m_pCamera, DC1394_FEATURE_EXPOSURE, DC1394_OFF); AVG_TRACE(Logger::category::CONFIG, Logger::severity::INFO, "Firewire camera opened."); for (FeatureMap::iterator it=m_Features.begin(); it != m_Features.end(); it++) { setFeature(it->first, it->second, true); } setWhitebalance(m_WhitebalanceU, m_WhitebalanceV, true); if (getCamPF() == BAYER8) { if (strcmp(m_pCamera->model, "DFx 31BF03") == 0) { AVG_TRACE(Logger::category::CONFIG, Logger::severity::INFO, "Applying bayer pattern fixup for IS DFx31BF03 camera"); setCamPF(BAYER8_GRBG); } else if (strcmp(m_pCamera->vendor, "Point Grey Research") == 0) { AVG_TRACE(Logger::category::CONFIG, Logger::severity::INFO, "Applying bayer pattern fixup for PointGrey cameras"); enablePtGreyBayer(); } } #endif }
CMUCamera::CMUCamera(long long guid, bool bFW800, IntPoint size, PixelFormat camPF, PixelFormat destPF, float frameRate) : Camera(camPF, destPF, size, frameRate), m_WhitebalanceU(-1), m_WhitebalanceV(-1), m_pCamera(0) { m_pCamera = new C1394Camera(); int err; unsigned long videoFormat, videoMode; getVideoFormatAndMode(getImgSize(), getCamPF(), &videoFormat, &videoMode); // Find and open camera if (m_pCamera->RefreshCameraList() <= 0) { throw Exception(AVG_ERR_CAMERA_NONFATAL, "No Firewire cameras found"); } int i = getCamIndex(guid); err = m_pCamera->SelectCamera(i); err = m_pCamera->InitCamera(TRUE); AVG_ASSERT(err == CAM_SUCCESS); if (bFW800) { m_pCamera->Set1394b(true); } // Setup video format and rate err = m_pCamera->SetVideoFormat(videoFormat); checkCMUError(err, AVG_ERR_CAMERA_NONFATAL, string("CMUCamera: Error setting video format ") + toString(videoFormat) + ", mode: " + toString(videoMode)); err = m_pCamera->SetVideoMode(videoMode); checkCMUError(err, AVG_ERR_CAMERA_NONFATAL, string("CMUCamera: Error setting video mode ") + toString(videoMode) + ", format: " + toString(videoFormat)); err = m_pCamera->SetVideoFrameRate(getFrameRateConst(getFrameRate())); checkCMUError(err, AVG_ERR_CAMERA_NONFATAL, "Error setting frame rate"); // Start capturing images err = m_pCamera->StartImageAcquisition(); if (err != CAM_SUCCESS) { throw Exception(AVG_ERR_CAMERA_NONFATAL, "CMUCamera: Could not start image acquisition. " + CMUErrorToString(err)); } // Set camera features for (FeatureMap::iterator it=m_Features.begin(); it != m_Features.end(); it++) { setFeature(it->first, it->second, true); } setWhitebalance(m_WhitebalanceU, m_WhitebalanceV, true); if (camPF == BAYER8) { char sModel[256], sVendor[256]; m_pCamera->GetCameraName(sModel, 256); m_pCamera->GetCameraVendor(sVendor, 256); if (strcmp(sModel, "DFx 31BF03") == 0) { AVG_TRACE(Logger::CONFIG, "Applying bayer pattern fixup for IS DFx31BF03 camera"); setCamPF(BAYER8_GRBG); } else if (strcmp(sVendor, "Point Grey Research") == 0) { AVG_TRACE(Logger::CONFIG, "Applying bayer pattern fixup for PointGrey cameras"); enablePtGreyBayer(); } } }