+/* Write a single null transport stream packet */
+static void mpegts_insert_null_packet(AVFormatContext *s)
+{
+ MpegTSWrite *ts = s->priv_data;
+ uint8_t *q;
+ uint8_t buf[TS_PACKET_SIZE];
+
+ q = buf;
+ *q++ = 0x47;
+ *q++ = 0x00 | 0x1f;
+ *q++ = 0xff;
+ *q++ = 0x10;
+ memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
+ put_buffer(s->pb, buf, TS_PACKET_SIZE);
+ ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
+}
+
+/* Write a single transport stream packet with a PCR and no payload */
+static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st)
+{
+ MpegTSWrite *ts = s->priv_data;
+ MpegTSWriteStream *ts_st = st->priv_data;
+ uint8_t *q;
+ uint64_t pcr = ts->cur_pcr;
+ uint8_t buf[TS_PACKET_SIZE];
+
+ q = buf;
+ *q++ = 0x47;
+ *q++ = ts_st->pid >> 8;
+ *q++ = ts_st->pid;
+ *q++ = 0x20 | ts_st->cc; /* Adaptation only */
+ /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
+ *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
+ *q++ = 0x10; /* Adaptation flags: PCR present */
+
+ /* PCR coded into 6 bytes */
+ *q++ = pcr >> 25;
+ *q++ = pcr >> 17;
+ *q++ = pcr >> 9;
+ *q++ = pcr >> 1;
+ *q++ = (pcr & 1) << 7;
+ *q++ = 0;
+
+ /* stuffing bytes */
+ memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
+ put_buffer(s->pb, buf, TS_PACKET_SIZE);
+ ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
+}
+