Re: [FFmpeg-devel] [PATCH] lavf/mov: atom box parsing returneofcause play fail
yes, it is. maybe we should add every stream's status and the whole file status can't be fail only by one of streams. but the modification will be too much and the effect is extensive. -- Original -- From: "Michael Niedermayer";<mich...@niedermayer.cc>; Send time: Saturday, Dec 9, 2017 3:36 AM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mov: atom box parsing returneofcause play fail On Sat, Dec 09, 2017 at 12:06:47AM +0800, Tiejun.Peng wrote: > yes, i have checked this case and i have done a lot of tests with .mp4 file and fate Please correct me if iam wrong there are many different atoms/boxes and many functions parsing them If any of these return EOF, it has previously been consideered an error now it can be handled as not an error. Noone has reviewed most of this code to be safe after the change. It doesnt crash in fate or with some valid mp4 files When a parsing function hits EOF it may return EOF. This can occur in the middle of the function, initializing some but not all of what it does normally. Previously this would stop the demuxer and trigger cleanup, after the change the code continues and may behave badly when it uses half initialized structures ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail
i agree with you. too much experience value in condition of Judgement like this: "else if(max_frames>=4 && max_frames >= p->buf_size/1)". why it is the value ? it is hard to known. maybe the work of cleaned up need a few days, so i just repair of the probe. -- Original -- From: "wm4";<nfx...@googlemail.com>; Send time: Thursday, Dec 7, 2017 9:16 PM To: "ffmpeg-devel"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail On Wed, 6 Dec 2017 17:27:43 +0800 "tiejun.peng" <tiejun.p...@foxmail.com> wrote: > fix #6895: https://trac.ffmpeg.org/ticket/6895 > stream:https://trac.ffmpeg.org/attachment/ticket/6895/music_mp3 > > Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> > --- > libavformat/mp3dec.c | 4 > 1 file changed, 4 insertions(+) > > diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c > index a76fe32..286eb68 100644 > --- a/libavformat/mp3dec.c > +++ b/libavformat/mp3dec.c > @@ -73,6 +73,7 @@ static int mp3_read_probe(AVProbeData *p) > int frames, ret; > uint32_t header; > const uint8_t *buf, *buf0, *buf2, *end; > +int match_size = 0; > > buf0 = p->buf; > end = p->buf + p->buf_size - sizeof(uint32_t); > @@ -92,6 +93,7 @@ static int mp3_read_probe(AVProbeData *p) > if (ret != 0) > break; > buf2 += h.frame_size; > +match_size += h.frame_size; > } > max_frames = FFMAX(max_frames, frames); > if(buf == buf0) { > @@ -104,6 +106,8 @@ static int mp3_read_probe(AVProbeData *p) > // issues with MPEG-files! > if (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1; > else if(max_frames>200)return AVPROBE_SCORE_EXTENSION; > +// over 50% of probe size is valid > +else if (p->buf_size > 1 && match_size > (p->buf_size/2)) return > AVPROBE_SCORE_EXTENSION; > else if(max_frames>=4 && max_frames >= p->buf_size/1) return > AVPROBE_SCORE_EXTENSION / 2; > else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && > 2*ff_id3v2_tag_len(buf0) >= p->buf_size) > return p->buf_size < PROBE_BUF_MAX ? > AVPROBE_SCORE_EXTENSION / 4 : AVPROBE_SCORE_EXTENSION - 2; That doesn't necessarily affect whether this patch should be applied, but: I think this mp4 probe should really be cleaned up. It's one of the most complex probe functions, and it doesn't even work correctly. It still detects some ELF files as mp3 (or mp1/2), for example. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail
sorry , i can't produce the output file of pcm with vlc . below link is the vlc record file, maybe it is useful for you. i try to play it with ffmpeg is ok. https://trac.ffmpeg.org/attachment/ticket/6895/vlc-record-2017-12-09-01h02m32s-music_mp3-.mp3 -- Original -- From: "Carl Eugen Hoyos";<ceffm...@gmail.com>; Send time: Saturday, Dec 9, 2017 0:21 AM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail 2017-12-08 17:13 GMT+01:00 Tiejun.Peng <tiejun.p...@foxmail.com>: > can this commit be merged into master? Given that it would introduce a regression, I guess not. More important though: I cannot reproduce successful playback with vlc - can you provide the output file that vlc produces for you? Please do not top-post here, Carl Eugen ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH V2] lavf/mov: atom box parsing return eof cause play fail
fix eof lead to play fail. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 180b6f4..870fdd6 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6632,7 +6632,9 @@ static int mov_read_header(AVFormatContext *s) do { if (mov->moov_retry) avio_seek(pb, 0, SEEK_SET); -if ((err = mov_read_default(mov, pb, atom)) < 0) { +/* EOF don't mean the file to play fail*/ +err = mov_read_default(mov, pb, atom); +if (err < 0 && err != AVERROR_EOF) { av_log(s, AV_LOG_ERROR, "error reading header\n"); mov_read_close(s); return err; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mov: modify code indentation
Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 14 +++--- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 9982204..180b6f4 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6630,13 +6630,13 @@ static int mov_read_header(AVFormatContext *s) /* check MOV header */ do { -if (mov->moov_retry) -avio_seek(pb, 0, SEEK_SET); -if ((err = mov_read_default(mov, pb, atom)) < 0) { -av_log(s, AV_LOG_ERROR, "error reading header\n"); -mov_read_close(s); -return err; -} +if (mov->moov_retry) +avio_seek(pb, 0, SEEK_SET); +if ((err = mov_read_default(mov, pb, atom)) < 0) { +av_log(s, AV_LOG_ERROR, "error reading header\n"); +mov_read_close(s); +return err; +} } while ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mov->found_moov && !mov->moov_retry++); if (!mov->found_moov) { av_log(s, AV_LOG_ERROR, "moov atom not found\n"); -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mov: add some useful warning log of eof
Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 43 +-- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c901859..9982204 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1991,8 +1991,10 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STCO atom\n"); return AVERROR_EOF; +} return 0; } @@ -2522,8 +2524,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) sc->stsd_count++; } -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSD atom\n"); return AVERROR_EOF; +} return 0; } @@ -2624,8 +2628,10 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stsc_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSC atom\n"); return AVERROR_EOF; +} return 0; } @@ -2676,8 +2682,10 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stps_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STPS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2723,8 +2731,10 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->keyframe_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2808,8 +2818,10 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_free(buf); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSZ atom\n"); return AVERROR_EOF; +} return 0; } @@ -2870,8 +2882,10 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->duration_for_fps += duration; sc->nb_frames_for_fps += total_sample_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STTS atom\n"); return AVERROR_EOF; +} st->nb_frames= total_sample_count; if (duration) @@ -2948,8 +2962,10 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->ctts_count = ctts_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted CTTS atom\n"); return AVERROR_EOF; +} av_log(c->fc, AV_LOG_TRACE, "dts shift %d\n", sc->dts_shift); @@ -2995,7 +3011,12 @@ static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->rap_group_count = i; -return pb->eof_reached ? AVERROR_EOF : 0; +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted SBGP atom\n"); +return AVERROR_EOF; +} + +return 0; } /** @@ -4720,8 +4741,10 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) fix_frag_index_entries(>frag_index, next_frag_index, frag->track_id, entries); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted TRUN atom\n"); return AVERROR_EOF; +} frag->implicit_offset = offset; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail
can this commit be merged into master? -- Original -- From: "Tiejun.Peng";<tiejun.p...@foxmail.com>; Send time: Thursday, Dec 7, 2017 5:32 PM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail Playback of the mp3 file sounds very good with VLC media player 2.2.2 Weatherwax (revision 2.2.2-0-g6259d80) Tiejun Peng -- Original -- From: "Carl Eugen Hoyos";<ceffm...@gmail.com>; Send time: Thursday, Dec 7, 2017 0:00 AM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail 2017-12-06 10:27 GMT+01:00 tiejun.peng <tiejun.p...@foxmail.com>: > fix #6895: https://trac.ffmpeg.org/ticket/6895 The patch breaks issue3327-libc-2.17.so > stream:https://trac.ffmpeg.org/attachment/ticket/6895/music_mp3 Which player does something useful with this file? I am not saying there can't be an issue, but not detecting severely broken files does not sound necessarily wrong to me. Carl Eugen ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] lavf/mov: atom box parsing return eofcause play fail
yes, i have checked this case and i have done a lot of tests with .mp4 file and fate -- Original -- From: "Michael Niedermayer";<mich...@niedermayer.cc>; Send time: Friday, Dec 8, 2017 4:42 AM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mov: atom box parsing return eofcause play fail On Thu, Dec 07, 2017 at 05:47:46PM +0800, tiejun.peng wrote: > fix eof lead to play fail. > > Signed-off-by: tiejun.peng > --- > libavformat/mov.c | 47 --- > 1 file changed, 36 insertions(+), 11 deletions(-) please split the addition of warning messages from the change to EOF behavior did you check that every EOF return case is safe to continue as if no error occured ? That change has quite wide effects possibly unless i misunderstand. [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mov: atom box parsing return eof cause play fail
fix eof lead to play fail. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 47 --- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c901859..6c3567f 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1991,8 +1991,10 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STCO atom\n"); return AVERROR_EOF; +} return 0; } @@ -2522,8 +2524,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) sc->stsd_count++; } -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSD atom\n"); return AVERROR_EOF; +} return 0; } @@ -2624,8 +2628,10 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stsc_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSC atom\n"); return AVERROR_EOF; +} return 0; } @@ -2676,8 +2682,10 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stps_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STPS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2723,8 +2731,10 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->keyframe_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2808,8 +2818,10 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_free(buf); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSZ atom\n"); return AVERROR_EOF; +} return 0; } @@ -2870,8 +2882,10 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->duration_for_fps += duration; sc->nb_frames_for_fps += total_sample_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STTS atom\n"); return AVERROR_EOF; +} st->nb_frames= total_sample_count; if (duration) @@ -2948,8 +2962,10 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->ctts_count = ctts_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted CTTS atom\n"); return AVERROR_EOF; +} av_log(c->fc, AV_LOG_TRACE, "dts shift %d\n", sc->dts_shift); @@ -2995,7 +3011,12 @@ static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->rap_group_count = i; -return pb->eof_reached ? AVERROR_EOF : 0; +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted SBGP atom\n"); +return AVERROR_EOF; +} + +return 0; } /** @@ -4720,8 +4741,10 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) fix_frag_index_entries(>frag_index, next_frag_index, frag->track_id, entries); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted TRUN atom\n"); return AVERROR_EOF; +} frag->implicit_offset = offset; @@ -6609,7 +6632,9 @@ static int mov_read_header(AVFormatContext *s) do { if (mov->moov_retry) avio_seek(pb, 0, SEEK_SET); -if ((err = mov_read_default(mov, pb, atom)) < 0) { +/* EOF don't mean the file to play fail*/ +err = mov_read_default(mov, pb, atom); +if (err < 0 && err != AVERROR_EOF) { av_log(s, AV_LOG_ERROR, "error reading header\n"); mov_read_close(s); return err; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail
Playback of the mp3 file sounds very good with VLC media player 2.2.2 Weatherwax (revision 2.2.2-0-g6259d80) Tiejun Peng -- Original -- From: "Carl Eugen Hoyos";<ceffm...@gmail.com>; Send time: Thursday, Dec 7, 2017 0:00 AM To: "FFmpeg development discussions and patches"<ffmpeg-devel@ffmpeg.org>; Subject: Re: [FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail 2017-12-06 10:27 GMT+01:00 tiejun.peng <tiejun.p...@foxmail.com>: > fix #6895: https://trac.ffmpeg.org/ticket/6895 The patch breaks issue3327-libc-2.17.so > stream:https://trac.ffmpeg.org/attachment/ticket/6895/music_mp3 Which player does something useful with this file? I am not saying there can't be an issue, but not detecting severely broken files does not sound necessarily wrong to me. Carl Eugen ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mp3dec: fix mp3 file probe fail
fix #6895: https://trac.ffmpeg.org/ticket/6895 stream:https://trac.ffmpeg.org/attachment/ticket/6895/music_mp3 Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mp3dec.c | 4 1 file changed, 4 insertions(+) diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c index a76fe32..286eb68 100644 --- a/libavformat/mp3dec.c +++ b/libavformat/mp3dec.c @@ -73,6 +73,7 @@ static int mp3_read_probe(AVProbeData *p) int frames, ret; uint32_t header; const uint8_t *buf, *buf0, *buf2, *end; +int match_size = 0; buf0 = p->buf; end = p->buf + p->buf_size - sizeof(uint32_t); @@ -92,6 +93,7 @@ static int mp3_read_probe(AVProbeData *p) if (ret != 0) break; buf2 += h.frame_size; +match_size += h.frame_size; } max_frames = FFMAX(max_frames, frames); if(buf == buf0) { @@ -104,6 +106,8 @@ static int mp3_read_probe(AVProbeData *p) // issues with MPEG-files! if (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1; else if(max_frames>200)return AVPROBE_SCORE_EXTENSION; +// over 50% of probe size is valid +else if (p->buf_size > 1 && match_size > (p->buf_size/2)) return AVPROBE_SCORE_EXTENSION; else if(max_frames>=4 && max_frames >= p->buf_size/1) return AVPROBE_SCORE_EXTENSION / 2; else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size) return p->buf_size < PROBE_BUF_MAX ? AVPROBE_SCORE_EXTENSION / 4 : AVPROBE_SCORE_EXTENSION - 2; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mov: atom box parsing return eof cause play fail
fix eof lead to play fail. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 59 +++ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c901859..870fdd6 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1991,8 +1991,10 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STCO atom\n"); return AVERROR_EOF; +} return 0; } @@ -2522,8 +2524,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) sc->stsd_count++; } -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSD atom\n"); return AVERROR_EOF; +} return 0; } @@ -2624,8 +2628,10 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stsc_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSC atom\n"); return AVERROR_EOF; +} return 0; } @@ -2676,8 +2682,10 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stps_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STPS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2723,8 +2731,10 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->keyframe_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2808,8 +2818,10 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_free(buf); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSZ atom\n"); return AVERROR_EOF; +} return 0; } @@ -2870,8 +2882,10 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->duration_for_fps += duration; sc->nb_frames_for_fps += total_sample_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STTS atom\n"); return AVERROR_EOF; +} st->nb_frames= total_sample_count; if (duration) @@ -2948,8 +2962,10 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->ctts_count = ctts_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted CTTS atom\n"); return AVERROR_EOF; +} av_log(c->fc, AV_LOG_TRACE, "dts shift %d\n", sc->dts_shift); @@ -2995,7 +3011,12 @@ static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->rap_group_count = i; -return pb->eof_reached ? AVERROR_EOF : 0; +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted SBGP atom\n"); +return AVERROR_EOF; +} + +return 0; } /** @@ -4720,8 +4741,10 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) fix_frag_index_entries(>frag_index, next_frag_index, frag->track_id, entries); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted TRUN atom\n"); return AVERROR_EOF; +} frag->implicit_offset = offset; @@ -6607,13 +6630,15 @@ static int mov_read_header(AVFormatContext *s) /* check MOV header */ do { -if (mov->moov_retry) -avio_seek(pb, 0, SEEK_SET); -if ((err = mov_read_default(mov, pb, atom)) < 0) { -av_log(s, AV_LOG_ERROR, "error reading header\n"); -mov_read_close(s); -return err; -} +if (mov->moov_retry) +avio_seek(pb, 0, SEEK_SET); +/* EOF don't mean the file to play fail*/ +err = mov_read_default(mov, pb, atom); +if (err < 0 && err != AVERROR_EOF) { +av_log(s, AV_LOG_ERROR, "error reading header\n"); +mov_read_close(s); +return err; +} } while ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mov->found_moov && !mov->moov_retry++); if (!mov->found_moov) { av_log(s, AV_LOG_ERROR, "moov atom not found\n"); -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/id3v2: add some ID3v2.3 tags convertion
Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/id3v2.c | 5 + 1 file changed, 5 insertions(+) diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 6c216ba..1cf759b 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -56,6 +56,11 @@ const AVMetadataConv ff_id3v2_34_metadata_conv[] = { { "TRCK", "track"}, { "TSSE", "encoder" }, { "USLT", "lyrics" }, +{ "TYER", "year" }, +{ "TDAT", "date" }, +{ "TMED", "media_type" }, +{ "TOLY", "author" }, +{ "TBPM", "BPM" }, { 0 } }; -- Please have a look this patch, give some advice or merge it. Thank you. 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] lavf/mov: atom box parsing return eof cause play fail
1.add warning info about corrupted atom box parsing. 2.atom box parsing return eof cause mov_read_close called in mov_read_header and user have no chance to play the file. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 46 +++--- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c901859..ef8b357 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1991,8 +1991,10 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STCO atom\n"); return AVERROR_EOF; +} return 0; } @@ -2522,8 +2524,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) sc->stsd_count++; } -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSD atom\n"); return AVERROR_EOF; +} return 0; } @@ -2624,8 +2628,10 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stsc_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSC atom\n"); return AVERROR_EOF; +} return 0; } @@ -2676,8 +2682,10 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->stps_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STPS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2723,8 +2731,10 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->keyframe_count = i; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSS atom\n"); return AVERROR_EOF; +} return 0; } @@ -2808,8 +2818,10 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_free(buf); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STSZ atom\n"); return AVERROR_EOF; +} return 0; } @@ -2870,8 +2882,10 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->duration_for_fps += duration; sc->nb_frames_for_fps += total_sample_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted STTS atom\n"); return AVERROR_EOF; +} st->nb_frames= total_sample_count; if (duration) @@ -2948,8 +2962,10 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->ctts_count = ctts_count; -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted CTTS atom\n"); return AVERROR_EOF; +} av_log(c->fc, AV_LOG_TRACE, "dts shift %d\n", sc->dts_shift); @@ -2995,7 +3011,12 @@ static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->rap_group_count = i; -return pb->eof_reached ? AVERROR_EOF : 0; +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted SBGP atom\n"); +return AVERROR_EOF; +} + +return 0; } /** @@ -4720,8 +4741,10 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) fix_frag_index_entries(>frag_index, next_frag_index, frag->track_id, entries); -if (pb->eof_reached) +if (pb->eof_reached) { +av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted TRUN atom\n"); return AVERROR_EOF; +} frag->implicit_offset = offset; @@ -6609,7 +6632,8 @@ static int mov_read_header(AVFormatContext *s) do { if (mov->moov_retry) avio_seek(pb, 0, SEEK_SET); -if ((err = mov_read_default(mov, pb, atom)) < 0) { +/* EOF don't mean the file to play fail*/ +if ((err = mov_read_default(mov, pb, atom) && err != AVERROR_EOF) < 0) { av_log(s, AV_LOG_ERROR, "error reading header\n"); mov_read_close(s); return err; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/mov:the "stco" box parse no need return eof.
discard corrupted track and good track have chance to play. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c901859..5c2ce39 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1991,8 +1991,10 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) -return AVERROR_EOF; +if (i < entries) { +av_log(c->fc, AV_LOG_WARNING, "stream id[0x%x]: corrupted STCO atom\n", st->id); +st->discard = AVDISCARD_ALL; +} return 0; } -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/id3v2: add some ID3v2.3 tags convertion
Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/id3v2.c | 5 + 1 file changed, 5 insertions(+) diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 6c216ba..1cf759b 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -56,6 +56,11 @@ const AVMetadataConv ff_id3v2_34_metadata_conv[] = { { "TRCK", "track"}, { "TSSE", "encoder" }, { "USLT", "lyrics" }, +{ "TYER", "year" }, +{ "TDAT", "date" }, +{ "TMED", "media_type" }, +{ "TOLY", "author" }, +{ "TBPM", "BPM" }, { 0 } }; -- Please have a look this patch, give some advice or merge it. Thank you. 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/mov:the "stco" box parse no need return eof.
if return eof, will cause to play the whole mp4 file fail. For example, currently the whole file will play fail when a few bytes missed in the "stco" box and the "stco" box is the last box of MP4 file, Actually the almost media frames can play success at most time. A few words missed in "stco" box and the other box data is full will not cause the whole mp4 file fail. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/mov.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 5c9f926..78b7bf7 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1989,9 +1989,6 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->chunk_count = i; -if (pb->eof_reached) -return AVERROR_EOF; - return 0; } -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/id3v2: add some ID3v2.3 tags convertion
Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/id3v2.c | 5 + 1 file changed, 5 insertions(+) diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 6c216ba..1cf759b 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -56,6 +56,11 @@ const AVMetadataConv ff_id3v2_34_metadata_conv[] = { { "TRCK", "track"}, { "TSSE", "encoder" }, { "USLT", "lyrics" }, +{ "TYER", "year" }, +{ "TDAT", "date" }, +{ "TMED", "media-type" }, +{ "TOLY", "author" }, +{ "TBPM", "BPM" }, { 0 } }; -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] libavformat/avidec: subtitle stream disable some non-interleaved process
non-interleaved process call avio_seek frequently, it will cause some performance issues especially in network play scene, such as http/ftp protocol. Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/avidec.c | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libavformat/avidec.c b/libavformat/avidec.c index b8a31dc..0220ea1 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -1520,7 +1520,8 @@ resync: } ast->seek_pos= 0; -if (!avi->non_interleaved && st->nb_index_entries>1 && avi->index_loaded>1) { +/* subtitle stream no need the next process, because subtitle's pkt->dts is always 0 */ +if (!avi->non_interleaved && st->nb_index_entries>1 && avi->index_loaded>1 && st->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) { int64_t dts= av_rescale_q(pkt->dts, st->time_base, AV_TIME_BASE_Q); if (avi->dts_max - dts > 2*AV_TIME_BASE) { @@ -1646,6 +1647,10 @@ static int check_stream_max_drift(AVFormatContext *s) AVStream *st = s->streams[i]; AVIStream *ast = st->priv_data; int n = st->nb_index_entries; +/* when stream is subtitle, don't change min_dts, because subtitle stream's dts is always 0 */ +if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) +continue; + while (idx[i] < n && st->index_entries[idx[i]].pos < pos) idx[i]++; if (idx[i] < n) { @@ -1661,6 +1666,10 @@ static int check_stream_max_drift(AVFormatContext *s) AVStream *st = s->streams[i]; AVIStream *ast = st->priv_data; +/* when stream is subtitle, don't change max_dts, because subtitle stream's dts is always 0 */ +if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) +continue; + if (idx[i] && min_dts != INT64_MAX / 2) { int64_t dts; dts = av_rescale_q(st->index_entries[idx[i] - 1].timestamp / -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH v2] avformat/ftp: Solve a crash bug when network occur a exception
This fixes a proble where ffmpeg would cause crash to do a seek when the network disconnect. The log like this: 01-01 10:53:03.441 6580 6580 F DEBUG : backtrace: 01-01 10:53:03.441 6580 6580 F DEBUG : #00 pc 0002942e /system/lib/libavformat.so (ffurl_write+9) Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/ftp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libavformat/ftp.c b/libavformat/ftp.c index 0663b47..9aa7a45 100644 --- a/libavformat/ftp.c +++ b/libavformat/ftp.c @@ -206,6 +206,9 @@ static int ftp_send_command(FTPContext *s, const char *command, if (response) *response = NULL; +if (!s->conn_control) +return AVERROR(EIO); + if ((err = ffurl_write(s->conn_control, command, strlen(command))) < 0) return err; if (!err) -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/ftp: Solve a crash bug when network occur a exception
This fixes a proble where ffmpeg would cause crash to do a seek when the network disconnect. The log like this: 01-01 10:53:03.441 6580 6580 F DEBUG : backtrace: 01-01 10:53:03.441 6580 6580 F DEBUG : #00 pc 0002942e /system/lib/libavformat.so (ffurl_write+9) Signed-off-by: tiejun.peng <tiejun.p...@foxmail.com> --- libavformat/ftp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libavformat/ftp.c b/libavformat/ftp.c index 0663b47..3f1bf2e 100644 --- a/libavformat/ftp.c +++ b/libavformat/ftp.c @@ -206,6 +206,9 @@ static int ftp_send_command(FTPContext *s, const char *command, if (response) *response = NULL; +if (!s->conn_control) +return -1; + if ((err = ffurl_write(s->conn_control, command, strlen(command))) < 0) return err; if (!err) -- 2.7.4 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel