#include "avformat.h"
#include "avio.h"
#include "avio_internal.h"
+#include "id3v2.h"
#include "internal.h"
#include "metadata.h"
#include "pcm.h"
return size;
}
-static int wav_probe(AVProbeData *p)
+static int wav_probe(const AVProbeData *p)
{
/* check file header */
if (p->buf_size <= 32)
char temp[257];
int ret;
- av_assert0(length <= sizeof(temp));
- if ((ret = avio_read(s->pb, temp, length)) < 0)
- return ret;
+ av_assert0(length < sizeof(temp));
+ if ((ret = avio_read(s->pb, temp, length)) != length)
+ return ret < 0 ? ret : AVERROR_INVALIDDATA;
temp[length] = 0;
if (!(coding_history = av_malloc(size + 1)))
return AVERROR(ENOMEM);
- if ((ret = avio_read(s->pb, coding_history, size)) < 0)
- return ret;
+ if ((ret = avio_read(s->pb, coding_history, size)) != size) {
+ av_free(coding_history);
+ return ret < 0 ? ret : AVERROR_INVALIDDATA;
+ }
coding_history[size] = 0;
if ((ret = av_dict_set(&s->metadata, "coding_history", coding_history,
ff_read_riff_info(s, size - 4);
}
break;
+ case MKTAG('I', 'D', '3', ' '):
+ case MKTAG('i', 'd', '3', ' '): {
+ ID3v2ExtraMeta *id3v2_extra_meta = NULL;
+ ff_id3v2_read_dict(pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
+ if (id3v2_extra_meta) {
+ ff_id3v2_parse_apic(s, &id3v2_extra_meta);
+ ff_id3v2_parse_chapters(s, &id3v2_extra_meta);
+ ff_id3v2_parse_priv(s, &id3v2_extra_meta);
+ }
+ ff_id3v2_free_extra_meta(&id3v2_extra_meta);
+ }
+ break;
}
/* seek to next tag unless we know that we'll run into EOF */
} else if (st->codecpar->codec_id == AV_CODEC_ID_XMA1 ||
st->codecpar->codec_id == AV_CODEC_ID_XMA2) {
st->codecpar->block_align = 2048;
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_ADPCM_MS && st->codecpar->channels > 2) {
+ st->codecpar->block_align *= st->codecpar->channels;
}
ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
#endif /* CONFIG_WAV_DEMUXER */
#if CONFIG_W64_DEMUXER
-static int w64_probe(AVProbeData *p)
+static int w64_probe(const AVProbeData *p)
{
if (p->buf_size <= 40)
return 0;