Patch by Stefan Huehner / stefan % huehner ! org \
[mplayer/glamo.git] / edl.c
blobde9c01d17999ebc74e0cf623a041e88b3b285c45
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "config.h"
4 #include "mp_msg.h"
5 #include "edl.h"
6 #include "help_mp.h"
8 char *edl_filename; // file to extract EDL entries from (-edl)
9 char *edl_output_filename; // file to put EDL entries in (-edlout)
11 #ifdef USE_EDL
13 /**
14 * Allocates a new EDL record and makes sure allocation was successful.
16 * \return New allocated EDL record.
17 * \brief Allocate new EDL record
20 static edl_record_ptr edl_alloc_new(edl_record_ptr next_edl_record)
22 edl_record_ptr new_record = calloc(1, sizeof(struct edl_record));
23 if (!new_record) {
24 mp_msg(MSGT_CPLAYER, MSGL_FATAL, MSGTR_EdlOutOfMem);
25 exit(1);
28 if (next_edl_record) // if this isn't the first record, tell the previous one what the new one is.
29 next_edl_record->next = new_record;
30 new_record->prev = next_edl_record;
32 return new_record;
35 /**
36 * Goes through entire EDL records and frees all memory.
37 * Assumes next_edl_record is valid or NULL.
39 * \brief Free EDL memory
42 void free_edl(edl_record_ptr next_edl_record)
44 edl_record_ptr tmp;
45 while (next_edl_record) {
46 tmp = next_edl_record->next;
47 free(next_edl_record);
48 next_edl_record = tmp;
52 /** Parses edl_filename to fill EDL operations queue.
53 * Prints out how many EDL operations recorded total.
54 * \brief Fills EDL operations queue.
57 edl_record_ptr edl_parse_file(void)
59 FILE *fd;
60 char line[100];
61 float start, stop;
62 int action;
63 int record_count = 0;
64 int lineCount = 0;
65 edl_record_ptr edl_records = edl_alloc_new(NULL);
66 edl_record_ptr next_edl_record = edl_records;
68 if (edl_filename)
70 if ((fd = fopen(edl_filename, "r")) == NULL)
72 return NULL;
73 } else
75 while (fgets(line, 99, fd) != NULL)
77 lineCount++;
78 if ((sscanf(line, "%f %f %d", &start, &stop, &action))
79 != 3)
81 mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadlyFormattedLine,
82 lineCount + 1);
83 continue;
84 } else
86 if (next_edl_record->prev && start <= next_edl_record->prev->stop_sec)
88 mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine, line);
89 mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineOverlap,
90 next_edl_record->prev->stop_sec, start);
91 continue;
93 if (stop <= start)
95 mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlNOValidLine,
96 line);
97 mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdlBadLineBadStop);
98 continue;
100 next_edl_record->action = action;
101 if (action == EDL_MUTE)
103 next_edl_record->length_sec = 0;
104 next_edl_record->start_sec = start;
105 next_edl_record->stop_sec = start;
107 next_edl_record = edl_alloc_new(next_edl_record);
109 next_edl_record->action = action;
110 next_edl_record->length_sec = 0;
111 next_edl_record->start_sec = stop;
112 next_edl_record->stop_sec = stop;
113 } else
115 next_edl_record->length_sec = stop - start;
116 next_edl_record->start_sec = start;
117 next_edl_record->stop_sec = stop;
119 next_edl_record = edl_alloc_new(next_edl_record);
120 record_count++;
124 fclose(fd);
126 if (next_edl_record->prev) {
127 next_edl_record->prev->next = NULL; // a record was before me, i don't want them thinking i'm a real record.
128 mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlRecordsNo, record_count);
130 else {
131 mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdlQueueEmpty);
132 edl_records = NULL; // there was no previous record, we only had one record, the empty one.
134 free(next_edl_record);
135 return edl_records;
138 #endif