Skip to content

Commit d14515b

Browse files
committed
Add error handling for command params.
1 parent 6721da7 commit d14515b

File tree

2 files changed

+137
-16
lines changed

2 files changed

+137
-16
lines changed

src/app/clusters/camera-av-stream-management-server/camera-av-stream-management-server.cpp

+78-12
Original file line numberDiff line numberDiff line change
@@ -107,24 +107,28 @@ CHIP_ERROR CameraAVStreamMgmtServer::Init()
107107

108108
if (SupportsOptAttr(OptionalAttribute::kSupportsNightVision) || SupportsOptAttr(OptionalAttribute::kSupportsNightVisionIllum))
109109
{
110-
VerifyOrReturnError(
111-
HasFeature(Feature::kVideo) || HasFeature(Feature::kSnapshot), CHIP_ERROR_INVALID_ARGUMENT,
112-
ChipLogError(Zcl, "CameraAVStreamMgmt: Feature configuration error. if NIghtVision is enabled, then Video|Snapshot feature required"));
110+
VerifyOrReturnError(HasFeature(Feature::kVideo) || HasFeature(Feature::kSnapshot), CHIP_ERROR_INVALID_ARGUMENT,
111+
ChipLogError(Zcl,
112+
"CameraAVStreamMgmt: Feature configuration error. if NIghtVision is enabled, then "
113+
"Video|Snapshot feature required"));
113114
}
114115

115116
if (SupportsOptAttr(OptionalAttribute::kSupportsMicrophoneAGCEnabled))
116117
{
117118
VerifyOrReturnError(
118119
HasFeature(Feature::kAudio), CHIP_ERROR_INVALID_ARGUMENT,
119-
ChipLogError(Zcl, "CameraAVStreamMgmt: Feature configuration error. if MicrophoneAGCEnabled, then Audio feature required"));
120+
ChipLogError(Zcl,
121+
"CameraAVStreamMgmt: Feature configuration error. if MicrophoneAGCEnabled, then Audio feature required"));
120122
}
121123

