Skip to content

Commit 0b4c4ba

Browse files
authored
Add _or_defaults versions of the format-specific parameters parsing functions (#426)
* Refactor handling of required format-specific parameters * Remove potential misleading error message Since an 'empty' fmtp attribute would appear the same at this abstraction, it's better to rely on reporting omission of specific required format-specific parameters * Switch if-else branches for consistency between required and optional parameters * Add _or_defaults versions of the functions that normally throw when required parameters are omitted - these functions still throw if they encounter invalid values
1 parent 0af3b66 commit 0b4c4ba

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

Development/nmos/sdp_utils.cpp

+30-19
Original file line numberDiff line numberDiff line change
@@ -1284,34 +1284,33 @@ namespace nmos
12841284
}
12851285

12861286
// Get additional "video/raw" parameters from the SDP parameters
1287-
video_raw_parameters get_video_raw_parameters(const sdp_parameters& sdp_params)
1287+
template <typename MissingRequiredParameter>
1288+
video_raw_parameters get_video_raw_parameters(const sdp_parameters& sdp_params, MissingRequiredParameter missing = MissingRequiredParameter{})
12881289
{
12891290
video_raw_parameters params;
12901291

1291-
if (sdp_params.fmtp.empty()) throw details::sdp_processing_error("missing attribute: fmtp");
1292-
12931292
// See SMPTE ST 2110-20:2017 Section 7.2 Required Media Type Parameters
12941293
// and Section 7.3 Media Type Parameters with default values
12951294

12961295
const auto sampling = details::find_fmtp(sdp_params.fmtp, sdp::fields::sampling);
1297-
if (sdp_params.fmtp.end() == sampling) throw details::sdp_processing_error("missing format parameter: sampling");
1298-
params.sampling = sdp::sampling{ sampling->second };
1296+
if (sdp_params.fmtp.end() != sampling) params.sampling = sdp::sampling{ sampling->second };
1297+
else missing(sdp::fields::sampling);
12991298

13001299
const auto depth = details::find_fmtp(sdp_params.fmtp, sdp::fields::depth);
1301-
if (sdp_params.fmtp.end() == depth) throw details::sdp_processing_error("missing format parameter: depth");
1302-
params.depth = utility::istringstreamed<uint32_t>(depth->second);
1300+
if (sdp_params.fmtp.end() != depth) params.depth = utility::istringstreamed<uint32_t>(depth->second);
1301+
else missing(sdp::fields::depth);
13031302

13041303
const auto width = details::find_fmtp(sdp_params.fmtp, sdp::fields::width);
1305-
if (sdp_params.fmtp.end() == width) throw details::sdp_processing_error("missing format parameter: width");
1306-
params.width = utility::istringstreamed<uint32_t>(width->second);
1304+
if (sdp_params.fmtp.end() != width) params.width = utility::istringstreamed<uint32_t>(width->second);
1305+
else missing(sdp::fields::width);
13071306

13081307
const auto height = details::find_fmtp(sdp_params.fmtp, sdp::fields::height);
1309-
if (sdp_params.fmtp.end() == height) throw details::sdp_processing_error("missing format parameter: height");
1310-
params.height = utility::istringstreamed<uint32_t>(height->second);
1308+
if (sdp_params.fmtp.end() != height) params.height = utility::istringstreamed<uint32_t>(height->second);
1309+
else missing(sdp::fields::height);
13111310

13121311
const auto exactframerate = details::find_fmtp(sdp_params.fmtp, sdp::fields::exactframerate);
1313-
if (sdp_params.fmtp.end() == exactframerate) throw details::sdp_processing_error("missing format parameter: exactframerate");
1314-
params.exactframerate = nmos::details::parse_exactframerate(exactframerate->second);
1312+
if (sdp_params.fmtp.end() != exactframerate) params.exactframerate = nmos::details::parse_exactframerate(exactframerate->second);
1313+
else missing(sdp::fields::exactframerate);
13151314

13161315
// optional
13171316
const auto interlace = details::find_fmtp(sdp_params.fmtp, sdp::fields::interlace);
@@ -1326,8 +1325,8 @@ namespace nmos
13261325
if (sdp_params.fmtp.end() != tcs) params.tcs = sdp::transfer_characteristic_system{ tcs->second };
13271326

13281327
const auto colorimetry = details::find_fmtp(sdp_params.fmtp, sdp::fields::colorimetry);
1329-
if (sdp_params.fmtp.end() == colorimetry) throw details::sdp_processing_error("missing format parameter: colorimetry");
1330-
params.colorimetry = sdp::colorimetry{ colorimetry->second };
1328+
if (sdp_params.fmtp.end() != colorimetry) params.colorimetry = sdp::colorimetry{ colorimetry->second };
1329+
else missing(sdp::fields::colorimetry);
13311330

13321331
// optional
13331332
const auto range = details::find_fmtp(sdp_params.fmtp, sdp::fields::range);
@@ -1338,12 +1337,12 @@ namespace nmos
13381337
if (sdp_params.fmtp.end() != par) params.par = nmos::details::parse_pixel_aspect_ratio(par->second);
13391338

13401339
const auto pm = details::find_fmtp(sdp_params.fmtp, sdp::fields::packing_mode);
1341-
if (sdp_params.fmtp.end() == pm) throw details::sdp_processing_error("missing format parameter: PM");
1342-
params.pm = sdp::packing_mode{ pm->second };
1340+
if (sdp_params.fmtp.end() != pm) params.pm = sdp::packing_mode{ pm->second };
1341+
else missing(sdp::fields::packing_mode);
13431342

13441343
const auto ssn = details::find_fmtp(sdp_params.fmtp, sdp::fields::smpte_standard_number);
1345-
if (sdp_params.fmtp.end() == ssn) throw details::sdp_processing_error("missing format parameter: SSN");
1346-
params.ssn = sdp::smpte_standard_number{ ssn->second };
1344+
if (sdp_params.fmtp.end() != ssn) params.ssn = sdp::smpte_standard_number{ ssn->second };
1345+
else missing(sdp::fields::smpte_standard_number);
13471346

13481347
// "Senders and Receivers compliant to [ST 2110-20] shall comply with the provisions of SMPTE ST 2110-21."
13491348
// See SMPTE ST 2110-20:2017 Section 6.1.1
@@ -1378,6 +1377,18 @@ namespace nmos
13781377
return params;
13791378
}
13801379

