static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { MP3DecContext *mp3 = s->priv_data; AVIndexEntry *ie; AVStream *st = s->streams[0]; int64_t ret = av_index_search_timestamp(st, timestamp, flags); uint32_t header = 0; if (!mp3->xing_toc) return AVERROR(ENOSYS); if (ret < 0) return ret; ie = &st->index_entries[ret]; ret = avio_seek(s->pb, ie->pos, SEEK_SET); if (ret < 0) return ret; while (!s->pb->eof_reached) { header = (header << 8) + avio_r8(s->pb); if (ff_mpa_check_header(header) >= 0) { ff_update_cur_dts(s, st, ie->timestamp); ret = avio_seek(s->pb, -4, SEEK_CUR); return (ret >= 0) ? 0 : ret; } } return AVERROR_EOF; }
static int idcin_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { IdcinDemuxContext *idcin = s->priv_data; if (idcin->first_pkt_pos > 0) { int ret = avio_seek(s->pb, idcin->first_pkt_pos, SEEK_SET); if (ret < 0) return ret; ff_update_cur_dts(s, s->streams[idcin->video_stream_index], 0); idcin->next_chunk_is_video = 1; idcin->current_audio_chunk = 0; return 0; } return -1; }
static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { AVStream *st = s->streams[stream_index]; BRSTMDemuxContext *b = s->priv_data; int64_t ret = 0; timestamp /= b->samples_per_block; ret = avio_seek(s->pb, b->data_start + timestamp * b->block_size * st->codec->channels, SEEK_SET); if (ret < 0) return ret; b->current_block = timestamp; ff_update_cur_dts(s, st, timestamp * b->samples_per_block); return 0; }
static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { MP3DecContext *mp3 = s->priv_data; AVIndexEntry *ie; AVStream *st = s->streams[0]; int64_t ret = av_index_search_timestamp(st, timestamp, flags); if (!mp3->xing_toc) return AVERROR(ENOSYS); if (ret < 0) return ret; ie = &st->index_entries[ret]; ret = reposition(s, ie->pos); if (ret < 0) return ret; ff_update_cur_dts(s, st, ie->timestamp); return 0; }