Skip to content

Commit fa74e95

Browse files
authored
Enhance NV12 and NV21 Support in sensor_msgs::image_encodings (#264)
- Redefine numChannels for NV12 and NV21 from 2 to 1 to accurately reflect their planar YUV 4:2:0 format. - Add isPlanar function to determine if an encoding is planar (e.g., NV12, NV21, NV24). - Introduce getHeightScaling function to provide height scaling factors for planar encodings. - Improve code consistency and add documentation for new utility functions. Signed-off-by: Zhaoyuan Cheng <[email protected]>
1 parent d236966 commit fa74e95

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

sensor_msgs/include/sensor_msgs/image_encodings.hpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,11 @@ static inline bool hasAlpha(const std::string & encoding)
150150
encoding == RGBA16 || encoding == BGRA16;
151151
}
152152

153+
static inline bool isPlanar(const std::string & encoding)
154+
{
155+
return encoding == NV12 || encoding == NV21 || encoding == NV24;
156+
}
157+
153158
static inline int numChannels(const std::string & encoding)
154159
{
155160
// First do the common-case encodings
@@ -191,12 +196,15 @@ static inline int numChannels(const std::string & encoding)
191196
return (m[3] == "") ? 1 : std::atoi(m[3].str().c_str());
192197
}
193198

199+
if (encoding == NV12 ||
200+
encoding == NV21)
201+
{
202+
return 1;
203+
}
194204
if (encoding == YUV422 ||
195205
encoding == YUV422_YUY2 ||
196206
encoding == UYVY ||
197207
encoding == YUYV ||
198-
encoding == NV12 ||
199-
encoding == NV21 ||
200208
encoding == NV24)
201209
{
202210
return 2;
@@ -258,6 +266,19 @@ static inline int bitDepth(const std::string & encoding)
258266
throw std::runtime_error("Unknown encoding " + encoding);
259267
return -1;
260268
}
269+
270+
static inline float getHeightScaling(const std::string & encoding)
271+
{
272+
if (isPlanar(encoding)) {
273+
if (encoding == NV12 ||
274+
encoding == NV21)
275+
{
276+
return 1.5f;
277+
}
278+
}
279+
return 1.0f;
280+
}
281+
261282
} // namespace image_encodings
262283
} // namespace sensor_msgs
263284

sensor_msgs/test/test_image_encodings.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,25 @@ TEST(sensor_msgs, bitDepth)
7171
ASSERT_EQ(sensor_msgs::image_encodings::bitDepth("yuv422"), 8);
7272
ASSERT_EQ(sensor_msgs::image_encodings::bitDepth("yuv422_yuy2"), 8);
7373
}
74+
75+
TEST(sensor_msgs, getHeightScaling)
76+
{
77+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("nv12"), 1.5f);
78+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("nv21"), 1.5f);
79+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("mono8"), 1.0f);
80+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("rgb8"), 1.0f);
81+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("8UC"), 1.0f);
82+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("8UC3"), 1.0f);
83+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("8UC10"), 1.0f);
84+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("16UC"), 1.0f);
85+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("16UC3"), 1.0f);
86+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("16UC10"), 1.0f);
87+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("32SC"), 1.0f);
88+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("32SC3"), 1.0f);
89+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("32SC10"), 1.0f);
90+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("64FC"), 1.0f);
91+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("64FC3"), 1.0f);
92+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("64FC10"), 1.0f);
93+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("yuv422"), 1.0f);
94+
ASSERT_FLOAT_EQ(sensor_msgs::image_encodings::getHeightScaling("yuv422_yuy2"), 1.0f);
95+
}

0 commit comments

Comments
 (0)