[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