Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IS-11 support #271

Open
wants to merge 116 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
d5e46c1
Add Flow Compatibility Management API base route
N-Nagorny Jan 11, 2022
487818e
Add IS-11 resource makers and implement all GET operations
N-Nagorny Jan 12, 2022
79d2024
Implement PUT and DELETE for /inputs/{inputId}/edid/base
N-Nagorny Jan 14, 2022
634967d
flowcompatibility_api.cpp: refactor repeated code
N-Nagorny Jan 14, 2022
6d2a212
Add IS-11 and BCP-004-01 JSON Schemas
N-Nagorny Jan 16, 2022
ca8c804
Implement PUT and DELETE for /senders/{senderId}/constraints/active, …
N-Nagorny Jan 16, 2022
4b8f590
Implement States of Sender and Receiver
N-Nagorny Jan 24, 2022
fff7420
Fix bst::optional nullopt values
N-Nagorny Feb 3, 2022
3de8159
Allow making Outputs without EDID
N-Nagorny Feb 21, 2022
142f765
Remove "senders"/"receivers" arrays from Input/Output properties
N-Nagorny Feb 21, 2022
7ba0287
Add Sender Capabilities to flowcompatibility_active_constraints_put_h…
N-Nagorny Mar 11, 2022
b11402e
IS-11: update schemas, apply the new spec name to the sources
N-Nagorny May 14, 2022
ae50dd1
flowcompatibility -> streamcompatibility
N-Nagorny May 14, 2022
d230c3a
Node: replace EDID examples with dummies, add minor fixes
N-Nagorny May 14, 2022
2bcaba0
Sync Sender/Receiver states with IS-11 spec
N-Nagorny May 14, 2022
16941f7
Prevent IS-11 restrictions violation
N-Nagorny May 14, 2022
f2b8918
Fix is_subconstraint(), add unit tests
N-Nagorny May 31, 2022
6604027
Get rid of list of parameter constraints used for checking if a Const…
N-Nagorny May 31, 2022
583969d
Align bst::optional usage in IS-11 with the rest of code
N-Nagorny May 31, 2022
b3cf776
Replace string literals with platform-independent version
N-Nagorny May 31, 2022
3755db2
Convert EDID binary stored as utility::string_t to std::vector<uint8_t>
N-Nagorny Jun 27, 2022
986820e
Sync IS-11 Status with the spec
N-Nagorny Jun 27, 2022
c8f111b
Make Sender validator of streamcompatibility_behaviour_thread customi…
N-Nagorny Jul 6, 2022
278a802
streamcompatibility_behaviour: make namespaces full
N-Nagorny Jul 6, 2022
4836364
is_subconstraint(): fix the rational case
N-Nagorny Jul 20, 2022
b48f40f
Add match_constraint() for arbitrary JSON value
N-Nagorny Nov 16, 2022
8141286
is_subconstraint(): fix comparing of rationals
N-Nagorny Nov 16, 2022
c5d2000
Add constraints matcher for Senders
N-Nagorny Nov 17, 2022
2bac1b6
Add validate_receiver() callback, expand validate_sender()'s return v…
N-Nagorny Nov 17, 2022
e94eddf
Remove senderReceiverSubrouteType
N-Nagorny Nov 17, 2022
0812d6f
Minor fixes
N-Nagorny Nov 17, 2022
8eabb3f
Align make_node_implementation_streamcompatibility_...() naming
N-Nagorny Nov 17, 2022
7df92e9
Fix is_constraint_subset()
N-Nagorny Nov 20, 2022
376d616
Decouple IS-11 and IS-05
N-Nagorny Nov 20, 2022
5c8ab03
Apply suggestions from code review
N-Nagorny Nov 22, 2022
0dcdd31
Remove trailing commas
N-Nagorny Nov 22, 2022
a538f15
Move default connection_resource_patch_validator to nmos/connection_s…
N-Nagorny Nov 22, 2022
8801298
Replace validate_sender_resources with make_streamcompatibility_sende…
N-Nagorny Nov 23, 2022
b62883e
Fix inverted logic in subconstraint and constraint subset definitions
N-Nagorny Nov 23, 2022
e83e7d9
Get rid of structured bindings
N-Nagorny Nov 23, 2022
8084118
constraint_{min,max}imum: field<double> -> field_as_value
N-Nagorny Nov 30, 2022
e0756a2
Rename validate_sender to validate_sender_resources
N-Nagorny Nov 30, 2022
7d799c5
Add a Stream Compatibility validation test
N-Nagorny Nov 30, 2022
8ba4b46
Merge remote-tracking branch 'origin/master' into is-11
garethsb Dec 2, 2022
0444c02
Compare integer min/max as int64_t
garethsb Dec 2, 2022
6574cd7
Merge branch 'master' into is-11
N-Nagorny Dec 4, 2022
402fa7d
Revert changes in sdp_utils.{cpp,h}
N-Nagorny Dec 4, 2022
f5216f3
Add make_streamcompatibility_sdp_constraint_sets_matcher
N-Nagorny Dec 4, 2022
cd890ad
Fix /{senders,receivers}/{resourceId}/{inputs,outputs}
N-Nagorny Dec 6, 2022
6f46f53
Fix PUTting an empty array to Active Constraints
N-Nagorny Feb 2, 2023
8fc7591
Add default streamcompatibility_sender_validator to node_implementation
N-Nagorny Feb 2, 2023
8680a8f
Move empty Active Constraints fix
N-Nagorny Feb 3, 2023
d24eb37
Add "edid_support" to Node config
N-Nagorny Mar 21, 2023
2e08ff5
Different supported parameter constraints and Sedner Caps for video a…
N-Nagorny Mar 21, 2023
f5106ca
Add handling of Active Constraints which Constraint Sets contain less…
N-Nagorny Mar 21, 2023
fb0e20e
Fix build
N-Nagorny Mar 21, 2023
c5f2834
Merge remote-tracking branch 'origin/master' into is-11
N-Nagorny Apr 9, 2023
15a27a9
Add room for custom "debug" in 422 response
N-Nagorny Apr 9, 2023
c07645b
Fix Windows build
N-Nagorny Apr 17, 2023
fdaac5c
Merge remote-tracking branch 'origin/master' into is-11
garethsb Apr 20, 2023
e31e434
Add make_streamcompatibility_receiver_validator
N-Nagorny Apr 20, 2023
48b3c2c
Fix Sender validator for video/jxsv
N-Nagorny Apr 20, 2023
29bc35b
Fix receivers validation
N-Nagorny Apr 20, 2023
16af3ee
Fill Sender Caps from impl::fields
N-Nagorny Apr 20, 2023
9a4d99f
Restore the elegance of make_node_implementation
N-Nagorny Apr 20, 2023
8e22199
Merge Base EDID PUT and Base EDID DELETE handlers into a single one
N-Nagorny Apr 20, 2023
0195a9e
Remove has_value()
N-Nagorny Apr 20, 2023
389bcd2
streamcompatibility_active_constraints_put_handler: take streamcompat…
N-Nagorny Apr 20, 2023
1d1f878
Add get_constraint_set_intersection for streamcompatibility_active_co…
N-Nagorny Apr 21, 2023
56d9555
Store intersection of Sender Caps and Active Constraints in streamcom…
N-Nagorny Apr 22, 2023
abd69b1
Fix print-outs
N-Nagorny Apr 22, 2023
9bc3c91
constraints.cpp tweaks
N-Nagorny Apr 25, 2023
fd69423
streamcompatibility_active_constraints_put_handler -> streamcompatibi…
N-Nagorny Apr 25, 2023
6b75505
Separate 422 and empty intersection
N-Nagorny Apr 25, 2023
e0b29e1
Run IS-11 test suite as part of CI
N-Nagorny Apr 25, 2023
9e9ac54
Quickfix
N-Nagorny Apr 25, 2023
1631623
Temporarily ignore auto_connection_21
N-Nagorny Apr 25, 2023
dff5591
Revert "Temporarily ignore auto_connection_21"
N-Nagorny Apr 27, 2023
3d71441
CI: switch IS-11 branch
N-Nagorny Apr 28, 2023
e5efb1d
Move video_jxsv_sender_resources_matcher to video_jxsv.{h,cpp}
N-Nagorny Apr 28, 2023
ecf6aaf
Fix streamcompatibility_sender_validator typedef
N-Nagorny Apr 28, 2023
e1f707c
Remove "merge" from get_constraint_set_intersection
N-Nagorny Apr 28, 2023
c0c479f
Replace make_streamcompatibility_receiver_validator's transport_file_…
N-Nagorny Apr 28, 2023
4edcf0c
Simplify make_node_implementation_streamcompatibility_active_constrai…
N-Nagorny May 5, 2023
4a37cd8
constraint_value_less: detail -> details
N-Nagorny May 5, 2023
bd128a3
Restore filtering out "meta" in get_constraint_set_intersection
N-Nagorny May 5, 2023
ca0b38a
Fix '"enum" matches "min"/"max"' case
N-Nagorny May 22, 2023
c17013f
Add settings for IS-11 implementation control
N-Nagorny May 22, 2023
04f1fc9
CI: print test results for failed suites
N-Nagorny May 22, 2023
bda591e
Fix streamcompatibility_index issue
N-Nagorny Jun 13, 2023
dbfc11d
Add "device_id" to IS-11 Input/Output
N-Nagorny Feb 13, 2023
60fa835
Add "base_edid_changeable" to Input
N-Nagorny Feb 15, 2023
3c01117
"base_edid_changeable" -> "base_edid_support"
N-Nagorny Jul 1, 2023
17f9721
Add "default_signal"
N-Nagorny Jul 1, 2023
28241d0
Update JSON Schemas
N-Nagorny Jul 1, 2023
b24f84d
Add "adjust_to_caps"
N-Nagorny Jul 3, 2023
b98dab7
Update JSON Schemas
N-Nagorny Jul 20, 2023
2e033b5
Remove support of obsolete "base_edid", "effective_edid" and "edid" J…
N-Nagorny Jul 20, 2023
146beed
Add "master_enable" check before Receiver's stream compliance check
N-Nagorny Jul 22, 2023
74e20cc
Wrap adjust_to_caps checks with U macro
N-Nagorny Jul 22, 2023
8f3301c
Erase "debug" in Status of S/R if it's empty in the last update
N-Nagorny Jul 22, 2023
c778adc
CI: temporarily switch to nmos-testing fork
N-Nagorny Jul 22, 2023
4c446ba
Fix edid_href
N-Nagorny Oct 12, 2023
0d8f8e4
CI: change the branch
N-Nagorny Nov 1, 2023
20b8a7d
Remove BCP-004-01 schemas since they were copied to IS-11
N-Nagorny Nov 1, 2023
290c745
Switch nmos-testing to AMWA-TV:is-11
N-Nagorny Mar 4, 2024
a21a413
Merge branch 'master' into is-11
N-Nagorny Mar 4, 2024
effaa6f
Add IS-11 docs
N-Nagorny Mar 6, 2024
726f18f
Temporarily disable IS-11 tests
N-Nagorny Mar 6, 2024
373ffa9
Merge branch 'master' into is-11
N-Nagorny Mar 7, 2024
a522324
Remove spaces
lo-simon Mar 11, 2024
fbb4470
Add IS-10 support
lo-simon Mar 11, 2024
d33fdfa
Merge pull request #1 from lo-simon/add-is10-support-to-is11
N-Nagorny Mar 12, 2024
3fa4720
Apply suggestions from code review
N-Nagorny Mar 13, 2024
7bce8b5
IS-11 branch: v1.0-dev -> v1.0.x
N-Nagorny Mar 15, 2024
7d47286
Update IS-11 docs
N-Nagorny Mar 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Replace make_streamcompatibility_receiver_validator's transport_file_…
…parser arg with transport_file_validator
  • Loading branch information
