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
constraints.cpp tweaks
  • Loading branch information
N-Nagorny committed Apr 25, 2023
commit 9bc3c9155266f72224a1f1f4026c4f0dd7c7e1a9
83 changes: 26 additions & 57 deletions Development/nmos/constraints.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "nmos/constraints.h"

#include <algorithm>
#include <map>
#include <set>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
Expand All @@ -15,46 +15,30 @@ namespace nmos
{
namespace experimental
{
bool constraint_comp(const web::json::value& lhs, const web::json::value& rhs)
namespace detail
N-Nagorny marked this conversation as resolved.
Show resolved Hide resolved
{
if (nmos::is_rational(lhs) && nmos::is_rational(rhs))
bool constraint_value_less(const web::json::value& lhs, const web::json::value& rhs)
{
if (nmos::parse_rational(lhs) < nmos::parse_rational(rhs))
if (nmos::is_rational(lhs) && nmos::is_rational(rhs))
{
return true;
}
}
else if (lhs.is_integer() && rhs.is_integer())
{
if (lhs.as_number().to_int64() < rhs.as_number().to_int64())
{
return true;
}
}
else if (lhs.is_double() && rhs.is_double())
{
if (lhs.as_double() < rhs.as_double())
{
return true;
}
}
else if (lhs.is_string() && rhs.is_string())
{
if (lhs.as_string() < rhs.as_string())
{
return true;
if (nmos::parse_rational(lhs) < nmos::parse_rational(rhs))
{
return true;
}
return false;
}
return lhs < rhs;
}
return false;
}

web::json::value get_intersection(const web::json::array& lhs, const web::json::array& rhs)
web::json::value get_intersection(const web::json::array& lhs_, const web::json::array& rhs_)
{
std::set<web::json::value, decltype(&detail::constraint_value_less)> lhs(lhs_.begin(), lhs_.end(), &detail::constraint_value_less);
std::set<web::json::value, decltype(&detail::constraint_value_less)> rhs(rhs_.begin(), rhs_.end(), &detail::constraint_value_less);

std::vector<web::json::value> v(std::min(lhs.size(), rhs.size()));

// "Arrays are used for ordered elements."
// https://json-schema.org/understanding-json-schema/reference/array.html
const auto it = std::set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), v.begin(), constraint_comp);
const auto it = std::set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), v.begin(), detail::constraint_value_less);
v.resize(it - v.begin());

