|
|
|
@@ -28,6 +28,7 @@ |
|
|
|
* @sa http://wiki.multimedia.cx/index.php?title=Vividas_VIV |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "libavutil/avassert.h" |
|
|
|
#include "libavutil/intreadwrite.h" |
|
|
|
#include "avio_internal.h" |
|
|
|
#include "avformat.h" |
|
|
|
@@ -379,7 +380,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * |
|
|
|
|
|
|
|
if (avio_tell(pb) < off) { |
|
|
|
int num_data; |
|
|
|
int xd_size = 0; |
|
|
|
int xd_size = 1; |
|
|
|
int data_len[256]; |
|
|
|
int offset = 1; |
|
|
|
uint8_t *p; |
|
|
|
@@ -393,10 +394,10 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
data_len[j] = len; |
|
|
|
xd_size += len; |
|
|
|
xd_size += len + 1 + len/255; |
|
|
|
} |
|
|
|
|
|
|
|
ret = ff_alloc_extradata(st->codecpar, 64 + xd_size + xd_size / 255); |
|
|
|
ret = ff_alloc_extradata(st->codecpar, xd_size); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
@@ -405,9 +406,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * |
|
|
|
|
|
|
|
for (j = 0; j < num_data - 1; j++) { |
|
|
|
unsigned delta = av_xiphlacing(&p[offset], data_len[j]); |
|
|
|
if (delta > data_len[j]) { |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
av_assert0(delta <= xd_size - offset); |
|
|
|
offset += delta; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -418,6 +417,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * |
|
|
|
av_freep(&st->codecpar->extradata); |
|
|
|
break; |
|
|
|
} |
|
|
|
av_assert0(data_len[j] <= xd_size - offset); |
|
|
|
offset += data_len[j]; |
|
|
|
} |
|
|
|
|
|
|
|
|