summaryrefslogtreecommitdiffstats
path: root/libmpdemux/aviheader.c
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-10-22 19:01:37 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-10-22 19:01:37 +0000
commitaba42ce2fe950b4e2300cb5aeff7eb9d707b9275 (patch)
treebcfdee770c6e3ddff2b8cf8550c59fd7b8851670 /libmpdemux/aviheader.c
parent4c53a4a6a550c54a7bc050c49fa949be638fe506 (diff)
downloadmpv-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.c62
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