AVIStream *ast;
int i;
int64_t last_pos= -1;
+ int64_t filesize= url_fsize(&s->pb);
-// av_log(s, AV_LOG_ERROR, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%Ld\n",
-// longs_pre_entry,index_type, entries_in_use, chunk_id, base);
+#ifdef DEBUG_SEEK
+ av_log(s, AV_LOG_ERROR, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%16LX\n",
+ longs_pre_entry,index_type, entries_in_use, chunk_id, base);
+#endif
if(stream_id > s->nb_streams || stream_id < 0)
return -1;
if(index_type>1)
return -1;
+ if(filesize > 0 && base >= filesize){
+ av_log(s, AV_LOG_ERROR, "ODML index invalid\n");
+ if(base>>32 == (base & 0xFFFFFFFF) && (base & 0xFFFFFFFF) < filesize && filesize <= 0xFFFFFFFF)
+ base &= 0xFFFFFFFF;
+ else
+ return -1;
+ }
+
for(i=0; i<entries_in_use; i++){
if(index_type){
int64_t pos= get_le32(pb) + base - 8;
int key= len >= 0;
len &= 0x7FFFFFFF;
-//av_log(s, AV_LOG_ERROR, "pos:%Ld, len:%X\n", pos, len);
+#ifdef DEBUG_SEEK
+ av_log(s, AV_LOG_ERROR, "pos:%Ld, len:%X\n", pos, len);
+#endif
if(last_pos == pos || pos == base - 8)
avi->non_interleaved= 1;
else
url_fseek(pb, pos, SEEK_SET);
}
}
+ avi->index_loaded=1;
return 0;
}
static void clean_index(AVFormatContext *s){
- int i, j;
+ int i;
+ int64_t j;
for(i=0; i<s->nb_streams; i++){
AVStream *st = s->streams[i];
}
}
+static int avi_read_tag(ByteIOContext *pb, char *buf, int maxlen, unsigned int size)
+{
+ offset_t i = url_ftell(pb);
+ size += (size & 1);
+ get_strz(pb, buf, maxlen);
+ url_fseek(pb, i+size, SEEK_SET);
+ return 0;
+}
+
static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
{
AVIContext *avi = s->priv_data;
i= url_ftell(pb);
if(!url_is_streamed(pb)){
read_braindead_odml_indx(s, 0);
- avi->index_loaded=1;
}
url_fseek(pb, i+size, SEEK_SET);
break;
+ case MKTAG('I', 'N', 'A', 'M'):
+ avi_read_tag(pb, s->title, sizeof(s->title), size);
+ break;
+ case MKTAG('I', 'A', 'R', 'T'):
+ avi_read_tag(pb, s->author, sizeof(s->author), size);
+ break;
+ case MKTAG('I', 'C', 'O', 'P'):
+ avi_read_tag(pb, s->copyright, sizeof(s->copyright), size);
+ break;
+ case MKTAG('I', 'C', 'M', 'T'):
+ avi_read_tag(pb, s->comment, sizeof(s->comment), size);
+ break;
+ case MKTAG('I', 'G', 'N', 'R'):
+ avi_read_tag(pb, s->genre, sizeof(s->genre), size);
+ break;
default:
/* skip tag */
size += (size & 1);
ast = st->priv_data;
#if defined(DEBUG_SEEK)
- av_log(NULL, AV_LOG_DEBUG, "%d cum_len=%d\n", len, ast->cum_len);
+ av_log(NULL, AV_LOG_DEBUG, "%d cum_len=%Ld\n", len, ast->cum_len);
#endif
if(last_pos == pos)
avi->non_interleaved= 1;