1380+
// Get additional "video/raw" parameters from the SDP parameters
1381+
video_raw_parameters get_video_raw_parameters(const sdp_parameters& sdp_params)
1382+
{
1383+
return get_video_raw_parameters<details::throw_missing_fmtp>(sdp_params);
1384+
}
1385+
1386+
// Get additional "video/raw" parameters from the SDP parameters
1387+
video_raw_parameters get_video_raw_parameters_or_defaults(const sdp_parameters& sdp_params)
1388+
{
1389+
return get_video_raw_parameters<>(sdp_params, [](const utility::string_t&) {});
1390+
}
1391+
13811392
// Get additional "audio/L" parameters from the SDP parameters
13821393
audio_L_parameters get_audio_L_parameters(const sdp_parameters& sdp_params)
13831394
{

Development/nmos/sdp_utils.h

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdexcept>
88
#include "bst/any.h"
99
#include "bst/optional.h"
10+
#include "cpprest/basic_utils.h"
1011
#include "sdp/json.h"
1112
#include "sdp/ntp.h"
1213
#include "nmos/did_sdid.h"
@@ -506,6 +507,7 @@ namespace nmos
506507
sdp_parameters make_video_raw_sdp_parameters(const utility::string_t& session_name, const video_raw_parameters& params, uint64_t payload_type, const std::vector<utility::string_t>& media_stream_ids = {}, const std::vector<sdp_parameters::ts_refclk_t>& ts_refclk = {});
507508
// Get additional "video/raw" parameters from the SDP parameters
508509
video_raw_parameters get_video_raw_parameters(const sdp_parameters& sdp_params);
510+
video_raw_parameters get_video_raw_parameters_or_defaults(const sdp_parameters& sdp_params);
509511

510512
// Construct additional "audio/L" parameters from the IS-04 resources, using default values for unspecified items
511513
audio_L_parameters make_audio_L_parameters(const web::json::value& node, const web::json::value& source, const web::json::value& flow, const web::json::value& sender, bst::optional<double> packet_time);
@@ -582,6 +584,14 @@ namespace nmos
582584
return std::runtime_error{ "sdp processing error - " + message };
583585
}
584586

