[FFmpeg-devel] [PATCH 1/1] mpegts: stop analyzing when pmt for all programs have been found

Joakim Plate elupus at ecce.se
Sat Dec 14 14:49:38 CET 2013


No, it takes effect directly. However it will still exhaust the probesize
and analyzeduration if it can't find other codec parameters.


On Sat, Dec 14, 2013 at 1:51 PM, Andrey Utkin <
andrey.krieger.utkin at gmail.com> wrote:

> 2013/12/14 Joakim Plate <elupus at ecce.se>:
> > This disable NOHEADER after finding PMT for all programs to
>
> disables
>
> > avoid find_stream_info always exhausting probe size for mpegts
> >
> > This is very problematically for live streams since read speed
>
> I'd suggest "important" instead of "problematically". Although this
> explanation is a bit trivial, if you like my suggestion you could make
> it more concise, just saying that avformat_find_stream_info on MPEG TS
> would complete faster.
>
> > will be limited. rtsp, udp and any protocol streaming a live
> > mpegts will have dramatically faster startup time.
> > ---
> >  libavformat/mpegts.c | 54
> +++++++++++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 45 insertions(+), 9 deletions(-)
> >
> > diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> > index d67c63a..51f4267 100644
> > --- a/libavformat/mpegts.c
> > +++ b/libavformat/mpegts.c
> > @@ -90,6 +90,9 @@ struct Program {
> >      unsigned int id; //program id/service id
> >      unsigned int nb_pids;
> >      unsigned int pids[MAX_PIDS_PER_PROGRAM];
> > +
> > +    /** have we found pmt for this program */
> > +    int pmt;
>
> As you set it to just 0 or 1, i'd suggest name "pmt_found".
>
> > @@ -1912,6 +1933,21 @@ static int handle_packet(MpegTSContext *ts, const
> uint8_t *packet)
> >                                     p, p_end - p, 0);
> >              }
> >          }
> > +
> > +        // stop find_stream_info from waiting for more streams
> > +        // when all programs have received a PMT
> > +        if( ts->stream->ctx_flags & AVFMTCTX_NOHEADER) {
> > +            int i;
> > +            for(i=0; i<ts->nb_prg; i++) {
> > +                if (ts->prg[i].pmt == 0)
> > +                    break;
> > +            }
> > +            if (ts->nb_prg > 0 && i == ts->nb_prg) {
> > +                av_log(ts->stream, AV_LOG_DEBUG, "All programs have
> pmt, headers found\n");
> > +                ts->stream->ctx_flags &= ~AVFMTCTX_NOHEADER;
> > +            }
> > +        }
> > +
>
> I know that major developers of FFmpeg like concise code, but i
> personally would prefer explicit "found" flag variable instead of
> using final value of "i" to determine result. Just my houmble opinion.
>
>
> Thanks for your efforts, this enhancement is interesting. BTW, does
> the modified procedure take its place _after_ the amount of data
> required by "probesize" and "analyzeduration" options is fetched?
>
> --
> Andrey Utkin
>


More information about the ffmpeg-devel mailing list