N-Nagorny committed Apr 28, 2023
commit c0c479fbc2e3f06dfa6d94c878b2224fc3bdfdcc
41 changes: 25 additions & 16 deletions Development/nmos-cpp-node/node_implementation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,19 @@ namespace impl
const auto temperature_Celsius = nmos::event_types::measurement(U("temperature"), U("C"));
const auto temperature_wildcard = nmos::event_types::measurement(U("temperature"), nmos::event_types::wildcard);
const auto catcall = nmos::event_types::named_enum(nmos::event_types::number, U("caterwaul"));

const auto validate_sdp_parameters = [](const web::json::value& receiver, const nmos::sdp_parameters& sdp_params)
{
if (nmos::media_types::video_jxsv == nmos::get_media_type(sdp_params))
{
nmos::validate_video_jxsv_sdp_parameters(receiver, sdp_params);
}
else
{
// validate core media types, i.e., "video/raw", "audio/L", "video/smpte291" and "video/SMPTE2022-6"
nmos::validate_sdp_parameters(receiver, sdp_params);
}
};
}

// forward declarations for node_implementation_thread
Expand Down Expand Up @@ -1146,19 +1159,7 @@ nmos::transport_file_parser make_node_implementation_transport_file_parser()
// (if this callback is specified, an 'empty' std::function is not allowed)
return [](const nmos::resource& receiver, const nmos::resource& connection_receiver, const utility::string_t& transport_file_type, const utility::string_t& transport_file_data, slog::base_gate& gate)
{
const auto validate_sdp_parameters = [](const web::json::value& receiver, const nmos::sdp_parameters& sdp_params)
{
if (nmos::media_types::video_jxsv == nmos::get_media_type(sdp_params))
{
nmos::validate_video_jxsv_sdp_parameters(receiver, sdp_params);
}
else
{
// validate core media types, i.e., "video/raw", "audio/L", "video/smpte291" and "video/SMPTE2022-6"
nmos::validate_sdp_parameters(receiver, sdp_params);
}
};
return nmos::details::parse_rtp_transport_file(validate_sdp_parameters, receiver, connection_receiver, transport_file_type, transport_file_data, gate);
return nmos::details::parse_rtp_transport_file(impl::validate_sdp_parameters, receiver, connection_receiver, transport_file_type, transport_file_data, gate);
};
}

