Ticket #271 (closed defect: fixed)
regression with seeking in avi
| Reported by: | ami_stuff | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | undetermined |
| Version: | unspecified | Keywords: | |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
http://www.datafilehost.com/download-39b73242.html
seeking with ffplay in attached file doesn't work correctly, seems like a regression because of this patch:
avidec: correct frame_offset for seeking
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=187528441ab936c102b8e72f38925cc10fc14abc
---
libavformat/avidec.c | 18 +++++++++++++++++-
1 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 98b3be6..7e97b7b 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -1303,7 +1303,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
{
AVIContext *avi = s->priv_data;
AVStream *st;
- int i, index;
+ int i, index, j;
int64_t pos, pos_min;
AVIStream *ast;
@@ -1367,6 +1367,22 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
index=0;
ast2->seek_pos= st2->index_entries[index].pos;
pos_min= FFMIN(pos_min,ast2->seek_pos);
+ }
+ for(i = 0; i < s->nb_streams; i++) {
+ AVStream *st2 = s->streams[i];
+ AVIStream *ast2 = st2->priv_data;
+
+ if (ast2->sub_ctx || st2->nb_index_entries <= 0)
+ continue;
+
+ index = av_index_search_timestamp(
+ st2,
+ av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1),
+ flags | AVSEEK_FLAG_BACKWARD);
+ if(index<0)
+ index=0;
+ while(index>0 && st2->index_entries[index-1].pos >= pos_min)
+ index--;
ast2->frame_offset = st2->index_entries[index].timestamp;
}
C:\>ffmpeg -i reszort.avi
ffmpeg version git-N-30558-ge844abc, Copyright (c) 2000-2011 the FFmpeg develope
rs
built on Jun 5 2011 08:19:16 with gcc 4.5.3
configuration: --enable-gpl --enable-version3 --enable-memalign-hack --enable-
runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libo
pencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --
enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger
--enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enabl
e-libx264 --enable-libxavs --enable-libxvid --enable-zlib --disable-outdev=sdl -
-pkg-config=pkg-config
libavutil 51. 4. 0 / 51. 4. 0
libavcodec 53. 6. 1 / 53. 6. 1
libavformat 53. 2. 0 / 53. 2. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 12. 0 / 2. 12. 0
libswscale 0. 14. 1 / 0. 14. 1
libpostproc 51. 2. 0 / 51. 2. 0
Input #0, avi, from 'reszort.avi':
Metadata:
creation_time : 2003-09-04 21:58:30
Duration: 00:00:38.03, start: 0.000000, bitrate: 824 kb/s
Stream #0.0: Video: msmpeg4v1, yuv420p, 192x144, 14.98 fps, 14.98 tbr, 14.98
tbn, 14.98 tbc
Stream #0.1: Audio: pcm_s16le, 22050 Hz, 1 channels, s16, 352 kb/s
At least one output file must be specified
C:\>ffmpeg -i reszort.avi
ffmpeg version git-N-30558-ge844abc, Copyright (c) 2000-2011 the FFmpeg develope
rs
built on Jun 5 2011 08:19:16 with gcc 4.5.3
configuration: --enable-gpl --enable-version3 --enable-memalign-hack --enable-
runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libo
pencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --
enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger
--enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enabl
e-libx264 --enable-libxavs --enable-libxvid --enable-zlib --disable-outdev=sdl -
-pkg-config=pkg-config
libavutil 51. 4. 0 / 51. 4. 0
libavcodec 53. 6. 1 / 53. 6. 1
libavformat 53. 2. 0 / 53. 2. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 12. 0 / 2. 12. 0
libswscale 0. 14. 1 / 0. 14. 1
libpostproc 51. 2. 0 / 51. 2. 0
Input #0, avi, from 'reszort.avi':
Metadata:
creation_time : 2003-09-04 21:58:30
Duration: 00:00:38.03, start: 0.000000, bitrate: 824 kb/s
Stream #0.0: Video: msmpeg4v1, yuv420p, 192x144, 14.98 fps, 14.98 tbr, 14.98
tbn, 14.98 tbc
Stream #0.1: Audio: pcm_s16le, 22050 Hz, 1 channels, s16, 352 kb/s
At least one output file must be specified
Change History
comment:2 Changed 2 years ago by exobuzz
I see this bug is marked as fixed on git. I just rebuilt ffmpeg from source from this version
commit 54dd50d14dc3a3952f7d85165142d02f6ea578d7 Date: Mon Jun 20 13:22:23 2011 +0200
perhaps my problem is not the same, but the same referenced patch "avidec: correct frame_offset for seeking" breaks seeking on a mpeg4 file. when seeking there are block artifacts (which disappear at the next key frame). the file is 5713978482 bytes in length. if i chop (with dd) the first 20 or 200mb of the file, the piece seeks correctly. (testing with ffplay)
playing (and seeking) the full file with the problem
$ ./ffplay artifacts_when_seeking.avi
ffplay version N-30884-g54dd50d, Copyright (c) 2003-2011 the FFmpeg developers
built on Jun 20 2011 23:10:06 with gcc 4.5.2
configuration:
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 0. 14. 1 / 0. 14. 1
[avi @ 0x13b01c0] non-interleaved AVI
Input #0, avi, from 'artifacts_when_seeking.avi':
Metadata:
encoder : MEncoder 1.0rc4-4.5.2
Duration: 02:13:54.16, start: 0.000000, bitrate: 5689 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 1280x544 [PAR 1:1 DAR 40:17], 24 tbr, 24 tbn, 24 tbc
Stream #0.1: Audio: dca (DTS), 48000 Hz, 5.1, s16, 1536 kb/s
[dca @ 0x13af5e0] Not a valid DCA frame= 43KB sq= 0B f=0/0 f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 27KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe
[dca @ 0x13af5e0] Not a valid DCA frame= 285KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 575KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 682KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 627KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 674KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 378KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
[dca @ 0x13af5e0] Not a valid DCA frame= 423KB sq= 0B f=0/0
[mpeg4 @ 0x13675c0] warning: first frame is no keyframe0B f=0/0
188.34 A-V: 0.008 s:0.0 aq= 321KB vq= 392KB sq= 0B f=0/0
revert two related commits
$ git revert -n a7e4342fc1a0e962b829a9a194d034fa38590951 $ git revert -n 187528441ab936c102b8e72f38925cc10fc14abc
i am then able to seek ok without the artifacts
$ ./ffplay artifacts_when_seeking.avi
ffplay version N-30884-g54dd50d, Copyright (c) 2003-2011 the FFmpeg developers
built on Jun 20 2011 23:10:06 with gcc 4.5.2
configuration:
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 0. 14. 1 / 0. 14. 1
[avi @ 0x2d850c0] non-interleaved AVI
Input #0, avi, from 'artifacts_when_seeking.avi':
Metadata:
encoder : MEncoder 1.0rc4-4.5.2
Duration: 02:13:54.16, start: 0.000000, bitrate: 5689 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 1280x544 [PAR 1:1 DAR 40:17], 24 tbr, 24 tbn, 24 tbc
Stream #0.1: Audio: dca (DTS), 48000 Hz, 5.1, s16, 1536 kb/s
[dca @ 0x2d844c0] Not a valid DCA frame= 19KB sq= 0B f=0/0 f=0/0
364.79 A-V: -0.002 s:0.0 aq= 319KB vq= 840KB sq= 0B f=0/0
Last message repeated 8 times
here is a snippet from the beginning of the file (20mb). if you need anything else please let me know.
http://www.datafilehost.com/download-a1793e98.html
comment:3 Changed 2 years ago by exobuzz
- Status changed from closed to reopened
- Resolution fixed deleted



will be fixed with my next push