From f92ecd437133340320373f7e6e2c1a23481d5cd5 Mon Sep 17 00:00:00 2001 From: Osenberg-Y Date: Thu, 9 Aug 2018 12:14:54 +0800 Subject: [PATCH 01/17] optimized pointscloud --- src/api/processor/disparity_processor.cc | 72 +++++++----------------- src/api/processor/disparity_processor.h | 6 +- 2 files changed, 26 insertions(+), 52 deletions(-) diff --git a/src/api/processor/disparity_processor.cc b/src/api/processor/disparity_processor.cc index dbb5ab3..83e7349 100644 --- a/src/api/processor/disparity_processor.cc +++ b/src/api/processor/disparity_processor.cc @@ -26,38 +26,26 @@ const char DisparityProcessor::NAME[] = "DisparityProcessor"; DisparityProcessor::DisparityProcessor(std::int32_t proc_period) : Processor(std::move(proc_period)) { VLOG(2) << __func__ << ": proc_period=" << proc_period; - int sgbmWinSize = 3; - int numberOfDisparities = 64; + int blockSize_ = 15; // 15 + int minDisparity_ = 0; // 0 + int numDisparities_ = 64; // 64 + int preFilterSize_ = 9; // 9 + int preFilterCap_ = 31; // 31 + int uniquenessRatio_ = 15; // 15 + int textureThreshold_ = 10; // 10 + int speckleWindowSize_ = 100; // 100 + int speckleRange_ = 4; // 4 -#ifdef USE_OPENCV2 - // StereoSGBM - // http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?#stereosgbm - sgbm_ = cv::Ptr( - new cv::StereoSGBM( - 0, // minDisparity - numberOfDisparities, // numDisparities - sgbmWinSize, // SADWindowSize - 8 * sgbmWinSize * sgbmWinSize, // P1 - 32 * sgbmWinSize * sgbmWinSize, // P2 - 1, // disp12MaxDiff - 63, // preFilterCap - 10, // uniquenessRatio - 100, // speckleWindowSize - 32, // speckleRange - false)); // fullDP -#else - sgbm_ = cv::StereoSGBM::create(0, 16, 3); - sgbm_->setPreFilterCap(63); - sgbm_->setBlockSize(sgbmWinSize); - sgbm_->setP1(8 * sgbmWinSize * sgbmWinSize); - sgbm_->setP2(32 * sgbmWinSize * sgbmWinSize); - sgbm_->setMinDisparity(0); - sgbm_->setNumDisparities(numberOfDisparities); - sgbm_->setUniquenessRatio(10); - sgbm_->setSpeckleWindowSize(100); - sgbm_->setSpeckleRange(32); - sgbm_->setDisp12MaxDiff(1); -#endif + bm_ = cv::StereoBM::create(); + bm_->setBlockSize(blockSize_); + bm_->setMinDisparity(minDisparity_); + bm_->setNumDisparities(numDisparities_); + bm_->setPreFilterSize(preFilterSize_); + bm_->setPreFilterCap(preFilterCap_); + bm_->setUniquenessRatio(uniquenessRatio_); + bm_->setTextureThreshold(textureThreshold_); + bm_->setSpeckleWindowSize(speckleWindowSize_); + bm_->setSpeckleRange(speckleRange_); } DisparityProcessor::~DisparityProcessor() { @@ -79,26 +67,8 @@ bool DisparityProcessor::OnProcess( ObjMat *output = Object::Cast(out); cv::Mat disparity; -#ifdef USE_OPENCV2 - // StereoSGBM::operator() - // http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereosgbm-operator - // Output disparity map. It is a 16-bit signed single-channel image of the - // same size as the input image. - // It contains disparity values scaled by 16. So, to get the floating-point - // disparity map, - // you need to divide each disp element by 16. - (*sgbm_)(input->first, input->second, disparity); -#else - // compute() - // http://docs.opencv.org/master/d2/d6e/classcv_1_1StereoMatcher.html - // Output disparity map. It has the same size as the input images. - // Some algorithms, like StereoBM or StereoSGBM compute 16-bit fixed-point - // disparity map - // (where each disparity value has 4 fractional bits), - // whereas other algorithms output 32-bit floating-point disparity map. - sgbm_->compute(input->first, input->second, disparity); -#endif - output->value = disparity / 16 + 1; + bm_->compute(input->first, input->second, disparity); + output->value = disparity; return true; } diff --git a/src/api/processor/disparity_processor.h b/src/api/processor/disparity_processor.h index 82b075f..da4f78b 100644 --- a/src/api/processor/disparity_processor.h +++ b/src/api/processor/disparity_processor.h @@ -17,13 +17,17 @@ #include +#include + #include "api/processor/processor.h" +#if 0 namespace cv { class StereoSGBM; } // namespace cv +#endif MYNTEYE_BEGIN_NAMESPACE @@ -42,7 +46,7 @@ class DisparityProcessor : public Processor { Object *const in, Object *const out, Processor *const parent) override; private: - cv::Ptr sgbm_; + cv::Ptr bm_; }; MYNTEYE_END_NAMESPACE From 5677aa56b244d13aca4749bd22f82f7742abddb7 Mon Sep 17 00:00:00 2001 From: Osenberg-Y Date: Fri, 10 Aug 2018 15:55:22 +0800 Subject: [PATCH 02/17] Made some optimization about pointscloud --- samples/tutorials/util/pc_viewer.cc | 1 + src/api/processor/disparity_processor.cc | 3 +- src/api/processor/points_processor.cc | 37 +++++++++++++++++++++++- src/api/processor/rectify_processor.cc | 4 +++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/samples/tutorials/util/pc_viewer.cc b/samples/tutorials/util/pc_viewer.cc index 2fb7394..13d6c00 100644 --- a/samples/tutorials/util/pc_viewer.cc +++ b/samples/tutorials/util/pc_viewer.cc @@ -84,6 +84,7 @@ void PCViewer::ConvertMatToPointCloud( for (int i = 0; i < xyz.rows; i++) { for (int j = 0; j < xyz.cols; j++) { auto &&p = xyz.at(i, j); + if (std::abs(p.z) > 9999) continue; if (std::isfinite(p.x) && std::isfinite(p.y) && std::isfinite(p.z)) { // LOG(INFO) << "[" << i << "," << j << "] x: " << p.x << ", y: " << p.y // << ", z: " << p.z; diff --git a/src/api/processor/disparity_processor.cc b/src/api/processor/disparity_processor.cc index 83e7349..2f4ccda 100644 --- a/src/api/processor/disparity_processor.cc +++ b/src/api/processor/disparity_processor.cc @@ -26,6 +26,7 @@ const char DisparityProcessor::NAME[] = "DisparityProcessor"; DisparityProcessor::DisparityProcessor(std::int32_t proc_period) : Processor(std::move(proc_period)) { VLOG(2) << __func__ << ": proc_period=" << proc_period; + int blockSize_ = 15; // 15 int minDisparity_ = 0; // 0 int numDisparities_ = 64; // 64 @@ -68,7 +69,7 @@ bool DisparityProcessor::OnProcess( cv::Mat disparity; bm_->compute(input->first, input->second, disparity); - output->value = disparity; + disparity.convertTo(output->value, CV_32F, 1./16); return true; } diff --git a/src/api/processor/points_processor.cc b/src/api/processor/points_processor.cc index 0d594b1..529c547 100644 --- a/src/api/processor/points_processor.cc +++ b/src/api/processor/points_processor.cc @@ -45,7 +45,42 @@ bool PointsProcessor::OnProcess( UNUSED(parent) const ObjMat *input = Object::Cast(in); ObjMat *output = Object::Cast(out); - cv::reprojectImageTo3D(input->value, output->value, Q_, true); + // cv::reprojectImageTo3D(input->value, output->value, Q_, true, -1); + bool handleMissingValues = true; + cv::Mat disparity = input->value; + output->value.create(disparity.size(), CV_MAKETYPE(CV_32FC3, 3)); + cv::Mat _3dImage = output->value; + + const float bigZ = 10000.f; + cv::Matx44d Q; + Q_.convertTo(Q, CV_64F); + + int x, cols = disparity.cols; + CV_Assert(cols >= 0); + + double minDisparity = FLT_MAX; + + if (handleMissingValues) { + cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); + } + + for (int y = 0; y < disparity.rows; y++) { + + float *sptr = disparity.ptr(y); + cv::Vec3f *dptr = _3dImage.ptr(y); + + for( x = 0; x < cols; x++) + { + double d = sptr[x]; + cv::Vec4d homg_pt = Q*cv::Vec4d(x, y, d, 1.0); + dptr[x] = cv::Vec3d(homg_pt.val); + dptr[x] /= homg_pt[3]; + + if( fabs(d-minDisparity) <= FLT_EPSILON ) { + dptr[x][2] = bigZ; + } + } + } return true; } diff --git a/src/api/processor/rectify_processor.cc b/src/api/processor/rectify_processor.cc index 31ce62c..ba5b3b2 100644 --- a/src/api/processor/rectify_processor.cc +++ b/src/api/processor/rectify_processor.cc @@ -69,12 +69,16 @@ void RectifyProcessor::InitParams( in_right.cy, 0, 0, 1); cv::Mat D1(1, 5, CV_64F, in_left.coeffs); cv::Mat D2(1, 5, CV_64F, in_right.coeffs); + /* cv::Mat R = (cv::Mat_(3, 3) << ex_right_to_left.rotation[0][0], ex_right_to_left.rotation[0][1], ex_right_to_left.rotation[0][2], ex_right_to_left.rotation[1][0], ex_right_to_left.rotation[1][1], ex_right_to_left.rotation[1][2], ex_right_to_left.rotation[2][0], ex_right_to_left.rotation[2][1], ex_right_to_left.rotation[2][2]); + */ + cv::Mat R = + (cv::Mat_(3, 3) << 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); cv::Mat T(3, 1, CV_64F, ex_right_to_left.translation); VLOG(2) << "InitParams size: " << size; From 23e28e20a606c087099902427b3f50b06cb6522e Mon Sep 17 00:00:00 2001 From: Osenberg-Y Date: Mon, 13 Aug 2018 18:42:53 +0800 Subject: [PATCH 03/17] Made some modification of code style and perfect function --- src/api/processor/disparity_processor.cc | 17 +++++++++++++++-- src/api/processor/disparity_processor.h | 4 +--- src/api/processor/points_processor.cc | 9 +++------ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/api/processor/disparity_processor.cc b/src/api/processor/disparity_processor.cc index 2f4ccda..cea855a 100644 --- a/src/api/processor/disparity_processor.cc +++ b/src/api/processor/disparity_processor.cc @@ -28,8 +28,16 @@ DisparityProcessor::DisparityProcessor(std::int32_t proc_period) VLOG(2) << __func__ << ": proc_period=" << proc_period; int blockSize_ = 15; // 15 - int minDisparity_ = 0; // 0 int numDisparities_ = 64; // 64 + +#ifdef USE_OPENCV2 + bm_ = cv::Ptr( + new cv::StereoBM( + cv::StereoBM::BASIC_PRESET, + numDisparities_, + blockSize_)); +#else + int minDisparity_ = 0; // 0 int preFilterSize_ = 9; // 9 int preFilterCap_ = 31; // 31 int uniquenessRatio_ = 15; // 15 @@ -37,7 +45,7 @@ DisparityProcessor::DisparityProcessor(std::int32_t proc_period) int speckleWindowSize_ = 100; // 100 int speckleRange_ = 4; // 4 - bm_ = cv::StereoBM::create(); + bm_ = cv::StereoBM::create(16, 9); bm_->setBlockSize(blockSize_); bm_->setMinDisparity(minDisparity_); bm_->setNumDisparities(numDisparities_); @@ -47,6 +55,7 @@ DisparityProcessor::DisparityProcessor(std::int32_t proc_period) bm_->setTextureThreshold(textureThreshold_); bm_->setSpeckleWindowSize(speckleWindowSize_); bm_->setSpeckleRange(speckleRange_); +#endif } DisparityProcessor::~DisparityProcessor() { @@ -68,7 +77,11 @@ bool DisparityProcessor::OnProcess( ObjMat *output = Object::Cast(out); cv::Mat disparity; +#ifdef USE_OPENCV2 + (*bm_)(input->first, input->second, disparity); +#else bm_->compute(input->first, input->second, disparity); +#endif disparity.convertTo(output->value, CV_32F, 1./16); return true; } diff --git a/src/api/processor/disparity_processor.h b/src/api/processor/disparity_processor.h index da4f78b..6a92ce6 100644 --- a/src/api/processor/disparity_processor.h +++ b/src/api/processor/disparity_processor.h @@ -21,13 +21,11 @@ #include "api/processor/processor.h" -#if 0 namespace cv { -class StereoSGBM; +class StereoBM; } // namespace cv -#endif MYNTEYE_BEGIN_NAMESPACE diff --git a/src/api/processor/points_processor.cc b/src/api/processor/points_processor.cc index 529c547..563beb8 100644 --- a/src/api/processor/points_processor.cc +++ b/src/api/processor/points_processor.cc @@ -45,8 +45,7 @@ bool PointsProcessor::OnProcess( UNUSED(parent) const ObjMat *input = Object::Cast(in); ObjMat *output = Object::Cast(out); - // cv::reprojectImageTo3D(input->value, output->value, Q_, true, -1); - bool handleMissingValues = true; + cv::Mat disparity = input->value; output->value.create(disparity.size(), CV_MAKETYPE(CV_32FC3, 3)); cv::Mat _3dImage = output->value; @@ -60,12 +59,9 @@ bool PointsProcessor::OnProcess( double minDisparity = FLT_MAX; - if (handleMissingValues) { - cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); - } + cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); for (int y = 0; y < disparity.rows; y++) { - float *sptr = disparity.ptr(y); cv::Vec3f *dptr = _3dImage.ptr(y); @@ -81,6 +77,7 @@ bool PointsProcessor::OnProcess( } } } + return true; } From 94fd56a65d0f72edddd5c84b13b77f714175e8c7 Mon Sep 17 00:00:00 2001 From: Osenberg-Y Date: Mon, 13 Aug 2018 18:49:59 +0800 Subject: [PATCH 04/17] code style --- src/api/processor/points_processor.cc | 47 +++++++++++++-------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/api/processor/points_processor.cc b/src/api/processor/points_processor.cc index 563beb8..9b2fc76 100644 --- a/src/api/processor/points_processor.cc +++ b/src/api/processor/points_processor.cc @@ -46,37 +46,36 @@ bool PointsProcessor::OnProcess( const ObjMat *input = Object::Cast(in); ObjMat *output = Object::Cast(out); - cv::Mat disparity = input->value; - output->value.create(disparity.size(), CV_MAKETYPE(CV_32FC3, 3)); - cv::Mat _3dImage = output->value; + cv::Mat disparity = input->value; + output->value.create(disparity.size(), CV_MAKETYPE(CV_32FC3, 3)); + cv::Mat _3dImage = output->value; - const float bigZ = 10000.f; - cv::Matx44d Q; - Q_.convertTo(Q, CV_64F); + const float bigZ = 10000.f; + cv::Matx44d Q; + Q_.convertTo(Q, CV_64F); - int x, cols = disparity.cols; - CV_Assert(cols >= 0); + int x, cols = disparity.cols; + CV_Assert(cols >= 0); - double minDisparity = FLT_MAX; + double minDisparity = FLT_MAX; - cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); + cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); - for (int y = 0; y < disparity.rows; y++) { - float *sptr = disparity.ptr(y); - cv::Vec3f *dptr = _3dImage.ptr(y); + for (int y = 0; y < disparity.rows; y++) { + float *sptr = disparity.ptr(y); + cv::Vec3f *dptr = _3dImage.ptr(y); - for( x = 0; x < cols; x++) - { - double d = sptr[x]; - cv::Vec4d homg_pt = Q*cv::Vec4d(x, y, d, 1.0); - dptr[x] = cv::Vec3d(homg_pt.val); - dptr[x] /= homg_pt[3]; + for (x = 0; x < cols; x++) { + double d = sptr[x]; + cv::Vec4d homg_pt = Q * cv::Vec4d(x, y, d, 1.0); + dptr[x] = cv::Vec3d(homg_pt.val); + dptr[x] /= homg_pt[3]; - if( fabs(d-minDisparity) <= FLT_EPSILON ) { - dptr[x][2] = bigZ; - } - } - } + if (fabs(d - minDisparity) <= FLT_EPSILON) { + dptr[x][2] = bigZ; + } + } + } return true; } From c3fc4ba3ba743729c8e658007156f0409675c64c Mon Sep 17 00:00:00 2001 From: Osenberg-Y Date: Tue, 14 Aug 2018 14:47:26 +0800 Subject: [PATCH 05/17] Fixed no pointcloud on ros --- wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc index 64dd7b9..8855d4a 100644 --- a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc +++ b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc @@ -324,7 +324,7 @@ class ROSWrapperNodelet : public nodelet::Nodelet { is_published_[stream] = true; } - if (camera_publishers_[Stream::POINTS].getNumSubscribers() > 0 && + if (points_publisher_.getNumSubscribers() > 0 && !is_published_[Stream::POINTS]) { api_->SetStreamCallback( Stream::POINTS, [this](const api::StreamData &data) { From 97701188b8ed5b83e3b801d39b0a827493451296 Mon Sep 17 00:00:00 2001 From: kalman Date: Fri, 7 Dec 2018 16:00:29 +0800 Subject: [PATCH 06/17] Do samll change in wrapper_nodelet.cc --- .../src/wrapper_nodelet.cc | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc index 81c9d24..189418e 100644 --- a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc +++ b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc @@ -409,25 +409,6 @@ class ROSWrapperNodelet : public nodelet::Nodelet { } else { publishPoint(stream); } - api_->SetStreamCallback( - stream, [this, stream](const api::StreamData &data) { - // data.img is null, not hard timestamp - static std::size_t count = 0; - ++count; - publishCamera(stream, data, count, ros::Time::now()); - }); - is_published_[stream] = true; - } - - if (points_publisher_.getNumSubscribers() > 0 && - !is_published_[Stream::POINTS]) { - api_->SetStreamCallback( - Stream::POINTS, [this](const api::StreamData &data) { - static std::size_t count = 0; - ++count; - publishPoints(data, count, ros::Time::now()); - }); - is_published_[Stream::POINTS] = true; } if (!is_motion_published_) { From 0ecb3950447671bf0a484bd382bac205c7799148 Mon Sep 17 00:00:00 2001 From: kalman Date: Fri, 7 Dec 2018 16:22:32 +0800 Subject: [PATCH 07/17] Replace tab with space --- samples/tutorials/util/pc_viewer.cc | 2 +- .../api/processor/disparity_processor.cc | 53 +++++++++---------- .../api/processor/rectify_processor.cc | 6 +-- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/samples/tutorials/util/pc_viewer.cc b/samples/tutorials/util/pc_viewer.cc index 1ad50a1..08bcce6 100644 --- a/samples/tutorials/util/pc_viewer.cc +++ b/samples/tutorials/util/pc_viewer.cc @@ -84,7 +84,7 @@ void PCViewer::ConvertMatToPointCloud( for (int i = 0; i < xyz.rows; i++) { for (int j = 0; j < xyz.cols; j++) { auto &&p = xyz.at(i, j); - if (std::abs(p.z) > 9999) continue; + if (std::abs(p.z) > 9999) continue; if (std::isfinite(p.x) && std::isfinite(p.y) && std::isfinite(p.z)) { // LOG(INFO) << "[" << i << "," << j << "] x: " << p.x << ", y: " << p.y // << ", z: " << p.z; diff --git a/src/mynteye/api/processor/disparity_processor.cc b/src/mynteye/api/processor/disparity_processor.cc index b662366..c60de02 100644 --- a/src/mynteye/api/processor/disparity_processor.cc +++ b/src/mynteye/api/processor/disparity_processor.cc @@ -27,34 +27,33 @@ DisparityProcessor::DisparityProcessor(std::int32_t proc_period) : Processor(std::move(proc_period)) { VLOG(2) << __func__ << ": proc_period=" << proc_period; - int blockSize_ = 15; // 15 - int numDisparities_ = 64; // 64 + int blockSize_ = 15; // 15 + int numDisparities_ = 64; // 64 #ifdef WITH_OPENCV2 - bm_ = cv::Ptr( - new cv::StereoBM( - cv::StereoBM::BASIC_PRESET, - numDisparities_, - blockSize_)); + bm_ = cv::Ptr( + new cv::StereoBM( + cv::StereoBM::BASIC_PRESET, + numDisparities_, + blockSize_)); #else - int minDisparity_ = 0; // 0 - int preFilterSize_ = 9; // 9 - int preFilterCap_ = 31; // 31 - int uniquenessRatio_ = 15; // 15 - int textureThreshold_ = 10; // 10 - int speckleWindowSize_ = 100; // 100 - int speckleRange_ = 4; // 4 - - bm_ = cv::StereoBM::create(16, 9); - bm_->setBlockSize(blockSize_); - bm_->setMinDisparity(minDisparity_); - bm_->setNumDisparities(numDisparities_); - bm_->setPreFilterSize(preFilterSize_); - bm_->setPreFilterCap(preFilterCap_); - bm_->setUniquenessRatio(uniquenessRatio_); - bm_->setTextureThreshold(textureThreshold_); - bm_->setSpeckleWindowSize(speckleWindowSize_); - bm_->setSpeckleRange(speckleRange_); + int minDisparity_ = 0; // 0 + int preFilterSize_ = 9; // 9 + int preFilterCap_ = 31; // 31 + int uniquenessRatio_ = 15; // 15 + int textureThreshold_ = 10; // 10 + int speckleWindowSize_ = 100; // 100 + int speckleRange_ = 4; // 4 + bm_ = cv::StereoBM::create(16, 9); + bm_->setBlockSize(blockSize_); + bm_->setMinDisparity(minDisparity_); + bm_->setNumDisparities(numDisparities_); + bm_->setPreFilterSize(preFilterSize_); + bm_->setPreFilterCap(preFilterCap_); + bm_->setUniquenessRatio(uniquenessRatio_); + bm_->setTextureThreshold(textureThreshold_); + bm_->setSpeckleWindowSize(speckleWindowSize_); + bm_->setSpeckleRange(speckleRange_); #endif } @@ -78,11 +77,11 @@ bool DisparityProcessor::OnProcess( cv::Mat disparity; #ifdef WITH_OPENCV2 - (*bm_)(input->first, input->second, disparity); + (*bm_)(input->first, input->second, disparity); #else bm_->compute(input->first, input->second, disparity); #endif - disparity.convertTo(output->value, CV_32F, 1./16); + disparity.convertTo(output->value, CV_32F, 1./16); return true; } diff --git a/src/mynteye/api/processor/rectify_processor.cc b/src/mynteye/api/processor/rectify_processor.cc index ab47402..2b14e12 100644 --- a/src/mynteye/api/processor/rectify_processor.cc +++ b/src/mynteye/api/processor/rectify_processor.cc @@ -72,15 +72,15 @@ void RectifyProcessor::InitParams( in_right.cy, 0, 0, 1); cv::Mat D1(1, 5, CV_64F, in_left.coeffs); cv::Mat D2(1, 5, CV_64F, in_right.coeffs); - /* + /* cv::Mat R = (cv::Mat_(3, 3) << ex_right_to_left.rotation[0][0], ex_right_to_left.rotation[0][1], ex_right_to_left.rotation[0][2], ex_right_to_left.rotation[1][0], ex_right_to_left.rotation[1][1], ex_right_to_left.rotation[1][2], ex_right_to_left.rotation[2][0], ex_right_to_left.rotation[2][1], ex_right_to_left.rotation[2][2]); - */ - cv::Mat R = + */ + cv::Mat R = (cv::Mat_(3, 3) << 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); cv::Mat T(3, 1, CV_64F, ex_right_to_left.translation); From 28ca9b60b0ef6231179f96700d06a7d393065ca2 Mon Sep 17 00:00:00 2001 From: kalman Date: Sat, 8 Dec 2018 20:53:11 +0800 Subject: [PATCH 08/17] Rollback to sgbm --- samples/tutorials/util/pc_viewer.cc | 1 - .../api/processor/disparity_processor.cc | 75 ++++++++++++------- .../api/processor/disparity_processor.h | 6 +- src/mynteye/api/processor/points_processor.cc | 35 +-------- .../api/processor/rectify_processor.cc | 4 - 5 files changed, 52 insertions(+), 69 deletions(-) diff --git a/samples/tutorials/util/pc_viewer.cc b/samples/tutorials/util/pc_viewer.cc index 08bcce6..bec96dc 100644 --- a/samples/tutorials/util/pc_viewer.cc +++ b/samples/tutorials/util/pc_viewer.cc @@ -84,7 +84,6 @@ void PCViewer::ConvertMatToPointCloud( for (int i = 0; i < xyz.rows; i++) { for (int j = 0; j < xyz.cols; j++) { auto &&p = xyz.at(i, j); - if (std::abs(p.z) > 9999) continue; if (std::isfinite(p.x) && std::isfinite(p.y) && std::isfinite(p.z)) { // LOG(INFO) << "[" << i << "," << j << "] x: " << p.x << ", y: " << p.y // << ", z: " << p.z; diff --git a/src/mynteye/api/processor/disparity_processor.cc b/src/mynteye/api/processor/disparity_processor.cc index c60de02..b6c37a3 100644 --- a/src/mynteye/api/processor/disparity_processor.cc +++ b/src/mynteye/api/processor/disparity_processor.cc @@ -26,34 +26,37 @@ const char DisparityProcessor::NAME[] = "DisparityProcessor"; DisparityProcessor::DisparityProcessor(std::int32_t proc_period) : Processor(std::move(proc_period)) { VLOG(2) << __func__ << ": proc_period=" << proc_period; - - int blockSize_ = 15; // 15 - int numDisparities_ = 64; // 64 + int sgbmWinSize = 3; + int numberOfDisparities = 64; #ifdef WITH_OPENCV2 - bm_ = cv::Ptr( - new cv::StereoBM( - cv::StereoBM::BASIC_PRESET, - numDisparities_, - blockSize_)); + // StereoSGBM + // http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?#stereosgbm + sgbm_ = cv::Ptr( + new cv::StereoSGBM( + 0, // minDisparity + numberOfDisparities, // numDisparities + sgbmWinSize, // SADWindowSize + 8 * sgbmWinSize * sgbmWinSize, // P1 + 32 * sgbmWinSize * sgbmWinSize, // P2 + 1, // disp12MaxDiff + 63, // preFilterCap + 10, // uniquenessRatio + 100, // speckleWindowSize + 32, // speckleRange + false)); // fullDP #else - int minDisparity_ = 0; // 0 - int preFilterSize_ = 9; // 9 - int preFilterCap_ = 31; // 31 - int uniquenessRatio_ = 15; // 15 - int textureThreshold_ = 10; // 10 - int speckleWindowSize_ = 100; // 100 - int speckleRange_ = 4; // 4 - bm_ = cv::StereoBM::create(16, 9); - bm_->setBlockSize(blockSize_); - bm_->setMinDisparity(minDisparity_); - bm_->setNumDisparities(numDisparities_); - bm_->setPreFilterSize(preFilterSize_); - bm_->setPreFilterCap(preFilterCap_); - bm_->setUniquenessRatio(uniquenessRatio_); - bm_->setTextureThreshold(textureThreshold_); - bm_->setSpeckleWindowSize(speckleWindowSize_); - bm_->setSpeckleRange(speckleRange_); + sgbm_ = cv::StereoSGBM::create(0, 16, 3); + sgbm_->setPreFilterCap(63); + sgbm_->setBlockSize(sgbmWinSize); + sgbm_->setP1(8 * sgbmWinSize * sgbmWinSize); + sgbm_->setP2(32 * sgbmWinSize * sgbmWinSize); + sgbm_->setMinDisparity(0); + sgbm_->setNumDisparities(numberOfDisparities); + sgbm_->setUniquenessRatio(10); + sgbm_->setSpeckleWindowSize(100); + sgbm_->setSpeckleRange(32); + sgbm_->setDisp12MaxDiff(1); #endif } @@ -77,11 +80,27 @@ bool DisparityProcessor::OnProcess( cv::Mat disparity; #ifdef WITH_OPENCV2 - (*bm_)(input->first, input->second, disparity); + // StereoSGBM::operator() + // http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereosgbm-operator + // Output disparity map. It is a 16-bit signed single-channel image of the + // same size as the input image. + // It contains disparity values scaled by 16. So, to get the floating-point + // disparity map, + // you need to divide each disp element by 16. + (*sgbm_)(input->first, input->second, disparity); #else - bm_->compute(input->first, input->second, disparity); + // compute() + // http://docs.opencv.org/master/d2/d6e/classcv_1_1StereoMatcher.html + // Output disparity map. It has the same size as the input images. + // Some algorithms, like StereoBM or StereoSGBM compute 16-bit fixed-point + // disparity map + // (where each disparity value has 4 fractional bits), + // whereas other algorithms output 32-bit floating-point disparity map. + sgbm_->compute(input->first, input->second, disparity); #endif - disparity.convertTo(output->value, CV_32F, 1./16); + output->value = disparity / 16 + 1; + output->id = input->first_id; + output->data = inpu t->first_data; return true; } diff --git a/src/mynteye/api/processor/disparity_processor.h b/src/mynteye/api/processor/disparity_processor.h index 0ec43b6..370dca3 100644 --- a/src/mynteye/api/processor/disparity_processor.h +++ b/src/mynteye/api/processor/disparity_processor.h @@ -17,13 +17,11 @@ #include -#include - #include "mynteye/api/processor.h" namespace cv { -class StereoBM; +class StereoSGBM; } // namespace cv @@ -44,7 +42,7 @@ class DisparityProcessor : public Processor { Object *const in, Object *const out, Processor *const parent) override; private: - cv::Ptr bm_; + cv::Ptr sgbm_; }; MYNTEYE_END_NAMESPACE diff --git a/src/mynteye/api/processor/points_processor.cc b/src/mynteye/api/processor/points_processor.cc index 9b40e85..7d2b6d4 100644 --- a/src/mynteye/api/processor/points_processor.cc +++ b/src/mynteye/api/processor/points_processor.cc @@ -45,38 +45,9 @@ bool PointsProcessor::OnProcess( MYNTEYE_UNUSED(parent) const ObjMat *input = Object::Cast(in); ObjMat *output = Object::Cast(out); - - cv::Mat disparity = input->value; - output->value.create(disparity.size(), CV_MAKETYPE(CV_32FC3, 3)); - cv::Mat _3dImage = output->value; - - const float bigZ = 10000.f; - cv::Matx44d Q; - Q_.convertTo(Q, CV_64F); - - int x, cols = disparity.cols; - CV_Assert(cols >= 0); - - double minDisparity = FLT_MAX; - - cv::minMaxIdx(disparity, &minDisparity, 0, 0, 0); - - for (int y = 0; y < disparity.rows; y++) { - float *sptr = disparity.ptr(y); - cv::Vec3f *dptr = _3dImage.ptr(y); - - for (x = 0; x < cols; x++) { - double d = sptr[x]; - cv::Vec4d homg_pt = Q * cv::Vec4d(x, y, d, 1.0); - dptr[x] = cv::Vec3d(homg_pt.val); - dptr[x] /= homg_pt[3]; - - if (fabs(d - minDisparity) <= FLT_EPSILON) { - dptr[x][2] = bigZ; - } - } - } - + cv::reprojectImageTo3D(input->value, output->value, Q_, true); + output->id = input->id; + output->data = input->data; return true; } diff --git a/src/mynteye/api/processor/rectify_processor.cc b/src/mynteye/api/processor/rectify_processor.cc index 2b14e12..9c570f0 100644 --- a/src/mynteye/api/processor/rectify_processor.cc +++ b/src/mynteye/api/processor/rectify_processor.cc @@ -72,16 +72,12 @@ void RectifyProcessor::InitParams( in_right.cy, 0, 0, 1); cv::Mat D1(1, 5, CV_64F, in_left.coeffs); cv::Mat D2(1, 5, CV_64F, in_right.coeffs); - /* cv::Mat R = (cv::Mat_(3, 3) << ex_right_to_left.rotation[0][0], ex_right_to_left.rotation[0][1], ex_right_to_left.rotation[0][2], ex_right_to_left.rotation[1][0], ex_right_to_left.rotation[1][1], ex_right_to_left.rotation[1][2], ex_right_to_left.rotation[2][0], ex_right_to_left.rotation[2][1], ex_right_to_left.rotation[2][2]); - */ - cv::Mat R = - (cv::Mat_(3, 3) << 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); cv::Mat T(3, 1, CV_64F, ex_right_to_left.translation); VLOG(2) << "InitParams size: " << size; From b9db889fa319f3644b4a491763bf1fd04ea16a49 Mon Sep 17 00:00:00 2001 From: kalman Date: Sat, 8 Dec 2018 20:55:14 +0800 Subject: [PATCH 09/17] Delete uesless space --- src/mynteye/api/processor/disparity_processor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mynteye/api/processor/disparity_processor.cc b/src/mynteye/api/processor/disparity_processor.cc index b6c37a3..c22232c 100644 --- a/src/mynteye/api/processor/disparity_processor.cc +++ b/src/mynteye/api/processor/disparity_processor.cc @@ -100,7 +100,7 @@ bool DisparityProcessor::OnProcess( #endif output->value = disparity / 16 + 1; output->id = input->first_id; - output->data = inpu t->first_data; + output->data = input->first_data; return true; } From 206683b76f91bcc666e724e4f9f3fc06fdc5f3b3 Mon Sep 17 00:00:00 2001 From: kalman Date: Sat, 8 Dec 2018 21:10:31 +0800 Subject: [PATCH 10/17] Fix disparity_processor.cc bug --- src/mynteye/api/processor/disparity_processor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mynteye/api/processor/disparity_processor.cc b/src/mynteye/api/processor/disparity_processor.cc index c22232c..1c4f939 100644 --- a/src/mynteye/api/processor/disparity_processor.cc +++ b/src/mynteye/api/processor/disparity_processor.cc @@ -98,7 +98,7 @@ bool DisparityProcessor::OnProcess( // whereas other algorithms output 32-bit floating-point disparity map. sgbm_->compute(input->first, input->second, disparity); #endif - output->value = disparity / 16 + 1; + disparity.convertTo(output->value, CV_32F, 1./16, 1); output->id = input->first_id; output->data = input->first_data; return true; From 66eb9883ff188cafcded0dfdccaa9dd70bd9708b Mon Sep 17 00:00:00 2001 From: Tiny Date: Tue, 11 Dec 2018 17:08:31 +0800 Subject: [PATCH 11/17] add mac uvc impl file. --- CMakeLists.txt | 23 +- src/mynteye/uvc/macosx/AVfoundationCamera.h | 91 + src/mynteye/uvc/macosx/AVfoundationCamera.mm | 739 ++++++ src/mynteye/uvc/macosx/CameraEngine.cpp | 697 ++++++ src/mynteye/uvc/macosx/CameraEngine.h | 306 +++ .../uvc/macosx/USBBusProber.framework/Headers | 1 + .../macosx/USBBusProber.framework/Resources | 1 + .../USBBusProber.framework/USBBusProber | 1 + .../Versions/A/Headers/BusProbeClass.h | 55 + .../Versions/A/Headers/BusProbeDevice.h | 82 + .../Versions/A/Headers/BusProber.h | 65 + .../A/Headers/BusProberSharedFunctions.h | 87 + .../Headers/DecodeAudioInterfaceDescriptor.h | 477 ++++ .../Versions/A/Headers/DecodeBOSDescriptor.h | 35 + .../A/Headers/DecodeCommClassDescriptor.h | 44 + .../A/Headers/DecodeConfigurationDescriptor.h | 37 + .../A/Headers/DecodeDeviceDescriptor.h | 36 + .../Headers/DecodeDeviceQualifierDescriptor.h | 37 + .../A/Headers/DecodeEndpointDescriptor.h | 40 + .../Versions/A/Headers/DecodeHIDDescriptor.h | 226 ++ .../Versions/A/Headers/DecodeHubDescriptor.h | 68 + .../A/Headers/DecodeInterfaceDescriptor.h | 45 + .../Headers/DecodeVideoInterfaceDescriptor.h | 765 ++++++ .../Versions/A/Headers/DescriptorDecoder.h | 58 + .../Versions/A/Headers/ExtensionSelector.h | 38 + .../Versions/A/Headers/OutlineViewAdditions.h | 34 + .../Versions/A/Headers/OutlineViewNode.h | 67 + .../Versions/A/Headers/TableViewWithCopying.h | 36 + .../Versions/A/Headers/USBBusProber.h | 6 + .../Versions/A/Resources/APPLE_LICENSE | 372 +++ .../Versions/A/Resources/Info.plist | 46 + .../Versions/A/Resources/USBVendors.txt | 2226 +++++++++++++++++ .../A/Resources/en.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../Versions/A/USBBusProber | Bin 0 -> 226076 bytes .../USBBusProber.framework/Versions/Current | 1 + .../uvc/macosx/USBBusProber/BusProbeDevice.m | 2 +- .../uvc/macosx/VVUVCKit.framework/Headers | 1 + .../uvc/macosx/VVUVCKit.framework/Resources | 1 + .../uvc/macosx/VVUVCKit.framework/VVUVCKit | 1 + .../Versions/A/Headers/VVUVCController.h | 405 +++ .../Versions/A/Headers/VVUVCKit.h | 4 + .../A/Headers/VVUVCKitStringAdditions.h | 7 + .../Versions/A/Headers/VVUVCUIController.h | 44 + .../Versions/A/Headers/VVUVCUIElement.h | 36 + .../Versions/A/Resources/Info.plist | 46 + .../Versions/A/Resources/VVUVCController.nib | Bin 0 -> 16669 bytes .../A/Resources/en.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../VVUVCKit.framework/Versions/A/VVUVCKit | Bin 0 -> 124072 bytes .../VVUVCKit.framework/Versions/Current | 1 + src/mynteye/uvc/macosx/uvc-vvuvckit.cc | 90 + 50 files changed, 7478 insertions(+), 2 deletions(-) create mode 100644 src/mynteye/uvc/macosx/AVfoundationCamera.h create mode 100644 src/mynteye/uvc/macosx/AVfoundationCamera.mm create mode 100644 src/mynteye/uvc/macosx/CameraEngine.cpp create mode 100644 src/mynteye/uvc/macosx/CameraEngine.h create mode 120000 src/mynteye/uvc/macosx/USBBusProber.framework/Headers create mode 120000 src/mynteye/uvc/macosx/USBBusProber.framework/Resources create mode 120000 src/mynteye/uvc/macosx/USBBusProber.framework/USBBusProber create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeClass.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeDevice.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProber.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProberSharedFunctions.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeAudioInterfaceDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeBOSDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeCommClassDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeConfigurationDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceQualifierDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeEndpointDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHIDDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHubDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeInterfaceDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeVideoInterfaceDescriptor.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DescriptorDecoder.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/ExtensionSelector.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewAdditions.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewNode.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/TableViewWithCopying.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/USBBusProber.h create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/APPLE_LICENSE create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/Info.plist create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/USBVendors.txt create mode 100644 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/en.lproj/InfoPlist.strings create mode 100755 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/USBBusProber create mode 120000 src/mynteye/uvc/macosx/USBBusProber.framework/Versions/Current create mode 120000 src/mynteye/uvc/macosx/VVUVCKit.framework/Headers create mode 120000 src/mynteye/uvc/macosx/VVUVCKit.framework/Resources create mode 120000 src/mynteye/uvc/macosx/VVUVCKit.framework/VVUVCKit create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCController.h create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKit.h create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKitStringAdditions.h create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIController.h create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIElement.h create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/Info.plist create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/VVUVCController.nib create mode 100644 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/en.lproj/InfoPlist.strings create mode 100755 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/VVUVCKit create mode 120000 src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/Current create mode 100644 src/mynteye/uvc/macosx/uvc-vvuvckit.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 04c4104..e03215b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,7 +128,25 @@ endif() if(OS_WIN) set(UVC_SRC src/mynteye/uvc/win/uvc-wmf.cc) elseif(OS_MAC) - set(UVC_SRC src/mynteye/uvc/macosx/uvc-libuvc.cc) + add_compile_options(-x objective-c++) + ## INCLUDE_DIRECTORIES(src/mynteye/uvc/macosx) + ## INCLUDE_DIRECTORIES(src/mynteye/uvc/macosx/VVUVCKit) + ## aux_source_directory(src/mynteye/uvc/macosx/VVUVCKit/ MAC_VVUVCKIT_SRC_LIST) + ## aux_source_directory(src/mynteye/uvc/macosx/USBBusProber/ MAC_USBBUSPROBER_SRC_LIST) + ## add_library(usbBusProber SHARED ${MAC_USBBUSPROBER_SRC_LIST}) + ## set_target_properties(usbBusProber PROPERTIES FRAMEWORK TRUE ) + ## add_library(vvuvckit SHARED ${MAC_VVUVCKIT_SRC_LIST}) + ## set_target_properties(vvuvckit PROPERTIES FRAMEWORK TRUE ) + + INCLUDE_DIRECTORIES(src/mynteye/uvc/macosx/USBBusProber.framework/Headers) + INCLUDE_DIRECTORIES(src/mynteye/uvc/macosx/VVUVCKit.framework/Headers) + find_library(VVUVCKIT_LIBRARY VVUVCKit PATHS src/mynteye/uvc/macosx) + find_library(USB_LIBRARY USBBusProber PATHS src/mynteye/uvc/macosx) + MARK_AS_ADVANCED (VVUVCKIT_LIBRARY USB_LIBRARY) + SET(OSX_EXTRA_LIBS ${VVUVCKIT_LIBRARY} ${USB_LIBRARY}) + + set(UVC_SRC src/mynteye/uvc/macosx/CameraEngine.cpp src/mynteye/uvc/macosx/AVfoundationCamera.mm src/mynteye/uvc/macosx/uvc-vvuvckit.cc ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework CoreFoundation -framework AVFoundation -framework IOKit -framework AppKit -framework Cocoa -framework CoreMedia -framework CoreData -framework Foundation -framework CoreVideo ${__MACUVCLOG_FLAGS}") find_package(libuvc REQUIRED) set(UVC_LIB ${libuvc_LIBRARIES}) @@ -186,6 +204,9 @@ endif() add_library(${MYNTEYE_NAME} SHARED ${MYNTEYE_SRCS}) target_link_libraries(${MYNTEYE_NAME} ${MYNTEYE_LINKLIBS}) +if(OS_MAC) + target_link_libraries( ${MYNTEYE_NAME} ${OSX_EXTRA_LIBS} ) +endif() target_link_threads(${MYNTEYE_NAME}) if(OS_WIN) diff --git a/src/mynteye/uvc/macosx/AVfoundationCamera.h b/src/mynteye/uvc/macosx/AVfoundationCamera.h new file mode 100644 index 0000000..aae568c --- /dev/null +++ b/src/mynteye/uvc/macosx/AVfoundationCamera.h @@ -0,0 +1,91 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef AVfoundationCamera_H +#define AVfoundationCamera_H + +#import +#import +#import "VVUVCKit.h" + +#include "CameraEngine.h" + +static int32_t codec_table[] = { 0, 40, 0, 24, 0, 0, 0, 0, 0, 0, 'yuvs', '2vuy', 0, 'v308', '420v', '410v', 0, 0, 0, 0, 'dmb1', 'dmb1', 'mp1v', 'mp2v', 'mp4v', 'h263', 'avc1', 'dvcp', 'dvc ' }; + + +@interface FrameGrabber : NSObject +{ + bool new_frame; + int cam_width, cam_height; + int frm_width, frm_height; + int xoff, yoff; + unsigned char *buffer; + bool crop; + bool color; +} +- (id) initWithCameraSize:(int)w :(int)h :(int)b; +- (id) initWithCropSize:(int)cw :(int)ch :(int)b :(int)fw :(int)fh :(int)xo :(int)yo; +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection; +- (unsigned char*) getFrame; + +@end + +class AVfoundationCamera : public CameraEngine +{ + +public: + AVfoundationCamera(CameraConfig* cam_cfg); + ~AVfoundationCamera(); + + static int getDeviceCount(); + static std::vector getCameraConfigs(int dev_id = -1); + static CameraEngine* getCamera(CameraConfig* cam_cfg); + + bool initCamera(); + bool startCamera(); + unsigned char* getFrame(); + bool stopCamera(); + bool stillRunning(); + bool resetCamera(); + bool closeCamera(); + + int getCameraSettingStep(int mode); + bool setCameraSettingAuto(int mode, bool flag); + bool getCameraSettingAuto(int mode); + bool setCameraSetting(int mode, int value); + int getCameraSetting(int mode); + int getMaxCameraSetting(int mode); + int getMinCameraSetting(int mode); + bool setDefaultCameraSetting(int mode); + int getDefaultCameraSetting(int mode); + bool hasCameraSetting(int mode); + bool hasCameraSettingAuto(int mode); + + bool showSettingsDialog(bool lock); + +private: + + bool disconnected; + + VVUVCController *uvcController; + FrameGrabber *grabber; + + AVCaptureSession *session; + AVCaptureDeviceInput *videoDeviceInput; + AVCaptureVideoDataOutput *videoOutput; + AVCaptureDevice *videoDevice; +}; +#endif diff --git a/src/mynteye/uvc/macosx/AVfoundationCamera.mm b/src/mynteye/uvc/macosx/AVfoundationCamera.mm new file mode 100644 index 0000000..0d1fe6b --- /dev/null +++ b/src/mynteye/uvc/macosx/AVfoundationCamera.mm @@ -0,0 +1,739 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "AVfoundationCamera.h" +#include +#include +// #include "CameraTool.h" + +#ifdef OSC_HOST_BIG_ENDIAN +#define FourCC2Str(fourcc) (const char[]){*((char*)&fourcc), *(((char*)&fourcc)+1), *(((char*)&fourcc)+2), *(((char*)&fourcc)+3),0} +#else +#define FourCC2Str(fourcc) (const char[]){*(((char*)&fourcc)+3), *(((char*)&fourcc)+2), *(((char*)&fourcc)+1), *(((char*)&fourcc)+0),0} +#endif + +@implementation FrameGrabber +- (id) initWithCameraSize:(int)cw :(int)ch :(int) bytes +{ + self = [super init]; + cam_width = cw; + cam_height = ch; + new_frame = false; + crop = false; + + if(bytes==3) color = true; + else color = false; + + buffer = new unsigned char[cam_width*cam_height*bytes]; + return self; +} + +- (id) initWithCropSize:(int)cw :(int)ch :(int)bytes :(int)fw :(int)fh :(int)xo :(int)yo +{ + self = [super init]; + cam_width = cw; + cam_height = ch; + frm_width = fw; + frm_height = fh; + xoff = xo; + yoff = yo; + new_frame = false; + crop = true; + + if(bytes==3) color = true; + else color = false; + + buffer = new unsigned char[frm_width*frm_height*bytes]; + return self; +} + + +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection +{ + + new_frame = false; + CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + if (CVPixelBufferLockBaseAddress(imageBuffer, 0) == kCVReturnSuccess) { + + unsigned char *src = (unsigned char*)CVPixelBufferGetBaseAddress(imageBuffer); + unsigned char *dest = buffer; + + if (color) { + + if (crop) { + unsigned char *src_buf = src + 3*(yoff*cam_width + xoff); + + for (int i=0;i0;j--) { + *dest++ = *src++; + src++; + *dest++ = *src++; + src++; + } + src += 2*xend; + + } + + } else { + + int size = cam_width*cam_height/2; + for (int i=size;i>0;i--) { + *dest++ = *src++; + src++; + *dest++ = *src++; + src++; + } + } + } + + CVPixelBufferUnlockBaseAddress(imageBuffer, 0); + new_frame = true; + } +} + +- (unsigned char*) getFrame +{ + if (new_frame){ + new_frame = false; + return buffer; + } else return NULL; +} + + +- (void)dealloc +{ + if(buffer) delete []buffer; + [super dealloc]; +} +@end + +AVfoundationCamera::AVfoundationCamera(CameraConfig *cam_cfg):CameraEngine(cam_cfg) +{ + disconnected = false; + running=false; + lost_frames=0; + timeout = 1000; + + uvcController = NULL; + + session = NULL; + videoDeviceInput = NULL; + videoOutput = NULL; + + videoDevice = NULL; + grabber = NULL; + + cam_cfg->driver = DRIVER_DEFAULT; +} + +AVfoundationCamera::~AVfoundationCamera() +{ + if (uvcController) [uvcController release]; + //if (videoDevice) [videoDevice release]; + if (videoOutput) [videoOutput release]; + if (grabber) [grabber release]; +} + +int AVfoundationCamera::getDeviceCount() { + + NSInteger dev_count0 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo].count; + NSInteger dev_count1 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed].count; + return (dev_count0 + dev_count1); +} + +std::vector AVfoundationCamera::getCameraConfigs(int dev_id) { + std::vector cfg_list; + + int dev_count = getDeviceCount(); + if (dev_count==0) return cfg_list; + + NSMutableArray *captureDevices = [NSMutableArray arrayWithCapacity:dev_count]; + NSArray *dev_list0 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice* device in dev_list0) [captureDevices addObject:device]; + NSArray *dev_list1 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]; + for (AVCaptureDevice* device in dev_list1)[captureDevices addObject:device]; + + int cam_id = -1; + for (AVCaptureDevice* device in captureDevices) { + cam_id ++; + if ((dev_id>=0) && (dev_id!=cam_id)) continue; + + CameraConfig cam_cfg; + // CameraTool::initCameraConfig(&cam_cfg); + + cam_cfg.driver = DRIVER_DEFAULT; + cam_cfg.device = cam_id; + + if ([device localizedName]!=NULL) + sprintf(cam_cfg.name,"%s",[[device localizedName] cStringUsingEncoding:NSUTF8StringEncoding]); + else sprintf(cam_cfg.name,"unknown device"); + + std::vector fmt_list; + int last_format = FORMAT_UNKNOWN; + NSArray *captureDeviceFormats = [device formats]; + for (AVCaptureDeviceFormat *format in captureDeviceFormats) { + + int32_t codec = CMVideoFormatDescriptionGetCodecType((CMVideoFormatDescriptionRef)[format formatDescription]); + + if (codec == '420f') codec = '420v'; + + cam_cfg.cam_format = FORMAT_UNKNOWN; + for (int i=FORMAT_MAX-1;i>0;i--) { + if (codec == codec_table[i]) { + cam_cfg.cam_format = i; + break; + } + } + + if (cam_cfg.cam_format != last_format) { + std::sort(fmt_list.begin(), fmt_list.end()); + cfg_list.insert( cfg_list.end(), fmt_list.begin(), fmt_list.end() ); + fmt_list.clear(); + last_format = cam_cfg.cam_format; + } + + CMVideoDimensions dim = CMVideoFormatDescriptionGetDimensions((CMVideoFormatDescriptionRef)[format formatDescription]); + + cam_cfg.cam_width = dim.width; + cam_cfg.cam_height = dim.height; + + for (AVFrameRateRange *frameRateRange in [format videoSupportedFrameRateRanges]) { + cam_cfg.cam_fps = roundf([frameRateRange maxFrameRate]*10)/10.0f; + fmt_list.push_back(cam_cfg); + } + } + std::sort(fmt_list.begin(), fmt_list.end()); + cfg_list.insert( cfg_list.end(), fmt_list.begin(), fmt_list.end() ); + } + + //[captureDevices release]; + return cfg_list; +} + +CameraEngine* AVfoundationCamera::getCamera(CameraConfig *cam_cfg) { + + int dev_count = getDeviceCount(); + if (dev_count==0) return NULL; + + if ((cam_cfg->device==SETTING_MIN) || (cam_cfg->device==SETTING_DEFAULT)) cam_cfg->device=0; + else if (cam_cfg->device==SETTING_MAX) cam_cfg->device=dev_count-1; + + std::vector cfg_list = AVfoundationCamera::getCameraConfigs(cam_cfg->device); + if (cam_cfg->cam_format==FORMAT_UNKNOWN) cam_cfg->cam_format = cfg_list[0].cam_format; + setMinMaxConfig(cam_cfg,cfg_list); + + if (cam_cfg->force) return new AVfoundationCamera(cam_cfg); + + for (int i=0;icam_format != cfg_list[i].cam_format) continue; + if ((cam_cfg->cam_width >=0) && (cam_cfg->cam_width != cfg_list[i].cam_width)) continue; + if ((cam_cfg->cam_height >=0) && (cam_cfg->cam_height != cfg_list[i].cam_height)) continue; + if ((cam_cfg->cam_fps >=0) && (cam_cfg->cam_fps != cfg_list[i].cam_fps)) continue; + + return new AVfoundationCamera(cam_cfg); + } + + return NULL; +} + +bool AVfoundationCamera::initCamera() { + + int dev_count = getDeviceCount(); + if ((dev_count==0) || (cfg->device < 0) || (cfg->device>=dev_count)) return false; + + NSMutableArray *videoDevices = [NSMutableArray arrayWithCapacity:dev_count]; + NSArray *dev_list0 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice* dev in dev_list0) [videoDevices addObject:dev]; + NSArray *dev_list1 = [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]; + for (AVCaptureDevice* dev in dev_list1) [videoDevices addObject:dev]; + + videoDevice = [videoDevices objectAtIndex:cfg->device]; + if (videoDevice==NULL) return false; + //else [videoDevices release]; + + if ([videoDevice localizedName]!=NULL) + sprintf(cfg->name,"%s",[[videoDevice localizedName] cStringUsingEncoding:NSUTF8StringEncoding]); + else sprintf(cfg->name,"unknown"); + + session = [[AVCaptureSession alloc] init]; + if (session==NULL) return false; + + NSError *error = nil; + videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; + if (videoDeviceInput == NULL) return false; + + std::vector cfg_list = getCameraConfigs(cfg->device); + if (cfg->cam_format==FORMAT_UNKNOWN) cfg->cam_format = cfg_list[0].cam_format; + setMinMaxConfig(cfg, cfg_list); + + AVCaptureDeviceFormat *selectedFormat = NULL; + AVFrameRateRange *selectedFrameRateRange = NULL; + NSArray *videoDeviceFormats = [videoDevice formats]; + for (AVCaptureDeviceFormat *format in videoDeviceFormats) { + + CMVideoDimensions dim = CMVideoFormatDescriptionGetDimensions((CMVideoFormatDescriptionRef)[format formatDescription]); + + if ((dim.width!=cfg->cam_width) || (dim.height!=cfg->cam_height)) continue; // wrong size + + int cam_format=0; + int32_t codec = CMVideoFormatDescriptionGetCodecType((CMVideoFormatDescriptionRef)[format formatDescription]); + if (codec == '420f') codec = '420v'; + + for (int i=FORMAT_MAX-1;i>0;i--) { + + if ((codec == codec_table[i]) && (cfg->cam_format==i)) { + cam_format = i; + break; + } + } + + if (!cam_format) continue; // wrong format + else selectedFormat = format; + + for (AVFrameRateRange *frameRateRange in [selectedFormat videoSupportedFrameRateRanges]) { + float framerate = roundf([frameRateRange maxFrameRate]*10)/10.0f; + if (framerate==cfg->cam_fps) { // found exact framerate + selectedFrameRateRange = frameRateRange; + break; + } + } + + if (selectedFrameRateRange) break; + } + + if ((selectedFrameRateRange==NULL) || (selectedFormat==NULL)) return false; + + [videoDevice lockForConfiguration:&error]; + [videoDevice setActiveFormat:selectedFormat]; + if ([[[videoDevice activeFormat] videoSupportedFrameRateRanges] containsObject:selectedFrameRateRange]) { + //[videoDevice setActiveVideoMaxFrameDuration:[selectedFrameRateRange maxFrameDuration]]; + [videoDevice setActiveVideoMinFrameDuration:[selectedFrameRateRange minFrameDuration]]; + } + [videoDevice unlockForConfiguration]; + + CMVideoDimensions dimensions = + CMVideoFormatDescriptionGetDimensions((CMVideoFormatDescriptionRef)[[videoDevice activeFormat] formatDescription]); + + cfg->cam_width = dimensions.width; + cfg->cam_height = dimensions.height; + + for (AVFrameRateRange *frameRateRange in [[videoDevice activeFormat] videoSupportedFrameRateRanges]) + { + cfg->cam_fps = roundf([frameRateRange maxFrameRate]*10)/10.0f; + if (CMTIME_COMPARE_INLINE([frameRateRange minFrameDuration], ==, [videoDevice activeVideoMinFrameDuration])) { + break; + } + } + + videoOutput = [[AVCaptureVideoDataOutput alloc] init]; + + unsigned int pixelformat = kCVPixelFormatType_422YpCbCr8_yuvs; + cfg->src_format = FORMAT_YUYV; + if (cfg->color) { + pixelformat = kCVPixelFormatType_24RGB; + cfg->src_format = FORMAT_RGB; + } + + NSDictionary *pixelBufferOptions = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithDouble:cfg->cam_width], (id)kCVPixelBufferWidthKey, + [NSNumber numberWithDouble:cfg->cam_height], (id)kCVPixelBufferHeightKey, + [NSNumber numberWithUnsignedInt: pixelformat ], + (id)kCVPixelBufferPixelFormatTypeKey, nil]; + + [videoOutput setVideoSettings:pixelBufferOptions]; + + videoOutput.alwaysDiscardsLateVideoFrames = YES; + [session addInput:videoDeviceInput]; + [session addOutput:videoOutput]; + + // configure output. + setupFrame(); + dispatch_queue_t queue = dispatch_queue_create("queue", NULL); + if (cfg->frame) { + grabber = [[FrameGrabber alloc] initWithCropSize:cfg->cam_width :cfg->cam_height :cfg->buf_format :cfg->frame_width :cfg->frame_height :cfg->frame_xoff :cfg->frame_yoff]; + } else { + grabber = [[FrameGrabber alloc] initWithCameraSize:cfg->cam_width :cfg->cam_height: cfg->buf_format]; + } + [videoOutput setSampleBufferDelegate:grabber queue:queue]; + dispatch_release(queue); + + NSString *uniqueID = [videoDevice uniqueID]; + if (uniqueID!=NULL) { + uvcController = [[VVUVCController alloc] initWithDeviceIDString:[videoDevice uniqueID]]; + if (uvcController) [uvcController resetParamsToDefaults]; + } // else std::cout << "VVUVCController NULL" << std::endl; + + return true; +} + +unsigned char* AVfoundationCamera::getFrame() +{ + unsigned char *cambuffer = [grabber getFrame]; + if (cambuffer!=NULL) { + timeout=100; + lost_frames=0; + return cambuffer; + } else { + usleep(10000); + lost_frames++; + if (lost_frames>timeout) { + disconnected=true; + running=false; + } + return NULL; + } + + return NULL; +} + +bool AVfoundationCamera::startCamera() +{ + [session startRunning]; + applyCameraSettings(); + running = true; + return true; +} + +bool AVfoundationCamera::stopCamera() +{ + [session stopRunning]; + running=false; + return true; +} + +bool AVfoundationCamera::stillRunning() { + return running; +} + +bool AVfoundationCamera::resetCamera() +{ + return (stopCamera() && startCamera()); +} + +bool AVfoundationCamera::closeCamera() +{ + if ((uvcController) && (!disconnected)) { + updateSettings(); + // CameraTool::saveSettings(); + } + [session release]; + return true; +} + +bool AVfoundationCamera::showSettingsDialog(bool lock) { + + if (uvcController) { + [uvcController closeSettingsWindow]; + [uvcController openSettingsWindow]; + } + + return lock; +} + +bool AVfoundationCamera::hasCameraSettingAuto(int mode) { + + if (uvcController==NULL) return false; + + switch (mode) { + case EXPOSURE: + return [uvcController autoExposureModeSupported]; + case WHITE: + return [uvcController autoWhiteBalanceSupported]; + case FOCUS: + return [uvcController autoFocusSupported]; + case COLOR_HUE: + return [uvcController autoHueSupported]; + } + + return false; +} + +bool AVfoundationCamera::getCameraSettingAuto(int mode) { + + if (uvcController==NULL) return false; + if (!hasCameraSettingAuto(mode)) return false; + + switch (mode) { + case EXPOSURE: + if ([uvcController autoExposureMode]>UVC_AEMode_Manual) return true; + else return false; + case WHITE: + return [uvcController autoWhiteBalance]; + case FOCUS: + return [uvcController autoFocus]; + case COLOR_HUE: + return [uvcController autoHue]; + } + + return false; +} + +bool AVfoundationCamera::setCameraSettingAuto(int mode, bool flag) { + + if (uvcController==NULL) return false; + if (!hasCameraSettingAuto(mode)) return false; + + switch (mode) { + case EXPOSURE: + if (flag==true) [uvcController setAutoExposureMode:UVC_AEMode_Auto]; + else [uvcController setAutoExposureMode:UVC_AEMode_Manual]; + return true; + case WHITE: + [uvcController setAutoWhiteBalance:flag]; + return true; + case FOCUS: + [uvcController setAutoFocus:flag]; + return true; + case COLOR_HUE: + [uvcController setAutoHue:flag]; + return true; + } + + return false; +} + +bool AVfoundationCamera::hasCameraSetting(int mode) { + + if (uvcController==NULL) return false; + + switch (mode) { + case BRIGHTNESS: return [uvcController brightSupported]; + case CONTRAST: return [uvcController contrastSupported]; + case SHARPNESS: return [uvcController sharpnessSupported]; + case GAMMA: return [uvcController gammaSupported]; + case GAIN: return [uvcController gainSupported]; + case AUTO_GAIN: return hasCameraSettingAuto(GAIN); + case EXPOSURE: return [uvcController exposureTimeSupported]; + case AUTO_EXPOSURE: return hasCameraSettingAuto(EXPOSURE); + case FOCUS: return [uvcController focusSupported]; + case AUTO_FOCUS: return hasCameraSettingAuto(FOCUS); + case WHITE: return [uvcController whiteBalanceSupported]; + case AUTO_WHITE: return hasCameraSettingAuto(WHITE); + case BACKLIGHT: return [uvcController backlightSupported]; + case SATURATION: return [uvcController saturationSupported]; + case COLOR_HUE: return [uvcController hueSupported]; + case AUTO_HUE: return hasCameraSettingAuto(COLOR_HUE); + case POWERLINE: return [uvcController powerLineSupported]; + } + + return false; +} + +bool AVfoundationCamera::setCameraSetting(int mode, int setting) { + + if (uvcController==NULL) return false; + if (!hasCameraSetting(mode)) return false; + setCameraSettingAuto(mode, false); + + switch (mode) { + case BRIGHTNESS: [uvcController setBright:setting]; return true; + case CONTRAST: [uvcController setContrast:setting]; return true; + case SHARPNESS: [uvcController setSharpness:setting]; return true; + case GAIN: [uvcController setGain:setting]; return true; + case GAMMA: [uvcController setGamma:setting]; return true; + case EXPOSURE: [uvcController setExposureTime:setting]; return true; + case FOCUS: [uvcController setFocus:setting]; return true; + case WHITE: [uvcController setWhiteBalance:setting]; return true; + case BACKLIGHT: [uvcController setBacklight:setting]; return true; + case SATURATION: [uvcController setSaturation:setting]; return true; + case COLOR_HUE: [uvcController setHue:setting]; return true; + case POWERLINE: [uvcController setPowerLine:setting]; return true; + } + + return false; +} + +int AVfoundationCamera::getCameraSetting(int mode) { + + if (uvcController==NULL) return 0; + if (!hasCameraSetting(mode)) return 0; + //if (getCameraSettingAuto(mode)) return 0; + + switch (mode) { + case BRIGHTNESS: return [uvcController bright]; + case CONTRAST: return [uvcController contrast]; + case SHARPNESS: return [uvcController sharpness]; + case GAIN: return [uvcController gain]; + case GAMMA: return [uvcController gamma]; + case EXPOSURE: return [uvcController exposureTime]; + case FOCUS: return [uvcController focus]; + case WHITE: return [uvcController whiteBalance]; + case BACKLIGHT: return [uvcController backlight]; + case SATURATION: return [uvcController saturation]; + case COLOR_HUE: return [uvcController hue]; + case POWERLINE: return [uvcController powerLine]; + } + + return 0; +} + +int AVfoundationCamera::getMaxCameraSetting(int mode) { + + if (uvcController==NULL) return 0; + if (!hasCameraSetting(mode)) return 0; + //if (getCameraSettingAuto(mode)) return 0; + + switch (mode) { + case BRIGHTNESS: return [uvcController maxBright]; + case CONTRAST: return [uvcController maxContrast]; + case SHARPNESS: return [uvcController maxSharpness]; + case GAIN: return [uvcController maxGain]; + case GAMMA: return [uvcController maxGamma]; + case EXPOSURE: return [uvcController maxExposureTime]; + case FOCUS: return [uvcController maxFocus]; + case WHITE: return [uvcController maxWhiteBalance]; + case BACKLIGHT: return [uvcController maxBacklight]; + case SATURATION: return [uvcController maxSaturation]; + case COLOR_HUE: return [uvcController maxHue]; + case POWERLINE: return [uvcController maxPowerLine]; + } + + return 0; +} + +int AVfoundationCamera::getMinCameraSetting(int mode) { + + if (uvcController==NULL) return 0; + if (!hasCameraSetting(mode)) return 0; + //if (getCameraSettingAuto(mode)) return 0; + + switch (mode) { + case BRIGHTNESS: return [uvcController minBright]; + case CONTRAST: return [uvcController minContrast]; + case GAIN: return [uvcController minGain]; + case GAMMA: return [uvcController minGamma]; + case EXPOSURE: return [uvcController minExposureTime]; + case SHARPNESS: return [uvcController minSharpness]; + case FOCUS: return [uvcController minFocus]; + case WHITE: return [uvcController minWhiteBalance]; + case BACKLIGHT: return [uvcController minBacklight]; + case SATURATION: return [uvcController minSaturation]; + case COLOR_HUE: return [uvcController minHue]; + case POWERLINE: return [uvcController minPowerLine]; + } + + return 0; +} + +bool AVfoundationCamera::setDefaultCameraSetting(int mode) { + + if (uvcController==NULL) return false; + if (!hasCameraSetting(mode)) return false; + setCameraSettingAuto(mode, false); + + switch (mode) { + case BRIGHTNESS: + [uvcController resetBright]; + default_brightness = [uvcController bright]; + break; + case CONTRAST: + [uvcController resetContrast]; + default_contrast = [uvcController contrast]; + break; + case SHARPNESS: + [uvcController resetSharpness]; + default_sharpness = [uvcController sharpness]; + break; + case GAIN: + [uvcController resetGain]; + default_gain = [uvcController gain]; + break; + case GAMMA: + [uvcController resetGamma]; + default_gamma = [uvcController gamma]; + break; + case EXPOSURE: + [uvcController resetExposureTime]; + default_exposure = [uvcController exposureTime]; + break; + case FOCUS: + [uvcController resetFocus]; + default_focus = [uvcController focus]; + break; + case WHITE: + [uvcController resetWhiteBalance]; + default_white = [uvcController whiteBalance]; + break; + case BACKLIGHT: + [uvcController resetBacklight]; + default_backlight = [uvcController backlight]; + break; + case SATURATION: + [uvcController resetSaturation]; + default_saturation = [uvcController saturation]; + break; + case COLOR_HUE: + [uvcController resetHue]; + default_hue = [uvcController hue]; + break; + case POWERLINE: + [uvcController resetPowerLine]; + default_powerline = [uvcController powerLine]; + break; + } + + return false; +} + +int AVfoundationCamera::getDefaultCameraSetting(int mode) { + + if (uvcController==NULL) return 0; + if (!hasCameraSetting(mode)) return 0; + + switch (mode) { + case BRIGHTNESS: return default_brightness; + case CONTRAST: return default_contrast; + case GAIN: return default_gain; + case GAMMA: return default_gamma; + case EXPOSURE: return default_exposure; + case SHARPNESS: return default_sharpness; + case FOCUS: return default_focus; + case WHITE: return default_white; + case BACKLIGHT: return default_backlight; + case SATURATION: return default_saturation; + case COLOR_HUE: return default_hue; + case POWERLINE: return default_powerline; + } + + return 0; +} + +int AVfoundationCamera::getCameraSettingStep(int mode) { + if (!hasCameraSetting(mode)) return 0; + return 1; +} diff --git a/src/mynteye/uvc/macosx/CameraEngine.cpp b/src/mynteye/uvc/macosx/CameraEngine.cpp new file mode 100644 index 0000000..c8020e9 --- /dev/null +++ b/src/mynteye/uvc/macosx/CameraEngine.cpp @@ -0,0 +1,697 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "CameraEngine.h" + +const char* dstr[] = { "default","dc1394","ps3eye","raspi","uvccam","","","","","","file","folder"}; + +const char* fstr[] = { "unknown", "mono8", "mono16", "rgb8", "rgb16", "mono16s", "rgb16s", "raw8", "raw16", "rgba", "yuyv", "uyvy", "yuv411", "yuv444", "yuv420p", "yuv410p", "yvyu", "yuv211", "", "", "jpeg", "mjpeg", "mpeg", "mpeg2", "mpeg4", "h263", "h264", "", "", "", "dvpal", "dvntsc" }; + + +void CameraEngine::printInfo() { + printf("camera: %s\n",cfg->name); + printf("driver: %s\n",dstr[cfg->driver]); + printf("codec: %s\n",fstr[cfg->cam_format]); + if (cfg->frame_mode<0) { + if (cfg->cam_fps==(int)cfg->cam_fps) printf("format: %dx%d, %dfps\n",cfg->frame_width,cfg->frame_height,(int)cfg->cam_fps); + else printf("format: %dx%d, %.1ffps\n",cfg->frame_width,cfg->frame_height,cfg->cam_fps); + } + else printf("format7_%d: %dx%d\n",cfg->frame_mode,cfg->frame_width,cfg->frame_height); +} + +void CameraEngine::setMinMaxConfig(CameraConfig *cam_cfg, std::vector cfg_list) { + if ((cam_cfg->cam_width>0) && (cam_cfg->cam_height>0) && (cam_cfg->cam_fps>0)) return; + + int max_width = 0; + int max_height = 0; + int min_width = INT_MAX; + int min_height = INT_MAX; + float max_fps = 0; + float min_fps = INT_MAX; + + for (unsigned int i=0;icam_format) continue; // wrong format + if (cfg_list[i].frame_mode!=cam_cfg->frame_mode) continue; // wrong format7 + + if (cfg_list[i].cam_width>max_width) max_width = cfg_list[i].cam_width; + if (cfg_list[i].cam_widthmax_height) max_height = cfg_list[i].cam_height; + if (cfg_list[i].cam_widthcam_width==SETTING_MAX) || (cam_cfg->cam_width>max_width)) cam_cfg->cam_width = max_width; + else if ((cam_cfg->cam_width==SETTING_MIN) || (cam_cfg->cam_widthcam_width = min_width; + if ((cam_cfg->cam_height==SETTING_MAX) || (cam_cfg->cam_height>max_height)) cam_cfg->cam_height = max_height; + else if ((cam_cfg->cam_height==SETTING_MIN) || (cam_cfg->cam_heightcam_height = min_height; + + if (cam_cfg->cam_fps>0) return; + + for (unsigned int i=0;icam_format) continue; // wrong format + if (cfg_list[i].frame_mode!=cam_cfg->frame_mode) continue; // wrong format7 + if ((cfg_list[i].cam_width!=cam_cfg->cam_width) || (cfg_list[i].cam_height!=cam_cfg->cam_height)) continue; // wrong size + + if (cfg_list[i].cam_fps>max_fps) max_fps = cfg_list[i].cam_fps; + if (cfg_list[i].cam_fpscam_fps==SETTING_MAX) || (cam_cfg->cam_fps>max_fps)) cam_cfg->cam_fps = max_fps; + if ((cam_cfg->cam_fps==SETTING_MIN) || (cam_cfg->cam_fpscam_fps = min_fps; +} + +bool CameraEngine::showSettingsDialog(bool lock) { + return true; +} + +void CameraEngine::control(unsigned char key) { + if(!settingsDialog) return; + + int step = 0; + switch(key) { + case VALUE_DECREASE: + step = getCameraSettingStep(currentCameraSetting); + if (step==1) step = (int)((float)ctrl_max/256.0f); + if (step<1) step=1; + ctrl_val -= step; + if (ctrl_valctrl_max) ctrl_val=ctrl_max; + setCameraSetting(currentCameraSetting,ctrl_val); + break; + case SETTING_PREVIOUS: + currentCameraSetting--; + if(currentCameraSetting<0) { + if (cfg->color) currentCameraSetting=COLOR_BLUE; + else currentCameraSetting=BACKLIGHT; + } + if ((!hasCameraSetting(currentCameraSetting)) || (getCameraSettingAuto(currentCameraSetting))) + control(SETTING_PREVIOUS); + break; + case SETTING_NEXT: + currentCameraSetting++; + if ((cfg->color) && (currentCameraSetting>COLOR_BLUE)) currentCameraSetting=0; + else if ((!cfg->color) && (currentCameraSetting>BACKLIGHT)) currentCameraSetting=0; + if ((!hasCameraSetting(currentCameraSetting)) || (getCameraSettingAuto(currentCameraSetting))) + control(SETTING_NEXT); + break; + case KEY_D: + resetCameraSettings(); + break; + + } + + ctrl_val = getCameraSetting(currentCameraSetting); + ctrl_max = getMaxCameraSetting(currentCameraSetting); + ctrl_min = getMinCameraSetting(currentCameraSetting); +} + +void CameraEngine::uyvy2gray(int width, int height, unsigned char *src, unsigned char *dest) { + + for (int i=height*width/2;i>0;i--) { + src++; + *dest++ = *src++; + src++; + *dest++ = *src++; + } +} + +void CameraEngine::crop_uyvy2gray(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + cam_buf += 2*x_off; + for (int j=frm_w/2;j>0;j--) { + cam_buf++; + *frm_buf++ = *cam_buf++; + cam_buf++; + *frm_buf++ = *cam_buf++; + } + cam_buf += 2*x_end; + } +} + +void CameraEngine::yuyv2gray(int width, int height, unsigned char *src, unsigned char *dest) { + for (int i=height*width/2;i>0;i--) { + *dest++ = *src++; + src++; + *dest++ = *src++; + src++; + } +} + +void CameraEngine::crop_yuyv2gray(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + cam_buf += 2*x_off; + for (int j=frm_w/2;j>0;j--) { + *frm_buf++ = *cam_buf++; + cam_buf++; + *frm_buf++ = *cam_buf++; + cam_buf++; + } + cam_buf += 2*x_end; + } +} + +//void yuv2rgb_conv(int Y1, int Y2, int U, int V, unsigned char *dest) { +void yuv2rgb_conv(int Y, int U, int V, unsigned char *dest) { + + /*int R = (int)(Y + 1.370705f * V); + int G = (int)(Y - 0.698001f * V - 0.337633f * U); + int B = (int)(Y + 1.732446f * U);*/ + + // integer method is twice as fast + int C = 298*(Y - 16); + int R = (C + 409*V + 128) >> 8; + int G = (C - 100*U - 208*V + 128) >> 8; + int B = (C + 516*U + 128) >> 8; + + SAT(R); + SAT(G); + SAT(B); + + *dest++ = R; + *dest++ = G; + *dest++ = B; +} + +void CameraEngine::uyvy2rgb(int width, int height, unsigned char *src, unsigned char *dest) { + + int Y1,Y2,U,V; + + for(int i=width*height/2;i>0;i--) { + // U and V are +-0.5 + U = *src++ - 128; + Y1 = *src++; + V = *src++ - 128; + Y2 = *src++; + + yuv2rgb_conv(Y1,U,V,dest); + yuv2rgb_conv(Y2,U,V,dest+=3); + dest+=3; + } +} + +void CameraEngine::crop_uyvy2rgb(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + int Y1,Y2,U,V; + + cam_buf += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + cam_buf += 2*x_off; + for (int j=frm_w/2;j>0;j--) { + // U and V are +-0.5 + U = *cam_buf++ - 128; + Y1 = *cam_buf++; + V = *cam_buf++ - 128; + Y2 = *cam_buf++; + + yuv2rgb_conv(Y1,U,V,frm_buf); + yuv2rgb_conv(Y2,U,V,frm_buf+=3); + frm_buf+=3; + } + cam_buf += 2*x_end; + } +} + +void CameraEngine::yuyv2rgb(int width, int height, unsigned char *src, unsigned char *dest) { + + int Y1,Y2,U,V; + + for(int i=width*height/2;i>0;i--) { + + Y1 = *src++; + U = *src++ - 128; + Y2 = *src++; + V = *src++ - 128; + + yuv2rgb_conv(Y1,U,V,dest); + yuv2rgb_conv(Y2,U,V,dest+=3); + dest+=3; + } +} + +void CameraEngine::crop_yuyv2rgb(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + int Y1,Y2,U,V; + + cam_buf += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + cam_buf += 2*x_off; + for (int j=frm_w/2;j>0;j--) { + // U and V are +-0.5 + Y1 = *cam_buf++; + U = *cam_buf++ - 128; + Y2 = *cam_buf++; + V = *cam_buf++ - 128; + + yuv2rgb_conv(Y1,U,V,frm_buf); + yuv2rgb_conv(Y2,U,V,frm_buf+=3); + frm_buf+=3; + } + cam_buf += 2*x_end; + } +} + +void CameraEngine::gray2rgb(int width, int height, unsigned char *src, unsigned char *dest) { + + int size = width*height; + for (int i=size;i>0;i--) { + unsigned char pixel = *src++; + *dest++ = pixel; + *dest++ = pixel; + *dest++ = pixel; + } +} + +void CameraEngine::crop_gray2rgb(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + cam_buf += x_off; + for (int j=frm_w;j>0;j--) { + unsigned char pixel = *cam_buf++; + *frm_buf++ = pixel; + *frm_buf++ = pixel; + *frm_buf++ = pixel; + } + cam_buf += x_end; + } +} + +void CameraEngine::grayw2rgb(int width, int height, unsigned char *src, unsigned char *dest) { + unsigned short src_pixel; + unsigned char dest_pixel; + unsigned char pixel; + + for(int i=width*height;i>0;i--) { + pixel = *src++ ; + src_pixel = pixel | (*src++ << 8); + dest_pixel = (unsigned char)(src_pixel/4); + *dest++ = dest_pixel; + *dest++ = dest_pixel; + *dest++ = dest_pixel; + } +} + +void CameraEngine::crop_grayw2rgb(int cam_w, unsigned char *src, unsigned char *dest) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + unsigned short src_pixel; + unsigned char dest_pixel; + unsigned char pixel; + + src += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + src += 2*x_off; + for (int j=frm_w;j>0;j--) { + pixel = *src++; + src_pixel = pixel | (*src++ << 8); + dest_pixel = (unsigned char)(src_pixel/4); + + *dest++ = dest_pixel; + *dest++ = dest_pixel; + *dest++ = dest_pixel; + } + src += 2*x_end; + } + +} + +void CameraEngine::grayw2gray(int width, int height, unsigned char *src, unsigned char *dest) { + + unsigned short value; + unsigned char pixel; + + for(int i=width*height;i>0;i--) { + pixel = *src++; + value = pixel | (*src++ << 8); + *dest++ = (unsigned char)(value/4); + } +} + +void CameraEngine::crop_grayw2gray(int cam_w, unsigned char *src, unsigned char *dest) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + unsigned short src_pixel; + unsigned char pixel; + + src += 2*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + for (int i=frm_h;i>0;i--) { + + src += 2*x_off; + for (int j=frm_w;j>0;j--) { + pixel = *src++; + src_pixel = pixel | (*src++ << 8); + *dest++ = (unsigned char)(src_pixel/4); + } + src += 2*x_end; + } +} + +void CameraEngine::crop(int cam_w, int cam_h, unsigned char *cam_buf, unsigned char *frm_buf, int b) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += b*(y_off*cam_w + x_off); + + for (int i=frm_h;i>0;i--) { + memcpy(frm_buf, cam_buf, b*cam_w); + + cam_buf += b*cam_w; + frm_buf += b*frm_w; + } + } + +void CameraEngine::flip(int width, int height, unsigned char *src, unsigned char *dest, int b) { + + int size = b*width*height; + dest += size-1; + for(int i=size;i>0;i--) { + *dest-- = *src++; + } +} + +void CameraEngine::flip_crop(int cam_w, int cam_h, unsigned char *cam_buf, unsigned char *frm_buf, int b) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += b*y_off*cam_w; + frm_buf += b*frm_w*frm_h-1; + int xend = (cam_w-(frm_w+x_off)); + + for (int i=frm_h;i>0;i--) { + + cam_buf += b*x_off; + for (int j=b*frm_w;j>0;j--) { + *frm_buf-- = *cam_buf++; + } + cam_buf += b*xend; + } +} + +void CameraEngine::rgb2gray(int width, int height, unsigned char *src, unsigned char *dest) { + + int R,G,B; + for (int i=width*height;i>0;i--) { + + R = *src++; + G = *src++; + B = *src++; + *dest++ = HBT(R*77 + G*151 + B*28); + } +} + +void CameraEngine::flip_rgb2gray(int width, int height, unsigned char *src, unsigned char *dest) { + + int size = width*height; + dest += size-1; + + int R,G,B; + for (int i=size;i>0;i--) { + + R = *src++; + G = *src++; + B = *src++; + *dest-- = HBT(R*77 + G*151 + B*28); + } +} +void CameraEngine::crop_rgb2gray(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += 3*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + + int R,G,B; + for (int i=frm_h;i>0;i--) { + + cam_buf += 3*x_off; + for (int j=frm_w;j>0;j--) { + R = *cam_buf++; + G = *cam_buf++; + B = *cam_buf++; + *frm_buf++ = HBT(R*77 + G*151 + B*28); + } + cam_buf += 3*x_end; + } +} + +void CameraEngine::flip_crop_rgb2gray(int cam_w, unsigned char *cam_buf, unsigned char *frm_buf) { + + if(!cfg->frame) return; + int x_off = cfg->frame_xoff; + int y_off = cfg->frame_yoff; + int frm_w = cfg->frame_width; + int frm_h = cfg->frame_height; + + cam_buf += 3*y_off*cam_w; + int x_end = cam_w-(frm_w+x_off); + frm_buf += frm_w*frm_h-1; + + int R,G,B; + for (int i=frm_h;i>0;i--) { + + cam_buf += 3*x_off; + for (int j=frm_w;j>0;j--) { + R = *cam_buf++; + G = *cam_buf++; + B = *cam_buf++; + *frm_buf-- = HBT(R*77 + G*151 + B*28); + } + cam_buf += 3*x_end; + } +} + +void CameraEngine::setupFrame() { + + if(!cfg->frame) { + cfg->frame_width = cfg->cam_width; + cfg->frame_height = cfg->cam_height; + return; + } + + // size sanity check + if (cfg->frame_width%2!=0) cfg->frame_width--; + if (cfg->frame_height%2!=0) cfg->frame_height--; + + if (cfg->frame_width<=0) cfg->frame_width = cfg->cam_width; + if (cfg->frame_height<=0) cfg->frame_height = cfg->cam_height; + + if (cfg->frame_width > cfg->cam_width) cfg->frame_width = cfg->cam_width; + if (cfg->frame_height > cfg->cam_height) cfg->frame_height = cfg->cam_height; + + // no cropping if same size + if ((cfg->frame_width==cfg->cam_width) && (cfg->frame_height==cfg->cam_height)) { + + cfg->frame_width = cfg->cam_width; + cfg->frame_height = cfg->cam_height; + cfg->frame = false; + return; + } + + // offset sanity check + int xdiff = cfg->cam_width-cfg->frame_width; + if (xdiff<0) cfg->frame_xoff = 0; + else if (cfg->frame_xoff > xdiff) cfg->frame_xoff = xdiff; + int ydiff = cfg->cam_height-cfg->frame_height; + if (ydiff<0) cfg->frame_yoff = 0; + else if (cfg->frame_yoff > ydiff) cfg->frame_yoff = ydiff; + +} + +void CameraEngine::applyCameraSetting(int mode, int value) { + + if (!hasCameraSetting(mode)) return; + + switch (value) { + case SETTING_AUTO: + if (hasCameraSettingAuto(mode)) { + setCameraSettingAuto(mode,true); + return; + } + case SETTING_OFF: + case SETTING_DEFAULT: + setDefaultCameraSetting(mode); + return; + case SETTING_MIN: + setCameraSettingAuto(mode,false); + setCameraSetting(mode,getMinCameraSetting(mode)); return; + case SETTING_MAX: + setCameraSettingAuto(mode,false); + setCameraSetting(mode,getMaxCameraSetting(mode)); return; + default: { + int max = getMaxCameraSetting(mode); + int min = getMinCameraSetting(mode); + if (valuemax) value = max; + setCameraSettingAuto(mode,false); + setCameraSetting(mode,value); + } + } +} + +void CameraEngine::resetCameraSettings() { + + for (int mode=MODE_MIN;mode<=MODE_MAX;mode++) + setDefaultCameraSetting(mode); +} + +void CameraEngine::applyCameraSettings() { + + resetCameraSettings(); + + applyCameraSetting(BRIGHTNESS,cfg->brightness); + applyCameraSetting(CONTRAST,cfg->contrast); + applyCameraSetting(SHARPNESS,cfg->sharpness); + applyCameraSetting(GAIN,cfg->gain); + applyCameraSetting(EXPOSURE,cfg->exposure); + applyCameraSetting(SHUTTER,cfg->shutter); + applyCameraSetting(FOCUS,cfg->focus); + applyCameraSetting(WHITE,cfg->white); + applyCameraSetting(POWERLINE,cfg->powerline); + applyCameraSetting(BACKLIGHT,cfg->backlight); + applyCameraSetting(GAMMA,cfg->gamma); + + applyCameraSetting(SATURATION,cfg->saturation); + applyCameraSetting(COLOR_HUE,cfg->hue); + applyCameraSetting(COLOR_RED,cfg->red); + applyCameraSetting(COLOR_GREEN,cfg->green); + applyCameraSetting(COLOR_BLUE,cfg->blue); +} + +int CameraEngine::updateSetting(int mode) { + + if (!hasCameraSetting(mode)) return SETTING_OFF; + if (getCameraSettingAuto(mode)) return SETTING_AUTO; + + int value = getCameraSetting(mode); + if (value==getDefaultCameraSetting(mode)) value = SETTING_DEFAULT; + else if (value==getMinCameraSetting(mode)) value = SETTING_MIN; + else if (value==getMaxCameraSetting(mode)) value = SETTING_MAX; + + return value; +} + +void CameraEngine::updateSettings() { + + cfg->brightness = updateSetting(BRIGHTNESS); + cfg->contrast = updateSetting(CONTRAST); + cfg->sharpness = updateSetting(SHARPNESS); + + cfg->gain = updateSetting(GAIN); + cfg->exposure = updateSetting(EXPOSURE); + cfg->shutter = updateSetting(SHUTTER); + cfg->focus = updateSetting(FOCUS); + cfg->white = updateSetting(WHITE); + cfg->backlight = updateSetting(BACKLIGHT); + cfg->powerline = updateSetting(POWERLINE); + cfg->gamma = updateSetting(GAMMA); + + if (cfg->color) { + cfg->saturation = updateSetting(SATURATION); + cfg->hue = updateSetting(COLOR_HUE); + cfg->red = updateSetting(COLOR_RED); + cfg->green = updateSetting(COLOR_GREEN); + cfg->blue = updateSetting(COLOR_BLUE); + } else { + cfg->saturation = SETTING_OFF; + cfg->hue = SETTING_OFF; + cfg->red = SETTING_OFF; + cfg->green = SETTING_OFF; + cfg->blue = SETTING_OFF; + } + +} diff --git a/src/mynteye/uvc/macosx/CameraEngine.h b/src/mynteye/uvc/macosx/CameraEngine.h new file mode 100644 index 0000000..964b1f2 --- /dev/null +++ b/src/mynteye/uvc/macosx/CameraEngine.h @@ -0,0 +1,306 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CAMERAENGINE_H +#define CAMERAENGINE_H + +#include +#include +#include +#include + +#include +#include + +#include + +#define SAT(c) \ +if (c & (~255)) { if (c < 0) c = 0; else c = 255; } +#define HBT(x) (unsigned char)((x)>>8) + +#define KEY_A 4 +#define KEY_B 5 +#define KEY_C 6 +#define KEY_D 7 +#define KEY_E 8 +#define KEY_F 9 +#define KEY_G 10 +#define KEY_H 11 +#define KEY_I 12 +#define KEY_J 13 +#define KEY_K 14 +#define KEY_L 15 +#define KEY_M 16 +#define KEY_N 17 +#define KEY_O 18 +#define KEY_P 19 +#define KEY_Q 20 +#define KEY_R 21 +#define KEY_S 22 +#define KEY_T 23 +#define KEY_U 24 +#define KEY_V 25 +#define KEY_W 26 +#define KEY_X 27 +#define KEY_Y 29 +#define KEY_Z 28 + +#define KEY_SPACE 44 +#define KEY_RIGHT 79 +#define KEY_LEFT 80 +#define KEY_DOWN 81 +#define KEY_UP 82 + +#define WIDTH 640 +#define HEIGHT 480 + +#define SETTING_DEFAULT -100000 +#define SETTING_AUTO -200000 +#define SETTING_MIN -300000 +#define SETTING_MAX -400000 +#define SETTING_OFF -500000 + +#define FORMAT_UNSUPPORTED -1 +#define FORMAT_UNKNOWN 0 +#define FORMAT_GRAY 1 +#define FORMAT_GRAY16 2 +#define FORMAT_RGB 3 +#define FORMAT_RGB16 4 +#define FORMAT_GRAY16S 5 +#define FORMAT_RGB16S 6 +#define FORMAT_RAW8 7 +#define FORMAT_RAW16 8 +#define FORMAT_RGBA 9 +#define FORMAT_YUYV 10 +#define FORMAT_UYVY 11 +#define FORMAT_YUV411 12 +#define FORMAT_YUV444 13 +#define FORMAT_420P 14 +#define FORMAT_410P 15 +#define FORMAT_YVYU 16 +#define FORMAT_YUV211 17 +#define FORMAT_JPEG 20 +#define FORMAT_MJPEG 21 +#define FORMAT_MPEG 22 +#define FORMAT_MPEG2 23 +#define FORMAT_MPEG4 24 +#define FORMAT_H263 25 +#define FORMAT_H264 26 +#define FORMAT_DVPAL 30 +#define FORMAT_DVNTSC 31 +#define FORMAT_MAX 31 + +extern const char* fstr[]; +extern const char* dstr[]; + +#define DRIVER_DEFAULT 0 +#define DRIVER_DC1394 1 +#define DRIVER_PS3EYE 2 +#define DRIVER_RASPI 3 +#define DRIVER_UVCCAM 4 +#define DRIVER_FILE 10 +#define DRIVER_FOLDER 11 + +#define VALUE_INCREASE 79 +#define VALUE_DECREASE 80 +#define SETTING_NEXT 81 +#define SETTING_PREVIOUS 82 + +enum CameraSetting { BRIGHTNESS, CONTRAST, SHARPNESS, AUTO_GAIN, GAIN, AUTO_EXPOSURE, EXPOSURE, SHUTTER, AUTO_FOCUS, FOCUS, AUTO_WHITE, WHITE, GAMMA, POWERLINE, BACKLIGHT, SATURATION, AUTO_HUE, COLOR_HUE, COLOR_RED, COLOR_GREEN, COLOR_BLUE }; +#define MODE_MIN BRIGHTNESS +#define MODE_MAX COLOR_BLUE + +struct CameraConfig { + + char path[256]; + + int driver; + int device; + + char name[256]; + char src[256]; + + bool color; + bool frame; + + int cam_format; + int src_format; + int buf_format; + + int cam_width; + int cam_height; + float cam_fps; + + int frame_width; + int frame_height; + int frame_xoff; + int frame_yoff; + int frame_mode; + + int brightness; + int contrast; + int sharpness; + + int gain; + int shutter; + int exposure; + int focus; + int gamma; + int white; + int powerline; + int backlight; + + int saturation; + int hue; + int red; + int blue; + int green; + + bool force; + + bool operator < (const CameraConfig& c) const { + + //if (device < c.device) return true; + //if (cam_format < c.cam_format) return true; + + if (cam_width > c.cam_width || (cam_width == c.cam_width && cam_height < c.cam_height)) + return true; + + if (cam_width == c.cam_width && cam_height == c.cam_height) { + return (cam_fps > c.cam_fps); + } else return false; + + } +}; + +class CameraEngine +{ +public: + + CameraEngine(CameraConfig *cam_cfg) { + cfg = cam_cfg; + settingsDialog=false; + + if (cfg->color) cfg->buf_format=FORMAT_RGB; + else cfg->buf_format=FORMAT_GRAY; + } + + virtual ~CameraEngine() {}; + + virtual bool initCamera() = 0; + virtual bool startCamera() = 0; + virtual unsigned char* getFrame() = 0; + virtual bool stopCamera() = 0; + virtual bool resetCamera() = 0; + virtual bool closeCamera() = 0; + virtual bool stillRunning() = 0; + + void printInfo(); + static void setMinMaxConfig(CameraConfig *cam_cfg, std::vector cfg_list); + + virtual int getCameraSettingStep(int mode) = 0; + virtual int getMinCameraSetting(int mode) = 0; + virtual int getMaxCameraSetting(int mode) = 0; + virtual int getCameraSetting(int mode) = 0; + virtual bool setCameraSetting(int mode, int value) = 0; + virtual bool setCameraSettingAuto(int mode, bool flag) = 0; + virtual bool getCameraSettingAuto(int mode) = 0; + virtual bool setDefaultCameraSetting(int mode) = 0; + virtual int getDefaultCameraSetting(int mode) = 0; + virtual bool hasCameraSetting(int mode) = 0; + virtual bool hasCameraSettingAuto(int mode) = 0; + + virtual bool showSettingsDialog(bool lock); + virtual void control(unsigned char key); + + int getId() { return cfg->device; } + int getFps() { return (int)floor(cfg->cam_fps+0.5f); } + int getWidth() { return cfg->frame_width; } + int getHeight() { return cfg->frame_height; } + int getFormat() { return cfg->buf_format; } + char* getName() { return cfg->name; } + +protected: + + CameraConfig *cfg; + + unsigned char* frm_buffer; + unsigned char* cam_buffer; + + int lost_frames, timeout; + + bool running; + bool settingsDialog; + int currentCameraSetting; + + void crop(int width, int height, unsigned char *src, unsigned char *dest, int bytes); + void flip(int width, int height, unsigned char *src, unsigned char *dest, int bytes); + void flip_crop(int width, int height, unsigned char *src, unsigned char *dest, int bytes); + + void rgb2gray(int width, int height, unsigned char *src, unsigned char *dest); + void crop_rgb2gray(int width, unsigned char *src, unsigned char *dest); + void flip_rgb2gray(int width, int height, unsigned char *src, unsigned char *dest); + void flip_crop_rgb2gray(int width, unsigned char *src, unsigned char *dest); + + void uyvy2gray(int width, int height, unsigned char *src, unsigned char *dest); + void crop_uyvy2gray(int width, unsigned char *src, unsigned char *dest); + void yuyv2gray(int width, int height, unsigned char *src, unsigned char *dest); + void crop_yuyv2gray(int width, unsigned char *src, unsigned char *dest); + void yuv2gray(int width, int height, unsigned char *src, unsigned char *dest); + void crop_yuv2gray(int width, unsigned char *src, unsigned char *dest); + + void gray2rgb(int width, int height, unsigned char *src, unsigned char *dest); + void crop_gray2rgb(int width, unsigned char *src, unsigned char *dest); + void uyvy2rgb(int width, int height, unsigned char *src, unsigned char *dest); + void crop_uyvy2rgb(int width, unsigned char *src, unsigned char *dest); + void yuyv2rgb(int width, int height, unsigned char *src, unsigned char *dest); + void crop_yuyv2rgb(int width, unsigned char *src, unsigned char *dest); + + void grayw2rgb(int width, int height, unsigned char *src, unsigned char *dest); + void crop_grayw2rgb(int width, unsigned char *src, unsigned char *dest); + void grayw2gray(int width, int height, unsigned char *src, unsigned char *dest); + void crop_grayw2gray(int width, unsigned char *src, unsigned char *dest); + + void resetCameraSettings(); + void applyCameraSettings(); + void applyCameraSetting(int mode, int value); + void updateSettings(); + int updateSetting(int mode); + + void setupFrame(); + + int default_brightness; + int default_contrast; + int default_sharpness; + + int default_gain; + int default_shutter; + int default_exposure; + int default_focus; + int default_gamma; + int default_powerline; + int default_white; + int default_backlight; + + int default_saturation; + int default_hue; + int default_red; + int default_blue; + int default_green; + + int ctrl_min; + int ctrl_max; + int ctrl_val; +}; +#endif diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Headers b/src/mynteye/uvc/macosx/USBBusProber.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Resources b/src/mynteye/uvc/macosx/USBBusProber.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/USBBusProber b/src/mynteye/uvc/macosx/USBBusProber.framework/USBBusProber new file mode 120000 index 0000000..8da966e --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/USBBusProber @@ -0,0 +1 @@ +Versions/Current/USBBusProber \ No newline at end of file diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeClass.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeClass.h new file mode 100644 index 0000000..6ea403f --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeClass.h @@ -0,0 +1,55 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import + + +@interface BusProbeClass : NSObject { + UInt8 _classNum; + UInt8 _subclassNum; + UInt8 _protocolNum; + NSString * _className; + NSString * _subclassName; + NSString * _protocolName; +} + ++ (BusProbeClass *)withClass:(UInt8)classNum subclass:(UInt8)subclassNum protocol:(UInt8)protocolNum; +- (UInt8)classNum; +- (void)setClassNum:(UInt8)classNum; +- (UInt8)subclassNum; +- (void)setSubclassNum:(UInt8)subclassNum; +- (UInt8)protocolNum; +- (void)setProtocolNum:(UInt8)protocolNum; +- (NSString *)className; +- (void)setClassName:(NSString *)deviceClass; +- (NSString *)subclassName; +- (void)setSubclassName:(NSString *)deviceSubclass; +- (NSString *)protocolName; +- (void)setProtocolName:(NSString *)deviceProtocol; +- (NSString *)classDescription; +- (NSString *)subclassDescription; +- (NSString *)protocolDescription; + +-(NSMutableDictionary *)dictionaryVersionOfMe; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeDevice.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeDevice.h new file mode 100644 index 0000000..71c66f3 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProbeDevice.h @@ -0,0 +1,82 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import +#import "BusProberSharedFunctions.h" +#import "OutlineViewNode.h" +#import "BusProbeClass.h" + +@interface BusProbeDevice : NSObject { + OutlineViewNode * _rootNode; + UInt8 _speed; + USBDeviceAddress _address; + UInt32 _locationID; + UInt32 _vendorID; + UInt32 _productID; + UInt16 _usbRelease; + BusProbeClass * _deviceClassInfo; + BusProbeClass * _lastInterfaceClassInfo; + UInt8 _lastInterfaceSubclass; + int _currentInterfaceNumber; + uint32_t _portInfo; +} + +- (OutlineViewNode *)rootNode; +- (void)addProperty:(char *)property withValue:(char *)value atDepth:(int)depth; +- (void)addNumberProperty:(char *)property value:(UInt32)value size:(int)sizeInBytes atDepth:(int)depth usingStyle:(int)style; +- (void)addStringProperty:(char *)property fromStringIndex:(UInt8)strIndex fromDeviceInterface:(IOUSBDeviceRef)deviceIntf atDepth:(int)depth; + +- (NSString *)deviceName; +- (void)setDeviceName:(NSString *)name; +- (NSString *)deviceDescription; +- (void)setDeviceDescription:(NSString *)description; +- (UInt8)speed; +- (void)setSpeed:(UInt8)speed; +- (USBDeviceAddress)address; +- (void)setAddress:(USBDeviceAddress)address; +- (uint32_t)portInfo; +- (void)setPortInfo:(uint32_t)portInfo; +//- (UInt32)locationID; +//- (void)setLocationID:(UInt32)locationID; +- (UInt32)vendorID; +- (void)setVendorID:(UInt32)vendorID; +- (UInt32)productID; +- (void)setProductID:(UInt32)productID; +- (UInt32)locationID; +- (void)setLocationID:(UInt32)locationID; +- (BusProbeClass *)deviceClassInfo; +- (void)setDeviceClassInfo:(BusProbeClass *)classInfo; +- (BusProbeClass *)lastInterfaceClassInfo; +- (void)setLastInterfaceClassInfo:(BusProbeClass *)classInfo; +- (int)currentInterfaceNumber; +- (void)setCurrentInterfaceNumber:(int)currentNum; +- (UInt16)usbRelease; +- (void)setUSBRelease:(UInt16)usbRelease; + +- (NSString *)descriptionForName:(NSString*)name; +- (NSString *)description; +- (NSMutableDictionary *)dictionaryVersionOfMe; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProber.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProber.h new file mode 100644 index 0000000..1188170 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProber.h @@ -0,0 +1,65 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import +#import +#import +#import +#import +#import "BusProberSharedFunctions.h" +#import "OutlineViewNode.h" +#import "BusProbeDevice.h" +#import "BusProbeClass.h" + +#import "DescriptorDecoder.h" + +@interface BusProber : NSObject { + id _listener; + + NSMutableArray * _devicesArray; + CFRunLoopSourceRef _runLoopSource; +} + +- (BOOL)registerForUSBNotifications; +- (void)unregisterForUSBNotifications; + +- (void)refreshData:(BOOL)shouldForce; + +- (void)processDevice:(IOUSBDeviceRef)deviceIntf deviceNumber:(int)deviceNumber usbName:(NSString*)usbName; +- (void)PrintPortInfo: (uint32_t)portInfo forDevice:(BusProbeDevice *)thisDevice; +- (void)GetAndPrintNumberOfEndpoints:(IOUSBDeviceRef)deviceIntf forDevice:(BusProbeDevice *)thisDevice portInfo:(UInt32)portInfo; + +- (NSMutableArray *) devicesArray; + +@end + + + + +@protocol BusProberListener + +- (void)busProberInformationDidChange:(BusProber *)aProber; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProberSharedFunctions.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProberSharedFunctions.h new file mode 100644 index 0000000..517756e --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/BusProberSharedFunctions.h @@ -0,0 +1,87 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#include + + +#import +#import +#import +#import +#import +#import "BusProbeClass.h" + +typedef struct IOUSBDeviceStruct320** IOUSBDeviceRef ; +typedef struct IOUSBInterfaceStruct220** IOUSBInterfaceRef ; + +#define ROOT_LEVEL 0 +#define DEVICE_DESCRIPTOR_LEVEL ROOT_LEVEL + 1 +#define CONFIGURATION_DESCRIPTOR_LEVEL ROOT_LEVEL + 1 +#define INTERFACE_LEVEL CONFIGURATION_DESCRIPTOR_LEVEL + 1 +#define ENDPOINT_LEVEL INTERFACE_LEVEL + 1 +#define HID_DESCRIPTOR_LEVEL INTERFACE_LEVEL + 1 +#define DFU_DESCRIPTOR_LEVEL INTERFACE_LEVEL + 1 +#define CCID_DESCRIPTOR_LEVEL INTERFACE_LEVEL + 1 +#define HUB_DESCRIPTOR_LEVEL ROOT_LEVEL + 1 +#define DEVICE_QUAL_DESCRIPTOR_LEVEL ROOT_LEVEL + 1 +#define BOS_DESCRIPTOR_LEVEL ROOT_LEVEL + 1 + +enum { + kIntegerOutputStyle = 0, + kHexOutputStyle = 1 +}; + +IOReturn GetNumberOfConfigurations( IOUSBDeviceRef deviceIntf, uint8_t * numberOfConfigs ); +IOReturn GetConfigurationDescriptor( IOUSBDeviceRef deviceIntf, uint8_t config, IOUSBConfigurationDescriptorPtr * description ); +IOReturn GetConfiguration( IOUSBDeviceRef deviceIntf, uint8_t * currentConfig ); +IOReturn GetPortInformation( IOUSBDeviceRef deviceIntf, uint32_t * portInfo ); +int GetDeviceLocationID( IOUSBDeviceRef deviceIntf, UInt32 * locationID ); +int GetDeviceSpeed( IOUSBDeviceRef deviceIntf, UInt8 * speed ); +int GetDeviceAddress( IOUSBDeviceRef deviceIntf, USBDeviceAddress * address ); +int SuspendDevice( IOUSBDeviceRef deviceIntf, BOOL suspend ); +IOReturn GetDescriptor(IOUSBDeviceRef deviceIntf, UInt8 descType, UInt8 descIndex, void *buf, UInt16 len, IOReturn *actError); +int GetStringDescriptor(IOUSBDeviceRef deviceIntf, UInt8 descIndex, void *buf, UInt16 len, UInt16 lang); +int GetClassDescriptor(IOUSBDeviceRef deviceIntf, UInt8 descType, UInt8 descIndex, void *buf, UInt16 len); +int GetDescriptorFromInterface(IOUSBDeviceRef deviceIntf, UInt8 descType, UInt8 descIndex, UInt16 wIndex, void *buf, UInt16 len, Boolean inCurrentConfig); +int GetCurrentConfiguration(IOUSBDeviceRef deviceIntf); + +BusProbeClass * GetDeviceClassAndSubClass(UInt8 * pcls); +BusProbeClass * GetInterfaceClassAndSubClass(UInt8 * pcls); +char * GetStringFromNumber(UInt32 value, int sizeInBytes, int style); +char * GetStringFromIndex(UInt8 strIndex, IOUSBDeviceRef deviceIntf); +NSString * VendorNameFromVendorID(NSString * intValueAsString); +NSString * GetUSBProductNameFromRegistry(io_registry_entry_t entry); + +void FreeString(char * cstr); +UInt16 Swap16(void *p); +uint32_t Swap32(void *p); +uint64_t Swap64(void *p); +uint32_t Swap24(void *p); + +const char * USBErrorToString(IOReturn status); + +IOUSBDescriptorHeader * NextDescriptor(const void *desc); +IOUSBDescriptorHeader* FindNextDescriptor(IOUSBConfigurationDescriptor *curConfDesc, const void *cur, UInt8 descType); +IOReturn FindNextInterfaceDescriptor(const IOUSBConfigurationDescriptor *configDescIn, const IOUSBInterfaceDescriptor *intfDesc,IOUSBInterfaceDescriptor **descOut); + diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeAudioInterfaceDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeAudioInterfaceDescriptor.h new file mode 100644 index 0000000..56625af --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeAudioInterfaceDescriptor.h @@ -0,0 +1,477 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + +#define kUSBAudioInterfaceDesc (0x24) +#define kUSBAudioEndPointDesc (0x25) + +// +#define kUSBAudioDescriptorBytesPerLine 16 +// String buffer size to log desciptor: +// Each byte in descriptor requires 3 chars: 2 for nibbles + a space char +// One byte for null terminator +#define kUSBAudioMaxDescriptorStringSize ( ( kUSBAudioDescriptorBytesPerLine * 3 ) + 1 ) * sizeof ( char ) + + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descContents[32]; +} GenericAudioDescriptor, *GenericAudioDescriptorPtr; +#pragma options align=reset + +enum AudioClassSpecific { + ACS_HEADER = 0x01, + ACS_INPUT_TERMINAL = 0x02, + ACS_OUTPUT_TERMINAL = 0x03, + ACS_MIXER_UNIT = 0x04, + ACS_SELECTOR_UNIT = 0x05, + ACS_FEATURE_UNIT = 0x06, + ACS_PROCESSING_UNIT = 0x07, + ACS_EXTENSION_UNIT = 0x08, + ACS_UNDEFINED = 0x20, + ACS_DEVICE = 0x21, + ACS_CONFIGURATION = 0x22, + ACS_STRING = 0x23, + ACS_INTERFACE = 0x24, + ACS_ENDPOINT = 0x25, + ACS_FORMAT_TYPE = 0x02, + ACS_FORMAT_SPECIFIC = 0x03, + ACS_FORMAT_TYPE_UNDEF = 0x00, + ACS_FORMAT_TYPE_I = 0x01, + ACS_FORMAT_TYPE_II = 0x02, + ACS_FORMAT_TYPE_III = 0x03, + ACS_ASTREAM_UNDEF = 0x00, + ACS_ASTREAM_GENERAL = 0x01, + ACS_ASTREAM_TYPE = 0x02, + ACS_ASTREAM_SPECIFIC = 0x03, + AC_CONTROL_SUBCLASS = 0x01, + AC_STREAM_SUBCLASS = 0x02, + AC_MIDI_SUBCLASS = 0x03 +}; + +// Standard Audio Stream Isoc Audio Data Endpoint Descriptor +// Refer to USB Audio Class Devices pp. 61-62. +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 asAddress; + UInt8 asAttributes; + UInt16 asMaxPacketSize; + UInt8 asInterval; + UInt8 asRefresh; + UInt8 asSynchAddress; +} AS_IsocEndPtDesc, *AS_IsocEndPtDescPtr; +#pragma options align=reset + +// Class Specific Audio Stream Isoc Audio Data Endpoint Descriptor +// Refer to USB Audio Class Devices pp. 62-63. +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubtype; + UInt8 asAttributes; + UInt8 bLockDelayUnits; + UInt16 wLockDelay; +} CSAS_IsocEndPtDesc, *CSAS_IsocEndPtDescPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt16 descVersNum; + UInt16 descTotalLength; + UInt8 descAICNum; /* Number of elements in the Audio Interface Collection. */ + UInt8 descInterfaceNum[1]; +} AudioCtrlHdrDescriptor, *AudioCtrlHdrDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descTermID; + UInt16 descTermType; + UInt8 descOutTermID; + UInt8 descNumChannels; + UInt16 descChannelConfig; + UInt8 descChannelNames; + UInt8 descTermName; +} AudioCtrlInTermDescriptor, *AudioCtrlInTermDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descTermID; + UInt16 descTermType; + UInt8 descInTermID; + UInt8 descSourceID; + UInt8 descTermName; +} AudioCtrlOutTermDescriptor, *AudioCtrlOutTermDescriptorPtr; + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt8 descNumPins; + UInt8 descSourcePID[1]; +} AudioCtrlMixerDescriptor, *AudioCtrlMixerDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt8 descNumPins; + UInt8 descSourcePID[1]; +} AudioCtrlSelectorDescriptor, *AudioCtrlSelectorDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt8 descSourceID; + UInt8 descCtrlSize; + UInt8 descControls[1]; +} AudioCtrlFeatureDescriptor, *AudioCtrlFeatureDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt16 descExtensionCode; + UInt8 descNumPins; + UInt8 descSourcePID[1]; +} AudioCtrlExtDescriptor, *AudioCtrlExtDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 terminalID; + UInt8 delay; + UInt16 formatTag; +} CSAS_InterfaceDescriptor, *CSAS_InterfaceDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct acProcessingDescriptor{ // ¥¥¥¥ WARNING ¥¥¥ ADDING ELEMENTS WILL KILL CODE!!! + UInt8 descLen; // size of this descriptor in bytes + UInt8 bDescriptorType; // const CS_INTERFACE + UInt8 bDescriptorSubtype; // const FEATURE_UNIT + UInt8 bUnitID; + UInt16 wProcessType; + UInt8 bNrPins; + UInt8 bSourceID; +}acProcessingDescriptor; +#pragma options align=reset +typedef acProcessingDescriptor *acProcessingDescriptorPtr; + +#pragma pack(1) +typedef struct acProcessingDescriptorCont{ + UInt8 bNrChannels; + UInt16 wChannelConfig; + UInt8 iChannelNames; + UInt8 bControlSize; + UInt16 bmControls; + UInt8 iProcessing; +}acProcessingDescriptorCont; +#pragma options align=reset +typedef acProcessingDescriptorCont *acProcessingDescriptorContPtr; + +/* Refer to USB PDF files for Frmts10.pdf pp. 10 for Type I Format Descriptor. */ +#pragma pack(1) +typedef struct { + UInt8 byte1; + UInt8 byte2; + UInt8 byte3; +} CSAS_Freq3, *CSAS_Freq3Ptr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + CSAS_Freq3 lowerSamFreq; + CSAS_Freq3 upperSamFreq; +} CSAS_ContTbl, *CSAS_ContTblPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + CSAS_Freq3 samFreq[1]; +} CSAS_DiscreteTbl, *CSAS_DiscreteTblPtr; +#pragma options align=reset +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 formatType; + UInt8 numberOfChannels; + UInt8 subFrameSize; + UInt8 bitResolution; + UInt8 sampleFreqType; + union { + CSAS_ContTbl cont; + CSAS_DiscreteTbl discrete; + } sampleFreqTables; +} CSAS_FormatTypeIDesc, *CSAS_FormatTypeIDescPtr; +#pragma options align=reset + +enum Audio20ClassSpecific { + AC20S_HEADER = 0x01, + AC20S_INPUT_TERMINAL = 0x02, + AC20S_OUTPUT_TERMINAL = 0x03, + AC20S_MIXER_UNIT = 0x04, + AC20S_SELECTOR_UNIT = 0x05, + AC20S_FEATURE_UNIT = 0x06, + AC20S_EFFECT_UNIT = 0x07, + AC20S_PROCESSING_UNIT = 0x08, + AC20S_EXTENSION_UNIT = 0x09, + AC20S_CLOCK_SOURCE = 0x0A, + AC20S_CLOCK_SELECTOR = 0x0B, + AC20S_CLOCK_MULTIPLIER = 0x0C, + AC20S_SAMPLE_RATE_CONVERTER = 0x0D, + + AC20S_FORMAT_TYPE_IV = 0x04, + AC20S_EXTENDED_FORMAT_TYPE_I = 0x81, + AC20S_EXTENDED_FORMAT_TYPE_II = 0x82, + AC20S_EXTENDED_FORMAT_TYPE_III = 0x83 + +}; + +// Standard Audio Stream Isoc Audio Data Endpoint Descriptor +// Refer to USB Audio Class Devices pp. 61-62. +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 asAddress; + UInt8 asAttributes; + UInt16 asMaxPacketSize; + UInt8 asInterval; +} AS20_IsocEndPtDesc, *AS20_IsocEndPtDescPtr; +#pragma options align=reset + +// Class Specific Audio Stream Isoc Audio Data Endpoint Descriptor +// Refer to USB Audio Class Devices pp. 62-63. +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubtype; + UInt8 asAttributes; + UInt8 bmControls; + UInt8 bLockDelayUnits; + UInt16 wLockDelay; +} CSA20S_IsocEndPtDesc, *CSAS20_IsocEndPtDescPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt16 descVersNum; + UInt8 descCategory; + UInt16 descTotalLength; + UInt8 descbmControls; +} Audio20CtrlHdrDescriptor, *Audio20CtrlHdrDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descTermID; + UInt16 descTermType; + UInt8 descOutTermID; + UInt8 descClockSourceID; + UInt8 descNumChannels; + UInt32 descChannelConfig; + UInt8 descChannelNames; + UInt16 descbmControls; + UInt8 descTermName; +} Audio20CtrlInTermDescriptor, *Audio20CtrlInTermDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descClockID; + UInt8 descAttributes; + UInt8 descbmControls; + UInt8 descAssocTermID; + UInt8 desciClockSourceName; +} Audio20ClockSourceDescriptor, *Audio20ClockSourceDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descClockID; + UInt8 descNumPins; + UInt8 descClockPID[1]; +} Audio20ClockSelectorDescriptor, *Audio20ClockSelectorDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descClockID; + UInt8 descClockSourceID; + UInt8 descbmControls; + UInt8 desciClockMultiplierName; +} Audio20ClockMultiplierDescriptor, *Audio20ClockMultiplierDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descTermID; + UInt16 descTermType; + UInt8 descInTermID; + UInt8 descSourceID; + UInt8 descClockSourceID; + UInt16 bmControls; + UInt8 descTermName; +} Audio20CtrlOutTermDescriptor, *Audio20CtrlOutTermDescriptorPtr; + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt8 descSourceID; + UInt8 descControls[1]; +} Audio20CtrlFeatureDescriptor, *Audio20CtrlFeatureDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 descUnitID; + UInt16 descExtensionCode; + UInt8 descNumPins; + UInt8 descSourcePID[1]; +} Audio20CtrlExtDescriptor, *Audio20CtrlExtDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 terminalID; + UInt8 bmControls; + UInt8 formatType; + UInt32 bmFormats; + UInt8 numChannels; + UInt32 channelConfig; + UInt8 channelNames; +} CS20AS_InterfaceDescriptor, *CS20AS_InterfaceDescriptorPtr; +#pragma options align=reset + +#pragma pack(1) +typedef struct ac20ProcessingDescriptor{ // ¥¥¥¥ WARNING ¥¥¥ ADDING ELEMENTS WILL KILL CODE!!! + UInt8 descLen; // size of this descriptor in bytes + UInt8 bDescriptorType; // const CS_INTERFACE + UInt8 bDescriptorSubtype; // const FEATURE_UNIT + UInt8 bUnitID; + UInt16 wProcessType; + UInt8 bNrPins; + UInt8 bSourceID[1]; +}ac20ProcessingDescriptor, *ac20ProcessingDescriptorPtr; +#pragma options align=reset +typedef ac20ProcessingDescriptor *a20cProcessingDescriptorPtr; + +#pragma pack(1) +typedef struct ac20ProcessingDescriptorCont{ + UInt8 bNrChannels; + UInt32 wChannelConfig; + UInt8 iChannelNames; + UInt16 bmControls; + UInt8 iProcessing; +}ac20ProcessingDescriptorCont; +#pragma options align=reset +typedef ac20ProcessingDescriptorCont *ac20ProcessingDescriptorContPtr; + +/* Refer to USB PDF files for Frmts10.pdf pp. 10 for Type I Format Descriptor. */ +#pragma pack(1) +typedef struct { + UInt8 descLen; + UInt8 descType; + UInt8 descSubType; + UInt8 formatType; + UInt8 slotSize; + UInt8 bitResolution; +} CS20AS_FormatTypeIDesc, *CS20AS_FormatTypeIDescPtr; +#pragma options align=reset + +@interface DecodeAudioInterfaceDescriptor : NSObject { + +} + ++(void)decodeBytes:(UInt8 *)descriptor forDevice:(BusProbeDevice *)thisDevice; +void decodeBytes10( UInt8 *descriptor, BusProbeDevice * thisDevice ); +void decodeBytes20( UInt8 *descriptor, BusProbeDevice * thisDevice ); + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeBOSDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeBOSDescriptor.h new file mode 100644 index 0000000..552b396 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeBOSDescriptor.h @@ -0,0 +1,35 @@ +/* + * Copyright © 2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeBOSDescriptor : NSObject { + +} + ++ (void)decodeBytes:(IOUSBBOSDescriptor *)bosDescriptor forDevice:(BusProbeDevice *)thisDevice deviceInterface:(IOUSBDeviceRef)deviceIntf; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeCommClassDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeCommClassDescriptor.h new file mode 100644 index 0000000..e187d1d --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeCommClassDescriptor.h @@ -0,0 +1,44 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeCommClassDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice; + +@end + +@interface DecodeMassStorageDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeConfigurationDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeConfigurationDescriptor.h new file mode 100644 index 0000000..3210e5d --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeConfigurationDescriptor.h @@ -0,0 +1,37 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeConfigurationDescriptor : NSObject { + +} + ++ (void)decodeBytes:(IOUSBConfigurationDescHeader *)cfg forDevice:(BusProbeDevice *)thisDevice deviceInterface:(IOUSBDeviceRef)deviceIntf configNumber:(int)iconfig currentConfig:(int)cconfig isOtherSpeedDesc:(BOOL)isOtherSpeedDesc; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceDescriptor.h new file mode 100644 index 0000000..06e8998 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceDescriptor.h @@ -0,0 +1,36 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeDeviceDescriptor : NSObject { + +} + ++ (void)decodeBytes:(IOUSBDeviceDescriptor *)dev forDevice:(BusProbeDevice *)thisDevice deviceInterface:(IOUSBDeviceRef)deviceIntf wasSuspended:(BOOL)wasSuspended; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceQualifierDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceQualifierDescriptor.h new file mode 100644 index 0000000..1a21ca7 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeDeviceQualifierDescriptor.h @@ -0,0 +1,37 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeDeviceQualifierDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeEndpointDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeEndpointDescriptor.h new file mode 100644 index 0000000..97f237e --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeEndpointDescriptor.h @@ -0,0 +1,40 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + +enum { + kEndpointAddressBit = 7, + kEndpointAddressMask = ( 1 << kEndpointAddressBit ) +}; + +@interface DecodeEndpointDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice isOtherSpeedDesc:(BOOL)isOtherSpeedDesc; ++ (void)decodeBytesCompanion:(Byte *)p forDevice:(BusProbeDevice *)thisDevice endpoint:(UInt8)epType; +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHIDDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHIDDescriptor.h new file mode 100644 index 0000000..c66882d --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHIDDescriptor.h @@ -0,0 +1,226 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + +#define UnpackReportSize(packedByte) ((packedByte) & 0x03) +#define UnpackReportType(packedByte) (((packedByte) & 0x0C) >> 2) +#define UnpackReportTag(packedByte) (((packedByte) & 0xF0) >> 4) + +enum +{ + kReport_TypeMain = 0, + kReport_TypeGlobal = 1, + kReport_TypeLocal = 2, + kReport_TypeReserved = 3, + + kReport_TagLongItem = 0x0F, + + // main items + kReport_TagInput = 0x08, + kReport_TagOutput = 0x09, + kReport_TagFeature = 0x0B, + kReport_TagCollection = 0x0A, + kReport_TagEndCollection = 0x0C, + + // global items + kReport_TagUsagePage = 0x00, + kReport_TagLogicalMin = 0x01, + kReport_TagLogicalMax = 0x02, + kReport_TagPhysicalMin = 0x03, + kReport_TagPhysicalMax = 0x04, + kReport_TagUnitExponent = 0x05, + kReport_TagUnit = 0x06, + kReport_TagReportSize = 0x07, + kReport_TagReportID = 0x08, + kReport_TagReportCount = 0x09, + kReport_TagPush = 0x0A, + kReport_TagPop = 0x0B, + + // local items + kReport_TagUsage = 0x00, + kReport_TagUsageMin = 0x01, + kReport_TagUsageMax = 0x02, + kReport_TagDesignatorIndex = 0x03, + kReport_TagDesignatorMin = 0x04, + kReport_TagDesignatorMax = 0x05, + kReport_TagStringIndex = 0x07, + kReport_TagStringMin = 0x08, + kReport_TagStringMax = 0x09, + kReport_TagSetDelimiter = 0x0A +}; + +// Collection constants +enum +{ + kCollection_Physical = 0x00, + kCollection_Application = 0x01, + kCollection_Logical = 0x02 +}; + +// I/O constants (used for Input/Output/Feature tags) +enum +{ + kIO_Data_or_Constant = 0x0001, + kIO_Array_or_Variable = 0x0002, + kIO_Absolute_or_Relative = 0x0004, + kIO_NoWrap_or_Wrap = 0x0008, + kIO_Linear_or_NonLinear = 0x0010, + kIO_PreferredState_or_NoPreferred = 0x0020, + kIO_NoNullPosition_or_NullState = 0x0040, + kIO_NonVolatile_or_Volatile = 0x0080, // reserved for Input + kIO_BitField_or_BufferedBytes = 0x0100 +}; + +// Usage pages from HID Usage Tables spec 1.0 +enum +{ + kUsage_PageGenericDesktop = 0x01, + kUsage_PageSimulationControls = 0x02, + kUsage_PageVRControls = 0x03, + kUsage_PageSportControls = 0x04, + kUsage_PageGameControls = 0x05, + kUsage_PageKeyboard = 0x07, + kUsage_PageLED = 0x08, + kUsage_PageButton = 0x09, + kUsage_PageOrdinal = 0x0A, + kUsage_PageTelephonyDevice = 0x0B, + kUsage_PageConsumer = 0x0C, + kUsage_PageDigitizers = 0x0D, + kUsage_PagePID = 0x0F, + kUsage_PageUnicode = 0x10, + kUsage_PageAlphanumericDisplay = 0x14, + kUsage_PageMonitor = 0x80, + kUsage_PageMonitorEnumeratedValues = 0x81, + kUsage_PageMonitorVirtualControl = 0x82, + kUsage_PageMonitorReserved = 0x83, + kUsage_PagePowerDevice = 0x84, + kUsage_PageBatterySystem = 0x85, + kUsage_PowerClassReserved = 0x86, + kUsage_PowerClassReserved2 = 0x87, + kUsage_VendorDefinedStart = 0xff00 +}; + +// Usage constants for Generic Desktop page (01) from HID Usage Tables spec 1.0 +enum +{ + kUsage_01_Pointer = 0x01, + kUsage_01_Mouse = 0x02, + kUsage_01_Joystick = 0x04, + kUsage_01_GamePad = 0x05, + kUsage_01_Keyboard = 0x06, + kUsage_01_Keypad = 0x07, + + kUsage_01_X = 0x30, + kUsage_01_Y = 0x31, + kUsage_01_Z = 0x32, + kUsage_01_Rx = 0x33, + kUsage_01_Ry = 0x34, + kUsage_01_Rz = 0x35, + kUsage_01_Slider = 0x36, + kUsage_01_Dial = 0x37, + kUsage_01_Wheel = 0x38, + kUsage_01_HatSwitch = 0x39, + kUsage_01_CountedBuffer = 0x3A, + kUsage_01_ByteCount = 0x3B, + kUsage_01_MotionWakeup = 0x3C, + + kUsage_01_Vx = 0x40, + kUsage_01_Vy = 0x41, + kUsage_01_Vz = 0x42, + kUsage_01_Vbrx = 0x43, + kUsage_01_Vbry = 0x44, + kUsage_01_Vbrz = 0x45, + kUsage_01_Vno = 0x46, + + kUsage_01_SystemControl = 0x80, + kUsage_01_SystemPowerDown = 0x81, + kUsage_01_SystemSleep = 0x82, + kUsage_01_SystemWakeup = 0x83, + kUsage_01_SystemContextMenu = 0x84, + kUsage_01_SystemMainMenu = 0x85, + kUsage_01_SystemAppMenu = 0x86, + kUsage_01_SystemMenuHelp = 0x87, + kUsage_01_SystemMenuExit = 0x88, + kUsage_01_SystemMenuSelect = 0x89, + kUsage_01_SystemMenuRight = 0x8A, + kUsage_01_SystemMenuLeft = 0x8B, + kUsage_01_SystemMenuUp = 0x8C, + kUsage_01_SystemMenuDown = 0x8D +}; + +/*! + @typedef IOUSBCCIDDescriptor + @discussion USB Device CHIP CARD ID Descriptor. See the USB CCID Specification at http://www.usb.org. + */ + +#pragma pack(1) +struct IOUSBCCIDDescriptor +{ + UInt8 bLength; + UInt8 bDescriptorType; + UInt16 bcdCCID; + UInt8 bMaxSlotIndex; + UInt8 bVoltageSupport; + UInt32 dwProtocols; + UInt32 dwDefaultClock; + UInt32 dwMaximumClock; + UInt8 bNumClockSupported; + UInt32 dwDataRate; + UInt32 dwMaxDataRate; + UInt8 bNumDataRatesSupported; + UInt32 dwMaxIFSD; + UInt32 dwSyncProtocols; + UInt32 dwMechanical; + UInt32 dwFeatures; + UInt32 dwMaxCCIDMessageLength; + UInt8 bClassGetResponse; + UInt8 bClassEnvelope; + UInt16 wLcdLayout; + UInt8 bPINSupport; + UInt8 bMaxCCIDBusySlots; +}; +typedef struct IOUSBCCIDDescriptor IOUSBCCIDDescriptor; +typedef IOUSBCCIDDescriptor * IOUSBCCIDDescriptorPtr; + +#pragma options align=reset + + + + +/* end HID Constants Spec 1.0 */ + +@interface DecodeHIDDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice withDeviceInterface:(IOUSBDeviceRef)deviceIntf isinCurrentConfig:(Boolean)inCurrentConfig; + ++(void)decodeHIDReport:(UInt8 *)reportDesc forDevice:(BusProbeDevice *)thisDevice atDepth:(UInt16)depth reportLen:(UInt16)length; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHubDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHubDescriptor.h new file mode 100644 index 0000000..c93a5f2 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeHubDescriptor.h @@ -0,0 +1,68 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + +struct IOUSBHubDescriptor { + UInt8 length; + UInt8 hubType; + UInt8 numPorts; + UInt16 characteristics __attribute__((packed)); + UInt8 powerOnToGood; // Port settling time, in 2ms + UInt8 hubCurrent; + // These are received packed, will have to be unpacked + UInt8 removablePortFlags[9]; + UInt8 pwrCtlPortFlags[9]; +}; + +typedef struct IOUSBHubDescriptor IOUSBHubDescriptor; + +// To cope with the extra fields in a USB3 hub descriptor + +struct IOUSB3HubDescriptor { + UInt8 length; + UInt8 hubType; + UInt8 numPorts; + UInt16 characteristics __attribute__((packed)); + UInt8 powerOnToGood; // Port settling time, in 2ms + UInt8 hubCurrent; + UInt8 hubHdrDecLat; // Header decode latency, new 3.0 field + UInt16 hubDelay __attribute__((packed)); // new in 3.0 + + // These are received packed, will have to be unpacked + UInt8 removablePortFlags[9]; + UInt8 pwrCtlPortFlags[9]; // This field does not exist in the 3.0 descriptor +}; + +typedef struct IOUSB3HubDescriptor IOUSB3HubDescriptor; + +@interface DecodeHubDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeInterfaceDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeInterfaceDescriptor.h new file mode 100644 index 0000000..0ac1a1a --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeInterfaceDescriptor.h @@ -0,0 +1,45 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +@interface DecodeInterfaceDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice withDeviceInterface:(IOUSBDeviceRef)deviceIntf; + +@end + +@interface DecodeInterfaceAssociationDescriptor : NSObject { + +} + ++ (void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice withDeviceInterface:(IOUSBDeviceRef)deviceIntf; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeVideoInterfaceDescriptor.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeVideoInterfaceDescriptor.h new file mode 100644 index 0000000..02a6663 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DecodeVideoInterfaceDescriptor.h @@ -0,0 +1,765 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "DescriptorDecoder.h" +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + + +enum VideoClassSpecific +{ + // Video Interface Class Code + CC_VIDEO = 0x0E, + + // Video Interface Subclass Codes + // + SC_UNDEFINED = 0x00, + SC_VIDEOCONTROL = 0x01, + SC_VIDEOSTREAMING = 0x02, + SC_VIDEO_INTERFACE_COLLECTION = 0x03, + + // Video Interface Protocol Codes + // + PC_PROTOCOL_UNDEFINED = 0x00, + + // Video Class Specific Descriptor Types + // + CS_UNDEFINED = 0x20, + CS_DEVICE = 0x21, + CS_CONFIGURATION = 0x22, + CS_STRING = 0x23, + // CS_INTERFACE = 0x24, + // CS_ENDPOINT = 0x25, + + // Video Class Specific Control Interface Descriptor Types + // + VC_DESCRIPTOR_UNDEFINED = 0x00, + VC_HEADER = 0x01, + VC_INPUT_TERMINAL = 0x02, + VC_OUTPUT_TERMINAL = 0x03, + VC_SELECTOR_UNIT = 0x04, + VC_PROCESSING_UNIT = 0x05, + VC_EXTENSION_UNIT = 0x06, + + // Video Class Specific Streaming Interface Descriptor Types + // + VS_UNDEFINED = 0x00, + VS_INPUT_HEADER = 0x01, + VS_OUTPUT_HEADER = 0x02, + VS_STILL_IMAGE_FRAME = 0x03, + VS_FORMAT_UNCOMPRESSED = 0x04, + VS_FRAME_UNCOMPRESSED = 0x05, + VS_FORMAT_MJPEG = 0x06, + VS_FRAME_MJPEG = 0x07, + VS_FORMAT_MPEG1 = 0x08, // Reserved in 1.1 + VS_FORMAT_MPEG2PS = 0x09, // Reserved in 1.1 + VS_FORMAT_MPEG2TS = 0x0a, + VS_FORMAT_DV = 0x0c, + VS_COLORFORMAT = 0x0d, + VS_FORMAT_VENDOR = 0x0e, // Reserved in 1.1 + VS_FRAME_VENDOR = 0x0f, // Reserved in 1.1 + VS_FORMAT_FRAME_BASED = 0x10, + VS_FRAME_FRAME_BASED = 0x11, + VS_FORMAT_STREAM_BASED = 0x12, + VS_FORMAT_MPEG4SL = 0xFF, // Undefined in 1.1 + + // Video Class Specific Endpoint Descriptor Subtypes + // + EP_UNDEFINED = 0x00, + EP_GENERAL = 0x01, + EP_ENDPOINT = 0x02, + EP_INTERRUPT = 0x03, + + // Video Class Specific Request Codes + // + RC_UNDEFINED = 0x00, + SET_CUR = 0x01, + GET_CUR = 0x81, + GET_MIN = 0x82, + GET_MAX = 0x83, + GET_RES = 0x84, + GET_LEN = 0x85, + GET_INFO = 0x86, + GET_DEF = 0x87, + + // Video Control Interface Control Selectors + // + VC_CONTROL_UNDEFINED = 0x00, + VC_VIDEO_POWER_MODE_CONTROL = 0x01, + VC_REQUEST_ERROR_CODE_CONTROL = 0x02, + VC_REQUEST_INDICATE_HOST_CLOCK_CONTROL = 0x03, + + // Terminal Control Selectors + // + TE_CONTROL_UNDEFINED = 0x00, + + // Selector Unit Control Selectors + // + SU_CONTROL_UNDEFINED = 0x00, + SU_INPUT_SELECT_CONTROL = 0x01, + + // Camera Terminal Control Selectors + // + CT_CONTROL_UNDEFINED = 0x00, + CT_SCANNING_MODE_CONTROL = 0x01, + CT_AE_MODE_CONTROL = 0x02, + CT_AE_PRIORITY_CONTROL = 0x03, + CT_EXPOSURE_TIME_ABSOLUTE_CONTROL = 0x04, + CT_EXPOSURE_TIME_RELATIVE_CONTROL = 0x05, + CT_FOCUS_ABSOLUTE_CONTROL = 0x06, + CT_FOCUS_RELATIVE_CONTROL = 0x07, + CT_FOCUS_AUTO_CONTROL = 0x08, + CT_IRIS_ABSOLUTE_CONTROL = 0x09, + CT_IRIS_RELATIVE_CONTROL = 0x0A, + CT_ZOOM_ABSOLUTE_CONTROL = 0x0B, + CT_ZOOM_RELATIVE_CONTROL = 0x0C, + CT_PANTILT_ABSOLUTE_CONTROL = 0x0D, + CT_PANTILT_RELATIVE_CONTROL = 0x0E, + CT_ROLL_ABSOLUTE_CONTROL = 0x0F, + CT_ROLL_RELATIVE_CONTROL = 0x10, + CT_PRIVACY_CONTROL = 0x11, + + // Processing Unit Control Selectors + // + PU_CONTROL_UNDEFINED = 0x00, + PU_BACKLIGHT_COMPENSATION_CONTROL = 0x01, + PU_BRIGHTNESS_CONTROL = 0x02, + PU_CONTRAST_CONTROL = 0x03, + PU_GAIN_CONTROL = 0x04, + PU_POWER_LINE_FREQUENCY_CONTROL = 0x05, + PU_HUE_CONTROL = 0x06, + PU_SATURATION_CONTROL = 0x07, + PU_SHARPNESS_CONTROL = 0x08, + PU_GAMMA_CONTROL = 0x09, + PU_WHITE_BALANCE_TEMPERATURE_CONTROL = 0x0A, + PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL = 0x0B, + PU_WHITE_BALANCE_COMPONENT_CONTROL = 0x0C, + PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL = 0x0D, + PU_DIGITAL_MULTIPLIER_CONTROL = 0x0E, + PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL = 0x0F, + PU_HUE_AUTO_CONTROL = 0x10, + + // Extension Unit Control Selectors + // + XU_CONTROL_UNDEFINED = 0x00, + + // Video Streaming Interface Control Selectors + // + VS_CONTROL_UNDEFINED = 0x00, + VS_PROBE_CONTROL = 0x01, + VS_COMMIT_CONTROL = 0x02, + VS_STILL_PROBE_CONTROL = 0x03, + VS_STILL_COMMIT_CONTROL = 0x04, + VS_STILL_IMAGE_TRIGGER_CONTROL = 0x05, + VS_STREAM_ERROR_CODE_CONTROL = 0x06, + VS_GENERATE_KEY_FRAME_CONTROL = 0x07, + VS_UPDATE_FRAME_SEGMENT_CONTROL = 0x08, + VS_SYNCH_DELAY_CONTROL = 0x09, + + // USB Terminal Types + // + TT_VENDOR_SPECIFIC = 0x0100, + TT_STREAMING = 0x0101, + + // Input Terminal Types + // + ITT_VENDOR_SPECIFIC = 0x0200, + ITT_CAMERA = 0x0201, + ITT_MEDIA_TRANSPORT_UNIT = 0x0202, + + // Output Terminal Types + // + OTT_VENDOR_SPECIFIC = 0x0300, + OTT_DISPLAY = 0x0301, + OTT_MEDIA_TRANSPORT_OUTPUT = 0x0302, + + // External Terminal Types + // + EXTERNAL_VENDOR_SPECIFIC = 0x0400, + COMPOSITE_CONNECTOR = 0x0401, + SVIDEO_CONNECTOR = 0x0402, + COMPONENT_CONNECTOR = 0x0403, + + // Media Transport Terminal Control Selectors + // + MTT_CONTROL_UNDEFINED = 0x00, + TRANSPORT_CONTROL = 0X01, + ATN_INFORMATION_CONTROL = 0X02, + MEDIA_INFORMATION_CONTROL = 0X03, + TIME_CODE_INFORMATION_CONTROL = 0X04, + + +}; + +enum UncompressedFormatGUID +{ + UNCOMPRESSED_YUV2_HI = 0x3259555900000010ULL, + UNCOMPRESSED_YUV2_LO = 0x800000aa00389b71ULL, + UNCOMPRESSED_NV12_HI = 0x3231564E00000010ULL, + UNCOMPRESSED_NV12_LO = 0x800000aa00389b71ULL, +}; + +// Standard Video Class Control Interface Descriptor +// +#pragma pack(1) +struct IOUSBVCInterfaceDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdVDC; + uint16_t wTotalLength; + uint32_t dwClockFrequency; + uint8_t bInCollection; // Number of Video Streaming Interfaces in the collection + uint8_t baInterfaceNr[1]; +}; +typedef struct IOUSBVCInterfaceDescriptor IOUSBVCInterfaceDescriptor; +#pragma options align=reset + +// Video Control Standard Input Terminal Descriptor +// +#pragma pack(1) +struct IOUSBVCInputTerminalDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t iTerminal; +}; +typedef struct IOUSBVCInputTerminalDescriptor IOUSBVCInputTerminalDescriptor; +#pragma options align=reset + +// Video Class Standard Output Terminal Descriptor +// +#pragma pack(1) +struct IOUSBVCOutputTerminalDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bSourceID; + uint8_t iTerminal; +}; +typedef struct IOUSBVCOutputTerminalDescriptor IOUSBVCOutputTerminalDescriptor; +#pragma options align=reset + +// Video Class Camera Terminal Descriptor +// +#pragma pack(1) +struct IOUSBVCCameraTerminalDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t iTerminal; + uint16_t wObjectiveFocalLengthMin; + uint16_t wObjectiveFocalLengthMax; + uint16_t wOcularFocalLength; + uint8_t bControlSize; // Size of the bmControls field + uint8_t bmControls[1]; +}; +typedef struct IOUSBVCCameraTerminalDescriptor IOUSBVCCameraTerminalDescriptor; +#pragma options align=reset + +// Video Class Selector Unit Descriptor +// +#pragma pack(1) +struct IOUSBVCSelectorUnitDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bUnitID; + uint8_t bNrInPins; + uint8_t baSourceID[1]; +}; +typedef struct IOUSBVCSelectorUnitDescriptor IOUSBVCSelectorUnitDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCSelectorUnit2Descriptor +{ + uint8_t iSelector; +}; +typedef struct IOUSBVCSelectorUnit2Descriptor IOUSBVCSelectorUnit2Descriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCProcessingUnitDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bUnitID; + uint8_t bSourceID; + uint16_t wMaxMultiplier; + uint8_t bControlSize; + uint8_t bmControls[1]; +}; +typedef struct IOUSBVCProcessingUnitDescriptor IOUSBVCProcessingUnitDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCProcessingUnit2Descriptor +{ + uint8_t iProcessing; +}; +typedef struct IOUSBVCProcessingUnit2Descriptor IOUSBVCProcessingUnit2Descriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCExtensionUnitDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bUnitID; + uint8_t guidFormat[16]; + uint8_t bNumControls; + uint8_t bNrInPins; + uint8_t baSourceID[1]; +}; +typedef struct IOUSBVCExtensionUnitDescriptor IOUSBVCExtensionUnitDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCExtensionUnit2Descriptor +{ + uint8_t bControlSize; + uint8_t bmControls[1]; +}; +typedef struct IOUSBVCExtensionUnit2Descriptor IOUSBVCExtensionUnit2Descriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCExtensionUnit3Descriptor +{ + uint8_t iExtension; +}; +typedef struct IOUSBVCExtensionUnit3Descriptor IOUSBVCExtensionUnit3Descriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVCInterruptEndpointDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t wMaxTransferSize; +}; +typedef struct IOUSBVCInterruptEndpointDescriptor IOUSBVCInterruptEndpointDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVSInputHeaderDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bNumFormats; + uint16_t wTotalLength; + uint8_t bEndpointAddress; + uint8_t bmInfo; + uint8_t bTerminalLink; + uint8_t bStillCaptureMethod; + uint8_t bTriggerSupport; + uint8_t bTriggerUsage; + uint8_t bControlSize; + uint8_t bmControls[1]; +}; +typedef struct IOUSBVSInputHeaderDescriptor IOUSBVSInputHeaderDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVSOutputHeaderDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bNumFormats; + uint16_t wTotalLength; + uint8_t bEndpointAddress; + uint8_t bTerminalLink; +}; +typedef struct IOUSBVSOutputHeaderDescriptor IOUSBVSOutputHeaderDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MJPEGFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t bmFlags; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterlaceFlags; + uint8_t bCopyProtect; +}; +typedef struct IOUSBVDC_MJPEGFormatDescriptor IOUSBVDC_MJPEGFormatDescriptor; +#pragma options align=reset + +struct IOSUBVDC_StillImageSize +{ + uint16_t wWidth; + uint16_t wHeight; +}; +typedef struct IOSUBVDC_StillImageSize IOSUBVDC_StillImageSize; + +struct IOSUBVDC_StillImageCompressionPattern +{ + uint8_t bNumCompressionPattern; + uint8_t bCompression[1]; +}; +typedef struct IOSUBVDC_StillImageCompressionPattern IOSUBVDC_StillImageCompressionPattern; + +#pragma pack(1) +struct IOUSBVDC_StillImageFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bEndpointAddress; + uint8_t bNumImageSizePatterns; + IOSUBVDC_StillImageSize dwSize[1]; +}; +typedef struct IOUSBVDC_StillImageFrameDescriptor IOUSBVDC_StillImageFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MJPEGFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwMinFrameInterval; + uint32_t dwMaxFrameInterval; + uint32_t dwFrameIntervalStep; +}; +typedef struct IOUSBVDC_MJPEGFrameDescriptor IOUSBVDC_MJPEGFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MJPEGDiscreteFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwFrameInterval[1]; +}; +typedef struct IOUSBVDC_MJPEGDiscreteFrameDescriptor IOUSBVDC_MJPEGDiscreteFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_UncompressedFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t guidFormat[16]; + uint8_t bBitsPerPixel; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterlaceFlags; + uint8_t bCopyProtect; +}; +typedef struct IOUSBVDC_UncompressedFormatDescriptor IOUSBVDC_UncompressedFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_UncompressedFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwMinFrameInterval; + uint32_t dwMaxFrameInterval; + uint32_t dwFrameIntervalStep; +}; +typedef struct IOUSBVDC_UncompressedFrameDescriptor IOUSBVDC_UncompressedFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_UncompressedDiscreteFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwFrameInterval[1]; +}; +typedef struct IOUSBVDC_UncompressedDiscreteFrameDescriptor IOUSBVDC_UncompressedDiscreteFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_VendorFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t guidMajorFormat[16]; + uint8_t guidSubFormat[16]; + uint8_t guidSpecifierFormat[16]; + uint8_t bPayloadClass; + uint8_t bDefaultFrameIndex; + uint8_t bCopyProtect; +}; +typedef struct IOUSBVDC_VendorFormatDescriptor IOUSBVDC_VendorFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_VendorFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwMinFrameInterval; + uint32_t dwMaxFrameInterval; + uint32_t dwFrameIntervalStep; +}; +typedef struct IOUSBVDC_VendorFrameDescriptor IOUSBVDC_VendorFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_VendorDiscreteFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwFrameInterval[1]; +}; +typedef struct IOUSBVDC_VendorDiscreteFrameDescriptor IOUSBVDC_VendorDiscreteFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_DVFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint32_t dwMaxVideoFrameBufferSize; + uint8_t bFormatType; +}; +typedef struct IOUSBVDC_DVFormatDescriptor IOUSBVDC_DVFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MPEG1SSFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint16_t wPacketLength; + uint16_t wPackLength; + uint8_t bPackDataType; +}; +typedef struct IOUSBVDC_MPEG1SSFormatDescriptor IOUSBVDC_MPEG1SSFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MPEG2PSFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint16_t wPacketLength; + uint16_t wPackLength; + uint8_t bPackDataType; +}; +typedef struct IOUSBVDC_MPEG2PSFormatDescriptor IOUSBVDC_MPEG2PSFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_MPEG2PTSFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bDataOffset; + uint8_t bPacketLength; + uint8_t bStrideLength; +}; +typedef struct IOUSBVDC_MPEG2PTSFormatDescriptor IOUSBVDC_MPEG2PTSFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_ColorFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bColorPrimaries; + uint8_t bTransferCharacteristics; + uint8_t bMatrixCoefficients; +}; +typedef struct IOUSBVDC_ColorFormatDescriptor IOUSBVDC_ColorFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_FrameBasedFormatDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t guidFormat[16]; + uint8_t bBitsPerPixel; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterlaceFlags; + uint8_t bCopyProtect; + uint8_t bVariableSize; +}; +typedef struct IOUSBVDC_FrameBasedFormatDescriptor IOUSBVDC_FrameBasedFormatDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_FrameBasedFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwBytesPerLine; + uint32_t dwMinFrameInterval; + uint32_t dwMaxFrameInterval; + uint32_t dwFrameIntervalStep; +}; +typedef struct IOUSBVDC_FrameBasedFrameDescriptor IOUSBVDC_FrameBasedFrameDescriptor; +#pragma options align=reset + +#pragma pack(1) +struct IOUSBVDC_DiscreteFrameBasedFrameDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwBytesPerLine; + uint32_t dwMinFrameInterval; + uint32_t dwMaxFrameInterval; + uint32_t dwFrameInterval[1]; +}; +typedef struct IOUSBVDC_DiscreteFrameBasedFrameDescriptor IOUSBVDC_DiscreteFrameBasedFrameDescriptor; +#pragma options align=reset + +@interface DecodeVideoInterfaceDescriptor : NSObject { + +} + ++(void)decodeBytes:(uint8_t *)descriptor forDevice:(BusProbeDevice *)thisDevice withDeviceInterface:(IOUSBDeviceRef)deviceIntf; + char MapNumberToVersion( int i ); + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DescriptorDecoder.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DescriptorDecoder.h new file mode 100644 index 0000000..5bd5972 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/DescriptorDecoder.h @@ -0,0 +1,58 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import +#import "BusProberSharedFunctions.h" +#import "BusProbeDevice.h" + +#import "DecodeDeviceDescriptor.h" +#import "DecodeConfigurationDescriptor.h" +#import "DecodeInterfaceDescriptor.h" +#import "DecodeEndpointDescriptor.h" +#import "DecodeHIDDescriptor.h" +#import "DecodeHubDescriptor.h" +#import "DecodeDeviceQualifierDescriptor.h" +#import "DecodeAudioInterfaceDescriptor.h" +#import "DecodeVideoInterfaceDescriptor.h" +#import "DecodeCommClassDescriptor.h" +#import "DecodeBOSDescriptor.h" + +#define HID_DESCRIPTOR 0x21 +#define DFU_FUNCTIONAL_DESCRIPTOR 0x21 +#define CCID_DESCRIPTOR 0x21 + +enum ClassSpecific { + CS_INTERFACE = 0x24, + CS_ENDPOINT = 0x25 +}; + +@interface DescriptorDecoder : NSObject { + +} + ++(void)decodeBytes:(Byte *)p forDevice:(BusProbeDevice *)thisDevice deviceInterface:(IOUSBDeviceRef)deviceIntf userInfo:(void *)userInfo isOtherSpeedDesc:(BOOL)isOtherSpeedDesc isinCurrentConfig:(Boolean)inCurrentConfig; ++(void)dumpRawDescriptor:(Byte *)p forDevice:(BusProbeDevice *)thisDevice atDepth:(int)depth; ++(void)dumpRawConfigDescriptor:(IOUSBConfigurationDescriptor*)cfg forDevice:(BusProbeDevice *)thisDevice atDepth:(int)depth; ++(void)dump:(int)n byte:(Byte *)p forDevice:(BusProbeDevice *)thisDevice atDepth:(int)depth; ++(void)dumpRawBOSDescriptor:(IOUSBBOSDescriptor*)bos forDevice:(BusProbeDevice *)thisDevice atDepth:(int)depth; +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/ExtensionSelector.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/ExtensionSelector.h new file mode 100644 index 0000000..80b75ce --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/ExtensionSelector.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2011-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import + +@interface ExtensionSelector : NSView +{ + NSPopUpButton *extensionSelectionButton; + NSSavePanel *theSavePanel; + NSDictionary *itemDictionary; +} +@property (nonatomic, retain) NSPopUpButton *extensionSelectionButton; +@property (nonatomic, retain) NSSavePanel *theSavePanel; +@property (nonatomic, retain) NSDictionary *itemDictionary; + +-(void)populatePopuButtonWithArray:(NSDictionary *)addItems; +-(void)setCurrentSelection:(NSString *)currentSelection; +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewAdditions.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewAdditions.h new file mode 100644 index 0000000..5b0ec56 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewAdditions.h @@ -0,0 +1,34 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import +#import "BusProbeDevice.h" + + +@interface NSOutlineView(OutlineViewAdditions) + +- (void)itemDoubleClicked; + +@end + diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewNode.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewNode.h new file mode 100644 index 0000000..c5ab35d --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/OutlineViewNode.h @@ -0,0 +1,67 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import + + +@interface OutlineViewNode : NSObject { + NSString * _name; + NSString * _value; + NSMutableArray * _children; + NSString * _tempName; + NSString * _tempValue; +} + +- init; +- initWithName:(NSString *)name value:(NSString *)value; +- (void)dealloc; + + + // Accessor methods for the strings +- (NSString *)name; +- (NSString *)value; +- (void)setName:(NSString *)aString; +- (void)setValue:(NSString *)aString; + + // Accessors for the children +- (void)addChild:(OutlineViewNode *)aNode; +- (int)childrenCount; +- (NSArray *)children; +- (OutlineViewNode *)childAtIndex:(int)i; +- (void)removeAllChildren; + +- (void)addNode:(OutlineViewNode *)aNode atDepth:(int)depth; +- (void)addNodeWithName:(char *)name value:(char *)value atDepth:(int)depth; + + // Other properties +- (BOOL)isExpandable; + +- (OutlineViewNode *)deepestChild; + +- (NSString*)stringRepresentation:(NSString*)name startingLevel:(int)startingLevel; +- (NSString *)stringRepresentation:(int)startingLevel; +- (NSString *)stringRepresentationOfValues:(int)startingLevel; +- (NSMutableDictionary *)dictionaryVersionOfMe; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/TableViewWithCopying.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/TableViewWithCopying.h new file mode 100644 index 0000000..ba13711 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/TableViewWithCopying.h @@ -0,0 +1,36 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import + + +@interface TableViewWithCopying : NSTableView { + +} + +- (IBAction)copy:(id)sender; +- (NSString *)stringRepresentation; +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem; + +@end diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/USBBusProber.h b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/USBBusProber.h new file mode 100644 index 0000000..d2055b3 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Headers/USBBusProber.h @@ -0,0 +1,6 @@ + +#import "BusProberSharedFunctions.h" +//#import "BusProbeController.h" +#import "BusProber.h" +//#import "BusProbeDevice.h" +//#import "BusProbeClass.h" diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/APPLE_LICENSE b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/APPLE_LICENSE new file mode 100644 index 0000000..c618c09 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/APPLE_LICENSE @@ -0,0 +1,372 @@ +/*! +\page AppleLicense + +APPLE PUBLIC SOURCE LICENSE +Version 2.0 - August 6, 2003 + +Please read this License carefully before downloading this software. +By downloading or using this software, you are agreeing to be bound by +the terms of this License. If you do not or cannot agree to the terms +of this License, please do not download or use the software. + +1. General; Definitions. This License applies to any program or other +work which Apple Computer, Inc. ("Apple") makes publicly available and +which contains a notice placed by Apple identifying such program or +work as "Original Code" and stating that it is subject to the terms of +this Apple Public Source License version 2.0 ("License"). As used in +this License: + +1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is +the grantor of rights, (i) claims of patents that are now or hereafter +acquired, owned by or assigned to Apple and (ii) that cover subject +matter contained in the Original Code, but only to the extent +necessary to use, reproduce and/or distribute the Original Code +without infringement; and (b) in the case where You are the grantor of +rights, (i) claims of patents that are now or hereafter acquired, +owned by or assigned to You and (ii) that cover subject matter in Your +Modifications, taken alone or in combination with Original Code. + +1.2 "Contributor" means any person or entity that creates or +contributes to the creation of Modifications. + +1.3 "Covered Code" means the Original Code, Modifications, the +combination of Original Code and any Modifications, and/or any +respective portions thereof. + +1.4 "Externally Deploy" means: (a) to sublicense, distribute or +otherwise make Covered Code available, directly or indirectly, to +anyone other than You; and/or (b) to use Covered Code, alone or as +part of a Larger Work, in any way to provide a service, including but +not limited to delivery of content, through electronic communication +with a client other than You. + +1.5 "Larger Work" means a work which combines Covered Code or portions +thereof with code not governed by the terms of this License. + +1.6 "Modifications" mean any addition to, deletion from, and/or change +to, the substance and/or structure of the Original Code, any previous +Modifications, the combination of Original Code and any previous +Modifications, and/or any respective portions thereof. When code is +released as a series of files, a Modification is: (a) any addition to +or deletion from the contents of a file containing Covered Code; +and/or (b) any new file or other representation of computer program +statements that contains any part of Covered Code. + +1.7 "Original Code" means (a) the Source Code of a program or other +work as originally made available by Apple under this License, +including the Source Code of any updates or upgrades to such programs +or works made available by Apple under this License, and that has been +expressly identified by Apple as such in the header file(s) of such +work; and (b) the object code compiled from such Source Code and +originally made available by Apple under this License. + +1.8 "Source Code" means the human readable form of a program or other +work that is suitable for making modifications to it, including all +modules it contains, plus any associated interface definition files, +scripts used to control compilation and installation of an executable +(object code). + +1.9 "You" or "Your" means an individual or a legal entity exercising +rights under this License. For legal entities, "You" or "Your" +includes any entity which controls, is controlled by, or is under +common control with, You, where "control" means (a) the power, direct +or indirect, to cause the direction or management of such entity, +whether by contract or otherwise, or (b) ownership of fifty percent +(50%) or more of the outstanding shares or beneficial ownership of +such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms +and conditions of this License, Apple hereby grants You, effective on +the date You accept this License and download the Original Code, a +world-wide, royalty-free, non-exclusive license, to the extent of +Apple's Applicable Patent Rights and copyrights covering the Original +Code, to do the following: + +2.1 Unmodified Code. You may use, reproduce, display, perform, +internally distribute within Your organization, and Externally Deploy +verbatim, unmodified copies of the Original Code, for commercial or +non-commercial purposes, provided that in each instance: + +(a) You must retain and reproduce in all copies of Original Code the +copyright and other proprietary notices and disclaimers of Apple as +they appear in the Original Code, and keep intact all notices in the +Original Code that refer to this License; and + +(b) You must include a copy of this License with every copy of Source +Code of Covered Code and documentation You distribute or Externally +Deploy, and You may not offer or impose any terms on such Source Code +that alter or restrict this License or the recipients' rights +hereunder, except as permitted under Section 6. + +2.2 Modified Code. You may modify Covered Code and use, reproduce, +display, perform, internally distribute within Your organization, and +Externally Deploy Your Modifications and Covered Code, for commercial +or non-commercial purposes, provided that in each instance You also +meet all of these conditions: + +(a) You must satisfy all the conditions of Section 2.1 with respect to +the Source Code of the Covered Code; + +(b) You must duplicate, to the extent it does not already exist, the +notice in Exhibit A in each file of the Source Code of all Your +Modifications, and cause the modified files to carry prominent notices +stating that You changed the files and the date of any change; and + +(c) If You Externally Deploy Your Modifications, You must make +Source Code of all Your Externally Deployed Modifications either +available to those to whom You have Externally Deployed Your +Modifications, or publicly available. Source Code of Your Externally +Deployed Modifications must be released under the terms set forth in +this License, including the license grants set forth in Section 3 +below, for as long as you Externally Deploy the Covered Code or twelve +(12) months from the date of initial External Deployment, whichever is +longer. You should preferably distribute the Source Code of Your +Externally Deployed Modifications electronically (e.g. download from a +web site). + +2.3 Distribution of Executable Versions. In addition, if You +Externally Deploy Covered Code (Original Code and/or Modifications) in +object code, executable form only, You must include a prominent +notice, in the code itself as well as in related documentation, +stating that Source Code of the Covered Code is available under the +terms of this License with information on how and where to obtain such +Source Code. + +2.4 Third Party Rights. You expressly acknowledge and agree that +although Apple and each Contributor grants the licenses to their +respective portions of the Covered Code set forth herein, no +assurances are provided by Apple or any Contributor that the Covered +Code does not infringe the patent or other intellectual property +rights of any other entity. Apple and each Contributor disclaim any +liability to You for claims brought by any other entity based on +infringement of intellectual property rights or otherwise. As a +condition to exercising the rights and licenses granted hereunder, You +hereby assume sole responsibility to secure any other intellectual +property rights needed, if any. For example, if a third party patent +license is required to allow You to distribute the Covered Code, it is +Your responsibility to acquire that license before distributing the +Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the +licenses granted to You under this License, You hereby grant to any +person or entity receiving or distributing Covered Code under this +License a non-exclusive, royalty-free, perpetual, irrevocable license, +under Your Applicable Patent Rights and other intellectual property +rights (other than patent) owned or controlled by You, to use, +reproduce, display, perform, modify, sublicense, distribute and +Externally Deploy Your Modifications of the same scope and extent as +Apple's licenses under Sections 2.1 and 2.2 above. + +4. Larger Works. You may create a Larger Work by combining Covered +Code with other code not governed by the terms of this License and +distribute the Larger Work as a single product. In each such instance, +You must make sure the requirements of this License are fulfilled for +the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in +Section 2, no other patent rights, express or implied, are granted by +Apple herein. Modifications and/or Larger Works may require additional +patent licenses from Apple which Apple may grant in its sole +discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, +warranty, support, indemnity or liability obligations and/or other +rights consistent with the scope of the license granted herein +("Additional Terms") to one or more recipients of Covered Code. +However, You may do so only on Your own behalf and as Your sole +responsibility, and not on behalf of Apple or any Contributor. You +must obtain the recipient's agreement that any such Additional Terms +are offered by You alone, and You hereby agree to indemnify, defend +and hold Apple and every Contributor harmless for any liability +incurred by or claims asserted against Apple or such Contributor by +reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new +versions of this License from time to time. Each version will be given +a distinguishing version number. Once Original Code has been published +under a particular version of this License, You may continue to use it +under the terms of that version. You may also choose to use such +Original Code under the terms of any subsequent version of this +License published by Apple. No one other than Apple has the right to +modify the terms applicable to Covered Code created under this +License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in +part pre-release, untested, or not fully tested works. The Covered +Code may contain errors that could cause failures or loss of data, and +may be incomplete or contain inaccuracies. You expressly acknowledge +and agree that use of the Covered Code, or any portion thereof, is at +Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND +WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND +APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE +PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM +ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF +MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR +PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST +INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE +FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, +THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO +ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE +AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. +You acknowledge that the Covered Code is not intended for use in the +operation of nuclear facilities, aircraft navigation, communication +systems, or air traffic control machines in which case the failure of +the Covered Code could lead to death, personal injury, or severe +physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO +EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING +TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR +ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, +TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF +APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY +REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF +INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY +TO YOU. In no event shall Apple's total liability to You for all +damages (other than as may be required by applicable law) under this +License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the +trademarks or trade names "Apple", "Apple Computer", "Mac", "Mac OS", +"QuickTime", "QuickTime Streaming Server" or any other trademarks, +service marks, logos or trade names belonging to Apple (collectively +"Apple Marks") or to any trademark, service mark, logo or trade name +belonging to any Contributor. You agree not to use any Apple Marks in +or as part of the name of products derived from the Original Code or +to endorse or promote products derived from the Original Code other +than as expressly permitted by and in strict compliance at all times +with Apple's third party trademark usage guidelines which are posted +at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Subject to the licenses granted under this License, +each Contributor retains all rights, title and interest in and to any +Modifications made by such Contributor. Apple retains all rights, +title and interest in and to the Original Code and any Modifications +made by or on behalf of Apple ("Apple Modifications"), and such Apple +Modifications will not be automatically subject to this License. Apple +may, at its sole discretion, choose to license such Apple +Modifications under this License, or on different terms from those +contained in this License or may choose not to license them at all. + +12. Termination. + +12.1 Termination. This License and the rights granted hereunder will +terminate: + +(a) automatically without notice from Apple if You fail to comply with +any term(s) of this License and fail to cure such breach within 30 +days of becoming aware of such breach; + +(b) immediately in the event of the circumstances described in Section +13.5(b); or + +(c) automatically without notice from Apple if You, at any time during +the term of this License, commence an action for patent infringement +against Apple; provided that Apple did not first commence +an action for patent infringement against You in that instance. + +12.2 Effect of Termination. Upon termination, You agree to immediately +stop any further use, reproduction, modification, sublicensing and +distribution of the Covered Code. All sublicenses to the Covered Code +which have been properly granted prior to termination shall survive +any termination of this License. Provisions which, by their nature, +should remain in effect beyond the termination of this License shall +survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, +12.2 and 13. No party will be liable to any other for compensation, +indemnity or damages of any sort solely as a result of terminating +this License in accordance with its terms, and termination of this +License will be without prejudice to any other right or remedy of +any party. + +13. Miscellaneous. + +13.1 Government End Users. The Covered Code is a "commercial item" as +defined in FAR 2.101. Government software and technical data rights in +the Covered Code include only those rights customarily provided to the +public as defined in this License. This customary commercial license +in technical data and software is provided in accordance with FAR +12.211 (Technical Data) and 12.212 (Computer Software) and, for +Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- +Commercial Items) and 227.7202-3 (Rights in Commercial Computer +Software or Computer Software Documentation). Accordingly, all U.S. +Government End Users acquire Covered Code with only those rights set +forth herein. + +13.2 Relationship of Parties. This License will not be construed as +creating an agency, partnership, joint venture or any other form of +legal association between or among You, Apple or any Contributor, and +You will not represent to the contrary, whether expressly, by +implication, appearance or otherwise. + +13.3 Independent Development. Nothing in this License will impair +Apple's right to acquire, license, develop, have others develop for +it, market and/or distribute technology or products that perform the +same or similar functions as, or otherwise compete with, +Modifications, Larger Works, technology or products that You may +develop, produce, market or distribute. + +13.4 Waiver; Construction. Failure by Apple or any Contributor to +enforce any provision of this License will not be deemed a waiver of +future enforcement of that or any other provision. Any law or +regulation which provides that the language of a contract shall be +construed against the drafter will not apply to this License. + +13.5 Severability. (a) If for any reason a court of competent +jurisdiction finds any provision of this License, or portion thereof, +to be unenforceable, that provision of the License will be enforced to +the maximum extent permissible so as to effect the economic benefits +and intent of the parties, and the remainder of this License will +continue in full force and effect. (b) Notwithstanding the foregoing, +if applicable law prohibits or restricts You from fully and/or +specifically complying with Sections 2 and/or 3 or prevents the +enforceability of either of those Sections, this License will +immediately terminate and You must immediately discontinue any use of +the Covered Code and destroy all copies of it that are in your +possession or control. + +13.6 Dispute Resolution. Any litigation or other dispute resolution +between You and Apple relating to this License shall take place in the +Northern District of California, and You and Apple hereby consent to +the personal jurisdiction of, and venue in, the state and federal +courts within that District with respect to this License. The +application of the United Nations Convention on Contracts for the +International Sale of Goods is expressly excluded. + +13.7 Entire Agreement; Governing Law. This License constitutes the +entire agreement between the parties with respect to the subject +matter hereof. This License shall be governed by the laws of the +United States and the State of California, except that body of +California law concerning conflicts of law. + +Where You are located in the province of Quebec, Canada, the following +clause applies: The parties hereby confirm that they have requested +that this License and all related documents be drafted in English. Les +parties ont exige que le present contrat et tous les documents +connexes soient rediges en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights +Reserved. + +This file contains Original Code and/or Modifications of Original Code +as defined in and that are subject to the Apple Public Source License +Version 2.0 (the 'License'). You may not use this file except in +compliance with the License. Please obtain a copy of the License at +http://www.opensource.apple.com/apsl/ and read it before using this +file. + +The Original Code and all software distributed under the License are +distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. +Please see the License for the specific language governing rights and +limitations under the License." + +*/ \ No newline at end of file diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/Info.plist b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..50f7a0d --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 17F77 + CFBundleDevelopmentRegion + English + CFBundleExecutable + USBBusProber + CFBundleIdentifier + com.Vidvox.USBBusProber + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + USBBusProber + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 9C40b + DTPlatformVersion + GM + DTSDKBuild + 17C76 + DTSDKName + macosx10.13 + DTXcode + 0920 + DTXcodeBuild + 9C40b + NSHumanReadableCopyright + Copyright © 2014 Vidvox. All rights reserved. + + diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/USBVendors.txt b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/USBVendors.txt new file mode 100644 index 0000000..22936a2 --- /dev/null +++ b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/USBVendors.txt @@ -0,0 +1,2226 @@ +1|Kavi-EVAL +1000|EndPoints Inc. +1001|Thesys Microelectronics +1003|Atmel Corporation +1005|Mitel Corporation +1006|Mitsumi +1008|Hewlett Packard +1009|Genoa Technology +1010|Oak Technology, Inc +1011|Adaptec, Inc. +1012|Diebold, Inc. +1016|Epson Research Center +1017|KeyTronic Corp. +1019|OPTi Inc. +1020|Elitegroup Computer Systems +1021|Xilinx Inc. +1022|Farallon Comunications +1024|National Semiconductor +1026|ALi Corporation +1026|Acer Labs Inc. +1027|Future Technology Devices International Limited +1028|NCR Corporation +1029|Sand Microelectronics, Inc. +1029|inSilicon +1031|Fujitsu Personal Systems, Inc. +1032|Quanta Computer Inc. +1033|NEC Corporation +1034|Eastman Kodak Company +1035|Weltrend Semiconductor +1037|VIA Technologies, Inc. +1038|MCCI +1041|BUFFALO INC. +1041|Melco, Inc. +1043|Leadtek Research Inc. +1044|Giga-Byte Technology Co., Ltd. +1046|Winbond Electronics Corp. +1050|Phoenix Technologies Ltd. +1054|Creative Labs +1057|Nokia Corporation +1058|ADI Systems Inc. +1059|CATC +1060|SMSC +1061|Motorola Semiconductors HK, Ltd. +1062|Integrated Device Technology +1063|Motorola Electronics Taiwan Ltd. +1064|Advanced Gravis Computer Ltd. +1065|Cirrus Logic Inc. +1066|Ericsson Austrian, AG +1068|Innovative Semiconductors, Inc. +1071|Molex Inc. +1072|Fujitsu Component Limited +1073|ITAC Systems, Inc. +1074|Unisys Corp. +1077|Hyundai Electronics America +1078|Taugagreining HF +1080|Advanced Micro Devices +1085|Lexmark International Inc. +1086|LG Electronics USA Inc. +1088|EIZO NANAO CORPORATION +1090|Ericsson Inc. +1091|Gateway 2000 +1094|NMB Technologies Corporation +1097|Eldim +1098|Shamrock Technology Co., Ltd. +1100|CCL/ITRI +1101|Siemens Nixdorf AG +1102|Alps Electric Co., Ltd. +1103|ThrustMaster, Inc. +1105|Texas Instruments +1106|Mitsubishi Electronics America, Inc. +1107|CMD Technology +1110|Analog Devices, Inc. +1111|Silicon Integrated Systems Corp. +1112|KYE Systems Corp. +1113|Adobe Systems, Inc. +1114|SONICblue Incorporated +1115|Renesas Electronics Corp. +1117|Nortel Networks +1118|Microsoft Corporation +1121|Primax Electronics +1123|EATON +1124|AMP/Tycoelectronics +1128|Wieson Technologies Co., Ltd. +1130|CHERRY GmbH +1131|American Megatrends +1132|Toshiba +1133|Logitech Inc. +1134|Behavior Tech Computer Corporation +1137|Philips Consumer Lifestyle BV +1138|Sun Microsystems +1139|Sanyo Information Business Co., Ltd. +1140|Sanyo Electric Co. Ltd. +1141|TECO Infor-ion System +1144|Connectix +1146|Semtech Corporation +1147|Silitek Corp. +1148|Dell Computer Corp. +1149|Kensington +1150|LSI Corporation +1151|Plantronics, Inc. +1152|Toshiba America Info. Systems, Inc. +1154|Kyocera Corporation +1155|STMicroelectronics +1160|Cirque Corporation +1161|Foxconn / Hon Hai +1165|ITE Tech Inc. +1165|Integrated Technology Express +1165|Integrated Technology Express, Inc. +1169|Capetronic (Kaohsiung ) Corp. +1170|Samsung SemiConductor, Inc. +1170|Samsung Semiconductor, Inc. +1174|Micron Electronics +1175|Smile International, Inc. +1177|Yamaha Corporation +1179|Curtis Connections +1181|VLSI Technology, Inc. +1183|Compaq Computer Corporation +1188|Hitachi, Ltd. +1189|Acer Peripherals Inc. +1189|BenQ Corporation +1189|Benq Corporation +1190|Nokia Display Products +1191|Visioneer +1192|Multivideo Labs, Inc. +1193|Canon Inc. +1200|Nikon Corporation +1201|Pan International +1203|IBM Corporation +1204|Cypress Semiconductor +1205|ROHM Co., Ltd. +1207|Compal Electronics, Inc. +1208|Seiko Epson Corp. +1209|Rainbow Technologies, Inc. +1211|I-O Data Device, Inc. +1215|TDK Corporation +1221|Fujitsu Ltd. +1222|Toshiba America Electronic Components +1223|Micro Macro Technologies +1224|Konica Corporation +1226|Lite-On Technology Corp. +1227|FUJIFILM Corporation +1227|Fuji Photo Film Co., Ltd. +1228|ST-Ericsson +1228|Philips Semiconductors +1229|Tatung Company of America, Inc. +1230|ScanLogic Corporation +1231|Myson Century, Inc. +1233|ITT Cannon +1234|Altec Lansing Technologies, Inc. +1236|LSI Logic Corporation +1238|Mentor Graphics +1239|Oki Semiconductor +1240|Microchip Technology Inc. +1241|Holtek Semiconductor, Inc. +1242|Panasonic Corporation +1244|Huan Hsin Holdings Ltd. +1245|Sharp Corporation +1246|MindShare, Inc. +1247|Interlink Electronics +1249|Iiyama Corporation +1250|Exar Corporation +1254|SCM Microsystems +1254|Shuttle Technology +1255|Elo TouchSystems +1256|Samsung Electronics Co., Ltd. +1257|PC-Tel Inc. +1259|Northstar Systems Corp. +1259|Northstar Systems, Inc +1260|Tokyo Electron Device Limited +1261|Annabooks +1265|Victor Company of Japan, Limited +1266|Chicony Electronics Co., Ltd. +1267|ELAN Microelectronics Corportation +1267|Elan Microelectronics Corportation +1271|Newnex Technology Corp. +1272|FuturePlus Systems +1273|Brother Industries, Ltd. +1273|Brother International Corporation +1274|Dallas Semiconductor +1275|Biostar Microtech Int'l Corp. +1276|SUNPLUS TECHNOLOGY CO., LTD. +1277|Soliton Systems K.K. +1278|PFU Limited +1279|E-CMOS Corp. +1281|Fujikura/DDK +1282|Acer, Inc. +1284|Hayes Microcomputer Products +1286|3Com Corporation +1287|Hosiden Corporation +1288|Clarion Co., Ltd. +1289|Aztech Systems Ltd +1293|Belkin Corporation +1295|KC Technology Inc. +1296|Sejin Electron Inc. +1300|FCI Electronics +1302|Longwell Electronics/Longwell Company +1303|Butterfly Communications +1304|EzKEY Corp. +1305|Star Micronics Co., LTD +1308|Shuttle Inc. +1309|American Power Conversion +1310|Scientific Atlanta, Inc. +1311|IO Systems Inc. fomerly Elite Electronics, Inc. +1312|Taiwan Semiconductor Manufacturing Co. +1314|ACON, Advanced-Connectek, Inc. +1315|ATEN GMBH +1316|Sola Electronics +1317|PLX Technology, Inc. +1318|Temic MHS S.A. +1319|ALTRA +1320|ATI Technologies, Inc. +1321|Aladdin Knowledge Systems +1322|Crescent Heart Software +1323|Tekom Technologies, Inc +1324|Canon Development Americas +1329|Wacom Technology Corp. +1330|Systech Corporation +1334|Welch Allyn Inc. +1335|Inventec Corporation +1336|Caldera International, Inc. +1337|Shyh Shiun Terminals Co. LTD +1338|Preh Werke Gmbh & Co. KG +1340|Institut of Microelectronic and Mechatronic Systems +1341|Silicon Architect +1342|Mobility Electronics +1343|Synopsys, Inc. +1344|UniAccess AB +1345|Sirf Technology, Inc +1347|ViewSonic Corporation +1349|Xirlink, Inc. +1350|Polaroid Corporation +1351|Anchor Chips Inc. +1356|Sony Corporation +1360|Fuji Xerox Co., Ltd. +1362|Philips Monitors +1363|STMicroelectronics Imaging Division +1363|VLSI Vision Ltd. +1364|Dictaphone Corp. +1366|Asahi Kasei Microsystems Co., Ltd +1367|ATEN International Co. Ltd. +1369|Cadence Design Systems, Inc. +1373|Samsung Electro-Mechanics Co. +1374|CTX Opto-Electronics Corp. +1376|Interface Corporation +1378|Telex Communications Inc. +1379|Immersion Corporation +1380|Chinon Industries, Inc. +1381|Peracom Networks, Inc. +1382|Monterey International Corp. +1383|Xyratex +1386|WACOM Co., Ltd. +1388|Belkin Research & Development +1389|Eizo +1390|Elecom Co., Ltd. +1391|Korea Data Systems Co., Ltd. +1393|Interex, Inc. +1394|Conexant Systems, Inc. +1395|Zoran Corporation +1397|Philips Creative Display Solutions +1398|BAFO/Quality Computer Accessories +1403|Y-E Data, Inc. +1404|AVM GmbH +1405|Shark Multimedia Inc. +1406|Nintendo Co., Ltd. +1407|QuickShot Limited +1410|Roland Corporation +1411|Padix Co., Ltd. +1412|RATOC System Inc. +1413|FlashPoint Technology, Inc. +1416|Sapien Design +1419|Infineon Technologies +1419|Siemens Semiconductor +1420|In Focus Systems +1421|Micrel Semiconductor +1422|Tripath Technology Inc. +1423|Alcor Micro, Corp. +1424|OMRON Corporation +1426|Exide Electronics +1429|Zoran Microelectronics Ltd. +1430|MicroTouch Systems Inc. +1432|Nigata Canotec Co., Inc. +1435|Iomega Corporation +1436|A-Trend Technology Co., Ltd. +1437|Advanced Input Devices +1438|Intelligent Instrumentation +1439|LaCie +1441|USC Corporation +1442|Fuji Film Microdevices Co. Ltd. +1443|ARC International +1443|V Automation Inc. +1444|Ortek Technology, Inc. +1445|Sampo Technology Corp. +1446|Cisco Systems, Inc. +1447|Bose Corporation +1448|Spacetec IMC Corporation +1449|OmniVision Technologies, Inc. +1451|In-System Design +1452|Apple Inc. +1453|Y.C. Cable U.S.A., Inc +1454|Jing-Mold Enterprise Co., Ltd. +1456|Fountain Technologies, Inc +1457|First International Computer, Inc. +1460|LG Semicon Co., Ltd. +1461|Dialogic Corp +1462|Proxima Corporation +1463|Medianix Semiconductor, Inc. +1466|DigitalPersona, Inc. +1469|RAFI GmbH & Co. KG +1470|Tyco Electronics +1472|Keil Software +1473|Kawasaki Microelectronics, Inc. +1473|Kawasaki Steel +1474|Mediaphonics S.A. +1477|Digi International Inc. +1478|Qualcomm, Inc +1479|Qtronix Corp +1480|Cheng Uei Precision Industry Co., Ltd +1480|Foxlink/Cheng Uei Precision Industry Co., Ltd. +1481|Semtech Corporation +1482|Ricoh Company Ltd. +1483|PowerVision Technologies Inc. +1484|ELSA AG +1485|Silicom LTD. +1486|SICAN Gmbh +1487|Sung Forn Co. LTD. +1488|Lunar Corporation +1489|Brainboxes Limited +1490|Wave Systems Corp. +1494|Philips Semiconductors, CICT +1495|Thomas and Betts +1496|Ultima Electronics Corp. +1497|Axiohm Transaction Solutions +1498|Microtek International Inc. +1499|Sun Corporation +1500|Lexar Media, Inc. +1501|Delta Electronics Inc. +1504|Symbol Technologies +1505|Syntek Design Technology Inc. +1507|Genesys Logic, Inc. +1508|Red Wing Corporation +1509|Fuji Electric FA Components & Systems Co. Ltd. +1510|Keithley Instruments +1513|Kawasaki Microelectronics America, Inc. +1515|FFC Limited +1516|COM21, Inc. +1518|Cytechinfo Inc. +1519|Anko Electronic Co., Ltd. +1520|Canopus Co., Ltd. +1522|Dexin Corporation, Ltd. +1523|PI Engineering, Inc +1525|Unixtar Technology Inc. +1526|AOC International +1527|RFC Distribution(s) PTE Ltd. +1529|Datalogic Scanning, Inc. +1529|PSC Scanning, Inc. +1530|Siemens Telecommunications Systems Limited +1532|Harman International +1533|STD Manufacturing Ltd. +1534|CHIC TECHNOLOGY CORP +1535|LeCroy Corporation +1536|Barco Display Systems +1537|Jazz Hipster Corporation +1538|Vista Imaging Inc. +1539|Novatek Microelectronics Corp. +1540|Jean Co, Ltd. +1542|Royal Information Electronics Co., Ltd. +1543|Bridge Information Co., Ltd. +1545|SMK Manufacturing Inc. +1546|Worth Data, Inc. +1546|Worthington Data Solutions, Inc. +1547|Solid Year Co., Ltd. +1548|EEH Datalink Gmbh +1550|Transmonde Technologies, Inc. +1551|Joinsoon Electronics Mfg. Co., Ltd. +1553|Totoku Electric Co., LTD. +1555|TransAct Technologies Incorporated +1556|Bio-Rad Laboratories +1558|Future Techno Designs PVT. LTD. +1560|Chia Shin Technology Corp. +1561|Seiko Instruments Inc. +1562|Veridicom +1564|Act Labs, Ltd. +1565|Quatech, Inc. +1566|Nissei Electric Co. +1568|Alaris, Inc. +1569|ODU-Steckverbindungssysteme GmbH and Co. KG +1571|Littelfuse, Inc. +1572|Apex PC Solutions, Inc. +1574|Nippon Systems Development Co., Ltd. +1577|Zida Technologies Limited +1578|MosArt Semiconductor Corp. +1578|ProVision Technology, Inc. +1579|Greatlink Electronics Taiwan Ltd. +1581|Taiwan Tai-Hao Enterprises Co. Ltd. +1582|MAIN SUPER ENTERPRISES CO.,LTD. +1582|Mainsuper Enterprises Co., Ltd. +1583|Sin Sheng Terminal & Machine Inc. +1588|Crucial Technology/Micron Semiconductor Products +1588|Micron Technology, Inc. +1590|Sierra Imaging, Inc. +1592|Avision, Inc. +1593|Chrontel, Inc. +1594|Techwin Corporation +1597|Fong Kai Industrial Co., Ltd. +1599|New Technology Cable Ltd. +1600|Hitex Development Tools +1601|Woods Industries, Inc. +1602|VIA Medical Corporation +1604|TEAC Corporation +1605|Who Vision Systems, Inc. +1608|Inside Out Networks +1611|Analog Devices, Inc. Development Tools +1612|Ji-Haw Industrial Co., Ltd +1614|Suyin Corporation +1615|WIBU-Systems AG +1617|Likom Technology Sdn. Bhd. +1618|Stargate Solutions, Inc. +1620|Granite Microsystems, Inc. +1621|Space Shuttle Hi-Fi Wire and Cable Industry Co, Ltd. +1621|Space Shuttle Hi-Tech Co.,Ltd. +1622|Glory Mark Electronic Ltd. +1623|Tekcon Electronics Corp. +1624|Sigma Designs, Inc. +1626|Optoelectronics Co., Ltd. +1630|Silicon Graphics +1631|Good Way Technology Co., Ltd. & GWC technology Inc +1632|TSAY-E (BVI) International Inc. +1633|Hamamatsu Photonics K.K. +1635|Topmax Electronic Co., Ltd. +1640|WordWand +1641|Oce Printing Systems GmbH +1642|Total Technologies, Ltd. +1643|Intermart Systems, Inc. +1645|Entrega Technologies Inc. +1646|Acer Semiconductor America, Inc. +1647|SigmaTel, Inc. +1650|Labtec Inc. +1652|KME Mouse Electronic Enterprise Co., Ltd. +1652|Key Mouse Electronic Enterprise Co., Ltd. +1653|DrayTek Corp. +1654|Teles AG +1655|Aiwa Co., Ltd. +1656|ACARD Technology Corp. +1659|Prolific Technology, Inc. +1660|Efficient Networks, Inc. +1661|Hohner Corp. +1662|Intermec Technologies (S) Pte Ltd. +1663|Virata Ltd. +1664|Avance Logic, Inc. +1664|Realtek Semiconductor Corp., CPP Div. +1665|Siemens Information and Communication Products +1669|ISDN*tek +1670|Minolta Co., Ltd. +1674|Pertech Inc. +1675|Potrans International, Inc. +1680|Golden Bridge Electech Inc. +1683|Hagiwara Sys-Com Co., Ltd. +1684|Lego Group +1688|Chuntex (CTX) +1689|Tektronix, Inc. +1690|Askey Computer Corporation +1691|Thomson Consumer Electronics +1693|Hughes Network Systems +1694|Welcat Inc. +1698|Topro Technology Inc. +1699|Saitek PLC +1700|Xiamen Doowell Electron Co., Ltd. +1701|Divio +1703|MicroStore, Inc. +1705|Westell +1706|Sysgration Ltd. +1708|Fujitsu Laboratories of America, Inc. +1709|Greatland Electronics Taiwan Ltd. +1710|Testronic Labs +1711|Harting, Inc. of North America +1714|N*ABLE Technologies, Inc. +1720|Pixela Corporation +1721|Alcatel +1722|Smooth Cord & Connector Co., Ltd. +1723|EDA Inc. +1724|Oki Data Corporation +1725|AGFA-Gevaert NV +1726|AME Optimedia Technology Co. Ltd. +1726|Asia Microelectronic Development, Inc. +1727|Leoco Corporation +1732|Bizlink Technology, Inc. +1733|Hagenuk, GmbH +1734|Infowave Software Inc. +1736|SIIG, Inc. +1737|Taxan (Europe) Ltd. +1738|Newer Technology, Inc. +1739|Synaptics Inc. +1740|Terayon Communication Systems +1741|Keyspan +1744|Traveling Software, Inc. +1745|Daewoo Electronics Co Ltd +1747|Mitsubishi Electric Corporation +1748|Cisco Systems +1749|Toshiba America Electronic Components, Inc. +1750|Aashima Technology B.V. +1751|Network Computing Devices (NCD) +1752|Technical Marketing Research, Inc. +1754|Phoenixtec Power Co., Ltd. +1755|Paradyne +1756|Compeye Corporation +1758|Heisei Electronics Co. Ltd. +1760|Multi-Tech Systems, Inc. +1761|ADS Technologies, Inc. +1764|Alcatel Microelectronics +1766|Tiger Jet Network, Inc. +1771|PC Expert Tech. Co., Ltd. +1775|I.A.C. Geometrische Ingenieurs B.V. +1776|T.N.C Industrial Co., Ltd. +1777|Opcode Systems Inc. +1778|Emine Technology Company +1782|Wintrend Technology Co., Ltd. +1786|HSD S.r.L +1788|Motorola Semiconductor Products Sector/US +1789|Boston Acoustics +1790|Gallant Computer, Inc. +1793|Supercomal Wire & Cable SDN. BHD. +1795|Bencent Tzeng Co., Ltd. +1795|Bvtech Industry Inc. +1797|NKK Corporation +1798|Ariel Corporation +1800|Putercom Co., Ltd. +1801|SSL +1802|Oki Electric Industry Co., Ltd +1802|Oki Electric Industry Co., Ltd. +1805|Comoss Electronic Co., Ltd. +1806|Excel Cell Electronic Co., Ltd. +1808|Connect Tech Inc. +1809|Magic Control Technology Corp. +1811|Interval Research Corp. +1815|ZNK Corporation +1816|Imation Corp. +1817|Tremon Enterprised Co., Ltd. +1820|Xionics Document Technologies, Inc. +1821|Dialogic Corporation +1821|Eicon Networks Corporation +1822|Ariston Technologies +1827|Centillium Communications Corporation +1830|Vanguard International Semiconductor-America +1838|Sunix Co., Ltd. +1841|SusTeen, Inc. +1842|Goldfull Electronics & Telecommunications Corp. +1843|ViewQuest Technologies, Inc. +1844|LASAT Communications A/S +1846|Lorom Industrial Co., Ltd. +1848|Mad Catz, Inc. +1850|Chaplet Systems, Inc. +1851|Suncom Technologies +1859|BBnig und Kallenbach oHG +1861|Syntech Information Co., Ltd. +1862|ONKYO Corporation +1863|Labway Corporation +1864|Strong Man Enterprise Co., Ltd. +1865|EVer Electronics Corp. +1866|Ming Fortune Industry Co., Ltd. +1867|Polestar Tech. Corp. +1868|C-C-C Group PLC +1869|Micronas GmbH +1870|Digital Stream Corporation +1877|Aureal Semiconductor +1879|Network Technologies, Inc. +1883|Sophisticated Circuits, Inc. +1891|M-Audio +1892|Cyber Power Systems, Inc. +1893|X-Rite Incorporated +1894|Jess-Link Products Co., Ltd. (JPC) +1895|Tokheim Corporation +1896|Camtel Technology Corp. +1897|SURECOM Technology Corp. +1898|Smart Technology Enablers, Inc. +1899|HID Global GmbH +1900|Partner Tech +1901|Denso Corporation +1902|Kuan Tech Enterprise Co., Ltd. +1903|Jhen Vei Electronic Co., Ltd. +1904|Welch Allyn, Inc - Medical Division +1908|AmTRAN Technology Co., Ltd. +1909|Longshine Electronics Corp. +1910|Inalways Corporation +1911|Comda Advanced Technology Corporation +1912|Volex, Inc. +1913|Fairchild Semiconductor +1914|Sankyo Seiki Mfg. Co., Ltd. +1915|Linksys +1916|Forward Electronics Co., Ltd. +1919|Well Excellent and Most Corp. +1921|SanDisk Corporation +1922|Trackerball +1929|Logitec +1932|GTCO CalComp Peripherals +1934|BRINCOM +1936|Pro-Image Manufacturing Co., Ltd +1937|Copartner Technology Corporation +1938|Axis Communications AB +1939|Wha Yu Industrial Co., Ltd. +1940|ABL Electronics Corporation +1941|SiCore Systems, Inc. +1942|Certicom Corp. +1943|Grandtech Semiconductor Corporation +1947|Sagem +1949|Alfadata Computer Corp. +1954|National Technical Systems +1955|ONNTO Corp. +1956|Be Incorporated +1958|ADMtek Incorporated +1962|corega K.K. +1963|Freecom Computer Peripherals +1969|IMP, Inc. +1970|Motorola BCS +1971|Plustek, Inc. +1972|OLYMPUS CORPORATION +1972|Olympus Optical Co., Ltd. +1973|Mega World International Ltd. +1974|Marubun Corp. +1975|TIME Interconnect Ltd. +1976|AboCom Systems, Inc. +1980|Canon Computer Sytems, Inc. +1981|Webgear Inc. +1982|Veridicom +1984|Code Mercenaries GmbH +1988|Datafab Systems Inc. +1989|APG Cash Drawer +1990|Share Wave, Inc. +1990|ShareWave, Inc. +1991|Powertech Industrial Co., Ltd. +1992|B.U.G., Inc. +1993|Allied Telesyn International +1994|AVerMedia Technologies, Inc. +1996|Carry Technology Co., Ltd. +1999|Casio Computer Co., Ltd. +2001|D-Link Corporation +2001|D-Link System +2002|Aptio Products Inc. +2003|Cyberdata Corp. +2007|GCC Technologies, Inc. +2010|Arasan Chip Systems Inc. +2015|David Electronics Company, Ltd. +2018|Elmeg GmbH and Co., Ltd. +2019|Planex Communications, Inc. +2020|Movado Enterprise Co., Ltd. +2021|QPS, Inc. +2022|Allied Cable Corporation +2023|Mirvo Toys, Inc. +2024|Labsystems +2027|Double-H Technology Co., Ltd. +2028|Taiyo Electric Wire & Cable Co., Ltd. +2038|Circuit Assembly Corp. +2039|Century Corporation +2041|Dotop Technology, Inc. +2049|Mag-Tek +2050|Mako Technologies, LLC +2051|Zoom Telephonics, Inc. +2057|Genicom Corp. +2058|Evermuch Technology Co., Ltd. +2061|TECO Image Systems Co., Ltd. +2064|Personal Communication Systems, Inc. +2067|Mattel, Inc. +2075|Indigita Corporation +2076|Mipsys +2078|AlphaSmart, Inc. +2082|REUDO Corporation +2085|GC Protronics +2086|Data Transit +2087|BroadLogic, Inc. +2088|Sato Corporation +2089|DirecTV Broadband +2093|Handspring Visor +2096|Palm Inc. +2098|Kouwell Electronics Corp. +2099|Source Corporation +2101|Action Star Enterprise Co., Ltd. +2105|Samsung Aerospace Industries Ltd. +2106|Accton Technology Corporation +2112|Argosy Research Inc. +2113|Rioport.com Inc. +2116|Welland Industrial Co., Ltd. +2118|NETGEAR, Inc. +2125|Minton Optic Industry Co., Ltd. +2128|Fast Point Technologies, Inc. +2129|Macronix International Co., Ltd. +2130|CSEM +2135|Gerber Scientific Products, Inc. +2136|Hitachi Maxell Ltd. +2137|Minolta Systems Laboratory, Inc. +2138|Xircom +2146|Teletrol Systems, Inc. +2147|Filanet Corporation +2151|Data Translation, Inc. +2154|Emagic Soft-und Hardware Gmbh +2158|System TALKS Inc. +2159|MEC IMEX INC/HPT +2160|Metricom +2163|Xpeed Inc. +2164|A-Tec Subsystem, Inc. +2169|Comtrol Corporation +2172|ADESSO/Kbtek America Inc. +2173|JATON Corporation +2174|Fujitsu Computer Products of America +2175|QualCore Logic Inc +2176|APT Technologies Inc. +2179|Recording Industry Association of America (RIAA) +2181|Boca Research, Inc. +2182|XAC Automation Corp. +2183|Hannstar Electronics Corp. +2194|DioGraphy Inc. +2204|United Technologies Research Cntr. +2205|Icron Technologies Corporation +2206|NST Co., Ltd. +2213|e9 Inc. +2216|Andrea Electronics +2222|Mace Group, Inc. +2228|Sorenson Vision, Inc. +2232|J. Gordon Electronic Design, Inc. +2233|RadioShack Corporation +2233|Tandy Corporation/Radio Shack +2235|Texas Instruments Japan +2237|Citizen Watch Co., Ltd. +2238|Meilenstein GmbH +2244|Proxim, Inc. +2247|TAI TWUN ENTERPRISE CO., LTD. +2248|2Wire, Inc +2249|Nippon Telegraph and Telephone Corp. +2250|AIPTEK International Inc. +2253|Jue Hsun Ind. Corp. +2254|Long Well Electronics Corp. +2255|Productivity Enhancement Products +2259|Virtual Ink +2260|Siemens PC Systems +2265|Increment P Corporation +2269|Billionton Systems, Inc. +2271|Spyrus Inc. +2276|Pioneer Corporation +2277|LITRONIC +2278|Gemalto SA +2279|PAN-INTERNATIONAL WIRE & CABLE (M) SDN BHD +2280|Integrated Memory Logic +2281|Extended Systems, Inc. +2282|Ericsson Inc., Blue Ridge Labs +2284|M-Systems Flash Disk Pioneers +2286|CCSI/HESSO +2288|CardScan Inc. +2289|CTI Electronics Corporation +2293|SYSTEC Co., Ltd. +2294|Logic 3 International Limited +2296|Keen Top International Enterprise Co., Ltd. +2297|Wipro Technologies +2298|CAERE +2299|Socket Communications +2300|Sicon Cable Technology Co. Ltd. +2301|Digianswer A/S +2303|AuthenTec, Inc. +2305|VST Technologies +2310|FARADAY Technology Corp. +2313|Audio-Technica Corp. +2314|Trumpion Microelectronics Inc +2315|Neurosmith +2316|Silicon Motion, Inc. - Taiwan +2317|MULTIPORT Computer Vertriebs GmbH +2318|Shining Technology, Inc. +2319|Fujitsu Devices Inc. +2320|Alation Systems, Inc. +2321|Philips Speech Processing +2322|Voquette, Inc. +2323|Asante' Technologies, Inc. +2325|GlobeSpan, Inc. +2327|SmartDisk Corporation +2334|Garmin International +2336|Echelon Co. +2337|GoHubs, inc. +2338|Dymo Corporation +2339|IC Media Corporation +2340|Xerox +2340|Xerox Corporation +2343|Summus, Ltd. +2344|Oxford Semiconductor Ltd. +2345|American Biometric Company +2346|Toshiba Information & Industrial Sys. And Services +2347|Sena Technologies, Inc. +2352|Toshiba Corporation +2353|Harmonic Data Systems Ltd. +2354|Crescentec Corporation +2355|Quantum Corp. +2356|Netcom Systems +2361|Lumberg, Inc. +2362|Pixart Imaging, Inc. +2363|Plextor LLC +2365|InnoSync, Inc. +2366|J.S.T. Mfg. Co., Ltd. +2367|OLYMPIA Telecom Vertriebs GmbH +2368|Japan Storage Battery Co., Ltd. +2369|Photobit Corporation +2370|i2Go.com, LLC +2371|HCL Technologies Ltd. +2372|KORG, Inc. +2373|PASCO Scientific +2381|Cable Television Laboratories +2385|Kingston Technology Company +2388|RPM Systems Corporation +2389|NVIDIA +2390|BSquare Corporation +2391|Agilent Technologies, Inc. +2392|CompuLink Research, Inc. +2393|Cologne Chip Designs GmbH +2394|Portsmith +2395|Medialogic Corporation +2396|K-Tec Electronics +2397|Polycom, Inc. +2408|Catalyst Enterprises, Inc. +2417|GretagMacbeth AG +2419|Axalto +2419|Schlumberger +2420|Datagraphix, a business unit of Anacomp +2421|OL'E Communications, Inc. +2422|Adirondack Wire & Cable +2423|Lightsurf Technologies +2424|Beckhoff Gmbh +2425|Jeilin Technology Corp., Ltd. +2426|Minds At Work LLC +2427|Knudsen Engineering Limited +2428|Marunix Co., Ltd. +2429|Rosun Technologies, Inc. +2431|Barun Electronics Co. Ltd. +2433|Oak Technology Ltd. +2436|Apricorn +2438|Matsushita Electric Works, Ltd. +2444|Vitana Corporation +2445|INDesign +2446|Integrated Intellectual Property Inc. +2447|Kenwood TMI Corporation +2454|Integrated Telecom Express, Inc. +2467|PairGain Technologies +2468|Contech Research, Inc. +2469|VCON Telecommunications +2470|Poinchips +2471|Data Transmission Network Corp. +2472|Lin Shiung Enterprise Co., Ltd. +2473|Smart Card Technologies Co., Ltd. +2474|Intersil Corporation +2475|Japan Cash Machine Co., Ltd. +2478|Tripp Lite +2482|Franklin Electronic Publishers +2483|Altius Solutions, Inc. +2484|MDS Telephone Systems +2485|Celltrix Technology Co., Ltd. +2497|ARRIS International +2498|NISCA Corporation +2499|ACTIVCARD, INC. +2500|ACTiSYS Corporation +2501|Memory Corporation +2508|Workbit Corporation +2509|Psion Dacom Plc +2510|City Electronics Ltd. +2511|Electronics Testing Center, Taiwan +2513|NeoMagic Inc. +2514|Vreelin Engineering Inc. +2515|COM ONE +2521|Jungo +2522|A-FOUR TECH CO., LTD. +2523|Measurement Computing Corporation +2524|AIMEX Corporation +2525|Fellowes Inc. +2525|Fellowes Manufacturing Co. +2527|Addonics Technologies Corp. +2529|Intellon Corporation +2533|Jo-Dan International, Inc. +2534|Silutia, Inc. +2535|Real 3D, Inc. +2536|AKAI professional M.I. Corp. +2537|CHEN-SOURCE INC. +2549|ARESCOM +2550|RocketChips, Inc. +2551|EDU-SCIENCE (H.K.) LIMITED +2552|SoftConnex Technologies, Inc. +2553|Bay Associates +2554|Mtek Vision +2555|Altera +2559|Gain Technology Corp. +2560|Liquid Audio +2561|ViA, Inc. +2571|Cybex Computer Products Corporation +2577|Xentec Incorporated +2578|Cambridge Silicon Radio Ltd. +2579|Telebyte Inc. +2580|Spacelabs Healthcare +2580|Spacelabs Medical Inc. +2581|Scalar Corporation +2582|Trek Technology (S) Pte Ltd +2583|HOYA Corporation +2584|Heidelberger Druckmaschinen AG +2585|Hua Geng Technologies Inc. +2593|Medtronic Physio Control Corp. +2594|Century Semiconductor USA, Inc. +2595|NDS Technologies Israel Ltd. +2617|Gilat Satellite Networks Ltd. +2618|PentaMedia Co., Ltd. +2620|NTT DoCoMo,Inc. +2621|Varo Vision +2627|Boca Systems Inc. +2628|TurboLinux +2629|Look&Say co., Ltd. +2630|Davicom Semiconductor, Inc. +2631|Hirose Electric Co., Ltd. +2632|I/O Interconnect +2635|Fujitsu Media Devices Limited +2636|COMPUTEX Co., Ltd. +2637|Evolution Electronics Ltd. +2638|Steinberg Soft-und Hardware GmbH +2639|Litton Systems Inc. +2640|Mimaki Engineering Co., Ltd. +2641|Sony Electronics Inc. +2642|JEBSEE ELECTRONICS CO., LTD. +2643|Portable Peripheral Co., Ltd. +2650|Electronics For Imaging, Inc. +2651|EASICS NV +2652|Broadcom Corp. +2653|Diatrend Corporation +2654|Spinnaker Systems Inc. +2661|FullAudio, Inc. +2662|ClearCube Technology +2662|INT LABS +2663|Medeli Electronics Co, Ltd. +2664|COMAIDE Corporation +2665|Chroma ate Inc. +2666|Newcom Inc. +2667|Green House Co., Ltd. +2668|Integrated Circuit Systems Inc. +2669|UPS Manufacturing +2670|Benwin +2671|Core Technology, Inc. +2672|International Game Technology +2673|VIPColor Technologies USA, Inc. +2674|Sanwa Denshi +2685|Intertek NSTL +2686|Octagon Systems Corporation +2687|AVerMedia MicroSystems +2688|Rexon Technology Corp., Ltd +2689|CHESEN ELECTRONICS CORP. +2690|SYSCAN +2691|NextComm, Inc. +2692|Maui Innovative Peripherals +2693|IDEXX LABS +2694|NITGen Co., Ltd. +2700|Tecmar +2701|Picturetel +2702|Japan Aviation Electronics Industry Ltd. (JAE) +2703|Young Chang Co. Ltd. +2704|Candy Technology Co., Ltd. +2705|Globlink Technology Inc. +2706|EGO SYStems Inc. +2707|C Technologies AB (publ) +2708|Intersense +2723|Lava Computer Mfg. Inc. +2724|Develco Elektronik +2725|First International Digital +2726|Perception Digital Limited +2727|Wincor Nixdorf GmbH & Co KG +2728|TriGem Computer, Inc. +2729|Baromtec Co. +2730|Japan CBM Corporation +2731|Vision Shape Europe SA. +2732|iCompression Inc. +2733|Rohde & Schwarz GmbH & Co. KG +2734|NEC infrontia Corporation +2734|Nitsuko Corporation +2735|digitalway co., ltd. +2736|Arrow Strong Electronics CO. LTD +2755|SANYO Semiconductor Company Micro +2756|LECO CORPORATION +2757|I & C Corporation +2758|Singing Electrons, Inc. +2759|Panwest Corporation +2760|Vimicro Corporation +2760|Z-Star Microelectronics Corporation +2761|Micro Solutions, Inc. +2764|Koga Electronics Co. +2765|ID Tech +2766|ZyDAS Technology Corporation +2767|Intoto, Inc. +2768|Intellix Corp. +2769|Remotec Technology Ltd. +2770|Service & Quality Technology Co., Ltd. +2787|Allion Test Labs, Inc. +2788|Taito Corporation +2789|MacroSystem Digital Video AG +2790|EVI, Inc. +2791|Neodym Systems Inc. +2792|System Support Co., Ltd. +2793|North Shore Circuit Design L.L.P. +2794|SciEssence, LLC +2795|TTP Communications Ltd. +2796|Neodio Technologies Corporation +2800|Option NV +2806|SILVER I CO., LTD. +2807|B2C2, Inc. +2812|Zaptronix Ltd +2813|Tateno Dennou, Inc. +2814|Cummins Engine Company +2815|Jump Zone Network Products, Inc. +2816|INGENICO +2821|ASUSTek Computer Inc. +2828|Todos Data System AB +2830|GN Netcom +2831|AVID Technology +2832|Pcally +2833|I Tech Solutions Co., Ltd. +2846|Electronic Warfare Assoc., Inc. (EWA) +2847|Insyde Software +2848|TransDimension Inc. +2849|Yokogawa Electric Corporation +2850|Japan System Development Co. Ltd. +2851|Pan-Asia Electronics Co., Ltd. +2852|Link Evolution Corp. +2855|Ritek Corporation +2856|Kenwood Corporation +2860|Village Center, Inc. +2864|NewHeights Software +2867|Contour Design, Inc. +2871|Hitachi ULSI Systems Co., Ltd. +2873|Omnidirectional Control Technology Inc. +2874|IPaxess +2875|Bromax Communications, Inc. +2876|Olivetti S.p.A +2876|Olivetti Tecnost +2878|Kikusui Electronics Corporation +2881|Hal Corporation +2888|TechnoTrend AG +2889|ASCII Corporation +2894|Musical Electronics Ltd. +2898|Colorado MicroDisplay, Inc +2900|Sinbon Electronics Co., Ltd. +2905|Lake Communications Ltd. +2912|Nsine Limited +2913|NEC Viewtechnology, Ltd. +2914|Orange Micro, Inc. +2917|Expert Magnetics Corp. +2921|CacheVision +2922|Maxim Integrated Products +2927|Nagano Japan Radio Co., Ltd +2928|PortalPlayer, Inc +2933|Roland DG Corporation +2949|Elkat Electronics (M) SDN. BHD. +2950|Exputer Systems, Inc. +2965|ASIX Electronics Corp. +2965|ASIX Electronics Corporation +2966|SEWON TELECOM +2967|O2 Micro, Inc. +2991|U.S. Robotics +2992|Concord Camera Corp. +2994|Ambit Microsystems Corporation +2995|Ofuji Technology +2996|HTC Corporation +2997|Murata Manufacturing Co., Ltd. +3000|Hitachi Semiconductor and Devices Sales Co., Ltd. +3000|Renesas Technology Sales Co., Ltd. +3009|FUW YNG ELECTRONICS COMPANY LTD +3010|Seagate LLC +3011|IPWireless, Inc. +3014|ExWAY Inc. +3015|X10 Wireless Technology, Inc. +3019|Perfect Technic Enterprise Co. LTD +3034|Realtek Semiconductor Corp. +3035|Ericsson AB +3042|Kanda Tsushin Kogyo Co., LTD +3044|Elka International Ltd. +3045|DOME Imaging Systems, Inc +3046|Wonderful Photoelectricity (DongGuan), Co., Ltd. +3054|LTK International Limited +3056|Pace Micro Technology PLC +3062|Addonics Technologies, Inc. +3063|Sunny Giken Inc. +3064|Fujitsu Siemens Computers GmbH +3078|Hasbro, Inc. +3079|Infinite Data Storage LTD +3083|Dura Micro, Inc. +3093|Iris Graphics +3100|Hang Zhou Silan Microelectronics Co. Ltd +3106|TallyGenicom L.P. +3108|Taiyo Yuden Co., Ltd. +3109|Sampo Corporation +3128|Der An Electric Wire & Cable Co. Ltd. +3129|Aeroflex +3130|Furui Precise Component (Kunshan) Co., Ltd +3131|Komatsu Ltd. +3132|Radius Co., Ltd. +3140|Motorola iDEN +3141|Sonix Technology Co., Ltd. +3154|Sealevel Systems, Inc. +3156|GLORY LTD. +3157|Spectrum Digital Inc. +3158|Billion Bright Limited +3159|Imaginative Design Operation Co. Ltd. +3161|Dong Guan Shinko Wire Co., Ltd. +3168|Apogee Electronics Corp +3170|Chant Sincere Co., Ltd +3171|Toko, Inc. +3172|Signality System Engineering Co., Ltd. +3173|Eminence Enterprise Co., Ltd. +3175|Concept Telecom Ltd +3176|Whanam Electronics Co., Ltd. +3190|Solid State System Co., Ltd. +3193|NuConnex Technologies PTE LTD +3194|Wing-Span Enterprise Co., Ltd. +3208|Kyocera Wireless Corp. +3209|Honda Tsushin Kogyo Co., Ltd +3213|Tempo +3214|Cesscom Co., Ltd. +3225|Innochips Co., Ltd. +3226|Hanwool Robotics Corp. +3238|Castles Technology Co. Ltd. +3245|Motorola CGISS +3245|Motorola G&PS +3247|Buslink +3255|Singatron Enterprise Co. Ltd. +3256|Opticis Co., Ltd. +3259|Shanghai Darong Electronics Co., Ltd. +3261|Pentel Co., Ltd. (Electronics Equipment Div.) +3262|Keryx Technologies, Inc. +3263|Union Genius Computer Co., Ltd +3264|Kuon Yi Industrial Corp. +3266|Timex Corporation +3268|emsys GmbH +3270|INTERMAGIC CORP. +3274|AMPHENOL +3276|DOMEX TECHNOLOGY CORPORATION +3289|Shin Din Cable Ltd. +3294|Z-Com INC. +3313|e-CONN ELECTRONIC CO., LTD. +3314|ENE Technology Inc. +3315|Atheros Communications, Inc. +3318|Compucable Corporation +3321|Central System Research Co., Ltd. +3324|Minolta-QMS, Inc. +3340|Astron Electronics Co., Ltd. +3343|Feng Shin Cable Co. Ltd. +3347|BMF CORPORATION +3348|Array Comm, Inc. +3349|OnStream b.v. +3350|Hi-Touch Imaging Technologies Co., Ltd. +3351|NALTEC, Inc. +3353|Hank Connection Industrial Co., Ltd. +3381|Dah Kun Co., Ltd. +3388|SRI CABLE TECHNOLOGY LTD. +3389|TANGTOP TECHNOLOGY CO., LTD. +3391|MTS Systems Corporation +3393|Ta Yun Electronic Technology Co., Ltd. +3394|FULL DER CO., LTD. +3401|Maxtor +3402|NF Corporation +3403|Grape Systems Inc. +3405|Coherent Inc. +3406|Agere Systems Netherland BV +3409|Volex (Asia) Pte Ltd +3411|HMI Co., Ltd. +3413|ASKA Technologies Inc. +3414|AVLAB Technology, Inc. +3423|CSI, Inc. +3424|IVL Technologies Ltd. +3425|MEILU ELECTRONICS (SHENZHEN) CO., LTD. +3426|Darfon Electronics Corp. +3427|Fritz Gegauf AG +3428|DXG Technology Corp. +3429|KMJP CO., LTD. +3430|TMT +3431|Advanet Inc. +3432|Super Link Electronics Co., Ltd. +3433|NSI +3434|Megapower International Corp. +3435|And-Or Logic +3440|Try Computer Co. LTD. +3442|Winmate Communication Inc. +3443|Hit's Communications INC. +3446|MFP Korea, Inc. +3447|Power Sentry/Newpoint +3448|Japan Distributor Corporation +3450|MARX CryptoTech LP +3452|Taiwan Line Tek Electronic Co., Ltd. +3453|Add-On Technology Co., Ltd. +3454|American Computer & Digital Components +3455|Essential Reality LLC +3456|H.R. Silvine Electronics Inc. +3457|TechnoVision +3459|Think Outside, Inc. +3463|Dolby Laboratories Inc. +3465|Oz Software +3466|KING JIM CO., LTD. +3467|Ascom Telecommunications Ltd. +3468|C-MEDIA ELECTRONICS INC. +3469|Promotion & Display Technology Ltd. +3470|Global Sun Technology Inc. +3471|Pitney Bowes +3472|Sure-Fire Electrical Corporation +3480|Mars Semiconductor Corp. +3481|Trazer Technologies Inc. +3482|RTX Telecom A/S +3483|Tat Shing Electrical Co. +3484|Chee Chen Hi-Technology Co., Ltd. +3485|Sanwa Supply Inc +3486|Avaya +3487|Powercom Co., Ltd. +3488|Danger Research +3489|Suzhou Peter's Precise Industrial Co., Ltd. +3491|Nippon Electro-Sensory Devices Corporation +3495|IOGEAR, Inc. +3501|Westover Scientific +3504|Micro-Star International Co., Ltd. +3505|Wen Te Electronics Co., Ltd. +3506|Shian Hwi Plug Parts, Plastic Factory +3507|Tekram Technology Co. Ltd. +3508|Chung Fu Chen Yeh Enterprise Corporation +3518|Jiuh Shiuh Precision Industry Co., Ltd. +3519|Quik Tech Solutions +3520|Great Notions +3521|Tamagawa Seiki Co., Ltd. +3523|Athena Smartcard Solutions Inc. +3524|Macpower Peripherals Ltd. +3525|SDK Co, Ltd. +3526|Precision Squared Technology Corporation +3527|First Cable Line, Inc. +3537|Contek Electronics Co., Ltd. +3538|Power Quotient International Co., Ltd. +3539|MediaQ +3540|Custom Engineering SPA +3541|California Micro Devices +3543|KOCOM CO., LTD +3545|HighSpeed Surfing +3546|Integrated Circuit Solution Inc. +3547|Tamarack Inc. +3548|Takaotec +3549|Datelink Technology Co., Ltd. +3550|UBICOM, INC +3552|BD Consumer Healthcare +3562|UTECH Electronic (D.G.) Co., Ltd. +3563|Lean Horn Co. +3564|Callserve Communications Ltd. +3565|Novasonics +3566|Lifetime Memory Products +3567|Full Rise Electronic Co., Ltd. +3574|Sitecom Europe B.V. +3575|Mobile Action Technology Inc. +3576|Hoya Computer Co., Ltd. +3577|Nice Fountain Industrial Co., Ltd. +3578|Toyo Communication Equipment Co., Ltd. +3580|General Touch Technology Co., Ltd. +3585|Sheng Xiang Investment Ltd. +3586|Doowon Co., LTD +3587|Nippon Systemware Co., Ltd. +3591|Viewtek Co., Ltd +3592|Winbest Technology Co., Ltd. +3593|Winskon Cabling Specialist Co., Ltd. +3599|VMWare, Inc. +3602|Danam Communications Inc. +3603|Lugh Networks, Inc. +3605|Tellert Elektronik GmbH +3606|JMTEK, LLC +3607|Walex Electronic Ltd. +3608|UNIWIDE Technologies +3615|Cabin Industrial Co., Ltd. +3618|Symbian Ltd. +3619|Liou Yuane International Ltd. +3620|Samson Electric Wire Co., Ltd. +3621|VinChip Systems, Inc. +3622|J-Phone East Co., Ltd. +3632|HeartMath LLC +3636|Micro Computer Control Corp. +3637|3Pea Technologies, Inc. +3638|TiePie engineering +3639|Alpha Data Corp. +3640|Stratitec, Inc. +3641|Smart Modular Technologies, Inc. +3642|Neostar Technology Co., Ltd. +3643|Mansella Ltd. +3644|Raytec Electronic Co., Ltd. +3650|Puretek Industrial Co., Ltd. +3651|Holly Lin International Technology Inc. +3652|Sun-Riseful Technology Co., Ltd. +3653|SafeNet B.V. +3654|Delphi Automotive +3654|Delphi Corporation +3658|Shenzhen Bao Hing Electric Wire & Cable Mfr. Co. +3659|System General Corp. +3660|Radica Games Ltd. +3661|Hong Shi Precision Corp. +3662|Lih Duo Intl. Co., Ltd. +3669|Speed Dragon Multimedia Ltd. +3674|ACTIVE CO., LTD. +3675|Union Power Information Industrial Co., Ltd. +3676|Bitland Information Technology Co., Ltd. +3677|Neltron Industrial Co., Ltd. +3678|Conwise Technology Co., Ltd. +3679|Entone Technologies +3680|XAVi Technologies Corp. +3681|E-Pen InMotion Inc. +3687|Fossil +3689|A Global Partner Corporation +3690|Megawin Technology Co., Ltd. +3696|Tokyo Electronic Industry Co, LTD. +3697|Schwarzer GmbH +3698|Hsi-Chin Electronics Co., Ltd. +3699|MCK Communications, Inc. +3700|Accu-Automation Corp. +3701|TVS Electronics Limited +3704|Ascom Powerline Communications Ltd. +3707|On-Tech Industry Co., Ltd. +3708|Legend Holdings Limited +3714|Ching Tai Electric Wire & Cable Co., Ltd. +3715|Shin An Wire & Cable Co. +3716|Elelux International Ltd. +3721|PRT Manufacturing Ltd. +3722|FinePoint Innovations, Inc. +3723|KAO SHIN PRECISION INDUSTRY CO., LTD. +3724|Well Force Electronic Co., Ltd +3725|MediaTek Inc. +3728|WiebeTech LLC +3729|VTech Engineering Canada Ltd. +3730|C'S GLORY ENTERPRISE CO., LTD. +3731|eM Technics Co., Ltd. +3733|Future Technology Co., Ltd +3734|APLUX Communications Ltd. +3735|Fingerworks, Inc. +3736|Advanced Analogic Technologies, Inc. +3737|Parallel Dice Co., Ltd. +3738|TA HSING INDUSTRIES LTD. +3739|ADTEC CORPORATION +3743|TAMURA CORPORATION +3744|Ours Technology Inc. +3750|Nihon Computer Co., Ltd. +3751|MSL Enterprises Corp. +3752|CenDyne, Inc. +3757|HUMAX Co., Ltd. +3761|WIS Technologies, Inc. +3762|Y-S ELECTRONIC CO., LTD. +3763|Saint Technology Corp. +3767|Endor AG +3768|Mettler-Toledo (Albstadt) GmbH +3774|VWEB Corporation +3775|Omega Technology of Taiwan Inc. +3776|LHI Technology (China) Co., Ltd. +3777|ABIT Computer Corporation +3778|Sweetray Industrial Ltd. +3779|AXELL CO., LTD. +3780|Ballracing Developments Ltd. +3781|GT Information System Co., Ltd. +3782|InnoVISION Multimedia Limited +3783|Theta Link Corporation +3789|Lite-On IT Corp. +3790|TaiSol Electronics Co., Ltd. +3791|Phogenix Imaging, LLC +3794|Kyoto Micro Computer Co., LTD. +3795|Wing-Tech Enterprise Co., Ltd. +3801|Holy Stone Enterprise Co., Ltd. +3802|ISE Electronics Corp. +3802|NORITAKE ITRON CORPORATION +3807|e-MDT Co., Ltd. +3808|SHIMA SEIKI MFG., LTD. +3809|Sarotech Co., Ltd. +3810|AMI Semiconductor Inc. +3811|ComTrue Technology Corporation (Taiwan) +3812|Sunrich Technology (H.K.) Ltd. +3822|Digital STREAM Technology, Inc. +3823|D-WAV SCIENTIFIC CO., LTD. +3824|Hitachi Cable, Ltd. +3825|Aichi Micro Intelligent Corporation +3826|I/OMAGIC CORPORATION +3827|Lynn Products, Inc. +3828|DSI Datotech +3829|PointChips +3830|Yield Microelectronics Corp. +3831|SM Tech Co., Ltd. +3837|Oasis Semiconductor +3838|WEM TECHNOLOGY INC. +3846|Visual Frontier Precision Corp. +3848|CSL Wire & Plug (Shen Zhen) Company +3852|CAS Corporation +3853|HORI CO., LTD. +3854|Energy Full Corp. +3858|MARS ENGINEERING CORPORATION +3859|Acetek Technology Co., Ltd. +3865|ORACOM CO., Ltd. +3867|Onset Computer Corporation +3868|Funai Electric Co., Ltd. +3869|Iwill Corporation +3872|GENNUM CORPORATION +3873|IOI Technology Corporation +3874|SENIOR INDUSTRIES, INC. +3875|Leader Tech Manufacturer Co., Ltd +3876|FLEX-P INDUSTRIES SDN.BHD. +3885|ViPower, Inc. +3886|Geniality Maple Technology Co., Ltd. +3886|Good Man Corporation +3887|Priva Design Services +3888|Jess Technology Co., Ltd. +3889|Chrysalis Development +3890|YFC-BonEagle Electric Co., Ltd. +3890|YFC-Boneagle Electric Co., Ltd. +3891|Futek Electronics, Co., Ltd. +3895|Kokuyo Co., Ltd. +3896|Nien-Yi Industrial Corp. +3905|RDC Semiconductor Co., Ltd. +3906|Nital Consulting Services, Inc. +3915|St. John Technology Co., Ltd. +3916|WORLDWIDE CABLE OPTO CORP. +3917|Microtune, Inc. +3918|Freedom Scientific +3922|WING KEI ELECTRICAL CO., LTD. +3923|Dongguan White Horse Cable Factory Ltd. +3923|Taiyo Cable (Dongguan) Co. Ltd. +3924|Kawai Musical Instruments Mfg. Co., Ltd. +3925|AmbiCom, Inc. +3932|PRAIRIECOMM, INC. +3933|NewAge International, LLC +3935|Key Technology Corporation +3936|GuangZhou Chief Tech Electronic Technology Co. Ltd. +3937|Varian Inc. +3938|Acrox Technologies Co., Ltd. +3944|TEPCO UQUEST, LTD. +3945|DIONEX CORPORATION +3946|Vibren Technologies Inc. +3955|DFI +3964|DQ Technology, Inc. +3965|NetBotz, Inc. +3966|Fluke Networks Corporation +3976|VTech Holdings Ltd. +3979|Yazaki Corporation +3980|Young Generation International Corp. +3981|Uniwill Computer Corp. +3982|Kingnet Technology Co., Ltd. +3983|SOMA NETWORKS +3991|CviLux Corporation +3992|CYBERBANK CORP. +3998|Lucent Technologies +4003|STARCONN Electronic Co., Ltd. +4004|ATL Technology +4005|SOTEC CO., LTD. +4007|EPOX COMPUTER CO., LTD. +4008|Logic Controls, Inc. +4015|Winpoint Electronic Corp. +4016|Haurtian Wire & Cable Co., Ltd. +4017|Inclose Design Inc. +4018|Conteck Co., Ltd. +4024|Wistron Corporation +4025|AACOM CORPORATION +4026|SAN SHING ELECTRONICS CO., LTD.. +4027|Bitwise Systems, Inc. +4033|MITAC INTERNATIONAL CORP. +4034|PLUG AND JACK INDUSTRIAL INC. +4038|Dataplus Supplies, Inc. +4046|Sony Ericsson Mobile Communications AB +4047|Dynastream Innovations Inc. +4048|Tulip Computers B.V. +4052|Tenovis GmbH & Co., KG +4053|Direct Access Technology, Inc. +4060|Micro Plus +4068|IN-TECH ELECTRONICS LIMITED +4069|TC&C ELECTRONIC CO.,LTD (SUNTECC, INC.) +4074|United Computer Accessories +4075|CRS ELECTRONIC CO., LTD. +4076|UMC Electronics Co., Ltd. +4077|ACCESS CO., LTD. +4078|Xsido Corporation +4079|MJ RESEARCH, INC. +4086|Core Valley Co., Ltd. +4087|CHI SHING COMPUTER ACCESSORIES CO., LTD. +4095|Aopen Inc. +4096|Speed Tech Corp. +4097|Ritronics Components (S) Pte. Ltd. +4099|SIGMA CORPORATION +4100|LG Electronics Inc. +4101|Animeta Systems, Inc. +4101|Apacer Technology Inc. +4105|Lumanate, Inc. +4106|AV Chaseway Ltd. +4107|Chou Chin Industrial Co., Ltd. +4109|NETOPIA, INC. +4112|FUKUDA DENSHI CO., LTD. +4113|Mobile Media Tech. +4114|SDKM Fibres, Wires & Cables Berhad +4115|TST-Touchless Sensor Technology AG +4116|Densitron Technologies PLC +4117|Softronics Pty. Ltd. +4118|Xiamen Hung's Enterprise Co., Ltd. +4119|SPEEDY INDUSTRIAL SUPPLIES PTE. LTD. +4130|Shinko Shoji Co., Ltd. +4133|Hyper-PALTEK +4134|Newly Corporation +4135|Time Domain +4136|Inovys Corporation +4137|Atlantic Coast Telesys +4138|RAMOS Technology Co., Ltd. +4139|Infotronic America, Inc. +4140|Etoms Electronics Corp. +4141|Winic Corporation +4143|WENZHOU YIHUA COMMUNICATED CONNECTOR CO., LTD. +4145|Comax Technology Inc. +4146|C-One Technology Corp. +4147|Nucam Corporation +4163|iCreate Technologies Corporation +4164|Chu Yuen Enterprise Co., Ltd. +4168|Targus Group International +4172|AMCO TEC International Inc. +4179|Immanuel Electronics Co., Ltd. +4180|BMS International Beheer N.V. +4181|Complex Micro Interconnection Co., Ltd. +4182|Hsin Chen Ent Co., Ltd. +4183|ON Semiconductor +4184|Western Digital Technologies, Inc. +4185|Giesecke & Devrient GmbH +4188|Freeway Electronic Wire & Cable (Dongguan) Co., Ltd. +4189|Delkin Devices, Inc. +4190|Valence Semiconductor Design Limited +4191|Chin Shong Enterprise Co., Ltd. +4192|Easthome Industrial Co., Ltd. +4202|Loyal Legend Limited +4204|Curitel Communications, Inc. +4205|San Chieh Manufacturing Ltd. +4206|ConectL +4207|Money Controls +4214|GCT Semiconductor, Inc. +4222|MIDORIYA ELECTRIC CO., LTD. +4223|KidzMouse, Inc. +4226|Shin-Etsukaken Co., Ltd. +4227|CANON ELECTRONICS INC. +4228|PANTECH CO., LTD. +4234|Chloride Power Protection +4235|Grand-tek Technology Co., Ltd. +4236|Robert Bosch GmbH +4238|Lotes Co., Ltd. +4249|Surface Optics Corporation +4255|eSOL Co., Ltd. +4256|HIROTECH, INC. +4259|MITSUBISHI MATERIALS CORPORATION +4265|SK Teletech Co., Ltd. +4266|Cables To Go +4267|USI Co., Ltd. +4268|Honeywell, Inc. +4270|Princeton Technology Corp. +4277|Comodo +4283|TM Technology Inc. +4284|Dinging Technology Co., Ltd. +4285|TMT TECHNOLOGY, INC. +4292|Silicon Laboratories, Inc. +4293|Sanei Electric Inc. +4294|Intec, Inc. +4299|eratech +4300|GBM Connector Co., Ltd. +4301|Kycon Inc. +4308|Man Boon Manufactory Ltd. +4309|Uni Class Technology Co., Ltd. +4310|Actions Semiconductor Co., Ltd. +4318|Authenex, Inc. +4319|In-Win Development Inc. +4320|Bella Corporation +4321|CABLEPLUS LTD. +4322|Nada Electronics, Ltd. +4332|Vast Technologies Inc. +4347|Pictos Technologies, Inc. +4352|VirTouch Ltd. +4353|EASYPASS INDUSTRIAL CO., LTD. +4360|BRIGHTCOM TECHNOLOGIES LTD. +4362|MOXA Technologies Co., Ltd. +4368|Analog Devices Canada Ltd. +4370|YM ELECTRIC CO., LTD. +4371|Medion AG +4381|Centon Electronics +4382|VSO Electric Co., Ltd. +4398|Master Hill Electric Wire and Cable Co., Ltd. +4399|Cellon International +4400|Tenx Technology, Inc. +4401|Integrated System Solution Corp. +4412|Arin Tech Co., Ltd. +4413|Mapower Electronics Co. Ltd. +4417|V ONE MULTIMEDIA PTE LTD +4422|Shimane SANYO Electric Co., Ltd. +4423|Ever Great Electric Wire and Cable Co., Ltd. +4427|Sphairon Technologies GmbH +4428|Tinius Olsen Testing Machine Co., Inc. +4429|Alpha Imaging Technology Corp. +4443|Salix Technology Co., Ltd. +4450|Secugen Corporation +4451|DeLorme Publishing Inc. +4452|YUAN High-Tech Development Co., Ltd. +4453|Telson Electronics Co., Ltd. +4454|Bantam Interactive Technologies +4455|Salient Systems Corporation +4456|BizConn International Corp. +4462|Gigastorage Corp. +4463|Silicon 10 Technology Corp. +4469|Sheng Yih Technologies Co., Ltd. +4469|Shengyih Steel Mold Co., Ltd. +4477|Santa Electronic Inc. +4478|JNC, Inc. +4482|Venture Corporation Limited +4483|Digital Dream Co. Europe Ltd. +4484|Kyocera Elco Corporation +4488|Bloomberg L.P. +4489|Trisat Industrial Co., Ltd. +4495|You Yang Technology Co., Ltd. +4496|Tripace +4497|Loyalty Founder Enterprise Co., Ltd. +4503|Technoimagia Co., Ltd. +4504|StarShine Technology Corp. +4505|Sierra Wireless Inc. +4506|DONG GUAN JALINK ELECTRONICES CO.,LTD +4506|ZHAN QI Technology Co., Ltd. +4515|Technovas Co., Ltd. +4520|Hoeft & Wessel AG +4522|GlobalMedia Group, LLC +4523|Exito Electronics Co., Ltd. +4527|Valence Semiconductor +4528|ATECH FLASH TECHNOLOGY +4529|New Motion Tec. Corp. +4544|Sanmos Microelectronics Corp. +4552|Fullcom Technology Corp. +4553|Monster Cable Products, Inc. +4559|Nemoto Kyorindo Co., Ltd. +4566|FUJIFILM AXIA CO., LTD. +4571|Topfield Co., Ltd. +4581|CHUFON Technology Co., Ltd. +4582|K.I. Technology Co. Ltd. +4583|Rockford Corporation +4584|NAAT Technology Corp. +4585|Wincan Technology Co., Ltd. +4586|PAN RAM International Corp. +4587|VTech Innovation L.P. dba Advanced American Telephones +4588|Hitachi Computer Peripherals Co., Ltd. +4591|Cableplus Industrial Co., Ltd. +4597|Siemens Mobile Phones +4610|KUK JE TONG SHIN CO., LTD. +4622|HUDSON SOFT CO., LTD. +4631|Goyatek Technology Inc. +4632|Geutebrueck GmbH +4633|COMPAL COMMUNICATIONS, INC. +4638|Jungsoft Co., Ltd. +4643|SKYCABLE ENTERPRISE. CO., LTD. +4649|EPO Science & Technology Inc. +4655|Takasic +4656|Chipidea-Microelectronica, S.A. +4657|CHI MEI COMMUNICATION SYSTEMS, INC. +4667|De La Rue Systems Automatizacao +4668|K-Won C & C Co., Ltd. +4674|MAC SYSTEM CO., LTD. +4682|AirVast Technology Inc. +4683|NYKO Technologies, Inc. +4689|Iwaya Corporation +4690|Nextway Co., Ltd. +4691|Erebus Limited +4698|Shintake Sangyo Co., Ltd. +4703|ADATA Technology Co., Ltd. +4705|All Ring Tech Co., Ltd. +4706|MICRO VISION CO., LTD. +4707|Opti Japan Corporation +4708|Covidien Energy-based Devices +4715|Veridian Systems +4716|Aristocrat Technologies +4717|Bel Stewart +4718|Strobe Data, Inc. +4719|TwinMOS Technologies Inc. +4720|Procomp Informatics Ltd. +4721|Foxda Technology Industrial (Shenzhen) Co., Ltd. +4722|Linear Technology Corporation +4736|Animeta Systems Inc. +4737|Gean Sen Electronic Co., Ltd. +4742|MARVELL SEMICONDUCTOR, INC. +4753|Flarion Technologies +4754|Fire International Ltd. +4756|RISO KAGAKU CORP. +4763|CyberTAN Technology Inc. +4764|Min Aik Technology Co., Ltd. +4765|Yueqing Longhua Electronics Factory +4771|KENT WORLD CO., LTD. +4772|Guangdong Matsunichi Communications Technology Co., Ltd +4775|Trendchip Technologies Corp. +4779|Honey Bee Electronic International Ltd. +4781|Asahi Seiko Co., Ltd. +4786|DICKSON Company +4787|Megaforce Company Ltd. +4792|Zhejiang Xinya Electronic Technology Co., Ltd. +4793|Freehand Systems, Inc. +4794|Sony Computer Entertainment America +4797|Sun Light Application Co., Ltd. +4809|Newmen Technology Corp. Ltd. +4817|Huawei Technologies Co., Ltd. +4818|LINE TECH INDUSTRIAL CO., LTD. +4823|BETTER WIRE FACTORY CO., LTD. +4824|Araneus Information Systems Oy +4825|DIGITFAB INTERNATIONAL CO., LTD. +4829|Alec Electronics Co.,Ltd. +4830|National Display Systems +4836|Bruel & Kjaer Sound & Vibration Meas. A/S +4841|Mindspeed Technologies +4852|Glovic Electronics Corp. +4853|Dynamic System Electronics Corp. +4855|Memorex Products, Inc. +4857|RF-LINK SYSTEMS, INC. +4858|RF Micro Devices +4862|E.U CONNECTOR(M) SDN BHD. +4870|Torcon Instruments Inc. +4871|USBest Technology Inc. +4882|ICS Electronics +4887|PC-CRAFT Co., Ltd. +4888|O'RITE TECHNOLOGY Co., Ltd. +4895|Ayuttha Technology Corp. +4899|Zeustech Company Limited +4900|H-Mod, Inc. +4905|Appairent Technologies, Inc. +4906|Envara +4907|Konica Minolta Holdings, Inc. +4908|Le Prestique International (H.K.) Ltd. +4923|FLASH SUPPORT GROUP, INC. +4924|G-Design Technology +4930|Sutter Instrument Company +4933|Sino Lite Technology Corp. +4936|Katsuragawa Electric Co., Ltd. +4950|Techpoint Electric Wire & Cable Co., Ltd. +4955|M-System Co., Ltd. +4970|Pelco +4971|STEC +4971|SimpleTech +4972|Datastor Technology Co., Ltd. +4976|Swissbit AG +4980|American Anko Co. +4981|TCL MOBILE COMMUNICATION CO., LTD. +4982|Vimtron Electronics Co., Ltd. +4989|Pericom Semiconductor Corp. +5054|Ricoh Printing Systems, Ltd. +5066|JyeTai Precision Industrial Co., Ltd. +5071|Wisair Ltd. +5073|A-Max Technology Macao Commercial Offshore Co. Ltd. +5075|AzureWave Technologies, Inc. +5084|ALEREON, INC. +5085|i.Tech Dynamic Limited +5089|Kaibo Wire & Cable (Shenzhen) Co., Ltd. +5117|Initio Corporation +5118|Phison Electronics Corp. +5122|Bowe Bell & Howell +5134|Telechips, Inc. +5136|Novatel Wireless, Inc. +5145|ABILITY ENTERPRISE CO., LTD. +5153|Sensor Technologies America, Inc. +5161|Vega Technologies Industrial (Austria) Co. +5168|RedOctane +5169|Pertech Resources, Inc. +5173|Wistron NeWeb Corp. +5174|Denali Software, Inc. +5180|Altek Corporation +5206|Extending Wire & Cable Co., Ltd. +5217|Staccato Communications +5234|Hangzhou H3C Technologies Co., Ltd. +5242|Formosa Industrial Computing, Inc. +5242|Formosa21 Inc. +5246|UPEK Inc. +5247|Hama GmbH & Co., KG +5255|DSP Group, Ltd. +5262|EVATRONIX SA +5271|Panstrong Company Ltd. +5293|CTK Corporation +5294|Printronix Inc. +5295|ATP Electronics Inc. +5296|StarTech.com Ltd. +5312|Rockwell Automation, Inc. +5314|Gemlight Computer Ltd. +5325|MOAI ELECTRONICS CORPORATION +5336|JAMER INDUSTRIES CO., LTD. +5349|SAIN Information & Communications Co., Ltd. +5357|Shure Inc. +5375|Twinhead International Corp. +5376|Ellisys +5377|Pine-Tum Enterprise Co., Ltd. +5393|BridgeCo, AG +5398|Skymedi Corporation +5404|VeriSilicon Holdings Co., Ltd. +5408|Bitwire Corp. +5421|JMicron Technology Corp. +5422|HLDS (Hitachi-LG Data Storage, Inc.) +5440|Phihong Technology Co., Ltd. +5451|PNY Technologies Inc. +5453|ConnectCounty Holdings Berhad +5454|D & M Holdings, Inc. +5460|Prolink Microsystems Corporation +5480|Sunf Pu Technology Co., Ltd +5487|Quantum Corporation +5488|ALLTOP TECHNOLOGY CO., LTD. +5499|Ketron SRL +5502|U-MEDIA Communications, Inc. +5510|Sitor Electronics (Shenzhen) Co., Ltd. +5511|SMA Technologie AG +5517|Oakley Inc. +5528|Kunshan Guoji Electronics Co., Ltd. +5538|Freescale Semiconductor, Inc. +5540|Afa Technologies, Inc. +5546|Hong Kong Gearway Electronics Co., Ltd. +5577|D-Box Technologies +5589|Coulomb Electronics Ltd. +5596|Hynix Semiconductor Inc. +5600|Seong Ji Industrial Co., Ltd. +5609|Pacific Digital Corp. +5612|Belcarra Technologies Corp. +5638|UMAX +5640|Inside Out Networks +5645|Samtec +5657|L & K Precision Technology Co., Ltd. +5650|Soft DB Inc. +5665|Wionics Research +5672|Stonestreet One, Inc. +5679|WiQuest Communications, Inc. +5681|Focus Enhancements +5694|HongLin Electronics Co., Ltd. +5706|ChipX +5728|Creatix Polymedia GmbH +5736|Actiontec Electronics, Inc. +5753|Total Phase +5762|Maxwise Production Enterprise Ltd. +5764|Godspeed Computer Corp. +5766|ZOOM Corporation +5767|Kingmax Digital Inc. +5782|Hitachi Video and Information System, Inc. +5783|VTEC TEST, INC. +5797|Shenzhen Zhengerya Technology Co., Ltd. +5804|Dongguan ChingLung Wire & Cable Co., Ltd. +5836|silex technology, Inc. +5843|Frontline Test Equipment, Inc. +5855|King Billion Electronics Co., Ltd. +5877|Futurelogic Inc. +5895|ARTIMI +5901|Avnera +5942|CANON IMAGING SYSTEMS INC. +5943|Hong Kong Applied Science and Technology Research Inst. +5955|General Atomics +5960|MQP Electronics Ltd. +5964|ASMedia Technology Inc. +5977|LucidPort Technology, Inc. +5998|UD electronic corp. +6001|Shenzhen Alex Connector Co., Ltd. +6002|System Level Solutions, Inc. +60186|Empia Technology, Inc. +6020|TopSeed Technology Corp. +6024|ShenZhen Litkconn Technology Co., Ltd. +6038|Printrex, Inc. +6039|JALCO CO., LTD. +6053|Advanced Connection Technology Inc. +6055|MICOMSOFT CO., LTD. +6083|Singim International Corp. +6095|Hip Hing Cable & Plug Mfy. Ltd. +6096|Sanford L.P. +6099|Korea Techtron Co., Ltd. +6121|DisplayLink (UK) Ltd. +6127|Lenovo +6133|K.K. Rocky +6134|Unicomp, Inc +6168|Osteosys Co., Ltd. +6185|Suzhou YuQiu Technology Co., Ltd. +6193|Gwo Jinn Industries Co., Ltd. +6194|Huizhou Shenghua Industrial Co., Ltd. +6228|Memory Devices Ltd. +6241|Tech Technology Industrial Company +6242|Teridian Semiconductor Corp. +6257|Aveo Technology Corp. +6271|Siano Mobile Silicon Ltd. +6292|SyntheSys Research, Inc. +6296|Summit Microelectronics +6297|Linkiss Co., Ltd. +6326|Mikkon Technology Limited +6353|Google Inc. +6357|Starline International Group Limited +6371|Fitilink Integrated Technology, Inc. +6394|Kuang Ying Computer Equipment Co., Ltd. +6397|FineArch Inc. +6413|Motorola GSG +6420|Alco Digital Devices Limited +6421|Nordic Semiconductor ASA +6425|Pixelworks +6434|Power 7 Technologies Corp. +6447|Avago Technologies, Pte. +6448|Shenzhen Xianhe Technology Co., Ltd. +6449|Ningbo Broad Telecommunication Co., Ltd. +6473|Lab126 +6483|Ironkey Inc. +6487|BIOS Corporation +6503|CASIO HITACHI Mobile Communications Co., Ltd. +6507|Wispro Technology Inc. +6512|Dane-Elec Corp. USA +6537|Nuconn Technology Corp. +6541|Fairchild Imaging +6543|Beceem Communications Inc. +6544|Acron Precision Industrial Co., Ltd. +6556|Richnex Microelectronics Corporation +6557|Dexxon +6559|Benica Corporation +6568|Biforst Technology Inc. +6581|B & W Group +6582|Infotech Logistic, LLC +6607|Parrot SA +6625|WeiDuan Electronic Accessory (S.Z.) Co., Ltd. +6632|Industrial Technology Research Institute +6640|Jyh Woei Industrial Co., Ltd. +6666|USB-IF non-workshop +6674|KES Co., Ltd. +6693|Amphenol East Asia Ltd. +6698|Seagate Branded Solutions +6709|Astec Power, a division of Emerson Network Power +6710|Biwin Technology Ltd. +6720|TERMINUS TECHNOLOGY INC. +6721|Action Electronics Co., Ltd. +6730|Silicon Image +6731|SafeBoot International B.V. +6753|Abbott Diabetes Care +6762|Spansion Inc. +6765|SamYoung Electronics Co., Ltd +6766|Global Unichip Corp. +6767|Sagem Orga GmbH +6772|Oberthur Technologies +6777|Bayer Health Care LLC +6779|Lumberg Connect GmbH +6786|Proconn Technology Co., Ltd. +6793|Dynalith Systems Co., Ltd. +6794|Simula Technology Inc. +6795|SGS Taiwan Ltd. +6808|Leica Camera AG +6820|Data Drive Thru, Inc. +6821|UBeacon Technologies, Inc. +6822|eFortune Technology Corp. +6830|Johnson Component & Equipments Co., Ltd. +6859|Salcomp Plc +6865|Desan Wire Co., Ltd. +6884|ic-design Reinhard Gottinger GmbH +6885|Jianduan Technology (Shenzhen) Co., Ltd +6893|High Top Precision Electronic Co., Ltd. +6894|Dongguan Chang'an Jinxia Rex Electronics Factory +6894|SHEN ZHEN REX TECHNOLOGY CO., LTD. +6895|Octekconn Incorporation +6940|CORSAIR MEMORY INC. +6944|MStar Semiconductor, Inc. +6946|WiLinx Corp. +6962|Ugobe Inc. +6966|ViXS Systems, Inc. +6983|Energizer Holdings, Inc. +6984|Plastron Precision Co., Ltd. +7001|K.S. Terminals Inc. +7002|Chao Zhou Kai Yuan Electric Co., Ltd. +7013|The Hong Kong Standards and Testing Centre Ltd. +7046|Dongguan Guanshang Electronics Co., Ltd. +7048|ShenMing Electron (Dong Guan) Co., Ltd. +7054|Amlogic, Inc. +7055|Super Talent Technology, Inc. +7062|N-Trig +7065|Shenzhen Yuanchuan Electronic +7073|JINQ CHERN ENTERPRISE CO., LTD. +7099|T & A Mobile Phones +7108|Ford Motor Co. +7118|Contac Cable Industrial Limited +7119|Sunplus Innovation Technology Inc. +7151|Shenzhen Tongyuan Network-Communication Cables Co., Ltd +7152|RealVision Inc. +7158|Orient Semiconductor Electronics, Ltd. +7181|Relm Wireless +7184|Lanterra Industrial Co., Ltd. +7194|Datel Electronics Ltd. +7195|Volkswagen of America, Inc. +7199|Goldvish S.A. +7200|Fuji Electric Device Technology Co., Ltd. +7201|ADDMM LLC +7202|ZHONGSHAN CHIANG YU ELECTRIC CO., LTD. +7206|Shanghai Haiying Electronics Co., Ltd. +7207|SHENZHEN D&S INDUSTRIES LIMITED +7217|LS Cable Ltd. +7223|Sonavation, Inc. +7229|NONIN MEDICAL INC. +7230|Wep Peripherals +7241|Cherng Weei Technology Corp. +7275|Philips & Lite-ON Digital Solutions Corporation +7276|Skydigital Inc. +7287|Kaetat Industrial Co., Ltd. +7288|Datascope Corp. +7289|Unigen Corporation +7290|LighTuning Technology Inc. +7291|Shenzhen Luxshare Precision Industry Co., Ltd. +7304|Somagic, Inc. +7305|HONGKONG WEIDIDA ELECTRON LIMITED +7310|ASTRON INTERNATIONAL CORP. +7320|ALPINE ELECTRONICS, INC. +7328|ACCARIO Inc. +7329|Symwave, Inc. +7347|Aces Electronics Co., Ltd. +7348|OPEX CORPORATION +7358|Texas Instruments - Stellaris +7359|FORTAT SKYMARK INDUSTRIAL COMPANY +7360|PlantSense +7370|NextWave Broadband Inc. +7373|Bodatong Technology (Shenzhen) Co., Ltd. +7380|adp corporation +7381|Firecomms Ltd. +7382|Antonio Precise Products Manufactory Ltd. +7390|Telecommunications Technology Association (TTA) +7391|WonTen Technology Co., Ltd. +7392|EDIMAX TECHNOLOGY CO., LTD. +7393|Amphenol KAE +7420|ANDES TECHNOLOGY CORPORATION +7421|Flextronics Digital Design Japan, LTD. +7432|NINGBO HENTEK DRAGON ELECTRONICS CO., LTD. +7433|TechFaith Wireless Technology Limited +7434|Johnson Controls, Inc. The Automotive Business Unit +7435|HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD. +7444|ALPHA-SAT TECHNOLOGY LIMITED +7455|Diostech Co., Ltd. +7456|SAMTACK INC. +7465|Horng Tong Enterprise Co., Ltd. +7473|XINTRONIX LIMITED +7490|DRAGON JOY LIMITED +7491|Montage Technology, Inc. +7492|Adirondack Digital Imaging Systems, Inc. +7493|Qisda Corporation +7494|nSys Design Systems +7496|Shenzhen XinYonghui Precise Technology Co., Ltd. +7497|SHENZHEN LINKCONN ELECTRONICS CO., LTD. +7501|Pegatron Corporation +7502|INPHI CORPORATION +7503|ADVANCED CHIP EXPRESS INC. +7516|Fresco Logic Inc. +7517|QIXING INDUSTRIAL (HK) CO. +7519|ViVOtech, Inc. +7520|ASAP International Co., Ltd. +7529|Walta Electronic Co., Ltd. +7530|ARICENT TECHNOLOGIES (HOLDINGS) LTD. +7531|The Linux Foundation +7537|Finisar Corporation +7542|LongCheng Electronic & Communication CO., LTD. +7543|Yueqing Changling Electronic Instrument Corp., Ltd. +7544|CAMBRIDGE SEMICONDUCTOR LTD. +7545|Shenzhen My-Power Technology Co., Ltd. +7546|SHINWA INTERNATIONAL HOLDINGS LTD. +7551|Ecrio +7552|PLDA +7553|YongXin Plastic & Hardware Co., Ltd. +7556|Kechenda Plastic Electronic Factory +7557|NINGBO SHUNSHENG COMMUNICATION APPARATUS CO., LTD. +7564|Wuxi AlphaScale IC Systems, Inc. +7582|CSR, Inc. +7583|KUNMING ELECTRONICS CO., LTD. +7584|Parade Technologies, Inc. +7607|SMedia Technology Corporation +7608|HD MEDICAL INC. +7613|Terawins +7614|S.R.N. Corporation +7615|Signostics Pty. Ltd. +7618|Datalogic Mobile Inc. +7628|Document Capture Technologies, Inc. +7629|HIN KUI MACHINE & METAL INDUSTRIAL CO., LTD. +7639|REDMERE TECHNOLOGY +7640|BUFFALO KOKUYO SUPPLY INC. +7641|EFFICERE TECHNOLOGIES +7647|GDA Technologies, Inc. +7648|Shenzhen Excelstor Technology Ltd. +7649|Actions Microelectronics Co., Ltd. +7650|ENTERY INDUSTRIAL CO., LTD. +7651|SHENZHEN REX ELECTRONICS CO., LTD. +7652|DAEWOO ELECTRONICS CORPORATION +7658|Yesin Electronics Technology Co., Ltd. +7659|SHIUH CHI PRECISION INDUSTRY CO., LTD. +7665|HUATIANYUAN ELECTRONIC INDUSTRY CO., LTD. +7666|Telecommunication Metrology Center of MII +7667|CRESYN CO., LTD. +7668|SHEN ZHEN FORMAN PRECISION INDUSTRY CO., LTD. +7680|Jupiter Systems +7682|GLOBEMASTER TECHNOLOGIES CO., LTD. +7687|GETA ELECTRONICS (DONG GUAN) CO., LTD. +7688|Inventure, Inc. +7696|Point Grey Research Inc. +7697|Hoya Xponent +7708|CMS PRODUCTS +7709|Kanguru Solutions +7711|INVIA +7712|JDSU +7722|NANOFORTI INC. +7731|KOBIAN CANADA INC. +7738|Continental Automotive Systems Inc. +7741|Chipsbrand Technologies (HK) Co., Limited +7751|HUNG TA H.T.ENTERPRISE CO., LTD. +7758|Etron Technology, Inc. +7789|WAN SHIH ELECTRONIC (H.K.) CO., LTD. +7795|COMLINK ELECTRONICS CO., LTD. +7817|Vtion Information Technology (Fujian) Co., Ltd. +7843|Concraft Holding Co., Ltd. +7846|novero GmbH +7863|WIN WIN PRECISION INDUSTRIAL CO., LTD. +7881|MOSER BAER INDIA LIMITED +7867|NuCORE Technology, Inc. +7898|AIRTIES WIRELESS NETWORKS +7899|BLACKMAGIC DESIGN PTY. +7976|Cal-Comp Electronics & Communications +7977|Analogix Semiconductor, Inc. +7985|SASKEN COMMUNICATION TECH LTD. +7989|Amphenol Shouh Min Industry +7996|Chang Yang Electronics Company Ltd. +8009|ITT Corporation +8027|KYODO COMMUNICATIONS & ELECTRONICS INC. +8053|Innostor Co., Ltd. +8063|NOVA Sensors +8064|MagicPixel Inc. +8073|Dongguan Goldconn Electronics Co., Ltd. +8074|Morning Star Industrial Co., Ltd. +8108|DIFFON CORPORATION +8109|Cresta Technology Inc. +8116|Owl Computing Technologies, Inc. +8117|Siemens Enterprise Communications GmbH & Co. KG +8137|NXP Semiconductors +8172|NIAN YEONG ENTERPRISE CO., LTD. +8193|D-Link Corporation +8205|Belkin Electronic (Changzhou) Co., Ltd. +8220|Freeport Resources Enterprises Corp. +8232|DETAS TECHNOLOGY LTD. +8237|Snowbush IP (a division of Gennum) +8256|Hauppauge Computer Works, Inc. +8284|Shenzhen Tronixin Electronics Co., Ltd. +8317|CESI Technology Co., Ltd. +8334|ICT-LANTO LIMITED +8341|China Electronics Technology Limited +8342|Microconn Electronic Co., Ltd. +8367|Shenzhen CARVE Electronics Co., Ltd. +8384|FENGHUA KINGSUN CO., LTD. +8386|Sumitomo Electric Ind., Ltd., Optical Comm. R&D Lab +8408|Changzhou Xinchao Technologies, Inc. +8432|Insight Technology Incorporated +8439|SOFTHARD Technology Ltd. +8445|NOVO NORDISK A/S +8446|Elektrobit Inc. +8457|VIA Labs, Inc. +8492|Shenzhen Linoya Electronic Co., Ltd. +8494|Amphenol AssembleTech (Xiamen) Co., Ltd. +8504|iVina, Inc. +8550|JVC KENWOOD Holdings, Inc. +8551|Zhejiang Fousine Science & Technology Co., Ltd. +8563|HUIZHOU HUANGJI PRECISIONS FLEX ELECTRONICAL CO., LTD. +8564|Transcend Information, Inc. +8565|Light Blue Optics, Inc. +8566|TMC/Allion Test Labs +8583|ESPACE SERVICES MULTIMEDIAS +8584|CalDigit +8618|TAKASAKI KYODO COMPUTING CENTER CO., LTD. +8627|Dongguan Teconn Electronics Technology Co., Ltd. +8629|SHENZHEN JASON ELECTRONICS CO., LTD. +8644|Netcom Technology (HK) Limited +8658|NeoLAB Convergence +8659|Compupack Technology Co., Ltd. +8660|Eduplayer Co., Ltd. +8665|Verification Technology, Inc. +8666|Valor Auto Companion, Inc. +8667|G-Max Technology Co., Ltd. +8681|Jiafuh Metal & Plastic (ShenZhen) Co., Ltd. +8682|JUST MAKE ELECTRONICS CO., LTD. +8695|Wuerth-Elektronik eiSos GmbH & Co. KG +8705|Elan Digital Systems Ltd. +8706|Walex Electronic (Wu Xi) Co., Ltd. +8707|Shin Shin Co., Ltd. +8709|3eYamaichi Electronics Co., Ltd. +8710|Wiretek International Investment Ltd. +8711|Fuzhou Rockchip Electronics Co., Ltd. +8734|Linktec Technologies Co., Ltd. +8756|T-CONN PRECISION CORPORATION +8770|Zhihe Electronics Technology Co., Ltd. +8784|Evernew Wire & Cable Co., Ltd. +8785|QuieTek Corp. +8786|TSANSUN TECH. CO., LTD. +8793|Skypine Electronics (Shenzhen) Co., Ltd. +8804|Entourage Systems, Inc. +8815|Koyo Trading Co., Ltd. +8816|XiaMen GaoLuChang Electronics Co. Ltd. +8831|Granite River Labs +8839|Shenzhen Oversea Win Technology Co., Ltd. +8840|Digital EMC Co., Ltd. +8841|Sun Fair Electric Wire & Cable (HK) Co., Ltd. +8842|Hotron Precision Electronic Ind. Corp. +8843|Shenzhen DLK Electronics Technology Co., Ltd. +8855|Evolution Technology Corporation +8873|Valor Communication, Inc. +8874|AppliedMicro +8875|Trigence Semiconductor, Inc. +8888|Motorola MDS +8889|eTurboTouch Technology Inc. +8890|Technology Innovation International Co., Ltd. +8903|MEMUP +8904|Karming Electronic (Shenzhen) Co., Ltd. +8923|Phase One A/S +8932|Shenyang Tongzhen Precision Electronic Technology Co. +8959|Avnet +8964|Pinnacle +8979|Kunshan Jiahua Electronics Co., Ltd. +8980|INQ Mobile Limited +8981|Avery Design Systems, Inc. +8982|DongGuan Potec Electric Industrial Co., Ltd. +8983|Huawei Device Co., Ltd. +8998|CHAO KUEI MOLD INDUSTRIAL CO., LTD. +9008|Tensorcom +9009|PUZZLE LOGIC INC. +9028|HAMBURG INDUSTRIES CO., LTD. +9036|Zenverge Inc. +9037|Skype Inc. +9048|Greenconn Corporation +9049|Shenzhen Autone-Tronic Technology Co., Ltd. +9050|Top Yang Technology Enterprise Co., Ltd. +9051|KangXiang Electronic Co., Ltd. +9068|ZheJiang Chunsheng Electronics Co., Ltd. +9069|e-supplies Co., Ltd. +9090|Trigaudio, Inc. +9131|Shenzhen Zhengtong Electronics Co., Ltd. +9132|Marunix Electron Limited +9147|EMI STOP CORP. +9797|Lead Data Inc. +9808|Electronics For Imaging, Inc. +10393|Toptronic Industrial Co., Ltd. +12662|WHANAM ELECTRONICS CO., Ltd. MS division +13878|INVIBRO +14627|National Instruments +16700|Dell Inc. +16962|USB Design By Example +21827|UC-Logic Technology Corp. +21930|OnSpec Electronic Inc. +24576|TRIDENT MICROSYSTEMS (Far East) Ltd. +25452|CoreLogic, Inc. +27253|Shanghai Jujo Electronics Co., Ltd. +32902|Intel Corporation +32903|Intel Corporation +38672|Moschip Semiconductor Technology +60186|Empia Technology, Inc. diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/en.lproj/InfoPlist.strings b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/Resources/en.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..5e45963c382ba690b781b953a00585212b898ac5 GIT binary patch literal 92 zcmW-XQ3`+{5C!MkQ~2$No+IcIkqMDxWCV8j>LCj|yTg2Mz+o9F%uHlf9u}h9EuK`F a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z literal 0 HcmV?d00001 diff --git a/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/USBBusProber b/src/mynteye/uvc/macosx/USBBusProber.framework/Versions/A/USBBusProber new file mode 100755 index 0000000000000000000000000000000000000000..06ccd584d45dba13bc5f83df4040df3a0919ba30 GIT binary patch literal 226076 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 sVAk0O?pT-Y1MS0^83%k4hJ}vhA11xh! +#include +#include +#include +#include +#include +#import +//#import +#import "VVUVCKitStringAdditions.h" + +/** +\defgroup VVUVCController +*/ + + +/* +@protocol VVUVCControllerDelegate + - (void) VVUVCControllerParamsUpdated:(id)c; +@end +*/ + + +/** +\ingroup VVUVCController +Auto-exposure modes described by the USB spec, put in a typedef/enum for convenience +*/ +typedef enum { + UVC_AEMode_Undefined = 0x00, /// undefined auto exposure mode + UVC_AEMode_Manual = 0x01, /// manual exposure, manual iris + UVC_AEMode_Auto = 0x02, /// auto exposure, auto iris + UVC_AEMode_ShutterPriority = 0x04, /// manual exposure, auto iris + UVC_AEMode_AperturePriority = 0x08 /// auto exposure, manual iris +} UVC_AEMode; + + +/* this struct contains all the info necessary to get/set vals from a video control parameter (either terminal/hardware or + processing/software)- but it does not contain info about the value at all! think of this struct as a sort of function + description for the hardware which will be sent out directly via USB. instances of this struct are populated by values + from the USB specification! */ +typedef struct { + int unit; // describes whether terminal/hardware or processing/software + int selector; // the address of the "parameter" being changed- + int intendedSize; + BOOL hasMin; // whether or not the video control parameter described by this struct has a min val + BOOL hasMax; // whether or not the video control parameter described by this struct has a max + BOOL hasDef; // whether or not the video control parameter described by this struct has a default + BOOL isSigned; // whether or not the video control parameter described by this struct is a signed val + BOOL isRelative; // whether or not the video control parameter described by this struct is a relative val +} uvc_control_info_t; + + +/* these variables contain enough info to send data to/get data from the implied attribute. the + variables are global to the class (the contents won't change from instance to instance), and + conceptually act like function descriptions (instances of this class can pass references to these + variables, which can be used to get/set values). these are populated when the class is + initialized by values described in the USB specification. if uvc_control_info_t is a function + description, these variables are essentially pointers to a bunch of different functions. */ +extern uvc_control_info_t _scanCtrl; +extern uvc_control_info_t _autoExposureModeCtrl; +extern uvc_control_info_t _autoExposurePriorityCtrl; +extern uvc_control_info_t _exposureTimeCtrl; +extern uvc_control_info_t _irisCtrl; +extern uvc_control_info_t _autoFocusCtrl; +extern uvc_control_info_t _focusCtrl; +extern uvc_control_info_t _zoomCtrl; +extern uvc_control_info_t _panTiltCtrl; +extern uvc_control_info_t _panTiltRelCtrl; +extern uvc_control_info_t _rollCtrl; +extern uvc_control_info_t _rollRelCtrl; + +extern uvc_control_info_t _backlightCtrl; +extern uvc_control_info_t _brightCtrl; +extern uvc_control_info_t _contrastCtrl; +extern uvc_control_info_t _gainCtrl; +extern uvc_control_info_t _powerLineCtrl; +extern uvc_control_info_t _autoHueCtrl; +extern uvc_control_info_t _hueCtrl; +extern uvc_control_info_t _saturationCtrl; +extern uvc_control_info_t _sharpnessCtrl; +extern uvc_control_info_t _gammaCtrl; +extern uvc_control_info_t _whiteBalanceAutoTempCtrl; +extern uvc_control_info_t _whiteBalanceTempCtrl; + + +/* this struct describes a parameter- it contains a pointer to the control info that describes +which parameter, as well as the min/max/default/current value. an instance of this struct will +contain the value of the parameter and the uvc_control_info_t struct necessary to communicate with +this parameter in a camera. */ +typedef struct { + BOOL supported; // if YES, this parameter is supported. if NO, either the camera doesn't support this parameter, or the "inputTerminalID" or "processingUnitID" of the camera is wrong! + long min; // the paramter's actual min val + long max; // the parameter's actual max val + long val; // the parameter's actual val + long def; // the parameter's default val + int actualSize; + uvc_control_info_t *ctrlInfo; +} uvc_param; + + + + + +/// An instance of VVUVCController will control the UVC params for a single USB video device. This is probably the only class you'll have to create or work with in this framework. +/** +\ingroup VVUVCController +This is probably the only class you'll have to work with in this framework. The basic idea is that you create a VVUVCController for an enabled USB video device, and then either tell the controller to open its settings window or interact with it programmatically. If you're looking for a more "embedded" feel, you can remove the VVUVCController's "settingsView" from its superview and add it into your application's NSView hierarchy. +*/ +@interface VVUVCController : NSObject { + IOUSBInterfaceInterface190 **interface; + UInt32 deviceLocationID; + UInt8 interfaceNumber; // pulled from interface on generalInit! + int inputTerminalID; // the "address" of the terminal unit, which handles hardware controls like aperture/focus. if this val is wrong, the hardware controls won't be available. + int processingUnitID; // the "address" of the processing unit, which handles software controls like contrast/hue. if this val is wrong, the software controls won't be available. + + //id delegate; + uvc_param scanningMode; + uvc_param autoExposureMode; // mode functionality described by the type UVC_AEMode + uvc_param autoExposurePriority; // if 1, framerate may be varied. if 0, framerate must remain constant. + uvc_param exposureTime; + uvc_param iris; + uvc_param autoFocus; + uvc_param focus; + uvc_param zoom; + uvc_param panTilt; + uvc_param panTiltRel; + uvc_param roll; + uvc_param rollRel; + + uvc_param backlight; + uvc_param bright; + uvc_param contrast; + uvc_param gain; + uvc_param powerLine; + uvc_param autoHue; + uvc_param hue; + uvc_param saturation; + uvc_param sharpness; + uvc_param gamma; + uvc_param autoWhiteBalance; + uvc_param whiteBalance; + + // this class has its own .nib which contains a UI for interacting with the class that may be opened directly in a window, or accessed as an NSView instance for use in other UIs/software + NSNib *theNib; + NSArray *nibTopLevelObjects; + + IBOutlet id uiCtrlr; // created & owned by the nib! + IBOutlet NSWindow *settingsWindow; // by default, the UI is in a window (it's easiest to just open and close it) + IBOutlet NSView *settingsView; // you can also access the view which contains the UI so you can embed it in other apps +} + +/// Use this method to init an instance of VVUVCController from an NSString returned by the AVFoundation or QTCapture APIs as the device's unique ID. +/** +@param n The "deviceIDString" is a string returned by QuickTime and AVFoundation as the unique ID for the USB video device. Technically, this is a hex value with sixteen digits (16 hex digits = an unsigned 64-bit integer). The first 8 hex digits is the USB device's "locationID", the next 4 hex digits is the device's vendor ID, and the last 4 digits are the device's product ID. Only the locationID is needed to create the necessary USB interfaces... +*/ +- (id) initWithDeviceIDString:(NSString *)n; +/// Use this method to init an instance of VVUVCController from the USB location ID. +/** +@param locationID The location ID of the USB device you want this instance of VVUVCController to control. +*/ +- (id) initWithLocationID:(UInt32)locationID; +- (IOUSBInterfaceInterface190 **) _getControlInferaceWithDeviceInterface:(IOUSBDeviceInterface **)deviceInterface; +- (void) generalInit; + +/// Returns a mutable dict representing the current state of the video input parameters +- (NSMutableDictionary *) createSnapshot; +/// Loads a saved state dict created with the "createSnapshot" method +- (void) loadSnapshot:(NSDictionary *)s; + +- (BOOL) _sendControlRequest:(IOUSBDevRequest *)controlRequest; +- (int) _requestValType:(int)requestType forControl:(const uvc_control_info_t *)ctrl returnVal:(void **)ret; +- (BOOL) _setBytes:(void *)bytes sized:(int)size toControl:(const uvc_control_info_t *)ctrl; +- (void) _populateAllParams; // populates all the uvc_param variables in this instance, loading their min/max/default vals and determining if they're supported or not +- (void) _populateParam:(uvc_param *)param; +- (BOOL) _pushParamToDevice:(uvc_param *)param; +- (void) _resetParamToDefault:(uvc_param *)param; + +/// Resets the parameters to their default values. The default values are supplied by/stored in the device. +- (void) resetParamsToDefaults; +/// Opens a window with a GUI for interacting with the camera parameters +- (void) openSettingsWindow; +/// Closes the GUI window (if it's open). +- (void) closeSettingsWindow; + +- (void) setInterlaced:(BOOL)n; +- (BOOL) interlaced; +- (BOOL) interlacedSupported; +- (void) resetInterlaced; +/// Sets the auto exposure mode using one of the basic auto exposure modes defined in the header (vals pulled from the USB spec) +- (void) setAutoExposureMode:(UVC_AEMode)n; +/// Gets the auto exposure mode +- (UVC_AEMode) autoExposureMode; +/// Whether or not this camera supports the use of alternate auto exposure modes +- (BOOL) autoExposureModeSupported; +/// Resets the auto exposure mode to the hardware-defined default +- (void) resetAutoExposureMode; +/// Sets whether or not auto exposure will be given priority +- (void) setAutoExposurePriority:(BOOL)n; +/// Gets whether or not the camera is giving auto exposure priority +- (BOOL) autoExposurePriority; +/// Whether or not this camera supports the use of auto exposure priority +- (BOOL) autoExposurePrioritySupported; +/// Resets the auto exposure priority to the hardware-defined default +- (void) resetAutoExposurePriority; + +/// Sets the exposure time to the passed value +- (void) setExposureTime:(long)n; +/// Gets the current exposure time value being used by the camera +- (long) exposureTime; +/// Whether or not this camera supports the exposure time parameter +- (BOOL) exposureTimeSupported; +/// Resets the exposure time value to the hardware-defined default +- (void) resetExposureTime; +/// The min exposure time value +- (long) minExposureTime; +/// The max exposure time value +- (long) maxExposureTime; +/// Sets the iris to the passed value +- (void) setIris:(long)n; +/// Gets the current iris value being used by the camera +- (long) iris; +/// Whether or not this camera supports the iris parameter +- (BOOL) irisSupported; +/// Resets the iris value to the hardware-defined default +- (void) resetIris; +/// The min iris value +- (long) minIris; +/// The max iris value +- (long) maxIris; +/// Sets the auto focus to the passed value +- (void) setAutoFocus:(BOOL)n; +/// Gets the auto focus value being used by the camera +- (BOOL) autoFocus; +/// Whether or not this camera supports the auto focus parameter +- (BOOL) autoFocusSupported; +/// Resets the auto focus value to the hardware-defined default. +- (void) resetAutoFocus; +/// Sets the focus value +- (void) setFocus:(long)n; +/// Gets the focus value currently being used by the camera +- (long) focus; +/// Whether or not this camera supports the focus parameter +- (BOOL) focusSupported; +/// Resets the focus value to the hardware-defined default +- (void) resetFocus; +/// The min focus value +- (long) minFocus; +/// The max focus value +- (long) maxFocus; +/// Sets the zoom value +- (void) setZoom:(long)n; +/// Gets the current zoom value being used by the camera +- (long) zoom; +/// Whether or not this camera supports the zoom parameter +- (BOOL) zoomSupported; +/// Resets the zoom value to the hardware-defined default +- (void) resetZoom; +/// The min zoom value +- (long) minZoom; +/// The max zoom value +- (long) maxZoom; + +// pan/tilt/roll aren't enabled +- (BOOL) panSupported; +- (BOOL) tiltSupported; +- (BOOL) rollSupported; + +/// Sets the backlight to the passed value +- (void) setBacklight:(long)n; +/// Gets the backlight value currently being used by the camera +- (long) backlight; +/// Whether or not this camera supports the backlight parameter +- (BOOL) backlightSupported; +/// Resets the backlight value to the hardware-defined default +- (void) resetBacklight; +/// The min backlight value +- (long) minBacklight; +/// The max backlight value +- (long) maxBacklight; +/// Sets the bright value to the passed value +- (void) setBright:(long)n; +/// Gets the bright value currently being used by the camera +- (long) bright; +/// Whether or not this camera supports the bright parameter +- (BOOL) brightSupported; +/// Resets the bright parameter to the hardware-defined default +- (void) resetBright; +/// The min bright value +- (long) minBright; +/// The max bright value +- (long) maxBright; +/// Sets the contrast to the passed value +- (void) setContrast:(long)n; +/// Gets the contrast value currently being used by the camera +- (long) contrast; +/// Whether or not this camera supports the contrast parameter +- (BOOL) contrastSupported; +/// Resets the contrast to the hardware-defined default +- (void) resetContrast; +/// The min contrast value +- (long) minContrast; +/// The max contrast value +- (long) maxContrast; +/// Sets the gain to the passed value +- (void) setGain:(long)n; +/// Gets the gain value currently being used by the camera +- (long) gain; +/// Whether or not this camera supports the gain parameter +- (BOOL) gainSupported; +/// Resets the gain value to the hardware-defined default +- (void) resetGain; +/// The min gain value +- (long) minGain; +/// The max gain value +- (long) maxGain; +/// Sets the powerline to the passed value +- (void) setPowerLine:(long)n; +/// Gets the powerline value currently being used by the camera +- (long) powerLine; +/// Whether or not this camera supports the powerline parameter +- (BOOL) powerLineSupported; +/// Resets the powerline value to the hardware-defined default +- (void) resetPowerLine; +/// The min powerline value +- (long) minPowerLine; +/// The max powerline value +- (long) maxPowerLine; +/// Sets the auto hue to the passed value +- (void) setAutoHue:(BOOL)n; +/// The auto hue value currently being used by the camera +- (BOOL) autoHue; +/// Whether or not this camera supports the auto hue parameter +- (BOOL) autoHueSupported; +/// Resets the auto hue parameter to the hardware-defined default +- (void) resetAutoHue; +/// Sets the hue to the passed value +- (void) setHue:(long)n; +/// Gets the hue value currently being used by the camera +- (long) hue; +/// Whether or not this camera supports the hue parameter +- (BOOL) hueSupported; +/// Resets the hue parameter to the hardware-defined default +- (void) resetHue; +/// The min hue value +- (long) minHue; +/// The max hue value +- (long) maxHue; +/// Sets the saturation to the passed value +- (void) setSaturation:(long)n; +/// Gets the saturation value currently being used by the camera +- (long) saturation; +/// Whether or not this camera supports the saturation parameter +- (BOOL) saturationSupported; +/// Resets the saturation to the hardware-defined default +- (void) resetSaturation; +/// The min saturation value +- (long) minSaturation; +/// The max saturation value +- (long) maxSaturation; +/// Sets the sharpness to the passed value +- (void) setSharpness:(long)n; +/// Gets the sharpness value currently being used by the camera +- (long) sharpness; +/// Whether or not this camera supports the sharpness parameter +- (BOOL) sharpnessSupported; +/// Resets the sharpness to the hardware-defined default +- (void) resetSharpness; +/// The min sharpness value +- (long) minSharpness; +/// The max sharpness value +- (long) maxSharpness; +/// Sets the gamma to the passed value +- (void) setGamma:(long)n; +/// Gets the gamma value currently being used by the camera +- (long) gamma; +/// Whether or not this camera supports the gamma parameter +- (BOOL) gammaSupported; +/// Resets the gamma value to the hardware-defined default +- (void) resetGamma; +/// The min gamma value +- (long) minGamma; +/// The max gamma value +- (long) maxGamma; +/// Sets the auto white balance to the passed value +- (void) setAutoWhiteBalance:(BOOL)n; +/// Gets the auto white balance value currently being used by the camera +- (BOOL) autoWhiteBalance; +/// Whether or not this camera supports the auto white balance parameter +- (BOOL) autoWhiteBalanceSupported; +/// Resets the auto white balance to the hardware-defined default +- (void) resetAutoWhiteBalance; +/// Sets the white balance to the passed value +- (void) setWhiteBalance:(long)n; +/// Gets the white balance value currently being used by the camera +- (long) whiteBalance; +/// Whether or not this camera supports the white balance parameter +- (BOOL) whiteBalanceSupported; +/// Resets the white balance value to the hardware-defined default +- (void) resetWhiteBalance; +/// The min white balance value +- (long) minWhiteBalance; +/// The max white balance value +- (long) maxWhiteBalance; + + +@end diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKit.h b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKit.h new file mode 100644 index 0000000..a0d50e3 --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKit.h @@ -0,0 +1,4 @@ + + +// this is the only class you should need to explicitly instantiate! +#import "VVUVCController.h" diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKitStringAdditions.h b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKitStringAdditions.h new file mode 100644 index 0000000..347856c --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCKitStringAdditions.h @@ -0,0 +1,7 @@ +#import + +@interface NSString (VVUVCKitStringAdditions) + +- (BOOL) containsString:(NSString *)n; + +@end diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIController.h b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIController.h new file mode 100644 index 0000000..82c9b2c --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIController.h @@ -0,0 +1,44 @@ +#import +#import "VVUVCUIElement.h" + + + + +@interface VVUVCUIController : NSObject { + IBOutlet id device; + + IBOutlet NSPopUpButton *autoExpButton; + IBOutlet NSButton *expPriorityButton; + IBOutlet NSButton *autoFocusButton; + //IBOutlet NSSlider *panSlider; + //IBOutlet NSSlider *tiltSlider; + //IBOutlet NSSlider *rollSlider; + + IBOutlet NSButton *autoHueButton; + IBOutlet NSButton *autoWBButton; + + IBOutlet VVUVCUIElement *expElement; + IBOutlet VVUVCUIElement *irisElement; + IBOutlet VVUVCUIElement *focusElement; + IBOutlet VVUVCUIElement *zoomElement; + + IBOutlet VVUVCUIElement *backlightElement; + IBOutlet VVUVCUIElement *brightElement; + IBOutlet VVUVCUIElement *contrastElement; + IBOutlet VVUVCUIElement *powerElement; + IBOutlet VVUVCUIElement *gammaElement; + IBOutlet VVUVCUIElement *hueElement; + IBOutlet VVUVCUIElement *satElement; + IBOutlet VVUVCUIElement *sharpElement; + IBOutlet VVUVCUIElement *gainElement; + IBOutlet VVUVCUIElement *wbElement; +} + +- (IBAction) buttonUsed:(id)sender; +- (IBAction) popUpButtonUsed:(id)sender; + +- (IBAction) resetToDefaults:(id)sender; + +- (void) _pushCameraControlStateToUI; + +@end diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIElement.h b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIElement.h new file mode 100644 index 0000000..f696c84 --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Headers/VVUVCUIElement.h @@ -0,0 +1,36 @@ +#import + + + + +@protocol VVUVCUIElementDelegate +- (void) controlElementChanged:(id)sender; +@end + + + + +@interface VVUVCUIElement : NSBox { + IBOutlet id delegate; + + BOOL enabled; + NSSlider *valSlider; + NSTextField *valField; + + int val; + int min; + int max; +} + +- (void) setEnabled:(BOOL)n; + +- (void) _resizeContents; + +- (void) uiItemUsed:(id)sender; + +@property (assign,readwrite) id delegate; +@property (assign,readwrite) int val; +@property (assign,readwrite) int min; +@property (assign,readwrite) int max; + +@end diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/Info.plist b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..83fb43f --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 17F77 + CFBundleDevelopmentRegion + English + CFBundleExecutable + VVUVCKit + CFBundleIdentifier + com.Vidvox.VVUVCKit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + VVUVCKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 9C40b + DTPlatformVersion + GM + DTSDKBuild + 17C76 + DTSDKName + macosx10.13 + DTXcode + 0920 + DTXcodeBuild + 9C40b + NSHumanReadableCopyright + Copyright © 2014 Vidvox. All rights reserved. + + diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/VVUVCController.nib b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/Resources/VVUVCController.nib new file mode 100644 index 0000000000000000000000000000000000000000..c6c4423107bc640fa830de77084a7d0e2aff63fe GIT binary patch literal 16669 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 a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z literal 0 HcmV?d00001 diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/VVUVCKit b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/A/VVUVCKit new file mode 100755 index 0000000000000000000000000000000000000000..7b0e4b188219c3073e88204d5d4f01798c956e48 GIT binary patch literal 124072 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 bX)iPT>(7+PSU)=3k+<=GYd<=5K>B|G*csY? literal 0 HcmV?d00001 diff --git a/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/Current b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/src/mynteye/uvc/macosx/VVUVCKit.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/src/mynteye/uvc/macosx/uvc-vvuvckit.cc b/src/mynteye/uvc/macosx/uvc-vvuvckit.cc new file mode 100644 index 0000000..7118141 --- /dev/null +++ b/src/mynteye/uvc/macosx/uvc-vvuvckit.cc @@ -0,0 +1,90 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include "mynteye/logger.h" +#include "mynteye/uvc/uvc.h" +#include "libuvc/libuvc.h" +#include "AVfoundationCamera.h" + +// #define ENABLE_DEBUG_SPAM + +MYNTEYE_BEGIN_NAMESPACE + +namespace uvc { + +// Enumerate devices +MYNTEYE_API std::shared_ptr create_context() { + //too +} +MYNTEYE_API std::vector> query_devices( + std::shared_ptr context) { + //todo +} + +// Static device properties +MYNTEYE_API std::string get_name(const device &device) { + //todo +} +MYNTEYE_API int get_vendor_id(const device &device) { + //todo +} +MYNTEYE_API int get_product_id(const device &device) { + //todo +} + +MYNTEYE_API std::string get_video_name(const device &device) { + //todo +} + +MYNTEYE_API bool pu_control_range( + const device &device, Option option, int32_t *min, int32_t *max, + int32_t *def) { + // todo +} +MYNTEYE_API bool pu_control_query( + const device &device, Option option, pu_query query, int32_t *value) { + // todo +} + +// Access XU (Extension Unit) controls +MYNTEYE_API bool xu_control_range( + const device &device, const xu &xu, uint8_t selector, uint8_t id, + int32_t *min, int32_t *max, int32_t *def) { + //todo +} +MYNTEYE_API bool xu_control_query( // XU_QUERY_SET, XU_QUERY_GET + const device &device, const xu &xu, uint8_t selector, xu_query query, + uint16_t size, uint8_t *data) { + //todo +} + +MYNTEYE_API void set_device_mode( + device &device, int width, int height, int fourcc, int fps, // NOLINT + video_channel_callback callback) { + //todo +} +MYNTEYE_API void start_streaming(device &device, int num_transfer_bufs) { + //todo +} +MYNTEYE_API void stop_streaming(device &device) { + //todo +} + +} // namespace uvc + +MYNTEYE_END_NAMESPACE From 515bcb5f8a319e22cda2aeae7259ac83f7c56529 Mon Sep 17 00:00:00 2001 From: kalman Date: Tue, 11 Dec 2018 20:12:26 +0800 Subject: [PATCH 12/17] Fix disparty bug --- src/mynteye/api/processor/disparity_processor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mynteye/api/processor/disparity_processor.cc b/src/mynteye/api/processor/disparity_processor.cc index c22232c..1c4f939 100644 --- a/src/mynteye/api/processor/disparity_processor.cc +++ b/src/mynteye/api/processor/disparity_processor.cc @@ -98,7 +98,7 @@ bool DisparityProcessor::OnProcess( // whereas other algorithms output 32-bit floating-point disparity map. sgbm_->compute(input->first, input->second, disparity); #endif - output->value = disparity / 16 + 1; + disparity.convertTo(output->value, CV_32F, 1./16, 1); output->id = input->first_id; output->data = input->first_data; return true; From 486e9d459d4e08b9e399fd6cd23a2c507aae576f Mon Sep 17 00:00:00 2001 From: kalman Date: Wed, 12 Dec 2018 20:22:39 +0800 Subject: [PATCH 13/17] Fix timestamp bug and record bug in ros --- .../launch/mynteye.launch | 32 +++++++++++++++++++ .../src/wrapper_nodelet.cc | 7 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/wrappers/ros/src/mynt_eye_ros_wrapper/launch/mynteye.launch b/wrappers/ros/src/mynt_eye_ros_wrapper/launch/mynteye.launch index 15b79c7..9c6e49c 100644 --- a/wrappers/ros/src/mynt_eye_ros_wrapper/launch/mynteye.launch +++ b/wrappers/ros/src/mynt_eye_ros_wrapper/launch/mynteye.launch @@ -156,5 +156,37 @@ + + + + - 'image_transport/compressedDepth' + + + + + - 'image_transport/compressedDepth' + + + + + - 'image_transport/compressedDepth' + + + + + - 'image_transport/compressedDepth' + + + + + - 'image_transport/compressedDepth' + + + + + - 'image_transport/compressedDepth' + + + diff --git a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc index 189418e..8dd656d 100644 --- a/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc +++ b/wrappers/ros/src/mynt_eye_ros_wrapper/src/wrapper_nodelet.cc @@ -322,9 +322,10 @@ class ROSWrapperNodelet : public nodelet::Nodelet { api_->EnableStreamData(Stream::POINTS); api_->SetStreamCallback( Stream::POINTS, [this](const api::StreamData &data) { + ros::Time stamp = hardTimeToSoftTime(data.img->timestamp); static std::size_t count = 0; ++count; - publishPoints(data, count, ros::Time::now()); + publishPoints(data, count, stamp); }); is_published_[Stream::POINTS] = true; } @@ -341,10 +342,10 @@ class ROSWrapperNodelet : public nodelet::Nodelet { api_->EnableStreamData(stream); api_->SetStreamCallback( stream, [this, stream](const api::StreamData &data) { - // data.img is null, not hard timestamp + ros::Time stamp = hardTimeToSoftTime(data.img->timestamp); static std::size_t count = 0; ++count; - publishCamera(stream, data, count, ros::Time::now()); + publishCamera(stream, data, count, stamp); }); is_published_[stream] = true; } From 324e68bca5bade9e98cd0f6254002216c6c9b982 Mon Sep 17 00:00:00 2001 From: kalman Date: Thu, 13 Dec 2018 17:00:31 +0800 Subject: [PATCH 14/17] Update version --- doc/en/api.doxyfile | 2 +- doc/zh-Hans/api.doxyfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/en/api.doxyfile b/doc/en/api.doxyfile index b33aa11..4960085 100644 --- a/doc/en/api.doxyfile +++ b/doc/en/api.doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "MYNT EYE S SDK" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2.2.2-rc1 +PROJECT_NUMBER = 2.2.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/doc/zh-Hans/api.doxyfile b/doc/zh-Hans/api.doxyfile index 784864b..d2b5675 100644 --- a/doc/zh-Hans/api.doxyfile +++ b/doc/zh-Hans/api.doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "MYNT EYE S SDK" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2.2.2-rc1 +PROJECT_NUMBER = 2.2.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From 54a91598508bb91c7fb6663c0ea51a6b2174fa07 Mon Sep 17 00:00:00 2001 From: John Zhao Date: Sun, 16 Dec 2018 19:53:27 +0800 Subject: [PATCH 15/17] Update inlcudes --- include/mynteye/api/api.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/mynteye/api/api.h b/include/mynteye/api/api.h index 7374453..580b567 100644 --- a/include/mynteye/api/api.h +++ b/include/mynteye/api/api.h @@ -15,6 +15,7 @@ #define MYNTEYE_API_API_H_ #pragma once +#include #include #include #include From e7dc4b7defa43308947d7f846625ca0124fb8c59 Mon Sep 17 00:00:00 2001 From: John Zhao Date: Sun, 16 Dec 2018 22:53:08 +0800 Subject: [PATCH 16/17] chore(root): update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5639063..4d4cd35 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MYNT® EYE S SDK -[![](https://img.shields.io/badge/MYNT%20EYE%20S%20SDK-2.2.2--rc1-brightgreen.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK) +[![](https://img.shields.io/badge/MYNT%20EYE%20S%20SDK-2.2.2-brightgreen.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK) ## Overview @@ -17,11 +17,11 @@ Please follow the guide doc to install the SDK on different platforms. ## Documentations * [API Doc](https://github.com/slightech/MYNT-EYE-S-SDK/releases): API reference, some guides and data spec. - * en: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2612865/mynt-eye-s-sdk-apidoc-2.2.2-rc1-en.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2612866/mynt-eye-s-sdk-apidoc-2.2.2-rc1-en.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](https://slightech.github.io/MYNT-EYE-S-SDK/) - * zh-Hans: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2612867/mynt-eye-s-sdk-apidoc-2.2.2-rc1-zh-Hans.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2612868/mynt-eye-s-sdk-apidoc-2.2.2-rc1-zh-Hans.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](http://doc.myntai.com/resource/api/mynt-eye-s-sdk-apidoc-2.2.2-rc1-zh-Hans/mynt-eye-s-sdk-apidoc-2.2.2-rc1-zh-Hans/index.html) + * en: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2683636/mynt-eye-s-sdk-apidoc-2.2.2-en.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2683637/mynt-eye-s-sdk-apidoc-2.2.2-en.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](https://slightech.github.io/MYNT-EYE-S-SDK/) + * zh-Hans: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2683638/mynt-eye-s-sdk-apidoc-2.2.2-zh-Hans.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK/files/2683639/mynt-eye-s-sdk-apidoc-2.2.2-zh-Hans.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](http://doc.myntai.com/resource/api/mynt-eye-s-sdk-apidoc-2.2.2-zh-Hans/mynt-eye-s-sdk-apidoc-2.2.2-zh-Hans/index.html) * [Guide Doc](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/releases): How to install and start using the SDK. - * en: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2612872/mynt-eye-s-sdk-guide-2.2.2-rc1-en.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2612873/mynt-eye-s-sdk-guide-2.2.2-rc1-en.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](https://slightech.github.io/MYNT-EYE-S-SDK-Guide/) - * zh-Hans: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2612874/mynt-eye-s-sdk-guide-2.2.2-rc1-zh-Hans.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2612875/mynt-eye-s-sdk-guide-2.2.2-rc1-zh-Hans.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](http://doc.myntai.com/resource/sdk/mynt-eye-s-sdk-guide-2.2.2-rc1-zh-Hans/mynt-eye-s-sdk-guide-2.2.2-rc1-zh-Hans/index.html) + * en: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2683625/mynt-eye-s-sdk-guide-2.2.2-en.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2683626/mynt-eye-s-sdk-guide-2.2.2-en.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](https://slightech.github.io/MYNT-EYE-S-SDK-Guide/) + * zh-Hans: [![](https://img.shields.io/badge/Download-PDF-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2683627/mynt-eye-s-sdk-guide-2.2.2-zh-Hans.pdf) [![](https://img.shields.io/badge/Download-HTML-blue.svg?style=flat)](https://github.com/slightech/MYNT-EYE-S-SDK-Guide/files/2683628/mynt-eye-s-sdk-guide-2.2.2-zh-Hans.zip) [![](https://img.shields.io/badge/Online-HTML-blue.svg?style=flat)](http://doc.myntai.com/resource/sdk/mynt-eye-s-sdk-guide-2.2.2-zh-Hans/mynt-eye-s-sdk-guide-2.2.2-zh-Hans/index.html) > Supported languages: `en`, `zh-Hans`. From f6abc574753411c9e69c89979a3f1d3944f033fd Mon Sep 17 00:00:00 2001 From: John Zhao Date: Mon, 17 Dec 2018 11:48:04 +0800 Subject: [PATCH 17/17] chore(samples): comment build uvc --- samples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 4781867..685e94b 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -71,7 +71,7 @@ add_subdirectory(device) # samples above uvc layer -add_subdirectory(uvc) +#add_subdirectory(uvc) # tutorials