Expand Down Expand Up @@ -1603,9 +1604,17 @@ nmos::experimental::details::streamcompatibility_sender_validator make_node_impl
};
}

nmos::experimental::details::streamcompatibility_receiver_validator make_node_implementation_streamcompatibility_receiver_validator(slog::base_gate& gate)
nmos::experimental::details::streamcompatibility_receiver_validator make_node_implementation_streamcompatibility_receiver_validator()
{
return nmos::experimental::make_streamcompatibility_receiver_validator(make_node_implementation_transport_file_parser(), gate);
// this example uses a custom transport file validator to handle video/jxsv in addition to the core media types
const auto transport_file_validator = std::bind(
nmos::experimental::details::validate_rtp_transport_file,
impl::validate_sdp_parameters,
std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3
);
return nmos::experimental::make_streamcompatibility_receiver_validator(transport_file_validator);
}

namespace impl
Expand Down Expand Up @@ -1770,5 +1779,5 @@ nmos::experimental::node_implementation make_node_implementation(nmos::node_mode
.on_set_effective_edid(set_effective_edid) // may be omitted if not required
.on_active_constraints_changed(make_node_implementation_streamcompatibility_active_constraints_handler(model, gate))
.on_validate_sender_resources_against_active_constraints(make_node_implementation_streamcompatibility_sender_validator()) // may be omitted if the default is sufficient
.on_validate_receiver_against_transport_file(make_node_implementation_streamcompatibility_receiver_validator(gate));
.on_validate_receiver_against_transport_file(make_node_implementation_streamcompatibility_receiver_validator());
}
1 change: 1 addition & 0 deletions Development/nmos/node_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ namespace nmos
node_implementation()
: parse_transport_file(&nmos::parse_rtp_transport_file)
, validate_sender_resources(make_streamcompatibility_sender_resources_validator(&nmos::experimental::match_resource_parameters_constraint_set, make_streamcompatibility_sdp_constraint_sets_matcher(&nmos::match_sdp_parameters_constraint_sets)))
, validate_receiver(make_streamcompatibility_receiver_validator(&nmos::experimental::validate_rtp_transport_file))
{}

