Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-08-01 00:41:00 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-08-01 00:41:00 +0400
commitd1dad7c824c14939a0e18fa262f3e51957de6e3e (patch)
tree615f6ba80611f53e520d2ae479d9d4409077a78d /libavformat/apetag.c
parentd2ca5dd0f33b0fdbb5d2a7429c8f71ff1dffffb7 (diff)
parentf2ed006c90ccb65cd143d8b0fcfc28ffb98c4289 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: mpc8: return more meaningful error codes. mpc: return more meaningful error codes. wv,mpc8: don't return apetag data in packets. rtmp: do not warn about receiving metadata packets x86: h264dsp: Adjust YASM #ifdefs x86: yadif: Mark mmxext optimizations as such h264: convert loop filter strength dsp function to yasm. Improve descriptiveness of a number of codec and container long names Conflicts: libavcodec/flvdec.c libavcodec/libopenjpegdec.c libavformat/apetag.c libavformat/mp3dec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/apetag.c')
-rw-r--r--libavformat/apetag.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libavformat/apetag.c b/libavformat/apetag.c
index 6f6a61b0ea..1818892b40 100644
--- a/libavformat/apetag.c
+++ b/libavformat/apetag.c
@@ -111,40 +111,47 @@ static int ape_tag_read_field(AVFormatContext *s)
return 0;
}
-void ff_ape_parse_tag(AVFormatContext *s)
+int64_t ff_ape_parse_tag(AVFormatContext *s)
{
AVIOContext *pb = s->pb;
int file_size = avio_size(pb);
uint32_t val, fields, tag_bytes;
uint8_t buf[8];
+ int64_t tag_start;
int i;
if (file_size < APE_TAG_FOOTER_BYTES)
- return;
+ return 0;
avio_seek(pb, file_size - APE_TAG_FOOTER_BYTES, SEEK_SET);
avio_read(pb, buf, 8); /* APETAGEX */
if (strncmp(buf, APE_TAG_PREAMBLE, 8)) {
- return;
+ return 0;
}
val = avio_rl32(pb); /* APE tag version */
if (val > APE_TAG_VERSION) {
av_log(s, AV_LOG_ERROR, "Unsupported tag version. (>=%d)\n", APE_TAG_VERSION);
- return;
+ return 0;
}
tag_bytes = avio_rl32(pb); /* tag size */
if (tag_bytes - APE_TAG_FOOTER_BYTES > (1024 * 1024 * 16)) {
av_log(s, AV_LOG_ERROR, "Tag size is way too big\n");
- return;
+ return 0;
+ }
+
+ tag_start = file_size - tag_bytes - APE_TAG_FOOTER_BYTES;
+ if (tag_start < 0) {
+ av_log(s, AV_LOG_ERROR, "Invalid tag size %u.\n", tag_bytes);
+ return 0;
}
fields = avio_rl32(pb); /* number of fields */
if (fields > 65536) {
av_log(s, AV_LOG_ERROR, "Too many tag fields (%d)\n", fields);
- return;
+ return 0;
}
val = avio_rl32(pb); /* flags */
@@ -157,4 +164,6 @@ void ff_ape_parse_tag(AVFormatContext *s)
for (i=0; i<fields; i++)
if (ape_tag_read_field(s) < 0) break;
+
+ return tag_start;
}