122-
if (SupportsOptAttr(OptionalAttribute::kSupportsImageFlipHorizontal) || SupportsOptAttr(OptionalAttribute::kSupportsImageFlipVertical) ||
124+
if (SupportsOptAttr(OptionalAttribute::kSupportsImageFlipHorizontal) ||
125+
SupportsOptAttr(OptionalAttribute::kSupportsImageFlipVertical) ||
123126
SupportsOptAttr(OptionalAttribute::kSupportsImageRotation))
124127
{
125-
VerifyOrReturnError(
126-
HasFeature(Feature::kImageControl), CHIP_ERROR_INVALID_ARGUMENT,
127-
ChipLogError(Zcl, "CameraAVStreamMgmt: Feature configuration error. if ImageFlip or Rotation enabled, then ImageControl feature required"));
128+
VerifyOrReturnError(HasFeature(Feature::kImageControl), CHIP_ERROR_INVALID_ARGUMENT,
129+
ChipLogError(Zcl,
130+
"CameraAVStreamMgmt: Feature configuration error. if ImageFlip or Rotation enabled, then "
131+
"ImageControl feature required"));
128132
}
129133

130134
LoadPersistentAttributes();
@@ -1463,7 +1467,7 @@ void CameraAVStreamMgmtServer::HandleVideoStreamAllocate(HandlerContext & ctx,
14631467
auto & maxFragmentLen = commandData.maxFragmentLen;
14641468
auto & isWaterMarkEnabled = commandData.watermarkEnabled;
14651469
auto & isOSDEnabled = commandData.OSDEnabled;
1466-
uint16_t videoStreamID = 0;
1470+
uint16_t videoStreamID = 0;
14671471

14681472
// If Watermark feature is supported, then command should have the
14691473
// isWaterMarkEnabled param. Or, if it is not supported, then command should
@@ -1479,6 +1483,22 @@ void CameraAVStreamMgmtServer::HandleVideoStreamAllocate(HandlerContext & ctx,
14791483
(!HasFeature(Feature::kOnScreenDisplay) && !commandData.OSDEnabled.HasValue()),
14801484
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand));
14811485

1486+
VerifyOrReturn(IsStreamUsageValid(streamUsage), {
1487+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid stream usage");
1488+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand);
1489+
});
1490+
1491+
VerifyOrReturn(IsVideoCodecValid(videoCodec), {
1492+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid video codec");
1493+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand);
1494+
});
1495+
1496+
VerifyOrReturn(minFrameRate <= maxFrameRate, ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError));
1497+
1498+
VerifyOrReturn(minBitRate <= maxBitRate, ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError));
1499+
1500+
VerifyOrReturn(minFragmentLen <= maxFragmentLen, ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError));
1501+
14821502
// Call the delegate
14831503
status =
14841504
mDelegate.VideoStreamAllocate(streamUsage, videoCodec, minFrameRate, maxFrameRate, minResolution, maxResolution, minBitRate,
@@ -1558,6 +1578,31 @@ void CameraAVStreamMgmtServer::HandleAudioStreamAllocate(HandlerContext & ctx,
15581578
auto & bitDepth = commandData.bitDepth;
15591579
uint16_t audioStreamID = 0;
15601580

1581+
VerifyOrReturn(IsStreamUsageValid(streamUsage), {
1582+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid stream usage");
1583+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1584+
});
1585+
1586+
VerifyOrReturn(IsAudioCodecValid(audioCodec), {
1587+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid audio codec");
1588+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1589+
});
1590+
1591+
VerifyOrReturn(sampleRate > 0 && bitRate > 0, {
1592+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid sampleRate or bitRate ");
1593+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1594+
});
1595+
1596+
VerifyOrReturn(IsBitDepthValid(bitDepth), {
1597+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid bitDepth");
1598+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1599+
});
1600+
1601+
VerifyOrReturn(channelCount <= kMaxChannelCount, {
1602+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid channel count");
1603+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1604+
});
1605+
15611606
// Call the delegate
15621607
Status status =
15631608
mDelegate.AudioStreamAllocate(streamUsage, audioCodec, channelCount, sampleRate, bitRate, bitDepth, audioStreamID);
@@ -1604,6 +1649,21 @@ void CameraAVStreamMgmtServer::HandleSnapshotStreamAllocate(HandlerContext & ctx
16041649
auto & quality = commandData.quality;
16051650
uint16_t snapshotStreamID = 0;
16061651

1652+
VerifyOrReturn(IsImageCodecValid(imageCodec), {
1653+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid image codec");
1654+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::InvalidCommand);
1655+
});
1656+
1657+
VerifyOrReturn(maxFrameRate > 0 && bitRate > 0, {
1658+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid maxFrameRate or bitRate");
1659+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1660+
});
1661+
1662+
VerifyOrReturn(quality > 0 && quality <= kMaxImageQualityMetric, {
1663+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid image quality");
1664+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::ConstraintError);
1665+
});
1666+
16071667
// Call the delegate
16081668
Status status = mDelegate.SnapshotStreamAllocate(imageCodec, maxFrameRate, bitRate, minResolution, maxResolution, quality,
16091669
snapshotStreamID);
@@ -1642,16 +1702,22 @@ void CameraAVStreamMgmtServer::HandleSetStreamPriorities(HandlerContext & ctx,
16421702
{
16431703

16441704
auto & streamPriorities = commandData.streamPriorities;
1645-
//auto & streamPriorities = commandData.streamPriorities;
1705+
// auto & streamPriorities = commandData.streamPriorities;
16461706

16471707
auto iter = streamPriorities.begin();
16481708
StreamUsageEnum rankedStreamPriorities[kNumOfStreamUsageTypes];
16491709
int i = 0;
1650-
while(iter.Next())
1710+
while (iter.Next())
16511711
{
1652-
auto & streamUsage = iter.GetValue();
1712+
auto & streamUsage = iter.GetValue();
16531713
rankedStreamPriorities[i++] = streamUsage;
16541714
}
1715+
1716+
VerifyOrReturn(i == kNumOfStreamUsageTypes, {
1717+
ChipLogError(Zcl, "CameraAVStreamMgmt: Invalid num of stream usages");
1718+
ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand);
1719+
});
1720+
16551721
CHIP_ERROR err = SetRankedVideoStreamPriorities(rankedStreamPriorities);
16561722

16571723
if (err != CHIP_NO_ERROR)

src/app/clusters/camera-av-stream-management-server/camera-av-stream-management-server.h

+59-4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ using SnapshotParamsStruct = Structs::SnapshotParamsStruct::Type;
4747
constexpr uint8_t kMaxSpeakerLevel = 254;
4848
constexpr uint8_t kMaxMicrophoneLevel = 254;
4949
constexpr uint16_t kMaxImageRotationDegrees = 359;
50+
constexpr uint8_t kMaxChannelCount = 8;
51+
constexpr uint8_t kMaxImageQualityMetric = 100;
5052

5153
constexpr size_t kViewportStructMaxSerializedSize =
5254
TLV::EstimateStructOverhead(sizeof(uint16_t), sizeof(uint16_t), sizeof(uint16_t), sizeof(uint16_t));
@@ -115,9 +117,8 @@ class CameraAVStreamMgmtDelegate
115117
VideoStreamAllocate(StreamUsageEnum streamUsage, VideoCodecEnum videoCodec, const uint16_t minFrameRate,
116118
const uint16_t maxFrameRate, const VideoResolutionStruct & minResolution,
117119
const VideoResolutionStruct & maxResolution, const uint32_t minBitRate, const uint32_t maxBitRate,
118-
const uint16_t minFragmentLen, const uint16_t maxFragmentLen,
119-
const chip::Optional<bool> waterMarkEnabled, const chip::Optional<bool> osdEnabled,
120-
uint16_t & outStreamID) = 0;
120+
const uint16_t minFragmentLen, const uint16_t maxFragmentLen, const chip::Optional<bool> waterMarkEnabled,
121+
const chip::Optional<bool> osdEnabled, uint16_t & outStreamID) = 0;
121122

122123
/**
123124
* @brief Handle Command Delegate for Video stream modification.
@@ -133,7 +134,8 @@ class CameraAVStreamMgmtDelegate
133134
* @return Success if the stream modification is successful; otherwise, the command SHALL be rejected with an appropriate
134135
* error.
135136
*/
136-
virtual Protocols::InteractionModel::Status VideoStreamModify(const uint16_t streamID, const chip::Optional<bool> waterMarkEnabled,
137+
virtual Protocols::InteractionModel::Status VideoStreamModify(const uint16_t streamID,
138+
const chip::Optional<bool> waterMarkEnabled,
137139
const chip::Optional<bool> osdEnabled) = 0;
138140

139141
/**
@@ -593,6 +595,59 @@ class CameraAVStreamMgmtServer : public CommandHandlerInterface, public Attribut
593595
return CHIP_NO_ERROR;
594596
}
595597

598+
bool IsAudioCodecValid(AudioCodecEnum audioCodec)
599+
{
600+
switch (audioCodec)
601+
{
602+
case AudioCodecEnum::kOpus:
603+
case AudioCodecEnum::kAacLc:
604+
return true;
605+
default:
606+
return false;
607+
}
608+
}
609+
610+
bool IsVideoCodecValid(VideoCodecEnum videoCodec)
611+
{
612+
switch (videoCodec)
613+
{
614+
case VideoCodecEnum::kH264:
615+
case VideoCodecEnum::kHevc:
616+
case VideoCodecEnum::kVvc:
617+
case VideoCodecEnum::kAv1:
618+
return true;
619+
default:
620+
return false;
621+
}
622+
}
623+
624+
bool IsImageCodecValid(ImageCodecEnum imageCodec)
625+
{
626+
switch (imageCodec)
627+
{
628+
case ImageCodecEnum::kJpeg:
629+
return true;
630+
default:
631+
return false;
632+
}
633+
}
634+
635+
bool IsStreamUsageValid(StreamUsageEnum streamUsage)
636+
{
637+
switch (streamUsage)
638+
{
639+
case StreamUsageEnum::kInternal:
640+
case StreamUsageEnum::kRecording:
641+
case StreamUsageEnum::kAnalysis:
642+
case StreamUsageEnum::kLiveView:
643+
return true;
644+
default:
645+
return false;
646+
}
647+
}
648+
649+
bool IsBitDepthValid(uint8_t bitDepth) { return (bitDepth == 8 || bitDepth == 16 || bitDepth == 24 || bitDepth == 32); }
650+
596651
/**
597652
* IM-level implementation of read
598653
* @return appropriately mapped CHIP_ERROR if applicable

0 commit comments

Comments
 (0)