]> git.decadent.org.uk Git - videolink.git/blobdiff - generate_dvd.cpp
Placed DVD limit values consistently in dvd.hpp.
[videolink.git] / generate_dvd.cpp
index 64079d28ad6c406e6579cc452bb7f1ae1e364ded..7f496c23e2b2a71d97411f80f6f27308b475ed1b 100644 (file)
@@ -91,6 +91,13 @@ namespace
            * double(params.rate_numer)
            / double(params.rate_denom);
     }
+
+    void throw_length_error(const char * limit_type, std::size_t limit)
+    {
+       std::ostringstream oss;
+       oss << "exceeded DVD limit: " << limit_type << " > " << limit;
+       throw std::length_error(oss.str());
+    }
 }
 
 dvd_generator::dvd_generator(const video::frame_params & frame_params,
@@ -104,13 +111,8 @@ dvd_generator::pgc_ref dvd_generator::add_menu()
 {
     pgc_ref next_menu(menu_pgc, menus_.size());
 
-    // Check against maximum number of menus.  It appears that no more
-    // than 128 menus are reachable through LinkPGCN instructions, and
-    // dvdauthor uses some menu numbers for special purposes, resulting
-    // in a practical limit of 119 per domain.  We can work around this
-    // later by spreading some menus across titlesets.
-    if (next_menu.index == 119)
-       throw std::runtime_error("No more than 119 menus can be used");
+    if (next_menu.index == dvd::domain_pgcs_max)
+       throw_length_error("number of menus", dvd::domain_pgcs_max);
 
     menus_.resize(next_menu.index + 1);
     return next_menu;
@@ -123,6 +125,10 @@ void dvd_generator::add_menu_entry(unsigned index,
     assert(index < menus_.size());
     assert(target.type == menu_pgc && target.index < menus_.size()
           || target.type == title_pgc && target.index < titles_.size());
+
+    if (menus_[index].entries.size() == dvd::menu_buttons_max)
+       throw_length_error("number of buttons", dvd::menu_buttons_max);
+
     menu_entry new_entry = { area, target };
     menus_[index].entries.push_back(new_entry);
 }
@@ -276,8 +282,8 @@ dvd_generator::pgc_ref dvd_generator::add_title(vob_list & content)
     pgc_ref next_title(title_pgc, titles_.size());
 
     // Check against maximum number of titles.
-    if (next_title.index == 99)
-       throw std::runtime_error("No more than 99 titles can be used");
+    if (next_title.index == dvd::titles_max)
+       throw_length_error("number of titles", dvd::titles_max);
 
     titles_.resize(next_title.index + 1);
     titles_[next_title.index].swap(content);