return web::json::value_from_elements(v);
Expand Down Expand Up @@ -89,7 +73,7 @@ namespace nmos
// "minimum"
if (lhs.has_field(nmos::fields::constraint_minimum) && rhs.has_field(nmos::fields::constraint_minimum))
{
result[nmos::fields::constraint_minimum] = std::max(nmos::fields::constraint_minimum(lhs), nmos::fields::constraint_minimum(rhs), constraint_comp);
result[nmos::fields::constraint_minimum] = std::max(nmos::fields::constraint_minimum(lhs), nmos::fields::constraint_minimum(rhs), detail::constraint_value_less);
}
else if (lhs.has_field(nmos::fields::constraint_minimum))
{
Expand All @@ -103,7 +87,7 @@ namespace nmos
// "maximum"
if (lhs.has_field(nmos::fields::constraint_maximum) && rhs.has_field(nmos::fields::constraint_maximum))
{
result[nmos::fields::constraint_maximum] = std::min(nmos::fields::constraint_maximum(lhs), nmos::fields::constraint_maximum(rhs), constraint_comp);
result[nmos::fields::constraint_maximum] = std::min(nmos::fields::constraint_maximum(lhs), nmos::fields::constraint_maximum(rhs), detail::constraint_value_less);
}
else if (lhs.has_field(nmos::fields::constraint_maximum))
{
Expand All @@ -117,7 +101,7 @@ namespace nmos
// "min" > "max"
if (result.has_field(nmos::fields::constraint_minimum) && result.has_field(nmos::fields::constraint_maximum))
{
if (!constraint_comp(nmos::fields::constraint_minimum(result), nmos::fields::constraint_maximum(result)))
if (detail::constraint_value_less(nmos::fields::constraint_maximum(result), nmos::fields::constraint_minimum(result)))
{
return web::json::value::null();
}
Expand All @@ -136,13 +120,10 @@ namespace nmos
}
}

// no "min"/"max" and "enum" is empty
if (result.has_field(nmos::fields::constraint_enum) && (!result.has_field(nmos::fields::constraint_minimum) && !result.has_field(nmos::fields::constraint_maximum)))
// "enum" is empty
if (result.has_field(nmos::fields::constraint_enum) && web::json::empty(nmos::fields::constraint_enum(result)))
{
if (0 == nmos::fields::constraint_enum(result).as_array().size())
{
return web::json::value::null();
}
return web::json::value::null();
}

return result;
Expand Down Expand Up @@ -224,20 +205,17 @@ namespace nmos
const auto& constraint_min = nmos::fields::constraint_minimum(constraint);
const auto& subconstraint_min = nmos::fields::constraint_minimum(subconstraint);

if (constraint_min != subconstraint_min)
if (detail::constraint_value_less(subconstraint_min, constraint_min))
{
if (!constraint_comp(constraint_min, subconstraint_min))
{
return false;
}
return false;
}
}
if (constraint.has_field(nmos::fields::constraint_maximum) && subconstraint.has_field(nmos::fields::constraint_maximum))
{
const auto& constraint_max = nmos::fields::constraint_maximum(constraint);
const auto& subconstraint_max = nmos::fields::constraint_maximum(subconstraint);

if (constraint_comp(constraint_max, subconstraint_max))
if (detail::constraint_value_less(constraint_max, subconstraint_max))
{
return false;
}
Expand All @@ -256,21 +234,12 @@ namespace nmos

// Constraint Set B is a subset of Constraint Set A if all Parameter Constraints of Constraint Set A are present in Constraint Set B, and for each Parameter Constraint
// that is present in both, the Parameter Constraint of Constraint Set B is a subconstraint of the Parameter Constraint of Constraint Set A.
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset, bool merge_left_to_right)
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset)
{
using web::json::value;

const auto& param_constraints_set = constraint_set.as_object();
auto param_constraints_subset = constraint_subset.as_object();

if (merge_left_to_right)
{
param_constraints_subset = param_constraints_set;
std::for_each(constraint_subset.as_object().begin(), constraint_subset.as_object().end(), [&param_constraints_subset](const std::pair<utility::string_t, value>& subconstraint)
{
param_constraints_subset[subconstraint.first] = subconstraint.second;
});
}
const auto& param_constraints_subset = constraint_subset.as_object();

return param_constraints_set.end() == std::find_if_not(param_constraints_set.begin(), param_constraints_set.end(), [&param_constraints_subset](const std::pair<utility::string_t, value>& constraint)
{
Expand Down
7 changes: 6 additions & 1 deletion Development/nmos/constraints.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,16 @@ namespace nmos
{
namespace experimental
{
namespace detail
{
bool constraint_value_less(const web::json::value& lhs, const web::json::value& rhs);
}

web::json::value get_constraint_intersection(const web::json::value& lhs, const web::json::value& rhs);
web::json::value get_constraint_set_intersection(const web::json::value& lhs, const web::json::value& rhs, bool merge_left_to_right = false);

bool is_subconstraint(const web::json::value& constraint, const web::json::value& subconstraint);
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset, bool merge_left_to_right = false);
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset);
}
}

Expand Down
26 changes: 24 additions & 2 deletions Development/nmos/test/constraints_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@

#include "bst/test/test.h"

////////////////////////////////////////////////////////////////////////////////////////////
BST_TEST_CASE(testJsonComparator)
{
{
using nmos::experimental::detail::constraint_value_less;

const auto a = nmos::make_caps_rational_constraint({}, nmos::rates::rate25, nmos::rates::rate30);
const auto b = nmos::make_caps_rational_constraint({}, nmos::rates::rate25, nmos::rates::rate29_97);

BST_REQUIRE(constraint_value_less(nmos::fields::constraint_minimum(a), nmos::fields::constraint_maximum(a)));
BST_REQUIRE(constraint_value_less(nmos::fields::constraint_minimum(a), nmos::fields::constraint_maximum(b)));
BST_REQUIRE(constraint_value_less(nmos::fields::constraint_minimum(b), nmos::fields::constraint_maximum(a)));
BST_REQUIRE(constraint_value_less(nmos::fields::constraint_minimum(b), nmos::fields::constraint_maximum(b)));

BST_REQUIRE(!constraint_value_less(nmos::fields::constraint_minimum(a), nmos::fields::constraint_minimum(b)));
BST_REQUIRE(!constraint_value_less(nmos::fields::constraint_maximum(a), nmos::fields::constraint_maximum(b)));

BST_REQUIRE(!constraint_value_less(nmos::fields::constraint_minimum(b), nmos::fields::constraint_minimum(a)));
BST_REQUIRE(constraint_value_less(nmos::fields::constraint_maximum(b), nmos::fields::constraint_maximum(a)));
}
}

////////////////////////////////////////////////////////////////////////////////////////////
BST_TEST_CASE(testSimpleCase)
{
Expand Down Expand Up @@ -231,7 +253,7 @@ BST_TEST_CASE(testConstraintSetIntersection)
{ nmos::caps::format::frame_width, nmos::make_caps_integer_constraint({ 1920 }) },
{ nmos::caps::format::frame_height, nmos::make_caps_integer_constraint({ 1080 }) },
{ nmos::caps::format::color_sampling, nmos::make_caps_string_constraint({ sdp::samplings::YCbCr_4_2_2.name }) },
{ nmos::caps::format::interlace_mode, nmos::make_caps_string_constraint({ nmos::interlace_modes::interlaced_tff.name, nmos::interlace_modes::interlaced_psf.name }) },
{ nmos::caps::format::interlace_mode, nmos::make_caps_string_constraint({ nmos::interlace_modes::interlaced_psf.name, nmos::interlace_modes::interlaced_tff.name }) },
{ nmos::caps::format::colorspace, nmos::make_caps_string_constraint({ sdp::colorimetries::BT2020.name, sdp::colorimetries::BT709.name }) },
{ nmos::caps::format::transfer_characteristic, nmos::make_caps_string_constraint({ sdp::transfer_characteristic_systems::SDR.name }) },
{ nmos::caps::format::component_depth, nmos::make_caps_integer_constraint({ 10 }) },
Expand Down Expand Up @@ -276,7 +298,7 @@ BST_TEST_CASE(testConstraintSetIntersectionMerge)
{ nmos::caps::format::frame_width, nmos::make_caps_integer_constraint({ 1920 }) },
{ nmos::caps::format::frame_height, nmos::make_caps_integer_constraint({ 1080 }) },
{ nmos::caps::format::color_sampling, nmos::make_caps_string_constraint({ sdp::samplings::YCbCr_4_2_2.name }) },
{ nmos::caps::format::interlace_mode, nmos::make_caps_string_constraint({ nmos::interlace_modes::interlaced_tff.name, nmos::interlace_modes::interlaced_psf.name }) },
{ nmos::caps::format::interlace_mode, nmos::make_caps_string_constraint({ nmos::interlace_modes::interlaced_psf.name, nmos::interlace_modes::interlaced_tff.name }) },
{ nmos::caps::format::colorspace, nmos::make_caps_string_constraint({ sdp::colorimetries::BT2020.name, sdp::colorimetries::BT709.name }) },
{ nmos::caps::format::transfer_characteristic, nmos::make_caps_string_constraint({ sdp::transfer_characteristic_systems::SDR.name }) },
{ nmos::caps::format::component_depth, nmos::make_caps_integer_constraint({ 10 }) },
Expand Down