- ReelAsset::write_to_cpl (node, standard);
-
- /* Find <MainPicture> */
- xmlpp::Node* mp = find_child (node, cpl_node_name ());
-
- mp->add_child ("FrameRate")->add_child_text (String::compose ("%1 %2", _frame_rate.numerator, _frame_rate.denominator));
- if (standard == INTEROP) {
- stringstream s;
- s << std::fixed << std::setprecision (2) << (float (_screen_aspect_ratio.numerator) / _screen_aspect_ratio.denominator);
- mp->add_child ("ScreenAspectRatio")->add_child_text (s.str ());
+ auto asset = write_to_cpl_asset (node, standard, hash());
+
+ asset->add_child("FrameRate")->add_child_text(String::compose("%1 %2", _frame_rate.numerator, _frame_rate.denominator));
+ if (standard == Standard::INTEROP) {
+
+ /* Allowed values for this tag from the standard */
+ float allowed[] = { 1.33, 1.66, 1.77, 1.85, 2.00, 2.39 };
+ int const num_allowed = sizeof(allowed) / sizeof(float);
+
+ /* Actual ratio */
+ float ratio = float (_screen_aspect_ratio.numerator) / _screen_aspect_ratio.denominator;
+
+ /* Pick the closest and use that */
+ optional<float> closest;
+ optional<float> error;
+ for (int i = 0; i < num_allowed; ++i) {
+ float const e = fabsf (allowed[i] - ratio);
+ if (!closest || e < error.get()) {
+ closest = allowed[i];
+ error = e;
+ }
+ }
+
+ asset->add_child ("ScreenAspectRatio")->add_child_text (raw_convert<string> (closest.get(), 2, true));