[FFmpeg-devel] [PATCHed] change PAT/PMT/SDT playout to be dependant on PTS and not a number of packets.

Baptiste Coudurier baptiste.coudurier at gmail.com
Fri May 20 23:23:07 CEST 2011


Hi,

On 05/20/2011 07:07 AM, JULIAN GARDNER wrote:
> ----- Original Message -----
>> From: Michael Niedermayer <michaelni at gmx.at>
>> To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org>
>> Cc: 
>> Sent: Friday, 20 May 2011, 16:02
>> Subject: Re: [FFmpeg-devel] [PATCHed] change PAT/PMT/SDT playout to be dependant on PTS and not a number of packets.
>>
>> On Fri, May 20, 2011 at 02:29:19PM +0100, JULIAN GARDNER wrote:
>> [...]
>>>  I have a newer version if you want this, i removed the temp variables and 
>> also added in 3 AVOption options to allow these 3 values to be set.
>>
>> please post it
>>
>> [...]
> 
> New version, still uses pts as its base.
> 
> Will look at changing to PCR but i dont think they need to be so accurate +-40ms wont make a difference.
> 
> Added 3 new options in the AVOption structure
> 
> mpegts_pat_playout_rate
> mpegts_pmt_playout_rate
> mpegts_sdt_playout_rate
> 
> joolz
> 
> 
> mpegtsenc.diff
> 
> 
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index 39185bb..f96934e 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c
> @@ -58,8 +58,11 @@ typedef struct MpegTSWrite {
>      MpegTSService **services;
>  
>      int64_t sdt_pts;
> +    int sdt_timeout;
>      int64_t pmt_pts;
> +    int pmt_timeout;
>      int64_t pat_pts;
> +    int pat_timeout;
>  
>      int nb_services;
>      int onid;
> @@ -86,6 +89,12 @@ static const AVOption options[] = {
>        offsetof(MpegTSWrite, pmt_start_pid), FF_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
>      { "mpegts_start_pid", "Set the first pid.",
>        offsetof(MpegTSWrite, start_pid), FF_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
> +    { "mpegts_pat_playout_rate", "Set the rate to playout the PAT in ms.",
> +      offsetof(MpegTSWrite, pat_timeout), FF_OPT_TYPE_INT, {.dbl = 250 }, 125, 500, AV_OPT_FLAG_ENCODING_PARAM},
> +    { "mpegts_pmt_playout_rate", "Set the rate to playout the PMT in ms.",
> +      offsetof(MpegTSWrite, pmt_timeout), FF_OPT_TYPE_INT, {.dbl = 375 }, 250, 750, AV_OPT_FLAG_ENCODING_PARAM},
> +    { "mpegts_sdt_playout_rate", "Set the rate to playout the SDT in ms.",
> +      offsetof(MpegTSWrite, sdt_timeout), FF_OPT_TYPE_INT, {.dbl = 1250 }, 250, 10000, AV_OPT_FLAG_ENCODING_PARAM},
>      { NULL },
>  };
>  
> @@ -574,9 +583,9 @@ static int mpegts_write_header(AVFormatContext *s)
>      else
>          av_log(s, AV_LOG_INFO, "muxrate %d, ", ts->mux_rate);
>      av_log(s, AV_LOG_INFO, "pcr every %d pkts, "
> -           "sdt every %d, pat %d, pmt every %d pkts\n",
> +           "sdt every %d, pat %d, pmt every %d ms\n",
>             service->pcr_packet_period,
> -           SDT_RETRANS_TIME, PAT_RETRANS_TIME, PMT_RETRANS_TIME);
> +           ts->sdt_timeout, ts->pat_timeout, ts->pmt_timeout);
>  
>      avio_flush(s->pb);
>  
> @@ -596,20 +605,16 @@ static void retransmit_si_info(AVFormatContext *s, int64_t pts)
>  {
>      MpegTSWrite *ts = s->priv_data;
>      int i;
> -    int64_t temp_pts;
>  
> -    temp_pts = 90*SDT_RETRANS_TIME;
> -    if (ts->sdt_pts==-1 || (abs(ts->sdt_pts-pts)>temp_pts)) {
> +    if (ts->sdt_pts==-1 || (abs(ts->sdt_pts-pts)>(90*ts->sdt_timeout))) {
>          mpegts_write_sdt(s);
>          ts->sdt_pts = pts;
>      }

Is it possible to write everything in write_header the first time and do
not check for -1 here ?

[...]

-- 
Baptiste COUDURIER
Key fingerprint          8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                           http://www.ffmpeg.org


More information about the ffmpeg-devel mailing list