On Fri, Sep 25, 2015 at 09:22:41AM +0800, Ching-Yi Chan wrote: > I do it with AVFMT_FLAG_FAST_SEEK flag. > > > 2015-09-24 23:47 GMT+08:00 wm4 <nfx...@googlemail.com>: > > > On Thu, 24 Sep 2015 23:41:03 +0800 > > Ching-Yi Chan <chingyichan...@gmail.com> wrote: > > > > > Is it acceptable to provide an option for different methods > > > between accuracy seek and fast but inaccurate. > > > > > > For example, mp3dec having "usetoc" option to seek by toc. > > > > You could use the AVFMT_FLAG_FAST_SEEK flag. (It's a flag set on the > > format context.) > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >
> flacdec.c | 43 ++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 42 insertions(+), 1 deletion(-) > 980c23fbd623f488c24194ec92d75aebe5e183f8 > 0001-avformat-flacdec-support-fast-seek.patch > From 2e1d69e0a24455136d1a5dcc0898eac1bb2cb602 Mon Sep 17 00:00:00 2001 > From: "Ching Yi, Chan" <chingyichan...@gmail.com> > Date: Thu, 24 Sep 2015 13:04:40 +0800 > Subject: [PATCH] avformat/flacdec: support fast-seek > > --- > libavformat/flacdec.c | 43 ++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 42 insertions(+), 1 deletions(-) > > diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c > index 4c1f943..3e4d867 100644 > --- a/libavformat/flacdec.c > +++ b/libavformat/flacdec.c > @@ -28,11 +28,14 @@ > #include "vorbiscomment.h" > #include "replaygain.h" > > +#define SEEKPOINT_SIZE 18 > + > static int flac_read_header(AVFormatContext *s) > { > int ret, metadata_last=0, metadata_type, metadata_size, > found_streaminfo=0; > uint8_t header[4]; > uint8_t *buffer=NULL; > + > AVStream *st = avformat_new_stream(s, NULL); > if (!st) > return AVERROR(ENOMEM); > @@ -58,6 +61,7 @@ static int flac_read_header(AVFormatContext *s) > case FLAC_METADATA_TYPE_CUESHEET: > case FLAC_METADATA_TYPE_PICTURE: > case FLAC_METADATA_TYPE_VORBIS_COMMENT: > + case FLAC_METADATA_TYPE_SEEKTABLE: > buffer = av_mallocz(metadata_size + > AV_INPUT_BUFFER_PADDING_SIZE); > if (!buffer) { > return AVERROR(ENOMEM); > @@ -132,7 +136,20 @@ static int flac_read_header(AVFormatContext *s) > av_log(s, AV_LOG_ERROR, "Error parsing attached picture.\n"); > return ret; > } > - } else { > + } else if (metadata_type == FLAC_METADATA_TYPE_SEEKTABLE) { > + const uint8_t *seekpoint = buffer; > + int i, seek_point_count = metadata_size/SEEKPOINT_SIZE; > + for(i=0; i<seek_point_count; i++) { > + int64_t timestamp = bytestream_get_be64(&seekpoint); > + int64_t pos = bytestream_get_be64(&seekpoint); > + /* skip number of samples */ > + bytestream_get_be16(&seekpoint); > + av_add_index_entry(st, pos, timestamp, 0, 0, > AVINDEX_KEYFRAME); > + } > + av_freep(&buffer); > + } > + else { > + > /* STREAMINFO must be the first block */ > if (!found_streaminfo) { > RETURN_ERROR(AVERROR_INVALIDDATA); > @@ -169,6 +186,12 @@ static int flac_read_header(AVFormatContext *s) > if (ret < 0) > return ret; > > + /* the real seek index offset should be the size of metadata blocks with > the offset in the frame blocks */ > + int metadata_head_size = avio_tell(s->pb); this should be int64_t probably also declarations and statments should not be mixed > + int i; > + for(i=0; i<st->nb_index_entries; i++) { > + st->index_entries[i].pos += metadata_head_size; > + } > return 0; > > fail: > @@ -249,12 +272,30 @@ static av_unused int64_t > flac_read_timestamp(AVFormatContext *s, int stream_inde > return pts; > } > > +static int flac_seek(AVFormatContext *s, int stream_index, int64_t > timestamp, int flags) { > + if (!(s->flags&AVFMT_FLAG_FAST_SEEK)) { > + return -1; > + } > + > + int index = av_index_search_timestamp(s->streams[0], timestamp, flags); > + if(index<0 || index >= s->streams[0]->nb_index_entries) > + return -1; > + > + AVIndexEntry e = s->streams[0]->index_entries[index]; > + int ret = avio_seek(s->pb, e.pos, SEEK_SET); int64_t what level of accuracy is this code intended to have ? seek-acodec-flac would differ by the amounts listed below if the code would be enabled and not depend on AVFMT_FLAG_FAST_SEEK --- ./tests/ref/seek/acodec-flac 2015-09-25 03:40:06.793930465 +0200 +++ tests/data/fate/seek-acodec-flac 2015-09-25 04:22:51.565984498 +0200 @@ -2,7 +2,7 @@ ret: 0 st:-1 flags:0 ts:-1.000000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 1.880816 pts: 1.880816 pos: 86742 size: 2191 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:0 ts: 0.788345 ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st: 0 flags:1 ts:-0.317506 @@ -10,44 +10,44 @@ ret: 0 st:-1 flags:0 ts: 2.576668 ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:1 ts: 1.470835 -ret: 0 st: 0 flags:1 dts: 1.462857 pts: 1.462857 pos: 53388 size: 1851 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st: 0 flags:0 ts: 0.365011 -ret: 0 st: 0 flags:1 dts: 0.365714 pts: 0.365714 pos: 16890 size: 614 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st: 0 flags:1 ts:-0.740839 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:0 ts: 2.153336 -ret: 0 st: 0 flags:1 dts: 2.168163 pts: 2.168163 pos: 110531 size: 2143 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:1 ts: 1.047503 -ret: 0 st: 0 flags:1 dts: 1.044898 pts: 1.044898 pos: 32880 size: 579 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st: 0 flags:0 ts:-0.058322 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 2.835828 -ret: 0 st: 0 flags:1 dts: 2.821224 pts: 2.821224 pos: 167112 size: 2391 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 0 flags:1 dts: 1.750204 pts: 1.750204 pos: 75788 size: 2191 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.600816 pts: 0.600816 pos: 22446 size: 616 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:0 ts:-0.481655 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 2.412494 -ret: 0 st: 0 flags:1 dts: 2.403265 pts: 2.403265 pos: 129793 size: 2138 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st:-1 flags:0 ts: 1.306672 -ret: 0 st: 0 flags:1 dts: 1.332245 pts: 1.332245 pos: 44812 size: 1609 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:1 ts: 0.200839 -ret: 0 st: 0 flags:1 dts: 0.182857 pts: 0.182857 pos: 12572 size: 628 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:0 ts:-0.904989 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 1.989184 -ret: 0 st: 0 flags:1 dts: 1.985306 pts: 1.985306 pos: 95508 size: 2169 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st:-1 flags:0 ts: 0.883340 -ret: 0 st: 0 flags:1 dts: 0.888163 pts: 0.888163 pos: 29211 size: 620 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 ret: 0 st:-1 flags:1 ts:-0.222493 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:0 ts: 2.671678 ret: 0 st: 0 flags:1 dts: 2.690612 pts: 2.690612 pos: 155154 size: 2394 ret: 0 st: 0 flags:1 ts: 1.565850 -ret: 0 st: 0 flags:1 dts: 1.541224 pts: 1.541224 pos: 59082 size: 1974 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.470204 pts: 0.470204 pos: 19353 size: 608 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 ret: 0 st:-1 flags:1 ts:-0.645825 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 > + if (ret >= 0) { > + return ret; > + } > + return -1; > +} > + > AVInputFormat ff_flac_demuxer = { > .name = "flac", > .long_name = NULL_IF_CONFIG_SMALL("raw FLAC"), > .read_probe = flac_probe, > .read_header = flac_read_header, > .read_packet = ff_raw_read_partial_packet, > + .read_seek = flac_seek, > .read_timestamp = flac_read_timestamp, > .flags = AVFMT_GENERIC_INDEX, > .extensions = "flac", > -- > 1.7.7 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Those who are best at talking, realize last or never when they are wrong.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel