]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/asfdec_f.c
Merge commit 'b469832de993dabbfe037bef59c68e90e82ebca5'
[ffmpeg] / libavformat / asfdec_f.c
index 8c93b6a5bf48fe0781e949a4db801b42d3d56ac2..a30b7d72128e3d7764e86d9265720673cdfeda70 100644 (file)
@@ -517,7 +517,7 @@ static int asf_read_stream_properties(AVFormatContext *s, int64_t size)
         if (sizeX > 40) {
             st->codec->extradata_size = ffio_limit(pb, sizeX - 40);
             st->codec->extradata      = av_mallocz(st->codec->extradata_size +
-                                                   FF_INPUT_BUFFER_PADDING_SIZE);
+                                                   AV_INPUT_BUFFER_PADDING_SIZE);
             if (!st->codec->extradata)
                 return AVERROR(ENOMEM);
             avio_read(pb, st->codec->extradata, st->codec->extradata_size);
@@ -958,13 +958,13 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb)
     int rsize = 8;
     int c, d, e, off;
 
-    if (asf->uses_std_ecc >= 0) {
+    if (asf->uses_std_ecc > 0) {
         // if we do not know packet size, allow skipping up to 32 kB
         off = 32768;
         if (asf->no_resync_search)
             off = 3;
-        else if (s->packet_size > 0)
-            off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
+//         else if (s->packet_size > 0 && !asf->uses_std_ecc)
+//             off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
 
         c = d = e = -1;
         while (off-- > 0) {
@@ -975,10 +975,6 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb)
                 break;
         }
 
-        if (!asf->uses_std_ecc) {
-            asf->uses_std_ecc =  (c == 0x82 && !d && !e) ? 1 : -1;
-        }
-
         if (c != 0x82) {
             /* This code allows handling of -EAGAIN at packet boundaries (i.e.
             * if the packet sync code above triggers -EAGAIN). This does not
@@ -1004,6 +1000,24 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb)
         }
     } else {
         c = avio_r8(pb);
+        if (c & 0x80) {
+            rsize ++;
+            if (!(c & 0x60)) {
+                d = avio_r8(pb);
+                e = avio_r8(pb);
+                avio_seek(pb, (c & 0xF) - 2, SEEK_CUR);
+                rsize += c & 0xF;
+            }
+
+            if (c != 0x82)
+                avpriv_request_sample(s, "Invalid ECC byte\n");
+
+            if (!asf->uses_std_ecc)
+                asf->uses_std_ecc =  (c == 0x82 && !d && !e) ? 1 : -1;
+
+            c = avio_r8(pb);
+        } else
+            asf->uses_std_ecc =  -1;
         d = avio_r8(pb);
     }
 
@@ -1380,12 +1394,12 @@ static int asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
                 } else {
                     /* packet descrambling */
                     AVBufferRef *buf = av_buffer_alloc(asf_st->pkt.size +
-                                                       FF_INPUT_BUFFER_PADDING_SIZE);
+                                                       AV_INPUT_BUFFER_PADDING_SIZE);
                     if (buf) {
                         uint8_t *newdata = buf->data;
                         int offset = 0;
                         memset(newdata + asf_st->pkt.size, 0,
-                               FF_INPUT_BUFFER_PADDING_SIZE);
+                               AV_INPUT_BUFFER_PADDING_SIZE);
                         while (offset < asf_st->pkt.size) {
                             int off = offset / asf_st->ds_chunk_size;
                             int row = off / asf_st->ds_span;