587+
struct throw_missing_fmtp
588+
{
589+
void operator()(const utility::string_t& name) const
590+
{
591+
throw details::sdp_processing_error("missing format parameter: " + utility::us2s(name));
592+
}
593+
};
594+
585595
inline sdp_parameters::fmtp_t::const_iterator find_fmtp(const sdp_parameters::fmtp_t& fmtp, const utility::string_t& name)
586596
{
587597
return std::find_if(fmtp.begin(), fmtp.end(), [&](const sdp_parameters::fmtp_t::value_type& param)

Development/nmos/video_jxsv.cpp

+16-3
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,14 @@ namespace nmos
186186
}
187187

188188
// Get additional "video/jxsv" parameters from the SDP parameters
189-
video_jxsv_parameters get_video_jxsv_parameters(const sdp_parameters& sdp_params)
189+
template <typename MissingRequiredParameter>
190+
video_jxsv_parameters get_video_jxsv_parameters(const sdp_parameters& sdp_params, MissingRequiredParameter missing = MissingRequiredParameter{})
190191
{
191192
video_jxsv_parameters params;
192193

193194
const auto packetmode = details::find_fmtp(sdp_params.fmtp, sdp::video_jxsv::fields::packetmode);
194-
if (sdp_params.fmtp.end() == packetmode) throw details::sdp_processing_error("missing format parameter: packetmode");
195-
params.packetmode = (sdp::video_jxsv::packetization_mode)utility::istringstreamed<uint32_t>(packetmode->second);
195+
if (sdp_params.fmtp.end() != packetmode) params.packetmode = (sdp::video_jxsv::packetization_mode)utility::istringstreamed<uint32_t>(packetmode->second);
196+
else missing(sdp::video_jxsv::fields::packetmode);
196197

197198
// optional
198199
const auto transmode = details::find_fmtp(sdp_params.fmtp, sdp::video_jxsv::fields::transmode);
@@ -286,6 +287,18 @@ namespace nmos
286287
return params;
287288
}
288289

290+
// Get additional "video/jxsv" parameters from the SDP parameters
291+
video_jxsv_parameters get_video_jxsv_parameters(const sdp_parameters& sdp_params)
292+
{
293+
return get_video_jxsv_parameters<details::throw_missing_fmtp>(sdp_params);
294+
}
295+
296+
// Get additional "video/jxsv" parameters from the SDP parameters
297+
video_jxsv_parameters get_video_jxsv_parameters_or_defaults(const sdp_parameters& sdp_params)
298+
{
299+
return get_video_jxsv_parameters<>(sdp_params, [](const utility::string_t&) {});
300+
}
301+
289302
// Calculate the format bit rate (kilobits/second) from the specified frame rate, dimensions and bits per pixel
290303
uint64_t get_video_jxsv_bit_rate(const nmos::rational& grain_rate, uint32_t frame_width, uint32_t frame_height, double bits_per_pixel)
291304
{

Development/nmos/video_jxsv.h

+1
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ namespace nmos
353353
sdp_parameters make_video_jxsv_sdp_parameters(const utility::string_t& session_name, const video_jxsv_parameters& params, uint64_t payload_type, const std::vector<utility::string_t>& media_stream_ids = {}, const std::vector<sdp_parameters::ts_refclk_t>& ts_refclk = {});
354354
// Get additional "video/jxsv" parameters from the SDP parameters
355355
video_jxsv_parameters get_video_jxsv_parameters(const sdp_parameters& sdp_params);
356+
video_jxsv_parameters get_video_jxsv_parameters_or_defaults(const sdp_parameters& sdp_params);
356357

357358
// Construct SDP parameters for "video/jxsv"
358359
inline sdp_parameters make_sdp_parameters(const utility::string_t& session_name, const video_jxsv_parameters& params, uint64_t payload_type, const std::vector<utility::string_t>& media_stream_ids = {}, const std::vector<sdp_parameters::ts_refclk_t>& ts_refclk = {})

0 commit comments

Comments
 (0)