node_implementation& on_load_server_certificates(nmos::load_server_certificates_handler load_server_certificates) { this->load_server_certificates = std::move(load_server_certificates); return *this; }
Expand Down
2 changes: 1 addition & 1 deletion Development/nmos/streamcompatibility_behaviour.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ namespace nmos

if (validate_receiver)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if validate_receiver is empty, should this use the "default" implementation, i.e. nmos::experimental::validate_receiver_resources? if it doesn't do any validation when this handler is omitted, the comment in make_node_implementation_streamcompatibility_receiver_validator() that "this example uses the default receiver validator explicitly" is wrong.

(same question applies to validate_sender above!)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the default implementation for validate_sender but gate argument stopped me from making it for validate_receiver. Not sure yet if it's a real obstacle to do it.

{
std::tie(receiver_state, receiver_state_debug) = validate_receiver(transport_file, *receiver, *connection_receiver);
std::tie(receiver_state, receiver_state_debug) = validate_receiver(*receiver, transport_file);
}

if (nmos::fields::state(nmos::fields::status(streamcompatibility_receiver->data)) != receiver_state.name)
Expand Down
28 changes: 24 additions & 4 deletions Development/nmos/streamcompatibility_validation.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "nmos/streamcompatibility_validation.h"

#include "nmos/connection_api.h"
#include "nmos/json_fields.h"
#include "nmos/model.h"
#include "nmos/resource.h"
Expand Down Expand Up @@ -28,6 +29,26 @@ namespace nmos

}

