[Ffmpeg-devel] Real-time mpegts encoding and streaming

Måns Rullgård mans
Fri Mar 2 21:33:38 CET 2007


Luca Abeni <lucabe72 at email.it> writes:

> Hi M?ns,
>
> On Fri, 2007-03-02 at 18:52 +0000, M?ns Rullg?rd wrote:
> [...]
>> > +                *q++ = val;
>> > +            } else if (pts != AV_NOPTS_VALUE) {
>> >                  *q++ = 0x80; /* PTS only */
>> >                  *q++ = 0x05; /* header len */
>> >                  val = (0x02 << 4) |
>> 
>> This duplicates the PTS writing code.
> Right... I thought that way the code was more readable, but I am not
> convinced anymore :)
> New patch attached.
>
> @@ -463,7 +465,7 @@
>  /* NOTE: pes_data contains all the PES packet */
>  static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
>                               const uint8_t *payload, int payload_size,
> -                             int64_t pts)
> +                             int64_t pts, int64_t dts)
>  {
>      MpegTSWriteStream *ts_st = st->priv_data;
>      uint8_t buf[TS_PACKET_SIZE];
> @@ -527,7 +529,9 @@
>                      private_code = 0x20;
>                  }
>              }
> -            if (pts != AV_NOPTS_VALUE)
> +            if ((pts != AV_NOPTS_VALUE) && (dts != AV_NOPTS_VALUE))
> +                header_len = 13;
> +            else if (pts != AV_NOPTS_VALUE)
>                  header_len = 8;
>              else
>                  header_len = 3;
> @@ -542,10 +546,16 @@
>                  val |= 0x04;
>              *q++ = val;
>              if (pts != AV_NOPTS_VALUE) {
> -                *q++ = 0x80; /* PTS only */
> -                *q++ = 0x05; /* header len */
> -                val = (0x02 << 4) |
> -                    (((pts >> 30) & 0x07) << 1) | 1;
> +                if (dts != AV_NOPTS_VALUE) {
> +                    *q++ = 0xC0; /* PTS + DTS */
> +                    *q++ = 0x0A; /* header len */
> +                    val = (0x03 << 4);
> +                } else {
> +                    *q++ = 0x80; /* PTS only */
> +                    *q++ = 0x05; /* header len */
> +                    val = (0x02 << 4);
> +                }
> +                val |= (((pts >> 30) & 0x07) << 1) | 1;
>                  *q++ = val;
>                  val = (((pts >> 15) & 0x7fff) << 1) | 1;
>                  *q++ = val >> 8;
> @@ -553,6 +563,16 @@
>                  val = (((pts) & 0x7fff) << 1) | 1;
>                  *q++ = val >> 8;
>                  *q++ = val;
> +                if (dts != AV_NOPTS_VALUE) {
> +                    val = (0x01 << 4) | (((dts >> 30) & 0x07) << 1) | 1;
> +                    *q++ = val;
> +                    val = (((dts >> 15) & 0x7fff) << 1) | 1;
> +                    *q++ = val >> 8;
> +                    *q++ = val;
> +                    val = (((dts) & 0x7fff) << 1) | 1;
> +                    *q++ = val >> 8;
> +                    *q++ = val;
> +                }
>              } else {
>                  *q++ = 0x00;
>                  *q++ = 0x00;

Why not something like this:

    header_len = 3;
    flags = 0;
    if(pts != AV_NOPTS_VALUE){
        header_len += 5;
        flags |= 0x80;
    }
    if(dts != AV_NOPTS_VALUE){
        header_len += 5;
        flags |= 0x40;
    }
    *q++ = flags;
    *q++ = header_len;
    /* maybe write pts */
    /* maybe write dts */

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list