int dvr_clone;
int dvr_complex_scheduling;
uint32_t dvr_rerecord_errors;
+ uint32_t dvr_max_data_errors;
uint32_t dvr_retention_days;
uint32_t dvr_removal_days;
uint32_t dvr_removal_after_playback;
uint32_t dvr_entry_get_rerecord_errors( dvr_entry_t *de );
+static inline uint32_t dvr_entry_get_max_data_errors( dvr_entry_t *de )
+ { return de->de_config ? de->de_config->dvr_max_data_errors : DVR_MAX_DATA_ERRORS; }
+
+static inline int dvr_entry_data_error_limit_reached( dvr_entry_t *de )
+ { uint32_t max_data_errors = dvr_entry_get_max_data_errors(de);
+ return max_data_errors && de->de_data_errors >= max_data_errors; }
+
int dvr_entry_get_epg_running( dvr_entry_t *de );
time_t dvr_entry_get_start_time( dvr_entry_t *de, int warm );
cfg->dvr_config_name = strdup(name);
cfg->dvr_retention_days = DVR_RET_ONREMOVE;
cfg->dvr_removal_days = DVR_RET_REM_FOREVER;
+ cfg->dvr_max_data_errors = DVR_MAX_DATA_ERRORS;
cfg->dvr_clone = 1;
cfg->dvr_tag_files = 1;
cfg->dvr_create_scene_markers = 1;
.opts = PO_ADVANCED,
.group = 1,
},
+ {
+ .type = PT_U32,
+ .id = "data-error-threshold",
+ .name = N_("Data error threshold for failed recordings (0=off)"),
+ .desc = N_("If a completed recording has this many or more data "
+ "errors, mark it as failed. Set to 0 to disable this "
+ "check."),
+ .off = offsetof(dvr_config_t, dvr_max_data_errors),
+ .opts = PO_ADVANCED,
+ .def.u32 = DVR_MAX_DATA_ERRORS,
+ .group = 1,
+ },
{
.type = PT_BOOL,
.id = "complex-scheduling",
if (success) {
if (entry->de_last_error == SM_CODE_OK)
- success = entry->de_data_errors < DVR_MAX_DATA_ERRORS;
+ success = !dvr_entry_data_error_limit_reached(entry);
else
success = dvr_entry_is_completed_ok(entry);
}
if (dvr_get_filesize(de, 0) < 0 && !de->de_file_removed)
return N_("File missing");
if(de->de_last_error != SM_CODE_FORCE_OK &&
- de->de_data_errors >= DVR_MAX_DATA_ERRORS) /* user configurable threshold? */
+ dvr_entry_data_error_limit_reached(de))
return N_("Too many data errors");
if(de->de_last_error)
return streaming_code2txt(de->de_last_error);