void validate_rtp_transport_file(const nmos::resource& receiver, const utility::string_t& transport_file_type, const utility::string_t& transport_file_data)
{
return details::validate_rtp_transport_file(&validate_sdp_parameters, receiver, transport_file_type, transport_file_data);
}

void details::validate_rtp_transport_file(nmos::details::sdp_parameters_validator validate_sdp_parameters, const nmos::resource& receiver, const utility::string_t& transport_file_type, const utility::string_t& transport_file_data)
{
if (transport_file_type != nmos::media_types::application_sdp.name)
{
throw std::runtime_error("unexpected type: " + utility::us2s(transport_file_type));
}

const auto session_description = sdp::parse_session_description(utility::us2s(transport_file_data));
auto sdp_transport_params = nmos::parse_session_description(session_description);

// Validate transport file according to the IS-04 receiver

validate_sdp_parameters(receiver.data, sdp_transport_params.first);
}

// "At any time if State of an active Sender becomes active_constraints_violation, the Sender MUST become inactive.
// An inactive Sender in this state MUST NOT allow activations.
// At any time if State of an active Receiver becomes non_compliant_stream, the Receiver SHOULD become inactive.
Expand Down Expand Up @@ -122,9 +143,9 @@ namespace nmos
};
}

details::streamcompatibility_receiver_validator make_streamcompatibility_receiver_validator(const nmos::transport_file_parser& parse_and_validate_transport_file, slog::base_gate& gate)
details::streamcompatibility_receiver_validator make_streamcompatibility_receiver_validator(const details::transport_file_validator& validate_transport_file)
{
return [parse_and_validate_transport_file, &gate](const web::json::value& transport_file_, const nmos::resource& receiver, const nmos::resource& connection_receiver) -> std::pair<nmos::receiver_state, utility::string_t>
return [validate_transport_file](const nmos::resource& receiver, const web::json::value& transport_file_) -> std::pair<nmos::receiver_state, utility::string_t>
{
nmos::receiver_state receiver_state = nmos::receiver_states::unknown;
utility::string_t receiver_state_debug;
Expand All @@ -138,11 +159,10 @@ namespace nmos

try
{
parse_and_validate_transport_file(receiver, connection_receiver, transport_file.first, transport_file.second, gate);
validate_transport_file(receiver, transport_file.first, transport_file.second);
}
catch (const std::runtime_error& e)
{
slog::log<slog::severities::error>(gate, SLOG_FLF) << "Validation of receiver " << receiver.id << " failed with " << e.what();
receiver_state = nmos::receiver_states::non_compliant_stream;
receiver_state_debug = utility::conversions::to_string_t(e.what());
}
Expand Down
13 changes: 11 additions & 2 deletions Development/nmos/streamcompatibility_validation.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,22 @@ namespace nmos
// returns Sender's "state" and "debug" values
typedef std::function<std::pair<nmos::sender_state, utility::string_t>(const nmos::resource& source, const nmos::resource& flow, const nmos::resource& sender, const nmos::resource& connection_sender, const web::json::array& constraint_sets)> streamcompatibility_sender_validator;
// returns Receiver's "state" and "debug" values
typedef std::function<std::pair<nmos::receiver_state, utility::string_t>(const web::json::value& transport_file, const nmos::resource& receiver, const nmos::resource& connection_receiver)> streamcompatibility_receiver_validator;
typedef std::function<std::pair<nmos::receiver_state, utility::string_t>(const nmos::resource& receiver, const web::json::value& transport_file)> streamcompatibility_receiver_validator;

typedef std::function<void(const nmos::resource& receiver, const utility::string_t& transportfile_type, const utility::string_t& transportfile_data)> transport_file_validator;

typedef std::function<bool(const nmos::resource& resource, const web::json::value& constraint_set)> resource_constraints_matcher;
typedef std::function<bool(const std::pair<utility::string_t, utility::string_t>& transport_file, const web::json::array& constraint_sets)> transport_file_constraint_sets_matcher;
typedef std::function<bool(const web::json::array& constraint_sets, const sdp_parameters& sdp_params)> sdp_constraint_sets_matcher;

// Validate the specified transport file for the specified receiver using the specified validator
void validate_rtp_transport_file(nmos::details::sdp_parameters_validator validate_sdp_parameters, const nmos::resource& receiver, const utility::string_t& transport_file_type, const utility::string_t& transport_file_data);
}

// Validate the specified transport file for the specified receiver using the default validator
// (this is the default transport file validator)
void validate_rtp_transport_file(const nmos::resource& receiver, const utility::string_t& transport_file_type, const utility::string_t& transport_file_data);

typedef std::map<utility::string_t, std::function<bool(const web::json::value& resource, const web::json::value& con)>> parameter_constraints;

// NMOS Parameter Registers - Capabilities register
Expand Down Expand Up @@ -89,7 +98,7 @@ namespace nmos
nmos::details::connection_resource_patch_validator make_connection_streamcompatibility_validator(nmos::node_model& model);

details::streamcompatibility_sender_validator make_streamcompatibility_sender_resources_validator(const details::resource_constraints_matcher& resource_matcher, const details::transport_file_constraint_sets_matcher& transport_file_matcher);
details::streamcompatibility_receiver_validator make_streamcompatibility_receiver_validator(const nmos::transport_file_parser& parse_and_validate_transport_file, slog::base_gate& gate);
details::streamcompatibility_receiver_validator make_streamcompatibility_receiver_validator(const details::transport_file_validator& validate_transport_file);
bool match_resource_parameters_constraint_set(const nmos::resource& resource, const web::json::value& constraint_set);
details::transport_file_constraint_sets_matcher make_streamcompatibility_sdp_constraint_sets_matcher(const details::sdp_constraint_sets_matcher& match_sdp_parameters_constraint_sets);
}
Expand Down
25 changes: 11 additions & 14 deletions Development/nmos/video_jxsv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,24 +344,21 @@ namespace nmos
return constraint_sets.end() != found;
}

