summaryrefslogtreecommitdiffstats
path: root/edl.c
diff options
context:
space:
mode:
authorreynaldo <reynaldo@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-07-04 07:33:15 +0000
committerreynaldo <reynaldo@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-07-04 07:33:15 +0000
commit66980cf5916c08f3292ef794155b5850e57b40c5 (patch)
treea58834d72496d48a20b39c69de367b95a29c76fb /edl.c
parent8df5c586b5de49bb4707e88dbeaff76ec9f1d44d (diff)
downloadmpv-66980cf5916c08f3292ef794155b5850e57b40c5.tar.bz2
mpv-66980cf5916c08f3292ef794155b5850e57b40c5.tar.xz
- Fix segfault on overlapping start/stop
- Correctly report skipped erroneous line number - Denestyfies main operation fill loop git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18896 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'edl.c')
-rw-r--r--edl.c108
1 files changed, 57 insertions, 51 deletions
diff --git a/edl.c b/edl.c
index bffb5926b6..ac986d7113 100644
--- a/edl.c
+++ b/edl.c
@@ -69,63 +69,69 @@ edl_record_ptr edl_parse_file(void)
if ((fd = fopen(edl_filename, "r")) == NULL)
{
return NULL;
- } else
+ }
+
+ while (fgets(line, 99, fd) != NULL)
{
- while (fgets(line, 99, fd) != NULL)
+ lineCount++;
+
+ if ((sscanf(line, "%f %f %d", &start, &stop, &action))
+ != 3)
+ {
+ mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadlyFormattedLine,
+ lineCount);
+ continue;
+ }
+
+ if (next_edl_record && start <= next_edl_record->stop_sec)
+ {
+ mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine, line);
+ mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineOverlap,
+ next_edl_record->stop_sec, start);
+ continue;
+ }
+
+ if (stop <= start)
{
- lineCount++;
- if ((sscanf(line, "%f %f %d", &start, &stop, &action))
- != 3)
- {
- mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadlyFormattedLine,
- lineCount + 1);
- continue;
- } else
- {
- if (next_edl_record && start <= next_edl_record->stop_sec)
- {
- mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine, line);
- mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineOverlap,
- next_edl_record->prev->stop_sec, start);
- continue;
- }
- if (stop <= start)
- {
- mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine,
- line);
- mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineBadStop);
- continue;
- }
- next_edl_record = edl_alloc_new(next_edl_record);
- if (!edl_records) edl_records = next_edl_record;
-
- next_edl_record->action = action;
- if (action == EDL_MUTE)
- {
- next_edl_record->length_sec = 0;
- next_edl_record->start_sec = start;
- next_edl_record->stop_sec = start;
-
- next_edl_record = edl_alloc_new(next_edl_record);
-
- next_edl_record->action = action;
- next_edl_record->length_sec = 0;
- next_edl_record->start_sec = stop;
- next_edl_record->stop_sec = stop;
- } else
- {
- next_edl_record->length_sec = stop - start;
- next_edl_record->start_sec = start;
- next_edl_record->stop_sec = stop;
- }
- record_count++;
- }
+ mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine,
+ line);
+ mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineBadStop);
+ continue;
}
+
+ next_edl_record = edl_alloc_new(next_edl_record);
+ if (!edl_records) edl_records = next_edl_record;
+
+ next_edl_record->action = action;
+
+ if (action == EDL_MUTE)
+ {
+ next_edl_record->length_sec = 0;
+ next_edl_record->start_sec = start;
+ next_edl_record->stop_sec = start;
+
+ next_edl_record = edl_alloc_new(next_edl_record);
+
+ next_edl_record->action = action;
+ next_edl_record->length_sec = 0;
+ next_edl_record->start_sec = stop;
+ next_edl_record->stop_sec = stop;
+ } else
+ {
+ next_edl_record->length_sec = stop - start;
+ next_edl_record->start_sec = start;
+ next_edl_record->stop_sec = stop;
+ }
+ record_count++;
}
+
fclose(fd);
}
- if (edl_records) mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlRecordsNo, record_count);
- else mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlQueueEmpty);
+
+ if (edl_records)
+ mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlRecordsNo, record_count);
+ else
+ mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlQueueEmpty);
return edl_records;
}