]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/asfdec.c
set stream aspect from mov tkhd width/height, patch by Andrew Wason, rectalogic at...
[ffmpeg] / libavformat / asfdec.c
index 543faf29d4caa5a3784c679d1843f32c5c9d94ab..ef7c2d309f972b1102ba7341a144792e6e23d0cd 100644 (file)
@@ -152,19 +152,27 @@ static int get_value(ByteIOContext *pb, int type){
 
 static void get_tag(AVFormatContext *s, const char *key, int type, int len)
 {
-    char value[1024];
+    char *value;
+
+    if ((unsigned)len >= UINT_MAX)
+        return;
+
+    value = av_malloc(len+1);
+    if (!value)
+        return;
+
     if (type <= 1) {         // unicode or byte
-        get_str16_nolen(s->pb, len, value, sizeof(value));
+        get_str16_nolen(s->pb, len, value, len);
     } else if (type <= 5) {  // boolean or DWORD or QWORD or WORD
         uint64_t num = get_value(s->pb, type);
-        snprintf(value, sizeof(value), "%"PRIu64, num);
+        snprintf(value, len, "%"PRIu64, num);
     } else {
         url_fskip(s->pb, len);
         return;
     }
     if (!strncmp(key, "WM/", 3))
         key += 3;
-    av_metadata_set(&s->metadata, key, value);
+    av_metadata_set2(&s->metadata, key, value, AV_METADATA_DONT_STRDUP_VAL);
 }
 
 static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
@@ -1057,7 +1065,7 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
     url_fseek(s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET);
     get_guid(s->pb, &g);
     if (!guidcmp(&g, &index_guid)) {
-        int64_t itime;
+        int64_t itime, last_pos=-1;
         int pct, ict;
         int64_t av_unused gsize= get_le64(s->pb);
         get_guid(s->pb, &g);
@@ -1072,8 +1080,11 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
             int64_t pos      = s->data_offset + s->packet_size*(int64_t)pktnum;
             int64_t index_pts= av_rescale(itime, i, 10000);
 
+            if(pos != last_pos){
             av_log(s, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct);
             av_add_index_entry(s->streams[stream_index], pos, index_pts, s->packet_size, 0, AVINDEX_KEYFRAME);
+            last_pos=pos;
+            }
         }
         asf->index_read= 1;
     }