Files
RkApp/VideoProsessing/OrbbecSDK_v2.5.5/include/libobsensor/hpp/StreamProfile.hpp
2026-01-09 13:59:10 +08:00

524 lines
17 KiB
C++

// Copyright (c) Orbbec Inc. All Rights Reserved.
// Licensed under the MIT License.
/**
* @file StreamProfile.hpp
* @brief The stream profile related type is used to get information such as the width, height, frame rate, and format of the stream.
*/
#pragma once
#include "Types.hpp"
#include "libobsensor/h/StreamProfile.h"
#include "libobsensor/h/Error.h"
#include <iostream>
#include <memory>
namespace ob {
class StreamProfile : public std::enable_shared_from_this<StreamProfile> {
protected:
const ob_stream_profile_t *impl_ = nullptr;
public:
StreamProfile(StreamProfile &streamProfile) = delete;
StreamProfile &operator=(StreamProfile &streamProfile) = delete;
StreamProfile(StreamProfile &&streamProfile) noexcept : impl_(streamProfile.impl_) {
streamProfile.impl_ = nullptr;
}
StreamProfile &operator=(StreamProfile &&streamProfile) noexcept {
if(this != &streamProfile) {
ob_error *error = nullptr;
ob_delete_stream_profile(impl_, &error);
Error::handle(&error);
impl_ = streamProfile.impl_;
streamProfile.impl_ = nullptr;
}
return *this;
}
virtual ~StreamProfile() noexcept {
if(impl_) {
ob_error *error = nullptr;
ob_delete_stream_profile(impl_, &error);
Error::handle(&error);
}
}
const ob_stream_profile *getImpl() const {
return impl_;
}
/**
* @brief Get the format of the stream.
*
* @return OBFormat return the format of the stream.
*/
OBFormat getFormat() const {
ob_error *error = nullptr;
auto format = ob_stream_profile_get_format(impl_, &error);
Error::handle(&error);
return format;
}
/**
* @brief Get the type of stream.
*
* @return OBStreamType return the type of the stream.
*/
OBStreamType getType() const {
ob_error *error = nullptr;
auto type = ob_stream_profile_get_type(impl_, &error);
Error::handle(&error);
return type;
}
/**
* @brief Get the extrinsic parameters from current stream profile to the given target stream profile.
*
* @return OBExtrinsic Return the extrinsic parameters.
*/
OBExtrinsic getExtrinsicTo(std::shared_ptr<StreamProfile> target) const {
ob_error *error = nullptr;
auto extrinsic = ob_stream_profile_get_extrinsic_to(impl_, const_cast<ob_stream_profile_t *>(target->getImpl()), &error);
Error::handle(&error);
return extrinsic;
}
/**
* @brief Set the extrinsic parameters from current stream profile to the given target stream profile.
*
* @tparam target Target stream profile.
* @tparam extrinsic The extrinsic.
*/
void bindExtrinsicTo(std::shared_ptr<StreamProfile> target, const OBExtrinsic &extrinsic) {
ob_error *error = nullptr;
ob_stream_profile_set_extrinsic_to(const_cast<ob_stream_profile_t *>(impl_), const_cast<const ob_stream_profile_t *>(target->getImpl()), extrinsic, &error);
Error::handle(&error);
}
/**
* @brief Set the extrinsic parameters from current stream profile to the given target stream type.
*
* @tparam targetStreamType Target stream type.
* @tparam extrinsic The extrinsic.
*/
void bindExtrinsicTo(const OBStreamType &targetStreamType, const OBExtrinsic &extrinsic) {
ob_error *error = nullptr;
ob_stream_profile_set_extrinsic_to_type(const_cast<ob_stream_profile_t *>(impl_),targetStreamType,extrinsic, &error);
Error::handle(&error);
}
/**
* @brief Check if frame object is compatible with the given type.
*
* @tparam T Given type.
* @return bool return result.
*/
template <typename T> bool is() const;
/**
* @brief Converts object type to target type.
*
* @tparam T Target type.
* @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible.
*/
template <typename T> std::shared_ptr<T> as() {
if(!is<T>()) {
throw std::runtime_error("Unsupported operation. Object's type is not the required type.");
}
return std::dynamic_pointer_cast<T>(shared_from_this());
}
/**
* @brief Converts object type to target type (const version).
*
* @tparam T Target type.
* @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible.
*/
template <typename T> std::shared_ptr<const T> as() const {
if(!is<T>()) {
throw std::runtime_error("Unsupported operation. Object's type is not the required type.");
}
return std::static_pointer_cast<const T>(shared_from_this());
}
// The following interfaces are deprecated and are retained here for compatibility purposes.
OBFormat format() const {
return getFormat();
}
OBStreamType type() const {
return getType();
}
protected:
explicit StreamProfile(const ob_stream_profile_t *impl) : impl_(impl) {}
};
/**
* @brief Class representing a video stream profile.
*/
class VideoStreamProfile : public StreamProfile {
public:
explicit VideoStreamProfile(const ob_stream_profile_t *impl) : StreamProfile(impl) {}
~VideoStreamProfile() noexcept override = default;
/**
* @brief Return the frame rate of the stream.
*
* @return uint32_t Return the frame rate of the stream.
*/
uint32_t getFps() const {
ob_error *error = nullptr;
auto fps = ob_video_stream_profile_get_fps(impl_, &error);
Error::handle(&error);
return fps;
}
/**
* @brief Return the width of the stream.
*
* @return uint32_t Return the width of the stream.
*/
uint32_t getWidth() const {
ob_error *error = nullptr;
auto width = ob_video_stream_profile_get_width(impl_, &error);
Error::handle(&error);
return width;
}
/**
* @brief Return the height of the stream.
*
* @return uint32_t Return the height of the stream.
*/
uint32_t getHeight() const {
ob_error *error = nullptr;
auto height = ob_video_stream_profile_get_height(impl_, &error);
Error::handle(&error);
return height;
}
/**
* @brief Get the intrinsic parameters of the stream.
*
* @return OBCameraIntrinsic Return the intrinsic parameters.
*/
OBCameraIntrinsic getIntrinsic() const {
ob_error *error = nullptr;
auto intrinsic = ob_video_stream_profile_get_intrinsic(impl_, &error);
Error::handle(&error);
return intrinsic;
}
/**
* @brief Set the intrinsic parameters of the stream.
*
* @param intrinsic The intrinsic parameters.
*/
void setIntrinsic(const OBCameraIntrinsic &intrinsic) {
ob_error *error = nullptr;
ob_video_stream_profile_set_intrinsic(const_cast<ob_stream_profile_t *>(impl_), intrinsic, &error);
Error::handle(&error);
}
/**
* @brief Get the distortion parameters of the stream.
* @brief Brown distortion model
*
* @return OBCameraDistortion Return the distortion parameters.
*/
OBCameraDistortion getDistortion() const {
ob_error *error = nullptr;
auto distortion = ob_video_stream_profile_get_distortion(impl_, &error);
Error::handle(&error);
return distortion;
}
/**
* @brief Set the distortion parameters of the stream.
*
* @param distortion The distortion parameters.
*/
void setDistortion(const OBCameraDistortion &distortion) {
ob_error *error = nullptr;
ob_video_stream_profile_set_distortion(const_cast<ob_stream_profile_t *>(impl_), distortion, &error);
Error::handle(&error);
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
uint32_t fps() const {
return getFps();
}
uint32_t width() const {
return getWidth();
}
uint32_t height() const {
return getHeight();
}
};
/**
* @brief Class representing an accelerometer stream profile.
*/
class AccelStreamProfile : public StreamProfile {
public:
explicit AccelStreamProfile(const ob_stream_profile_t *impl) : StreamProfile(impl) {}
~AccelStreamProfile() noexcept override = default;
/**
* @brief Return the full scale range.
*
* @return OBAccelFullScaleRange Return the scale range value.
*/
OBAccelFullScaleRange getFullScaleRange() const {
ob_error *error = nullptr;
auto fullScaleRange = ob_accel_stream_profile_get_full_scale_range(impl_, &error);
Error::handle(&error);
return fullScaleRange;
}
/**
* @brief Return the sampling frequency.
*
* @return OBAccelFullScaleRange Return the sampling frequency.
*/
OBAccelSampleRate getSampleRate() const {
ob_error *error = nullptr;
auto sampleRate = ob_accel_stream_profile_get_sample_rate(impl_, &error);
Error::handle(&error);
return sampleRate;
}
/**
* @brief get the intrinsic parameters of the stream.
*
* @return OBAccelIntrinsic Return the intrinsic parameters.
*/
OBAccelIntrinsic getIntrinsic() const {
ob_error *error = nullptr;
auto intrinsic = ob_accel_stream_profile_get_intrinsic(impl_, &error);
Error::handle(&error);
return intrinsic;
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
OBAccelFullScaleRange fullScaleRange() const {
return getFullScaleRange();
}
OBAccelSampleRate sampleRate() const {
return getSampleRate();
}
};
/**
* @brief Class representing a gyroscope stream profile.
*/
class GyroStreamProfile : public StreamProfile {
public:
explicit GyroStreamProfile(const ob_stream_profile_t *impl) : StreamProfile(impl) {}
~GyroStreamProfile() noexcept override = default;
/**
* @brief Return the full scale range.
*
* @return OBAccelFullScaleRange Return the scale range value.
*/
OBGyroFullScaleRange getFullScaleRange() const {
ob_error *error = nullptr;
auto fullScaleRange = ob_gyro_stream_profile_get_full_scale_range(impl_, &error);
Error::handle(&error);
return fullScaleRange;
}
/**
* @brief Return the sampling frequency.
*
* @return OBAccelFullScaleRange Return the sampling frequency.
*/
OBGyroSampleRate getSampleRate() const {
ob_error *error = nullptr;
auto sampleRate = ob_gyro_stream_profile_get_sample_rate(impl_, &error);
Error::handle(&error);
return sampleRate;
}
/**
* @brief get the intrinsic parameters of the stream.
*
* @return OBGyroIntrinsic Return the intrinsic parameters.
*/
OBGyroIntrinsic getIntrinsic() const {
ob_error *error = nullptr;
auto intrinsic = ob_gyro_stream_get_intrinsic(impl_, &error);
Error::handle(&error);
return intrinsic;
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
OBGyroFullScaleRange fullScaleRange() const {
return getFullScaleRange();
}
OBGyroSampleRate sampleRate() const {
return getSampleRate();
}
};
template <typename T> bool StreamProfile::is() const {
switch(this->getType()) {
case OB_STREAM_VIDEO:
case OB_STREAM_IR:
case OB_STREAM_IR_LEFT:
case OB_STREAM_IR_RIGHT:
case OB_STREAM_COLOR:
case OB_STREAM_DEPTH:
case OB_STREAM_RAW_PHASE:
case OB_STREAM_CONFIDENCE:
return typeid(T) == typeid(VideoStreamProfile);
case OB_STREAM_ACCEL:
return typeid(T) == typeid(AccelStreamProfile);
case OB_STREAM_GYRO:
return typeid(T) == typeid(GyroStreamProfile);
default:
break;
}
return false;
}
class StreamProfileFactory {
public:
static std::shared_ptr<StreamProfile> create(const ob_stream_profile_t *impl) {
ob_error *error = nullptr;
const auto type = ob_stream_profile_get_type(impl, &error);
Error::handle(&error);
switch(type) {
case OB_STREAM_IR:
case OB_STREAM_IR_LEFT:
case OB_STREAM_IR_RIGHT:
case OB_STREAM_DEPTH:
case OB_STREAM_COLOR:
case OB_STREAM_VIDEO:
case OB_STREAM_CONFIDENCE:
return std::make_shared<VideoStreamProfile>(impl);
case OB_STREAM_ACCEL:
return std::make_shared<AccelStreamProfile>(impl);
case OB_STREAM_GYRO:
return std::make_shared<GyroStreamProfile>(impl);
default: {
ob_error *err = ob_create_error(OB_STATUS_ERROR, "Unsupported stream type.", "StreamProfileFactory::create", "", OB_EXCEPTION_TYPE_INVALID_VALUE);
Error::handle(&err);
return nullptr;
}
}
}
};
class StreamProfileList {
protected:
const ob_stream_profile_list_t *impl_;
public:
explicit StreamProfileList(ob_stream_profile_list_t *impl) : impl_(impl) {}
~StreamProfileList() noexcept {
ob_error *error = nullptr;
ob_delete_stream_profile_list(impl_, &error);
Error::handle(&error, false);
}
/**
* @brief Return the number of StreamProfile objects.
*
* @return uint32_t Return the number of StreamProfile objects.
*/
uint32_t getCount() const {
ob_error *error = nullptr;
auto count = ob_stream_profile_list_get_count(impl_, &error);
Error::handle(&error);
return count;
}
/**
* @brief Return the StreamProfile object at the specified index.
*
* @param index The index of the StreamProfile object to be retrieved. Must be in the range [0, count-1]. Throws an exception if the index is out of range.
* @return std::shared_ptr<StreamProfile> Return the StreamProfile object.
*/
std::shared_ptr<StreamProfile> getProfile(uint32_t index) const {
ob_error *error = nullptr;
auto profile = ob_stream_profile_list_get_profile(impl_, index, &error);
Error::handle(&error);
return StreamProfileFactory::create(profile);
}
/**
* @brief Match the corresponding video stream profile based on the passed-in parameters. If multiple Match are found, the first one in the list is
* returned by default. Throws an exception if no matching profile is found.
*
* @param width The width of the stream. Pass OB_WIDTH_ANY if no matching condition is required.
* @param height The height of the stream. Pass OB_HEIGHT_ANY if no matching condition is required.
* @param format The type of the stream. Pass OB_FORMAT_ANY if no matching condition is required.
* @param fps The frame rate of the stream. Pass OB_FPS_ANY if no matching condition is required.
* @return std::shared_ptr<VideoStreamProfile> Return the matching resolution.
*/
std::shared_ptr<VideoStreamProfile> getVideoStreamProfile(int width = OB_WIDTH_ANY, int height = OB_HEIGHT_ANY, OBFormat format = OB_FORMAT_ANY,
int fps = OB_FPS_ANY) const {
ob_error *error = nullptr;
auto profile = ob_stream_profile_list_get_video_stream_profile(impl_, width, height, format, fps, &error);
Error::handle(&error);
auto vsp = StreamProfileFactory::create(profile);
return vsp->as<VideoStreamProfile>();
}
/**
* @brief Match the corresponding accelerometer stream profile based on the passed-in parameters. If multiple Match are found, the first one in the list
* is returned by default. Throws an exception if no matching profile is found.
*
* @param fullScaleRange The full scale range. Pass 0 if no matching condition is required.
* @param sampleRate The sampling frequency. Pass 0 if no matching condition is required.
*/
std::shared_ptr<AccelStreamProfile> getAccelStreamProfile(OBAccelFullScaleRange fullScaleRange, OBAccelSampleRate sampleRate) const {
ob_error *error = nullptr;
auto profile = ob_stream_profile_list_get_accel_stream_profile(impl_, fullScaleRange, sampleRate, &error);
Error::handle(&error);
auto asp = StreamProfileFactory::create(profile);
return asp->as<AccelStreamProfile>();
}
/**
* @brief Match the corresponding gyroscope stream profile based on the passed-in parameters. If multiple Match are found, the first one in the list is
* returned by default. Throws an exception if no matching profile is found.
*
* @param fullScaleRange The full scale range. Pass 0 if no matching condition is required.
* @param sampleRate The sampling frequency. Pass 0 if no matching condition is required.
*/
std::shared_ptr<GyroStreamProfile> getGyroStreamProfile(OBGyroFullScaleRange fullScaleRange, OBGyroSampleRate sampleRate) const {
ob_error *error = nullptr;
auto profile = ob_stream_profile_list_get_gyro_stream_profile(impl_, fullScaleRange, sampleRate, &error);
Error::handle(&error);
auto gsp = StreamProfileFactory::create(profile);
return gsp->as<GyroStreamProfile>();
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
uint32_t count() const {
return getCount();
}
};
} // namespace ob