diff options
author | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-22 19:01:37 +0000 |
---|---|---|
committer | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-22 19:01:37 +0000 |
commit | aba42ce2fe950b4e2300cb5aeff7eb9d707b9275 (patch) | |
tree | bcfdee770c6e3ddff2b8cf8550c59fd7b8851670 /libmpdemux | |
parent | 4c53a4a6a550c54a7bc050c49fa949be638fe506 (diff) | |
download | mpv-aba42ce2fe950b4e2300cb5aeff7eb9d707b9275.tar.bz2 mpv-aba42ce2fe950b4e2300cb5aeff7eb9d707b9275.tar.xz |
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11235 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/aviheader.c | 62 | ||||
-rw-r--r-- | libmpdemux/demux_avi.c | 1 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 1 |
3 files changed, 63 insertions, 1 deletions
diff --git a/libmpdemux/aviheader.c b/libmpdemux/aviheader.c index 40ec3f9841..332b9d9b16 100644 --- a/libmpdemux/aviheader.c +++ b/libmpdemux/aviheader.c @@ -2,6 +2,7 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include <errno.h> #include "config.h" #include "mp_msg.h" @@ -44,6 +45,9 @@ while(1){ char* hdr=NULL; // if(stream_eof(demuxer->stream)) break; + // Imply -forceidx if -saveidx is specified + if (index_file_save) + index_mode = 2; // if(id==mmioFOURCC('L','I','S','T')){ unsigned len=stream_read_dword_le(demuxer->stream); // list size @@ -299,6 +303,44 @@ while(1){ } +/* Read a saved index file */ +if (index_file_load) { + FILE *fp; + char magic[7]; + unsigned int i; + + if ((fp = fopen(index_file_load, "r")) == NULL) { + mp_msg(MSGT_HEADER,MSGL_ERR, "Can't read index file %s: %s\n", index_file_load, strerror(errno)); + goto gen_index; + } + fread(&magic, 6, 1, fp); + if (strncmp(magic, "MPIDX1", 6)) { + mp_msg(MSGT_HEADER,MSGL_ERR, "%s is not a valid MPlayer index file\n", index_file_load); + goto gen_index; + } + fread(&priv->idx_size, sizeof(priv->idx_size), 1, fp); + priv->idx=malloc(priv->idx_size*sizeof(AVIINDEXENTRY)); + if (!priv->idx) { + mp_msg(MSGT_HEADER,MSGL_ERR, "Could not allocate memory for index data from %s\n", index_file_load); + priv->idx_size = 0; + goto gen_index; + } + + for (i=0; i<priv->idx_size;i++) { + AVIINDEXENTRY *idx; + idx=&((AVIINDEXENTRY *)priv->idx)[i]; + fread(idx, sizeof(AVIINDEXENTRY), 1, fp); + if (feof(fp)) { + mp_msg(MSGT_HEADER,MSGL_ERR, "Premature end of index file %s\n", index_file_load); + free(priv->idx); + priv->idx_size = 0; + goto gen_index; + } + } + fclose(fp); + mp_msg(MSGT_HEADER,MSGL_INFO, "Loaded index file: %s\n", index_file_load); +} +gen_index: if(index_mode>=2 || (priv->idx_size==0 && index_mode==1)){ // build index for file: stream_reset(demuxer->stream); @@ -381,8 +423,26 @@ skip_chunk: priv->idx_size=priv->idx_pos; mp_msg(MSGT_HEADER,MSGL_INFO,"AVI: Generated index table for %d chunks!\n",priv->idx_size); if(verbose>=2) print_index(priv->idx,priv->idx_size); -} + /* Write generated index to a file */ + if (index_file_save) { + FILE *fp; + unsigned int i; + + if ((fp=fopen(index_file_save, "w")) == NULL) { + mp_msg(MSGT_HEADER,MSGL_ERR, "Couldn't write index file %s: %s\n", index_file_save, strerror(errno)); + return; + } + fwrite("MPIDX1", 6, 1, fp); + fwrite(&priv->idx_size, sizeof(priv->idx_size), 1, fp); + for (i=0; i<priv->idx_size; i++) { + AVIINDEXENTRY *idx = &((AVIINDEXENTRY *)priv->idx)[i]; + fwrite(idx, sizeof(AVIINDEXENTRY), 1, fp); + } + fclose(fp); + mp_msg(MSGT_HEADER,MSGL_INFO, "Saved index file: %s\n", index_file_save); + } +} } #undef MIN diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 8bec06712b..9f0be39285 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -425,6 +425,7 @@ do{ // AVI demuxer parameters: int index_mode=-1; // -1=untouched 0=don't use index 1=use (geneate) index +char *index_file_save = NULL, *index_file_load = NULL; int force_ni=0; // force non-interleaved AVI parsing void read_avi_header(demuxer_t *demuxer,int index_mode); diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 5024443776..0e08ee02cf 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -265,6 +265,7 @@ demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd); // AVI demuxer params: extern int index_mode; // -1=untouched 0=don't use index 1=use (geneate) index +extern char *index_file_save, *index_file_load; extern int force_ni; extern int pts_from_bps; |