comparison demux_avi.c @ 1421:ea0a0b9e6fbc

nosound avi seeking fixed
author arpi
date Sun, 29 Jul 2001 21:07:34 +0000
parents 65058a94df3b
children 1728d249c783
comparison
equal deleted inserted replaced
1420:d97816161256 1421:ea0a0b9e6fbc
124 int ret=0; 124 int ret=0;
125 125
126 do{ 126 do{
127 int flags=0; 127 int flags=0;
128 AVIINDEXENTRY *idx=NULL; 128 AVIINDEXENTRY *idx=NULL;
129 #if 0
129 demux->filepos=stream_tell(demux->stream); 130 demux->filepos=stream_tell(demux->stream);
130 if(demux->filepos>=demux->movi_end){ 131 if(demux->filepos>=demux->movi_end){
131 demux->stream->eof=1; 132 demux->stream->eof=1;
132 return 0; 133 return 0;
133 } 134 }
134 if(stream_eof(demux->stream)) return 0; 135 if(stream_eof(demux->stream)) return 0;
136 #endif
135 if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){ 137 if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){
136 unsigned int pos; 138 unsigned int pos;
137 139
138 //if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos); 140 //if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos);
139 141
153 continue; // skip this chunk 155 continue; // skip this chunk
154 } 156 }
155 157
156 pos=idx->dwChunkOffset+demux->idx_offset; 158 pos=idx->dwChunkOffset+demux->idx_offset;
157 if(pos<demux->movi_start || pos>=demux->movi_end){ 159 if(pos<demux->movi_start || pos>=demux->movi_end){
158 printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); 160 printf("ChunkOffset out of range! idx=0x%X \n",pos);
159 continue; 161 continue;
160 } 162 }
161 #if 0 163 #if 0
162 if(pos!=demux->filepos){ 164 if(pos!=demux->filepos){
163 printf("Warning! pos=0x%X idx.pos=0x%X diff=%d \n",demux->filepos,pos,pos-demux->filepos); 165 printf("Warning! pos=0x%X idx.pos=0x%X diff=%d \n",demux->filepos,pos,pos-demux->filepos);
164 } 166 }
165 #endif 167 #endif
166 stream_seek(demux->stream,pos); 168 stream_seek(demux->stream,pos);
169 demux->filepos=stream_tell(demux->stream);
167 id=stream_read_dword_le(demux->stream); 170 id=stream_read_dword_le(demux->stream);
171 if(stream_eof(demux->stream)) return 0; // EOF!
172
168 if(id!=idx->ckid){ 173 if(id!=idx->ckid){
169 printf("ChunkID mismatch! raw=%.4s idx=%.4s \n",(char *)&id,(char *)&idx->ckid); 174 printf("ChunkID mismatch! raw=%.4s idx=%.4s \n",(char *)&id,(char *)&idx->ckid);
170 continue; 175 continue;
171 } 176 }
172 len=stream_read_dword_le(demux->stream); 177 len=stream_read_dword_le(demux->stream);
176 printf("ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength); 181 printf("ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength);
177 continue; 182 continue;
178 } 183 }
179 if(idx->dwFlags&AVIIF_KEYFRAME) flags=1; 184 if(idx->dwFlags&AVIIF_KEYFRAME) flags=1;
180 } else { 185 } else {
186 demux->filepos=stream_tell(demux->stream);
187 if(demux->filepos>=demux->movi_end){
188 demux->stream->eof=1;
189 return 0;
190 }
181 id=stream_read_dword_le(demux->stream); 191 id=stream_read_dword_le(demux->stream);
182 len=stream_read_dword_le(demux->stream); 192 len=stream_read_dword_le(demux->stream);
193 if(stream_eof(demux->stream)) return 0; // EOF!
194
183 if(id==mmioFOURCC('L','I','S','T')){ 195 if(id==mmioFOURCC('L','I','S','T')){
184 id=stream_read_dword_le(demux->stream); // list type 196 id=stream_read_dword_le(demux->stream); // list type
185 continue; 197 continue;
186 } 198 }
187 } 199 }