annotate edl.c @ 13168:ce046ef860da

EDL enhancement/fixes: *Some edl's code moved from mplayer.c to edl.c (mencoder will use the same functions) * slighty faster * removed MAX_EDL_ENTRIES limit (just reserve the memory we really need) * really treat edl_records as a linked list (coz it is) * edl now 'remembers' pending operations after a manual _seek_ * better way of handling Mute/Umute eliminates some nasty bugs when manual seeking (scrwed up mute/unmute order, no audio after seek, etc) * seeking while on -edl mode now _WORKS_ Patch by Reynaldo H. Verdejo Pinochet (reynaldo at opendot dot cl)
author rtognimp
date Sat, 28 Aug 2004 00:46:05 +0000
parents
children 567875b88aab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13168
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
1 #include <stdio.h>
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
2 #include <stdlib.h>
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
3 #include "config.h"
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
4 #include "mp_msg.h"
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
5 #include "edl.h"
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
6
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
7 #ifdef USE_EDL
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
8
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
9 int edl_check_mode(void)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
10 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
11 if (edl_filename && edl_output_filename)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
12 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
13 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
14 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
15
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
16 return (1);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
17 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
18
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
19 int edl_count_entries(void)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
20 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
21 FILE *fd = NULL;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
22 int entries = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
23 int action = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
24 float start = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
25 float stop = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
26 char line[100];
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
27
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
28 if (edl_filename)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
29 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
30 if ((fd = fopen(edl_filename, "r")) == NULL)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
31 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
32 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
33 "Invalid EDL file, cant open '%s' for reading!\n",
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
34 edl_filename);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
35 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
36 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
37 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
38 while (fgets(line, 99, fd) != NULL)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
39 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
40 if ((sscanf(line, "%f %f %d", &start, &stop, &action)) ==
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
41 3)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
42 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
43 if (action == EDL_SKIP)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
44 entries += 1;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
45 if (action == EDL_MUTE)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
46 entries += 2;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
47 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
48 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
49 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
50 "Invalid EDL line: %s\n", line);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
51 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
52 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
53
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
54 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
55 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
56 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
57 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
58 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
59 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
60
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
61 return (entries);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
62 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
63
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
64 int edl_parse_file(edl_record_ptr edl_records)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
65 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
66 FILE *fd;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
67 char line[100];
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
68 float start, stop;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
69 int action;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
70 int record_count = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
71 int lineCount = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
72 struct edl_record *next_edl_record = edl_records;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
73
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
74 if (edl_filename)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
75 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
76 if ((fd = fopen(edl_filename, "r")) == NULL)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
77 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
78 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
79 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
80 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
81 while (fgets(line, 99, fd) != NULL)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
82 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
83 lineCount++;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
84 if ((sscanf(line, "%f %f %d", &start, &stop, &action))
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
85 != 3)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
86 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
87 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
88 "Badly formated EDL line [%d]. Discarding!\n",
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
89 lineCount + 1, line);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
90 continue;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
91 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
92 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
93 if (record_count > 0)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
94 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
95 if (start <= (next_edl_record - 1)->stop_sec)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
96 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
97 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
98 "Invalid EDL line [%d]: %s",
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
99 lineCount, line);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
100 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
101 "Last stop position was [%f]; next start is [%f]. Entries must be in chronological order and cannot overlap. Discarding!\n",
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
102 (next_edl_record - 1)->stop_sec, start);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
103 continue;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
104 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
105 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
106 if (stop <= start)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
107 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
108 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
109 "Invalid EDL line [%d]: %s", lineCount,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
110 line);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
111 mp_msg(MSGT_CPLAYER, MSGL_WARN,
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
112 "Stop time must follow start time. Discarding!\n");
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
113 continue;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
114 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
115 next_edl_record->action = action;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
116 if (action == EDL_MUTE)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
117 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
118 next_edl_record->length_sec = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
119 next_edl_record->start_sec = start;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
120 next_edl_record->stop_sec = start;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
121 next_edl_record->mute_state = EDL_MUTE_START;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
122 next_edl_record++;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
123 (next_edl_record - 1)->next = next_edl_record;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
124 next_edl_record->action = action;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
125 next_edl_record->length_sec = 0;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
126 next_edl_record->start_sec = stop;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
127 next_edl_record->stop_sec = stop;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
128 next_edl_record->mute_state = EDL_MUTE_END;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
129
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
130 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
131 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
132 next_edl_record->length_sec = stop - start;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
133 next_edl_record->start_sec = start;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
134 next_edl_record->stop_sec = stop;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
135 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
136 next_edl_record++;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
137
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
138 if (record_count >= 0)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
139 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
140 (next_edl_record - 1)->next = next_edl_record;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
141 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
142
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
143 record_count++;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
144 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
145 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
146
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
147 if (record_count > 0)
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
148 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
149 (next_edl_record - 1)->next = NULL;
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
150 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
151 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
152 fclose(fd);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
153 } else
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
154 {
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
155 return (EDL_ERROR);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
156 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
157
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
158 return (record_count);
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
159 }
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
160
ce046ef860da EDL enhancement/fixes:
rtognimp
parents:
diff changeset
161 #endif