[FFmpeg-devel] [PATCH] lavf/matroskaenc: avoid assert failure in case of cuepoints with duplicated PTS
Stefano Sabatini
stefasab at gmail.com
Wed Feb 20 12:07:56 CET 2013
On date Tuesday 2013-02-19 00:15:07 +0100, Michael Niedermayer encoded:
> On Tue, Feb 19, 2013 at 12:04:16AM +0100, Stefano Sabatini wrote:
> > On date Monday 2013-02-18 03:42:15 +0100, Michael Niedermayer encoded:
> > > On Sun, Feb 10, 2013 at 09:44:35PM +0100, Stefano Sabatini wrote:
> > [...]
> > > > -static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, int num_tracks)
> > > > +static int mkv_write_cues(AVIOContext *pb, int64_t *currentpos_ptr, mkv_cues *cues, int num_tracks)
> > > > {
> > > > ebml_master cues_element;
> > > > int64_t currentpos;
> > > > + int *track_has_cue;
> > > > int i, j;
> > > >
> > > > + if (!(track_has_cue = av_malloc(sizeof(int)*num_tracks)))
> > > > + return AVERROR(ENOMEM);
> > >
> > > isnt it sikmpler to use a field in mkv_track instead of a dynamically
> > > allocated array
> > > ?
> > > would also avoid the return code changes
> >
> > Yes, updated.
> > --
> > FFmpeg = Faithful & Fantastic Mysterious Pitiless Evil God
>
> > matroskaenc.c | 7 +++++--
> > 1 file changed, 5 insertions(+), 2 deletions(-)
> > c266d2177f3b92948ce592ba9b7e2cb35480d6b7 0001-lavf-matroskaenc-avoid-assert-failure-in-case-of-cue.patch
> > From 1e8306d18d8885569b6dc0aabb7889e44d6aa106 Mon Sep 17 00:00:00 2001
> > From: Stefano Sabatini <stefasab at gmail.com>
> > Date: Sun, 10 Feb 2013 21:32:37 +0100
> > Subject: [PATCH] lavf/matroskaenc: avoid assert failure in case of cuepoints
> > with duplicated PTS
> >
> > Avoid to write more than one cuepoint per track and PTS in
> > mkv_write_cues(). This avoids a later assertion failure on "(bytes >=
> > needed_bytes)" in put_ebml_num() called from end_ebml_master(), in case
> > there are several cuepoints per track with the same PTS.
> >
> > This may happen with files containing packets with duplicated PTS in the
> > same track.
> > ---
> > libavformat/matroskaenc.c | 7 +++++--
> > 1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> > index 5c1e2f1..b0a037a 100644
> > --- a/libavformat/matroskaenc.c
> > +++ b/libavformat/matroskaenc.c
> > @@ -72,6 +72,7 @@ typedef struct {
> >
> > typedef struct {
> > int write_dts;
> > + int num_cues;
> > } mkv_track;
> >
> > #define MODE_MATROSKAv2 0x01
> > @@ -384,7 +385,7 @@ static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t clus
> > return 0;
> > }
> >
> > -static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, int num_tracks)
> > +static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, mkv_track *tracks, int num_tracks)
> > {
> > ebml_master cues_element;
> > int64_t currentpos;
> > @@ -404,6 +405,8 @@ static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, int num_tracks)
> > // put all the entries from different tracks that have the exact same
> > // timestamp into the same CuePoint
> > for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
> > + if (++tracks[entry[j].tracknum].num_cues > 1)
> > + continue;
>
> if(x)
> continue
> x=1
>
> would avoid theoretical interger overflow
> otherwise LGTM
I also had to reset has_cue with:
for (j = 0; j < num_tracks; j++)
tracks[j].has_cue = 0;
After that FATE passed, patch pushed.
--
FFmpeg = Formidable & Fascinating Marvellous Portentous Eager Gadget
More information about the ffmpeg-devel
mailing list