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/aviheader.c | |
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/aviheader.c')
-rw-r--r-- | libmpdemux/aviheader.c | 62 |
1 files changed, 61 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 |