From 7a5f11ae39de2436d2d366702a3479cf6f8a4836 Mon Sep 17 00:00:00 2001 From: ob-yalian Date: Tue, 15 Sep 2026 19:45:58 +0800 Subject: [PATCH] fix: enhance JPEG validation and add corresponding tests --- orbbec_camera/src/utils.cpp | 15 +++++++++++-- .../test/camera_info_distortion_test.cpp | 21 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/orbbec_camera/src/utils.cpp b/orbbec_camera/src/utils.cpp index c9fe56c4..1dfcf64e 100644 --- a/orbbec_camera/src/utils.cpp +++ b/orbbec_camera/src/utils.cpp @@ -946,17 +946,28 @@ std::string parseUsbPort(const std::string &line) { } bool isValidJPEG(const std::shared_ptr &frame) { - if (frame->getDataSize() < 2) { // Checking both start and end markers, so minimal size is 4 + if (!frame) { return false; } + const auto data_size = frame->getDataSize(); const auto *data = static_cast(frame->getData()); + if (data == nullptr || data_size < 4) { + return false; + } // Check for JPEG start marker if (data[0] != 0xFF || data[1] != 0xD8) { return false; } - return true; + + auto jpeg_size = data_size; + while (jpeg_size > 2 && data[jpeg_size - 1] == 0x00) { + --jpeg_size; + } + + // Check for JPEG end marker after trimming zero padding. + return jpeg_size >= 4 && data[jpeg_size - 2] == 0xFF && data[jpeg_size - 1] == 0xD9; } std::string metaDataTypeToString(const OBFrameMetadataType &meta_data_type) { diff --git a/orbbec_camera/test/camera_info_distortion_test.cpp b/orbbec_camera/test/camera_info_distortion_test.cpp index 5c303284..0796e9ef 100644 --- a/orbbec_camera/test/camera_info_distortion_test.cpp +++ b/orbbec_camera/test/camera_info_distortion_test.cpp @@ -1,5 +1,6 @@ #include +#include #include #include "orbbec_camera/utils.h" @@ -32,6 +33,14 @@ OBCameraDistortion makeDistortion(OBCameraDistortionModel model) { return distortion; } +std::shared_ptr makeMjpegFrame(const std::vector& data) { + auto frame = ob::FrameFactory::createFrame(OB_FRAME_COLOR, OB_FORMAT_MJPG, + static_cast(data.size())); + auto color_frame = frame->as(); + std::memcpy(color_frame->getData(), data.data(), data.size()); + return color_frame; +} + TEST(CameraInfoDistortionTest, ConvertsBrownConradyToPlumbBob) { const auto intrinsic = makeIntrinsic(); const auto distortion = makeDistortion(OB_DISTORTION_BROWN_CONRADY); @@ -69,5 +78,17 @@ TEST(CameraInfoDistortionTest, ConvertsKannalaBrandtToEquidistant) { std::vector({distortion.k1, distortion.k2, distortion.k3, distortion.k4})); } +TEST(JpegValidationTest, AcceptsEoiBeforeZeroPadding) { + const auto frame = makeMjpegFrame({0xFF, 0xD8, 0x01, 0x02, 0xFF, 0xD9, 0x00, 0x00}); + + EXPECT_TRUE(isValidJPEG(frame)); +} + +TEST(JpegValidationTest, RejectsMjpegWithoutEoi) { + const auto frame = makeMjpegFrame({0xFF, 0xD8, 0x01, 0x02, 0x00, 0x00}); + + EXPECT_FALSE(isValidJPEG(frame)); +} + } // namespace } // namespace orbbec_camera