[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