namespace experimental
bool experimental::match_video_jxsv_resource_parameters_constraint_set(const nmos::resource& resource, const web::json::value& constraint_set)
{
bool match_video_jxsv_resource_parameters_constraint_set(const nmos::resource& resource, const web::json::value& constraint_set)
const std::map<nmos::type, nmos::experimental::parameter_constraints> resource_parameter_constraints
{
const std::map<nmos::type, nmos::experimental::parameter_constraints> resource_parameter_constraints
{
{ nmos::types::source, nmos::experimental::source_parameter_constraints },
{ nmos::types::flow, nmos::experimental::video_jxsv_flow_parameter_constraints },
{ nmos::types::sender, nmos::experimental::video_jxsv_sender_parameter_constraints }
};
{ nmos::types::source, nmos::experimental::source_parameter_constraints },
{ nmos::types::flow, nmos::experimental::video_jxsv_flow_parameter_constraints },
{ nmos::types::sender, nmos::experimental::video_jxsv_sender_parameter_constraints }
};

if (0 == resource_parameter_constraints.count(resource.type))
{
throw std::logic_error("wrong resource type");
}
if (0 == resource_parameter_constraints.count(resource.type))
{
throw std::logic_error("wrong resource type");
}

return nmos::experimental::detail::match_resource_parameters_constraint_set(resource_parameter_constraints.at(resource.type), resource.data, constraint_set);
};
return nmos::experimental::detail::match_resource_parameters_constraint_set(resource_parameter_constraints.at(resource.type), resource.data, constraint_set);
}

// See https://specs.amwa.tv/bcp-006-01/branches/v1.0-dev/docs/NMOS_With_JPEG_XS.html#flows
Expand Down