+ if (start < 0)
+ return AVERROR_INVALIDDATA;
+
+ if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
+ int64_t remaining = avio_size(pb);
+
+ if (remaining >= start && remaining - start <= INT_MAX)
+ switch (par->codec_id) {
+ case AV_CODEC_ID_ADPCM_PSX:
+ case AV_CODEC_ID_ADPCM_IMA_RAD:
+ case AV_CODEC_ID_ADPCM_IMA_WAV:
+ case AV_CODEC_ID_ADPCM_THP_LE:
+ st->duration = av_get_audio_frame_duration2(par, remaining - start);
+ break;
+ case AV_CODEC_ID_ADPCM_THP:
+ st->duration = (remaining - start) / (8 * par->channels) * 14;
+ break;
+ case AV_CODEC_ID_PCM_S16LE:
+ case AV_CODEC_ID_PCM_S16BE:
+ st->duration = (remaining - start) / 2 / par->channels;
+ }
+ }