2010-01-30 23:24:23 +00:00
|
|
|
/*
|
|
|
|
* This file is part of MPlayer.
|
|
|
|
*
|
|
|
|
* MPlayer is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* MPlayer is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
|
2004-08-28 00:46:05 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "config.h"
|
|
|
|
#include "mp_msg.h"
|
|
|
|
#include "edl.h"
|
|
|
|
|
2005-01-29 12:24:43 +00:00
|
|
|
char *edl_filename; // file to extract EDL entries from (-edl)
|
|
|
|
char *edl_output_filename; // file to put EDL entries in (-edlout)
|
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
/**
|
|
|
|
* Allocates a new EDL record and makes sure allocation was successful.
|
|
|
|
*
|
|
|
|
* \return New allocated EDL record.
|
|
|
|
* \brief Allocate new EDL record
|
2004-09-17 02:28:44 +00:00
|
|
|
*/
|
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
static edl_record_ptr edl_alloc_new(edl_record_ptr next_edl_record)
|
2004-08-28 00:46:05 +00:00
|
|
|
{
|
2005-02-25 04:30:53 +00:00
|
|
|
edl_record_ptr new_record = calloc(1, sizeof(struct edl_record));
|
|
|
|
if (!new_record) {
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_FATAL, "Can't allocate enough memory to hold EDL data.\n");
|
2005-02-25 04:30:53 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
2009-07-06 23:26:13 +00:00
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
if (next_edl_record) // if this isn't the first record, tell the previous one what the new one is.
|
|
|
|
next_edl_record->next = new_record;
|
|
|
|
new_record->prev = next_edl_record;
|
2006-03-10 21:34:54 +00:00
|
|
|
new_record->next = NULL;
|
2009-07-06 23:26:13 +00:00
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
return new_record;
|
|
|
|
}
|
2004-08-28 00:46:05 +00:00
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
/**
|
|
|
|
* Goes through entire EDL records and frees all memory.
|
|
|
|
* Assumes next_edl_record is valid or NULL.
|
|
|
|
*
|
|
|
|
* \brief Free EDL memory
|
|
|
|
*/
|
2004-08-28 00:46:05 +00:00
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
void free_edl(edl_record_ptr next_edl_record)
|
|
|
|
{
|
|
|
|
edl_record_ptr tmp;
|
|
|
|
while (next_edl_record) {
|
|
|
|
tmp = next_edl_record->next;
|
|
|
|
free(next_edl_record);
|
|
|
|
next_edl_record = tmp;
|
2004-08-28 00:46:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-09-17 02:28:44 +00:00
|
|
|
/** Parses edl_filename to fill EDL operations queue.
|
2005-02-25 04:30:53 +00:00
|
|
|
* Prints out how many EDL operations recorded total.
|
2004-09-17 02:28:44 +00:00
|
|
|
* \brief Fills EDL operations queue.
|
|
|
|
*/
|
|
|
|
|
2006-02-09 14:08:03 +00:00
|
|
|
edl_record_ptr edl_parse_file(void)
|
2004-08-28 00:46:05 +00:00
|
|
|
{
|
|
|
|
FILE *fd;
|
|
|
|
char line[100];
|
|
|
|
float start, stop;
|
|
|
|
int action;
|
|
|
|
int record_count = 0;
|
|
|
|
int lineCount = 0;
|
2006-03-10 21:34:54 +00:00
|
|
|
edl_record_ptr edl_records = NULL;
|
|
|
|
edl_record_ptr next_edl_record = NULL;
|
2004-08-28 00:46:05 +00:00
|
|
|
|
|
|
|
if (edl_filename)
|
|
|
|
{
|
|
|
|
if ((fd = fopen(edl_filename, "r")) == NULL)
|
|
|
|
{
|
2005-02-25 04:30:53 +00:00
|
|
|
return NULL;
|
2006-07-05 06:54:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
while (fgets(line, 99, fd) != NULL)
|
2004-08-28 00:46:05 +00:00
|
|
|
{
|
2006-07-05 06:54:58 +00:00
|
|
|
lineCount++;
|
|
|
|
|
|
|
|
if ((sscanf(line, "%f %f %d", &start, &stop, &action))
|
|
|
|
!= 3)
|
2004-08-28 00:46:05 +00:00
|
|
|
{
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Badly formatted EDL line [%d], discarding.\n",
|
2006-07-05 06:54:58 +00:00
|
|
|
lineCount);
|
|
|
|
continue;
|
2009-07-06 23:26:13 +00:00
|
|
|
}
|
|
|
|
|
2006-07-05 06:54:58 +00:00
|
|
|
if (next_edl_record && start <= next_edl_record->stop_sec)
|
|
|
|
{
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Invalid EDL line: %s\n", line);
|
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_WARN,
|
|
|
|
"Last stop position was [%f]; next start is [%f].\n"\
|
|
|
|
"Entries must be in chronological order, cannot overlap. Discarding.\n",
|
2006-07-05 06:54:58 +00:00
|
|
|
next_edl_record->stop_sec, start);
|
2009-07-06 23:26:13 +00:00
|
|
|
continue;
|
2004-08-28 00:46:05 +00:00
|
|
|
}
|
2006-07-05 06:54:58 +00:00
|
|
|
|
|
|
|
if (stop <= start)
|
|
|
|
{
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Invalid EDL line: %s\n",
|
2006-07-05 06:54:58 +00:00
|
|
|
line);
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Stop time has to be after start time.\n");
|
2006-07-05 06:54:58 +00:00
|
|
|
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;
|
2009-07-06 23:26:13 +00:00
|
|
|
|
2006-07-05 06:54:58 +00:00
|
|
|
next_edl_record = edl_alloc_new(next_edl_record);
|
2009-07-06 23:26:13 +00:00
|
|
|
|
2006-07-05 06:54:58 +00:00
|
|
|
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++;
|
2004-08-28 00:46:05 +00:00
|
|
|
}
|
2006-07-05 06:54:58 +00:00
|
|
|
|
2004-08-28 00:46:05 +00:00
|
|
|
fclose(fd);
|
2009-07-06 23:26:13 +00:00
|
|
|
}
|
2006-07-05 06:54:58 +00:00
|
|
|
|
2009-07-06 23:26:13 +00:00
|
|
|
if (edl_records)
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Read %d EDL actions.\n", record_count);
|
2009-07-06 23:26:13 +00:00
|
|
|
else
|
2009-07-06 22:15:02 +00:00
|
|
|
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "There are no EDL actions to take care of.\n");
|
2006-03-10 21:34:54 +00:00
|
|
|
|
2005-02-25 04:30:53 +00:00
|
|
|
return edl_records;
|
2004-08-28 00:46:05 +00:00
|
|
|
}
|