X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fcafdec.c;h=3294f0639ef24bac100f128b07cf3ca96157e4e4;hb=cd2f7ed0007f4803b6bd845366b2398abb32c355;hp=0938e1a0d795f143d2bb45e837d7081bdf0962c2;hpb=bd4ebbbbed47761df65dd574dce6d3c56d29e2e7;p=ffmpeg diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c index 0938e1a0d79..3294f0639ef 100644 --- a/libavformat/cafdec.c +++ b/libavformat/cafdec.c @@ -26,10 +26,11 @@ */ #include "avformat.h" +#include "internal.h" #include "riff.h" #include "isom.h" #include "libavutil/intreadwrite.h" -#include "libavutil/intfloat_readwrite.h" +#include "libavutil/intfloat.h" #include "libavutil/dict.h" #include "caf.h" @@ -61,13 +62,13 @@ static int read_desc_chunk(AVFormatContext *s) int flags; /* new audio stream */ - st = av_new_stream(s, 0); + st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); /* parse format description */ st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - st->codec->sample_rate = av_int2dbl(avio_rb64(pb)); + st->codec->sample_rate = av_int2double(avio_rb64(pb)); st->codec->codec_tag = avio_rl32(pb); flags = avio_rb32(pb); caf->bytes_per_packet = avio_rb32(pb); @@ -120,18 +121,28 @@ static int read_kuki_chunk(AVFormatContext *s, int64_t size) } else if (st->codec->codec_id == CODEC_ID_ALAC) { #define ALAC_PREAMBLE 12 #define ALAC_HEADER 36 - if (size < ALAC_PREAMBLE + ALAC_HEADER) { - av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n"); - avio_skip(pb, size); - return AVERROR_INVALIDDATA; +#define ALAC_NEW_KUKI 24 + if (size == ALAC_NEW_KUKI) { + st->codec->extradata = av_mallocz(ALAC_HEADER + FF_INPUT_BUFFER_PADDING_SIZE); + if (!st->codec->extradata) + return AVERROR(ENOMEM); + memcpy(st->codec->extradata, "\0\0\0\24alac", 8); + avio_read(pb, st->codec->extradata + ALAC_HEADER - ALAC_NEW_KUKI, ALAC_NEW_KUKI); + st->codec->extradata_size = ALAC_HEADER; + } else { + if (size < ALAC_PREAMBLE + ALAC_HEADER) { + av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n"); + avio_skip(pb, size); + return AVERROR_INVALIDDATA; + } + avio_skip(pb, ALAC_PREAMBLE); + st->codec->extradata = av_mallocz(ALAC_HEADER + FF_INPUT_BUFFER_PADDING_SIZE); + if (!st->codec->extradata) + return AVERROR(ENOMEM); + avio_read(pb, st->codec->extradata, ALAC_HEADER); + st->codec->extradata_size = ALAC_HEADER; + avio_skip(pb, size - ALAC_PREAMBLE - ALAC_HEADER); } - avio_skip(pb, ALAC_PREAMBLE); - st->codec->extradata = av_mallocz(ALAC_HEADER + FF_INPUT_BUFFER_PADDING_SIZE); - if (!st->codec->extradata) - return AVERROR(ENOMEM); - avio_read(pb, st->codec->extradata, ALAC_HEADER); - st->codec->extradata_size = ALAC_HEADER; - avio_skip(pb, size - ALAC_PREAMBLE - ALAC_HEADER); } else { st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE); if (!st->codec->extradata) @@ -292,10 +303,8 @@ static int read_header(AVFormatContext *s, "block size or frame size are variable.\n"); return AVERROR_INVALIDDATA; } - s->file_size = avio_size(pb); - s->file_size = FFMAX(0, s->file_size); - av_set_pts_info(st, 64, 1, st->codec->sample_rate); + avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); st->start_time = 0; /* position the stream at the start of data */