--- rpicam-apps-original-1.11.0/core/still_options.hpp 2025-12-20 16:32:28.223308449 +0100 +++ rpicam-apps-1.11.0/core/still_options.hpp 2025-12-20 16:48:50.052707336 +0100 @@ -27,9 +27,9 @@ ("framestart", value(&v_->framestart)->default_value(0), "Initial frame counter value for timelapse captures") ("datetime", value(&v_->datetime)->default_value(false)->implicit_value(true), - "Use date format for output file names") + "Replace %s with date and time in output file names") ("timestamp", value(&v_->timestamp)->default_value(false)->implicit_value(true), - "Use system timestamps for output file names") + "Replace %u with timestamp in output file names") ("restart", value(&v_->restart)->default_value(0), "Set JPEG restart interval") ("keypress,k", value(&v_->keypress)->default_value(false)->implicit_value(true), --- rpicam-apps-original-1.11.0/apps/rpicam_still.cpp 2025-12-20 16:32:28.221836546 +0100 +++ rpicam-apps-1.11.0/apps/rpicam_still.cpp 2025-12-20 16:47:29.557173395 +0100 @@ -37,24 +37,28 @@ static std::string generate_filename(StillOptions const *options) { - char filename[128]; - std::string folder = options->Get().output; // sometimes "output" is used as a folder name - if (!folder.empty() && folder.back() != '/') - folder += "/"; + // treat the output file name as a mask + char filename[2048]; if (options->Get().datetime) { + // expects "%s" in the filename std::time_t raw_time; std::time(&raw_time); char time_string[32]; std::tm *time_info = std::localtime(&raw_time); - std::strftime(time_string, sizeof(time_string), "%m%d%H%M%S", time_info); - snprintf(filename, sizeof(filename), "%s%s.%s", folder.c_str(), time_string, options->Get().encoding.c_str()); + std::strftime(time_string, sizeof(time_string), "%Y%m%d%H%M%S", time_info); + snprintf(filename, sizeof(filename), options->Get().output.c_str(), time_string); } else if (options->Get().timestamp) - snprintf(filename, sizeof(filename), "%s%u.%s", folder.c_str(), (unsigned)time(NULL), - options->Get().encoding.c_str()); + { + // expects "%u" in the filename + snprintf(filename, sizeof(filename), options->Get().output.c_str(), (unsigned)time(NULL)); + } else + { + // expects "%d" in the filename snprintf(filename, sizeof(filename), options->Get().output.c_str(), options->Get().framestart); + } filename[sizeof(filename) - 1] = 0; return std::string(filename); }