X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fdsfdec.c;h=2fca25ef326e1606aec2980bcc2af6cc3fb8098b;hb=930391e5988abe126d29c5e9b09fab459e0b8936;hp=5e06fd63a587d6fa2e921bded260cdfbb65e2350;hpb=022fa7a24ea8f5000e7b6a50e57cc752f417da47;p=ffmpeg diff --git a/libavformat/dsfdec.c b/libavformat/dsfdec.c index 5e06fd63a58..2fca25ef326 100644 --- a/libavformat/dsfdec.c +++ b/libavformat/dsfdec.c @@ -30,7 +30,7 @@ typedef struct { uint64_t data_size; } DSFContext; -static int dsf_probe(AVProbeData *p) +static int dsf_probe(const AVProbeData *p) { if (p->buf_size < 12 || memcmp(p->buf, "DSD ", 4) || AV_RL64(p->buf + 4) != 28) return 0; @@ -50,14 +50,14 @@ static const uint64_t dsf_channel_layout[] = { static void read_id3(AVFormatContext *s, uint64_t id3pos) { - ID3v2ExtraMeta *id3v2_extra_meta = NULL; + ID3v2ExtraMeta *id3v2_extra_meta; if (avio_seek(s->pb, id3pos, SEEK_SET) < 0) return; ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0); if (id3v2_extra_meta) { - ff_id3v2_parse_apic(s, &id3v2_extra_meta); - ff_id3v2_parse_chapters(s, &id3v2_extra_meta); + ff_id3v2_parse_apic(s, id3v2_extra_meta); + ff_id3v2_parse_chapters(s, id3v2_extra_meta); } ff_id3v2_free_extra_meta(&id3v2_extra_meta); } @@ -124,12 +124,13 @@ static int dsf_read_header(AVFormatContext *s) dsf->audio_size = avio_rl64(pb) / 8 * st->codecpar->channels; st->codecpar->block_align = avio_rl32(pb); - if (st->codecpar->block_align > INT_MAX / st->codecpar->channels) { - avpriv_request_sample(s, "block_align overflow"); + if (st->codecpar->block_align > INT_MAX / st->codecpar->channels || st->codecpar->block_align <= 0) { + avpriv_request_sample(s, "block_align invalid"); return AVERROR_INVALIDDATA; } st->codecpar->block_align *= st->codecpar->channels; st->codecpar->bit_rate = st->codecpar->channels * st->codecpar->sample_rate * 8LL; + avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); avio_skip(pb, 4); /* data chunk */ @@ -150,11 +151,11 @@ static int dsf_read_packet(AVFormatContext *s, AVPacket *pkt) AVIOContext *pb = s->pb; AVStream *st = s->streams[0]; int64_t pos = avio_tell(pb); + int ret; if (pos >= dsf->data_end) return AVERROR_EOF; - pkt->stream_index = 0; if (dsf->data_size > dsf->audio_size) { int last_packet = pos == (dsf->data_end - st->codecpar->block_align); @@ -168,8 +169,8 @@ static int dsf_read_packet(AVFormatContext *s, AVPacket *pkt) if (packet_size <= 0 || skip_size <= 0) return AVERROR_INVALIDDATA; - if (av_new_packet(pkt, packet_size) < 0) - return AVERROR(ENOMEM); + if ((ret = av_new_packet(pkt, packet_size)) < 0) + return ret; dst = pkt->data; for (ch = 0; ch < st->codecpar->channels; ch++) { ret = avio_read(pb, dst, packet_size / st->codecpar->channels); @@ -180,10 +181,22 @@ static int dsf_read_packet(AVFormatContext *s, AVPacket *pkt) avio_skip(pb, skip_size / st->codecpar->channels); } + pkt->pos = pos; + pkt->stream_index = 0; + pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels; + pkt->duration = packet_size / st->codecpar->channels; return 0; } } - return av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align)); + ret = av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align)); + if (ret < 0) + return ret; + + pkt->stream_index = 0; + pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels; + pkt->duration = st->codecpar->block_align / st->codecpar->channels; + + return 0; } AVInputFormat ff_dsf_demuxer = {