[FFmpeg-devel] [libav-devel] mpegts encoder not interleaving audio/video packets well

Tony Strauss tony at animoto.com
Mon Jun 20 15:42:58 CEST 2011


Any ayes or nays?

On Thu, Jun 16, 2011 at 5:47 PM, Tony Strauss <tony at animoto.com> wrote:

> On Thu, Jun 16, 2011 at 12:09 PM, Michael Niedermayer <michaelni at gmx.at>wrote:
>
>> On Thu, Jun 16, 2011 at 12:05:34PM -0400, Tony Strauss wrote:
>> >
>> > I took a look through the mpeg ps encoder (libavformat/mpegenc.c).  It
>> seems
>> > to require interleaving within .7 sec by default (max_delay).  I think
>> that
>> > it's reasonable to implement this for the mpegts muxer as well.
>>  max_delay
>> > also is configurable via ffmpeg's command-line, so people can set it to
>> be
>> > whatever they want.  I can create a patch for this, if it sounds
>> reasonable
>> > to everyone.
>>
>> sounds reasonable to me
>
> I've attached a patch (reproduced below as well).  The tests continue to
> pass with it.
>
> While testing, I noticed a block of code in the mpegts encoder that struck
> me as strange (mpegtsenc.c:885):
>     const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
>     int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
>
>     if (pkt->pts != AV_NOPTS_VALUE)
>         pts = pkt->pts + delay;
>     if (pkt->dts != AV_NOPTS_VALUE)
>         dts = pkt->dts + delay;
>
> The pts and dts of all of the packets gets incremented by twice max_delay,
> which seems contrary to its use in the mpeg ps muxer (although I may well be
> missing something).
>
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index 7e96472..cbc194c 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c
> @@ -878,6 +878,7 @@ static int mpegts_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>      uint8_t *buf= pkt->data;
>      uint8_t *data= NULL;
>      MpegTSWriteStream *ts_st = st->priv_data;
> +    const uint64_t max_delay = av_rescale(s->max_delay, 90000,
> AV_TIME_BASE);
>      const uint64_t delay = av_rescale(s->max_delay, 90000,
> AV_TIME_BASE)*2;
>      int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
>
> @@ -947,6 +948,18 @@ static int mpegts_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>          }
>      }
>
> +    /*
> +     * Flush the audio packets once we've amassed a full PES payload or
> +     * once the stream has moved a certain amount of time past the first
> audio
> +     * packet in the buffer.
> +     */
> +    if ((ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) ||
> +        ((ts_st->payload_index > 0) && (dts - ts_st->payload_dts >
> max_delay))) {
> +        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
> +                         ts_st->payload_pts, ts_st->payload_dts);
> +        ts_st->payload_index = 0;
> +    }
> +
>      if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
>          // for video and subtitle, write a single pes packet
>          mpegts_write_pes(s, st, buf, size, pts, dts);
> @@ -954,12 +967,6 @@ static int mpegts_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>          return 0;
>      }
>
> -    if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
> -        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
> -                         ts_st->payload_pts, ts_st->payload_dts);
> -        ts_st->payload_index = 0;
> -    }
> -
>      if (!ts_st->payload_index) {
>          ts_st->payload_pts = pts;
>          ts_st->payload_dts = dts;
>
>
> Tony
>


More information about the ffmpeg-devel mailing list