mpegtsenc.c 72.0 KB
Newer Older
1
/*
2
 * MPEG-2 transport stream (aka DVB) muxer
3
 * Copyright (c) 2003 Fabrice Bellard
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

22
#include "libavutil/avassert.h"
23
#include "libavutil/bswap.h"
24
#include "libavutil/crc.h"
25
#include "libavutil/dict.h"
26
#include "libavutil/intreadwrite.h"
27
#include "libavutil/mathematics.h"
28
#include "libavutil/opt.h"
D
Diego Biurrun 已提交
29

30
#include "libavcodec/internal.h"
D
Diego Biurrun 已提交
31

32
#include "avformat.h"
33
#include "avio_internal.h"
34
#include "internal.h"
35 36
#include "mpegts.h"

37 38
#define PCR_TIME_BASE 27000000

39 40
/* write DVB SI sections */

41 42
#define DVB_PRIVATE_NETWORK_START 0xff01

43 44 45 46 47 48
/*********************************************/
/* mpegts section writer */

typedef struct MpegTSSection {
    int pid;
    int cc;
49
    int discontinuity;
50 51 52 53
    void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
    void *opaque;
} MpegTSSection;

54
typedef struct MpegTSService {
55
    MpegTSSection pmt; /* MPEG-2 PMT table context */
56
    int sid;           /* service ID */
57 58
    uint8_t name[256];
    uint8_t provider_name[256];
59 60
    int pcr_pid;
    int pcr_packet_count;
61
    int pcr_packet_period;
62
    AVProgram *program;
63 64
} MpegTSService;

65 66 67 68 69 70 71 72
// service_type values as defined in ETSI 300 468
enum {
    MPEGTS_SERVICE_TYPE_DIGITAL_TV                   = 0x01,
    MPEGTS_SERVICE_TYPE_DIGITAL_RADIO                = 0x02,
    MPEGTS_SERVICE_TYPE_TELETEXT                     = 0x03,
    MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_RADIO = 0x0A,
    MPEGTS_SERVICE_TYPE_MPEG2_DIGITAL_HDTV           = 0x11,
    MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_SDTV  = 0x16,
73 74
    MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV  = 0x19,
    MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV            = 0x1F,
75
};
76
typedef struct MpegTSWrite {
77
    const AVClass *av_class;
78 79
    MpegTSSection pat; /* MPEG-2 PAT table */
    MpegTSSection sdt; /* MPEG-2 SDT table context */
80 81
    MpegTSService **services;
    int sdt_packet_count;
82
    int sdt_packet_period;
83
    int pat_packet_count;
84
    int pat_packet_period;
85 86 87
    int nb_services;
    int onid;
    int tsid;
88
    int64_t first_pcr;
89
    int mux_rate; ///< set to 1 when VBR
90
    int pes_payload_size;
91 92 93 94

    int transport_stream_id;
    int original_network_id;
    int service_id;
95
    int service_type;
96 97 98

    int pmt_start_pid;
    int start_pid;
99
    int m2ts_mode;
100

101 102
    int reemit_pat_pmt; // backward compatibility

103
    int pcr_period;
104 105
#define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
#define MPEGTS_FLAG_AAC_LATM        0x02
106
#define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
107
#define MPEGTS_FLAG_SYSTEM_B        0x08
108
#define MPEGTS_FLAG_DISCONT         0x10
109
    int flags;
110
    int copyts;
111
    int tables_version;
112
    double pat_period;
113
    double sdt_period;
114
    int64_t last_pat_ts;
115
    int64_t last_sdt_ts;
116

R
Reimar Döffinger 已提交
117
    int omit_video_pes_length;
118 119
} MpegTSWrite;

120
/* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
D
Diego Biurrun 已提交
121
#define DEFAULT_PES_HEADER_FREQ  16
122 123
#define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)

124 125 126 127
/* The section length is 12 bits. The first 2 are set to 0, the remaining
 * 10 bits should not exceed 1021. */
#define SECTION_LENGTH 1020

128
/* NOTE: 4 bytes must be left at the end for the crc32 */
129
static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
130 131 132 133 134 135 136
{
    unsigned int crc;
    unsigned char packet[TS_PACKET_SIZE];
    const unsigned char *buf_ptr;
    unsigned char *q;
    int first, b, len1, left;

D
Diego Biurrun 已提交
137 138 139
    crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE),
                            -1, buf, len - 4));

140 141
    buf[len - 4] = (crc >> 24) & 0xff;
    buf[len - 3] = (crc >> 16) & 0xff;
D
Diego Biurrun 已提交
142
    buf[len - 2] = (crc >>  8) & 0xff;
143
    buf[len - 1] =  crc        & 0xff;
144

145 146 147
    /* send each packet */
    buf_ptr = buf;
    while (len > 0) {
148
        first = buf == buf_ptr;
D
Diego Biurrun 已提交
149 150
        q     = packet;
        *q++  = 0x47;
151
        b     = s->pid >> 8;
152 153
        if (first)
            b |= 0x40;
D
Diego Biurrun 已提交
154 155
        *q++  = b;
        *q++  = s->pid;
156
        s->cc = s->cc + 1 & 0xf;
D
Diego Biurrun 已提交
157
        *q++  = 0x10 | s->cc;
158 159 160 161 162 163
        if (s->discontinuity) {
            q[-1] |= 0x20;
            *q++ = 1;
            *q++ = 0x80;
            s->discontinuity = 0;
        }
164 165 166
        if (first)
            *q++ = 0; /* 0 offset */
        len1 = TS_PACKET_SIZE - (q - packet);
167
        if (len1 > len)
168 169 170 171 172 173 174 175 176 177 178
            len1 = len;
        memcpy(q, buf_ptr, len1);
        q += len1;
        /* add known padding data */
        left = TS_PACKET_SIZE - (q - packet);
        if (left > 0)
            memset(q, 0xff, left);

        s->write_packet(s, packet);

        buf_ptr += len1;
D
Diego Biurrun 已提交
179
        len     -= len1;
180 181 182 183 184 185
    }
}

static inline void put16(uint8_t **q_ptr, int val)
{
    uint8_t *q;
D
Diego Biurrun 已提交
186 187 188
    q      = *q_ptr;
    *q++   = val >> 8;
    *q++   = val;
189 190 191
    *q_ptr = q;
}

192
static int mpegts_write_section1(MpegTSSection *s, int tid, int id,
D
Diego Biurrun 已提交
193 194
                                 int version, int sec_num, int last_sec_num,
                                 uint8_t *buf, int len)
195 196 197
{
    uint8_t section[1024], *q;
    unsigned int tot_len;
198 199
    /* reserved_future_use field must be set to 1 for SDT */
    unsigned int flags = tid == SDT_TID ? 0xf000 : 0xb000;
200

201 202 203
    tot_len = 3 + 5 + len + 4;
    /* check if not too big */
    if (tot_len > 1024)
204
        return AVERROR_INVALIDDATA;
205

D
Diego Biurrun 已提交
206
    q    = section;
207
    *q++ = tid;
208
    put16(&q, flags | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */
209 210 211 212 213
    put16(&q, id);
    *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
    *q++ = sec_num;
    *q++ = last_sec_num;
    memcpy(q, buf, len);
214

215 216 217 218 219 220 221
    mpegts_write_section(s, section, tot_len);
    return 0;
}

/*********************************************/
/* mpegts writer */

222
#define DEFAULT_PROVIDER_NAME   "FFmpeg"
223 224 225 226 227
#define DEFAULT_SERVICE_NAME    "Service01"

/* we retransmit the SI info at this rate */
#define SDT_RETRANS_TIME 500
#define PAT_RETRANS_TIME 100
228
#define PCR_RETRANS_TIME 20
229 230

typedef struct MpegTSWriteStream {
231
    struct MpegTSService *service;
232 233
    int pid; /* stream associated pid */
    int cc;
234
    int discontinuity;
235
    int payload_size;
236
    int first_pts_check; ///< first pts check needed
237
    int prev_payload_key;
238
    int64_t payload_pts;
239
    int64_t payload_dts;
240
    int payload_flags;
241
    uint8_t *payload;
242
    AVFormatContext *amux;
243
    AVRational user_tb;
244 245 246

    /* For Opus */
    int opus_queued_samples;
247
    int opus_pending_trim_start;
248 249 250 251 252 253
} MpegTSWriteStream;

static void mpegts_write_pat(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
254
    uint8_t data[SECTION_LENGTH], *q;
255
    int i;
256

257
    q = data;
D
Diego Biurrun 已提交
258
    for (i = 0; i < ts->nb_services; i++) {
259 260 261 262
        service = ts->services[i];
        put16(&q, service->sid);
        put16(&q, 0xe000 | service->pmt.pid);
    }
263
    mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, ts->tables_version, 0, 0,
264 265 266
                          data, q - data);
}

267
static void putbuf(uint8_t **q_ptr, const uint8_t *buf, size_t len)
268
{
269 270
    memcpy(*q_ptr, buf, len);
    *q_ptr += len;
271 272
}

273 274 275 276 277 278 279 280 281 282 283 284
static void put_registration_descriptor(uint8_t **q_ptr, uint32_t tag)
{
    uint8_t *q = *q_ptr;
    *q++ = 0x05; /* MPEG-2 registration descriptor*/
    *q++ = 4;
    *q++ = tag;
    *q++ = tag >> 8;
    *q++ = tag >> 16;
    *q++ = tag >> 24;
    *q_ptr = q;
}

285
static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
286
{
287
    MpegTSWrite *ts = s->priv_data;
288
    uint8_t data[SECTION_LENGTH], *q, *desc_length_ptr, *program_info_length_ptr;
289
    int val, stream_type, i, err = 0;
290 291 292 293 294 295 296 297 298 299 300 301

    q = data;
    put16(&q, 0xe000 | service->pcr_pid);

    program_info_length_ptr = q;
    q += 2; /* patched after */

    /* put program info here */

    val = 0xf000 | (q - program_info_length_ptr - 2);
    program_info_length_ptr[0] = val >> 8;
    program_info_length_ptr[1] = val;
302

D
Diego Biurrun 已提交
303
    for (i = 0; i < s->nb_streams; i++) {
304 305
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
D
Diego Biurrun 已提交
306
        AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
307

308
        if (s->nb_programs) {
309 310 311 312 313 314
            int k, found = 0;
            AVProgram *program = service->program;

            for (k = 0; k < program->nb_stream_indexes; k++)
                if (program->stream_index[k] == i) {
                    found = 1;
315 316 317 318
                    break;
                }

            if (!found)
319 320 321
                continue;
        }

322
        if (q - data > SECTION_LENGTH - 32) {
323 324 325
            err = 1;
            break;
        }
326
        switch (st->codecpar->codec_id) {
327 328
        case AV_CODEC_ID_MPEG1VIDEO:
        case AV_CODEC_ID_MPEG2VIDEO:
329
            stream_type = STREAM_TYPE_VIDEO_MPEG2;
330
            break;
331
        case AV_CODEC_ID_MPEG4:
332 333
            stream_type = STREAM_TYPE_VIDEO_MPEG4;
            break;
334
        case AV_CODEC_ID_H264:
335 336
            stream_type = STREAM_TYPE_VIDEO_H264;
            break;
337 338 339
        case AV_CODEC_ID_HEVC:
            stream_type = STREAM_TYPE_VIDEO_HEVC;
            break;
340 341 342
        case AV_CODEC_ID_CAVS:
            stream_type = STREAM_TYPE_VIDEO_CAVS;
            break;
343
        case AV_CODEC_ID_DIRAC:
344 345
            stream_type = STREAM_TYPE_VIDEO_DIRAC;
            break;
346 347 348
        case AV_CODEC_ID_VC1:
            stream_type = STREAM_TYPE_VIDEO_VC1;
            break;
349 350
        case AV_CODEC_ID_MP2:
        case AV_CODEC_ID_MP3:
351 352
            if (   st->codecpar->sample_rate > 0
                && st->codecpar->sample_rate < 32000) {
353 354 355 356
                stream_type = STREAM_TYPE_AUDIO_MPEG2;
            } else {
                stream_type = STREAM_TYPE_AUDIO_MPEG1;
            }
357
            break;
358
        case AV_CODEC_ID_AAC:
D
Diego Biurrun 已提交
359 360 361
            stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
                          ? STREAM_TYPE_AUDIO_AAC_LATM
                          : STREAM_TYPE_AUDIO_AAC;
362
            break;
363
        case AV_CODEC_ID_AAC_LATM:
364 365
            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
            break;
366
        case AV_CODEC_ID_AC3:
367 368 369 370 371 372 373 374
            stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
                          ? STREAM_TYPE_PRIVATE_DATA
                          : STREAM_TYPE_AUDIO_AC3;
            break;
        case AV_CODEC_ID_EAC3:
            stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
                          ? STREAM_TYPE_PRIVATE_DATA
                          : STREAM_TYPE_AUDIO_EAC3;
375
            break;
376 377 378 379 380 381
        case AV_CODEC_ID_DTS:
            stream_type = STREAM_TYPE_AUDIO_DTS;
            break;
        case AV_CODEC_ID_TRUEHD:
            stream_type = STREAM_TYPE_AUDIO_TRUEHD;
            break;
382 383 384
        case AV_CODEC_ID_OPUS:
            stream_type = STREAM_TYPE_PRIVATE_DATA;
            break;
385 386 387
        case AV_CODEC_ID_TIMED_ID3:
            stream_type = STREAM_TYPE_METADATA;
            break;
388 389 390 391
        default:
            stream_type = STREAM_TYPE_PRIVATE_DATA;
            break;
        }
392

393 394 395 396 397 398
        *q++ = stream_type;
        put16(&q, 0xe000 | ts_st->pid);
        desc_length_ptr = q;
        q += 2; /* patched after */

        /* write optional descriptors here */
399
        switch (st->codecpar->codec_type) {
400
        case AVMEDIA_TYPE_AUDIO:
401
            if (st->codecpar->codec_id==AV_CODEC_ID_AC3 && (ts->flags & MPEGTS_FLAG_SYSTEM_B)) {
402 403 404 405
                *q++=0x6a; // AC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
406
            if (st->codecpar->codec_id==AV_CODEC_ID_EAC3 && (ts->flags & MPEGTS_FLAG_SYSTEM_B)) {
M
Mean 已提交
407 408 409 410
                *q++=0x7a; // EAC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
411 412
            if (st->codecpar->codec_id==AV_CODEC_ID_S302M)
                put_registration_descriptor(&q, MKTAG('B', 'S', 'S', 'D'));
413
            if (st->codecpar->codec_id==AV_CODEC_ID_OPUS) {
414 415 416 417 418 419
                /* 6 bytes registration descriptor, 4 bytes Opus audio descriptor */
                if (q - data > SECTION_LENGTH - 6 - 4) {
                    err = 1;
                    break;
                }

420
                put_registration_descriptor(&q, MKTAG('O', 'p', 'u', 's'));
421 422 423 424 425

                *q++ = 0x7f; /* DVB extension descriptor */
                *q++ = 2;
                *q++ = 0x80;

426 427
                if (st->codecpar->extradata && st->codecpar->extradata_size >= 19) {
                    if (st->codecpar->extradata[18] == 0 && st->codecpar->channels <= 2) {
428
                        /* RTP mapping family */
429 430 431
                        *q++ = st->codecpar->channels;
                    } else if (st->codecpar->extradata[18] == 1 && st->codecpar->channels <= 8 &&
                               st->codecpar->extradata_size >= 21 + st->codecpar->channels) {
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456
                        static const uint8_t coupled_stream_counts[9] = {
                            1, 0, 1, 1, 2, 2, 2, 3, 3
                        };
                        static const uint8_t channel_map_a[8][8] = {
                            {0},
                            {0, 1},
                            {0, 2, 1},
                            {0, 1, 2, 3},
                            {0, 4, 1, 2, 3},
                            {0, 4, 1, 2, 3, 5},
                            {0, 4, 1, 2, 3, 5, 6},
                            {0, 6, 1, 2, 3, 4, 5, 7},
                        };
                        static const uint8_t channel_map_b[8][8] = {
                            {0},
                            {0, 1},
                            {0, 1, 2},
                            {0, 1, 2, 3},
                            {0, 1, 2, 3, 4},
                            {0, 1, 2, 3, 4, 5},
                            {0, 1, 2, 3, 4, 5, 6},
                            {0, 1, 2, 3, 4, 5, 6, 7},
                        };
                        /* Vorbis mapping family */

457 458 459 460 461 462 463 464
                        if (st->codecpar->extradata[19] == st->codecpar->channels - coupled_stream_counts[st->codecpar->channels] &&
                            st->codecpar->extradata[20] == coupled_stream_counts[st->codecpar->channels] &&
                            memcmp(&st->codecpar->extradata[21], channel_map_a[st->codecpar->channels-1], st->codecpar->channels) == 0) {
                            *q++ = st->codecpar->channels;
                        } else if (st->codecpar->channels >= 2 && st->codecpar->extradata[19] == st->codecpar->channels &&
                                   st->codecpar->extradata[20] == 0 &&
                                   memcmp(&st->codecpar->extradata[21], channel_map_b[st->codecpar->channels-1], st->codecpar->channels) == 0) {
                            *q++ = st->codecpar->channels | 0x80;
465 466 467 468 469 470 471
                        } else {
                            /* Unsupported, could write an extended descriptor here */
                            av_log(s, AV_LOG_ERROR, "Unsupported Opus Vorbis-style channel mapping");
                            *q++ = 0xff;
                        }
                    } else {
                        /* Unsupported */
472
                        av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]);
473 474
                        *q++ = 0xff;
                    }
475
                } else if (st->codecpar->channels <= 2) {
476
                    /* Assume RTP mapping family */
477
                    *q++ = st->codecpar->channels;
478 479 480 481 482 483
                } else {
                    /* Unsupported */
                    av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping");
                    *q++ = 0xff;
                }
            }
M
Mean 已提交
484

485 486 487 488 489
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

D
Diego Biurrun 已提交
490 491
                *q++     = 0x0a; /* ISO 639 language descriptor */
                len_ptr  = q++;
492 493 494
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
495 496 497 498
                    if (q - data > SECTION_LENGTH - 4) {
                        err = 1;
                        break;
                    }
499 500 501 502 503 504 505 506
                    next = strchr(p, ',');
                    if (strlen(p) != 3 && (!next || next != p + 3))
                        continue; /* not a 3-letter code */

                    *q++ = *p++;
                    *q++ = *p++;
                    *q++ = *p++;

D
Diego Biurrun 已提交
507 508 509 510 511 512 513 514
                    if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
                        *q++ = 0x01;
                    else if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
                        *q++ = 0x02;
                    else if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
                        *q++ = 0x03;
                    else
                        *q++ = 0; /* undefined type */
515 516 517 518 519 520

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
521 522
            }
            break;
523
        case AVMEDIA_TYPE_SUBTITLE:
D
Diego Biurrun 已提交
524
        {
525 526 527
           const char default_language[] = "und";
           const char *language = lang && strlen(lang->value) >= 3 ? lang->value : default_language;

528
           if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
529 530 531 532 533 534
               uint8_t *len_ptr;
               int extradata_copied = 0;

               *q++ = 0x59; /* subtitling_descriptor */
               len_ptr = q++;

535 536 537 538 539
               while (strlen(language) >= 3) {
                   if (sizeof(data) - (q - data) < 8) { /* 8 bytes per DVB subtitle substream data */
                       err = 1;
                       break;
                   }
540 541 542 543 544 545 546
                   *q++ = *language++;
                   *q++ = *language++;
                   *q++ = *language++;
                   /* Skip comma */
                   if (*language != '\0')
                       language++;

547 548 549
                   if (st->codecpar->extradata_size - extradata_copied >= 5) {
                       *q++ = st->codecpar->extradata[extradata_copied + 4]; /* subtitling_type */
                       memcpy(q, st->codecpar->extradata + extradata_copied, 4); /* composition_page_id and ancillary_page_id */
550 551 552 553 554 555 556
                       extradata_copied += 5;
                       q += 4;
                   } else {
                       /* subtitling_type:
                        * 0x10 - normal with no monitor aspect ratio criticality
                        * 0x20 - for the hard of hearing with no monitor aspect ratio criticality */
                       *q++ = (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED) ? 0x20 : 0x10;
557
                       if ((st->codecpar->extradata_size == 4) && (extradata_copied == 0)) {
558
                           /* support of old 4-byte extradata format */
559
                           memcpy(q, st->codecpar->extradata, 4); /* composition_page_id and ancillary_page_id */
560 561 562 563 564 565 566 567 568 569
                           extradata_copied += 4;
                           q += 4;
                       } else {
                           put16(&q, 1); /* composition_page_id */
                           put16(&q, 1); /* ancillary_page_id */
                       }
                   }
               }

               *len_ptr = q - len_ptr - 1;
570
           } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
               uint8_t *len_ptr = NULL;
               int extradata_copied = 0;

               /* The descriptor tag. teletext_descriptor */
               *q++ = 0x56;
               len_ptr = q++;

               while (strlen(language) >= 3 && q - data < sizeof(data) - 6) {
                   *q++ = *language++;
                   *q++ = *language++;
                   *q++ = *language++;
                   /* Skip comma */
                   if (*language != '\0')
                       language++;

586 587
                   if (st->codecpar->extradata_size - 1 > extradata_copied) {
                       memcpy(q, st->codecpar->extradata + extradata_copied, 2);
588 589 590 591 592 593 594 595 596 597 598 599 600
                       extradata_copied += 2;
                       q += 2;
                   } else {
                       /* The Teletext descriptor:
                        * teletext_type: This 5-bit field indicates the type of Teletext page indicated. (0x01 Initial Teletext page)
                        * teletext_magazine_number: This is a 3-bit field which identifies the magazine number.
                        * teletext_page_number: This is an 8-bit field giving two 4-bit hex digits identifying the page number. */
                       *q++ = 0x08;
                       *q++ = 0x00;
                   }
               }

               *len_ptr = q - len_ptr - 1;
601
            }
D
Diego Biurrun 已提交
602 603
        }
        break;
604
        case AVMEDIA_TYPE_VIDEO:
605
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
606
                put_registration_descriptor(&q, MKTAG('d', 'r', 'a', 'c'));
607
            } else if (stream_type == STREAM_TYPE_VIDEO_VC1) {
608
                put_registration_descriptor(&q, MKTAG('V', 'C', '-', '1'));
609 610
            }
            break;
611
        case AVMEDIA_TYPE_DATA:
612
            if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV) {
613
                put_registration_descriptor(&q, MKTAG('K', 'L', 'V', 'A'));
614
            } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
615 616 617 618
                const char *tag = "ID3 ";
                *q++ = 0x26; /* metadata descriptor */
                *q++ = 13;
                put16(&q, 0xffff);    /* metadata application format */
619
                putbuf(&q, tag, strlen(tag));
620
                *q++ = 0xff;        /* metadata format */
621
                putbuf(&q, tag, strlen(tag));
622 623
                *q++ = 0;            /* metadata service ID */
                *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
624 625
            }
            break;
626
        }
627 628 629 630 631

        val = 0xf000 | (q - desc_length_ptr - 2);
        desc_length_ptr[0] = val >> 8;
        desc_length_ptr[1] = val;
    }
632 633 634 635 636 637 638

    if (err)
        av_log(s, AV_LOG_ERROR,
               "The PMT section cannot fit stream %d and all following streams.\n"
               "Try reducing the number of languages in the audio streams "
               "or the total number of streams.\n", i);

639
    mpegts_write_section1(&service->pmt, PMT_TID, service->sid, ts->tables_version, 0, 0,
640
                          data, q - data);
641
    return 0;
642
}
643 644 645 646 647

static void mpegts_write_sdt(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
648
    uint8_t data[SECTION_LENGTH], *q, *desc_list_len_ptr, *desc_len_ptr;
649
    int i, running_status, free_ca_mode, val;
650

651 652 653
    q = data;
    put16(&q, ts->onid);
    *q++ = 0xff;
D
Diego Biurrun 已提交
654
    for (i = 0; i < ts->nb_services; i++) {
655 656
        service = ts->services[i];
        put16(&q, service->sid);
D
Diego Biurrun 已提交
657
        *q++              = 0xfc | 0x00; /* currently no EIT info */
658
        desc_list_len_ptr = q;
D
Diego Biurrun 已提交
659 660 661
        q                += 2;
        running_status    = 4; /* running */
        free_ca_mode      = 0;
662 663

        /* write only one descriptor for the service name and provider */
D
Diego Biurrun 已提交
664
        *q++         = 0x48;
665 666
        desc_len_ptr = q;
        q++;
667
        *q++         = ts->service_type;
668 669
        putbuf(&q, service->provider_name, service->provider_name[0] + 1);
        putbuf(&q, service->name, service->name[0] + 1);
670 671 672
        desc_len_ptr[0] = q - desc_len_ptr - 1;

        /* fill descriptor length */
673
        val = (running_status << 13) | (free_ca_mode << 12) |
D
Diego Biurrun 已提交
674
              (q - desc_list_len_ptr - 2);
675 676 677
        desc_list_len_ptr[0] = val >> 8;
        desc_list_len_ptr[1] = val;
    }
678
    mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, ts->tables_version, 0, 0,
679 680 681
                          data, q - data);
}

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
/* This stores a string in buf with the correct encoding and also sets the
 * first byte as the length. !str is accepted for an empty string.
 * If the string is already encoded, invalid UTF-8 or has no multibyte sequence
 * then we keep it as is, otherwise we signal UTF-8 encoding. */
static int encode_str8(uint8_t *buf, const char *str)
{
    size_t str_len;
    if (!str)
        str = "";
    str_len = strlen(str);
    if (str[0] && (unsigned)str[0] >= 0x20) {   /* Make sure the string is not already encoded. */
        const uint8_t *q = str;
        int has_multibyte = 0;
        while (*q) {
            uint32_t code;
            GET_UTF8(code, *q++, goto invalid;) /* Is it valid UTF-8? */
            has_multibyte |= (code > 127);      /* Does it have multibyte UTF-8 chars in it? */
        }
        if (has_multibyte) {                    /* If we have multibyte chars and valid UTF-8, then encode as such! */
            if (str_len > 254)
                return AVERROR(EINVAL);
            buf[0] = str_len + 1;
            buf[1] = 0x15;
            memcpy(&buf[2], str, str_len);
            return 0;
        }
    }
invalid:
    /* Otherwise let's just encode the string as is! */
    if (str_len > 255)
        return AVERROR(EINVAL);
    buf[0] = str_len;
    memcpy(&buf[1], str, str_len);
    return 0;
}

static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
719
                                         const char *provider_name,
720 721
                                         const char *name)
{
722
    MpegTSWrite *ts = s->priv_data;
723 724 725 726 727
    MpegTSService *service;

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
D
Diego Biurrun 已提交
728 729
    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
    service->sid           = sid;
730
    service->pcr_pid       = 0x1fff;
731 732 733
    if (encode_str8(service->provider_name, provider_name) < 0 ||
        encode_str8(service->name, name) < 0) {
        av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
734
        goto fail;
735
    }
736 737 738
    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
        goto fail;

739
    return service;
740 741 742
fail:
    av_free(service);
    return NULL;
743 744
}

745 746 747 748 749 750 751 752 753 754 755 756 757 758
static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
{
    return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
           ts->first_pcr;
}

static void mpegts_prefix_m2ts_header(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    if (ts->m2ts_mode) {
        int64_t pcr = get_pcr(s->priv_data, s->pb);
        uint32_t tp_extra_header = pcr % 0x3fffffff;
        tp_extra_header = AV_RB32(&tp_extra_header);
        avio_write(s->pb, (unsigned char *) &tp_extra_header,
759
                   sizeof(tp_extra_header));
760 761 762
    }
}

763 764 765
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
766
    mpegts_prefix_m2ts_header(ctx);
767
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
768 769
}

770
static int mpegts_init(AVFormatContext *s)
771 772 773 774
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st;
    MpegTSService *service;
775
    AVStream *st, *pcr_st = NULL;
776
    AVDictionaryEntry *title, *provider;
777
    int i, j;
778
    const char *service_name;
779
    const char *provider_name;
780
    int *pids;
781
    int ret;
782

783 784 785
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

786 787 788
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

789 790
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
791 792 793 794 795 796 797 798
    if (!s->nb_programs) {
        /* allocate a single DVB service */
        title = av_dict_get(s->metadata, "service_name", NULL, 0);
        if (!title)
            title = av_dict_get(s->metadata, "title", NULL, 0);
        service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
        provider      = av_dict_get(s->metadata, "service_provider", NULL, 0);
        provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
799
        service       = mpegts_add_service(s, ts->service_id,
800 801 802 803 804 805 806 807
                                           provider_name, service_name);

        if (!service)
            return AVERROR(ENOMEM);

        service->pmt.write_packet = section_write_packet;
        service->pmt.opaque       = s;
        service->pmt.cc           = 15;
808
        service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
809 810 811 812 813 814 815 816 817
    } else {
        for (i = 0; i < s->nb_programs; i++) {
            AVProgram *program = s->programs[i];
            title = av_dict_get(program->metadata, "service_name", NULL, 0);
            if (!title)
                title = av_dict_get(program->metadata, "title", NULL, 0);
            service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
            provider      = av_dict_get(program->metadata, "service_provider", NULL, 0);
            provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
818
            service       = mpegts_add_service(s, program->id,
819 820 821 822 823 824 825 826
                                               provider_name, service_name);

            if (!service)
                return AVERROR(ENOMEM);

            service->pmt.write_packet = section_write_packet;
            service->pmt.opaque       = s;
            service->pmt.cc           = 15;
827
            service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
828
            service->program          = program;
829 830
        }
    }
831

D
Diego Biurrun 已提交
832 833 834 835
    ts->pat.pid          = PAT_PID;
    /* Initialize at 15 so that it wraps and is equal to 0 for the
     * first packet we write. */
    ts->pat.cc           = 15;
836
    ts->pat.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
837
    ts->pat.write_packet = section_write_packet;
D
Diego Biurrun 已提交
838
    ts->pat.opaque       = s;
839

D
Diego Biurrun 已提交
840 841
    ts->sdt.pid          = SDT_PID;
    ts->sdt.cc           = 15;
842
    ts->sdt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
843
    ts->sdt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
844
    ts->sdt.opaque       = s;
845

846
    pids = av_malloc_array(s->nb_streams, sizeof(*pids));
847
    if (!pids) {
848 849
        ret = AVERROR(ENOMEM);
        goto fail;
850
    }
851

852
    /* assign pids to each stream */
D
Diego Biurrun 已提交
853
    for (i = 0; i < s->nb_streams; i++) {
854
        AVProgram *program;
855
        st = s->streams[i];
856

857
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
858 859
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
860
            goto fail;
861
        }
862
        st->priv_data = ts_st;
863 864 865 866

        ts_st->user_tb = st->time_base;
        avpriv_set_pts_info(st, 33, 1, 90000);

867
        ts_st->payload = av_mallocz(ts->pes_payload_size);
868 869
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
870
            goto fail;
871
        }
872 873 874 875 876 877 878 879 880 881 882

        program = av_find_program_from_stream(s, NULL, i);
        if (program) {
            for (j = 0; j < ts->nb_services; j++) {
                if (ts->services[j]->program == program) {
                    service = ts->services[j];
                    break;
                }
            }
        }

883
        ts_st->service = service;
884 885 886
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
887
            ts_st->pid = ts->start_pid + i;
888 889 890
        } else if (st->id < 0x1FFF) {
            ts_st->pid = st->id;
        } else {
D
Diego Biurrun 已提交
891 892
            av_log(s, AV_LOG_ERROR,
                   "Invalid stream id %d, must be less than 8191\n", st->id);
893
            ret = AVERROR(EINVAL);
894 895 896 897
            goto fail;
        }
        if (ts_st->pid == service->pmt.pid) {
            av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
898
            ret = AVERROR(EINVAL);
899 900
            goto fail;
        }
D
Diego Biurrun 已提交
901
        for (j = 0; j < i; j++) {
902 903
            if (pids[j] == ts_st->pid) {
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
904
                ret = AVERROR(EINVAL);
905 906
                goto fail;
            }
D
Diego Biurrun 已提交
907 908 909 910
        }
        pids[i]                = ts_st->pid;
        ts_st->payload_pts     = AV_NOPTS_VALUE;
        ts_st->payload_dts     = AV_NOPTS_VALUE;
911
        ts_st->first_pts_check = 1;
D
Diego Biurrun 已提交
912
        ts_st->cc              = 15;
913
        ts_st->discontinuity   = ts->flags & MPEGTS_FLAG_DISCONT;
914
        /* update PCR pid by using the first video stream */
915
        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
916
            service->pcr_pid == 0x1fff) {
917
            service->pcr_pid = ts_st->pid;
D
Diego Biurrun 已提交
918
            pcr_st           = st;
919
        }
920 921
        if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
            st->codecpar->extradata_size > 0) {
922 923 924 925
            AVStream *ast;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
                ret = AVERROR(ENOMEM);
926
                goto fail;
927
            }
D
Diego Biurrun 已提交
928 929 930
            ts_st->amux->oformat =
                av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
                                NULL, NULL);
931 932 933 934
            if (!ts_st->amux->oformat) {
                ret = AVERROR(EINVAL);
                goto fail;
            }
935
            if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
936 937 938
                ret = AVERROR(ENOMEM);
                goto fail;
            }
939
            ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
940 941
            if (ret != 0)
                goto fail;
942
            ast->time_base = st->time_base;
943 944
            ret = avformat_write_header(ts_st->amux, NULL);
            if (ret < 0)
945
                goto fail;
946
        }
947 948
        if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
            ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate;
949
        }
950
    }
951

952
    av_freep(&pids);
953

954 955
    /* if no video stream, use the first stream as PCR */
    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
D
Diego Biurrun 已提交
956 957
        pcr_st           = s->streams[0];
        ts_st            = pcr_st->priv_data;
958
        service->pcr_pid = ts_st->pid;
959 960
    } else
        ts_st = pcr_st->priv_data;
961

962
    if (ts->mux_rate > 1) {
963
        service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period /
D
Diego Biurrun 已提交
964
                                     (TS_PACKET_SIZE * 8 * 1000);
965
        ts->sdt_packet_period      = (int64_t)ts->mux_rate * SDT_RETRANS_TIME /
D
Diego Biurrun 已提交
966
                                     (TS_PACKET_SIZE * 8 * 1000);
967
        ts->pat_packet_period      = (int64_t)ts->mux_rate * PAT_RETRANS_TIME /
D
Diego Biurrun 已提交
968
                                     (TS_PACKET_SIZE * 8 * 1000);
B
Baptiste Coudurier 已提交
969

970
        if (ts->copyts < 1)
971
            ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
972
    } else {
973
        /* Arbitrary values, PAT/PMT will also be written on video key frames */
974 975
        ts->sdt_packet_period = 200;
        ts->pat_packet_period = 40;
976 977 978
        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
            if (!frame_size) {
979 980
                av_log(s, AV_LOG_WARNING, "frame size not set\n");
                service->pcr_packet_period =
981
                    pcr_st->codecpar->sample_rate / (10 * 512);
982 983
            } else {
                service->pcr_packet_period =
984
                    pcr_st->codecpar->sample_rate / (10 * frame_size);
985 986 987
            }
        } else {
            // max delta PCR 0.1s
988
            // TODO: should be avg_frame_rate
989
            service->pcr_packet_period =
990
                ts_st->user_tb.den / (10 * ts_st->user_tb.num);
991
        }
992
        if (!service->pcr_packet_period)
993
            service->pcr_packet_period = 1;
994 995
    }

996
    ts->last_pat_ts = AV_NOPTS_VALUE;
997
    ts->last_sdt_ts = AV_NOPTS_VALUE;
998 999 1000 1001
    // The user specified a period, use only it
    if (ts->pat_period < INT_MAX/2) {
        ts->pat_packet_period = INT_MAX;
    }
1002 1003 1004
    if (ts->sdt_period < INT_MAX/2) {
        ts->sdt_packet_period = INT_MAX;
    }
1005

1006 1007
    // output a PCR as soon as possible
    service->pcr_packet_count = service->pcr_packet_period;
D
Diego Biurrun 已提交
1008 1009
    ts->pat_packet_count      = ts->pat_packet_period - 1;
    ts->sdt_packet_count      = ts->sdt_packet_period - 1;
1010

1011
    if (ts->mux_rate == 1)
1012
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
1013
    else
1014
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
D
Diego Biurrun 已提交
1015 1016
    av_log(s, AV_LOG_VERBOSE,
           "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
1017
           service->pcr_packet_period,
1018
           ts->sdt_packet_period, ts->pat_packet_period);
1019

1020
    if (ts->m2ts_mode == -1) {
1021
        if (av_match_ext(s->url, "m2ts")) {
1022 1023 1024 1025 1026 1027
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

1028 1029
    return 0;

D
Diego Biurrun 已提交
1030
fail:
1031
    av_freep(&pids);
1032
    return ret;
1033 1034
}

1035
/* send SDT, PAT and PMT tables regularly */
1036
static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts)
1037 1038 1039 1040
{
    MpegTSWrite *ts = s->priv_data;
    int i;

1041 1042 1043 1044
    if (++ts->sdt_packet_count == ts->sdt_packet_period ||
        (dts != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
        (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0)
    ) {
1045
        ts->sdt_packet_count = 0;
1046 1047
        if (dts != AV_NOPTS_VALUE)
            ts->last_sdt_ts = FFMAX(dts, ts->last_sdt_ts);
1048 1049
        mpegts_write_sdt(s);
    }
1050 1051 1052 1053
    if (++ts->pat_packet_count == ts->pat_packet_period ||
        (dts != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
        (dts != AV_NOPTS_VALUE && dts - ts->last_pat_ts >= ts->pat_period*90000.0) ||
        force_pat) {
1054
        ts->pat_packet_count = 0;
1055 1056
        if (dts != AV_NOPTS_VALUE)
            ts->last_pat_ts = FFMAX(dts, ts->last_pat_ts);
1057
        mpegts_write_pat(s);
D
Diego Biurrun 已提交
1058
        for (i = 0; i < ts->nb_services; i++)
1059 1060 1061 1062
            mpegts_write_pmt(s, ts->services[i]);
    }
}

1063
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
1064 1065 1066 1067 1068
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
D
Diego Biurrun 已提交
1069 1070 1071
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
1072 1073
    *buf++ = pcr_low;

1074
    return 6;
1075 1076
}

1077 1078 1079 1080 1081 1082
/* Write a single null transport stream packet */
static void mpegts_insert_null_packet(AVFormatContext *s)
{
    uint8_t *q;
    uint8_t buf[TS_PACKET_SIZE];

D
Diego Biurrun 已提交
1083
    q    = buf;
1084 1085 1086 1087 1088
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
1089
    mpegts_prefix_m2ts_header(s);
1090
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
}

/* 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;
    uint8_t buf[TS_PACKET_SIZE];

D
Diego Biurrun 已提交
1101
    q    = buf;
1102 1103 1104 1105 1106 1107 1108
    *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 */
1109 1110 1111 1112
    if (ts_st->discontinuity) {
        q[-1] |= 0x80;
        ts_st->discontinuity = 0;
    }
1113 1114

    /* PCR coded into 6 bytes */
1115
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
1116 1117 1118

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
1119
    mpegts_prefix_m2ts_header(s);
1120
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1121 1122
}

1123 1124 1125 1126
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

D
Diego Biurrun 已提交
1127
    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
1128
    *q++ = val;
D
Diego Biurrun 已提交
1129
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
1130 1131
    *q++ = val >> 8;
    *q++ = val;
D
Diego Biurrun 已提交
1132
    val  = (((pts) & 0x7fff) << 1) | 1;
1133 1134 1135 1136
    *q++ = val >> 8;
    *q++ = val;
}

1137 1138 1139 1140
/* Set an adaptation field flag in an MPEG-TS packet*/
static void set_af_flag(uint8_t *pkt, int flag)
{
    // expect at least one flag to set
M
Michael Niedermayer 已提交
1141
    av_assert0(flag);
1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156

    if ((pkt[3] & 0x20) == 0) {
        // no AF yet, set adaptation field flag
        pkt[3] |= 0x20;
        // 1 byte length, no flags
        pkt[4] = 1;
        pkt[5] = 0;
    }
    pkt[5] |= flag;
}

/* Extend the adaptation field by size bytes */
static void extend_af(uint8_t *pkt, int size)
{
    // expect already existing adaptation field
M
Michael Niedermayer 已提交
1157
    av_assert0(pkt[3] & 0x20);
1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
    pkt[4] += size;
}

/* Get a pointer to MPEG-TS payload (right after TS packet header) */
static uint8_t *get_ts_payload_start(uint8_t *pkt)
{
    if (pkt[3] & 0x20)
        return pkt + 5 + pkt[4];
    else
        return pkt + 4;
}

D
Diego Biurrun 已提交
1170 1171 1172 1173
/* Add a PES header to the front of the payload, and segment into an integer
 * number of TS packets. The final TS packet is padded using an oversized
 * adaptation header to exactly fill the last TS packet.
 * NOTE: 'payload' contains a complete PES payload. */
1174 1175
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
1176
                             int64_t pts, int64_t dts, int key, int stream_id)
1177 1178
{
    MpegTSWriteStream *ts_st = st->priv_data;
1179
    MpegTSWrite *ts = s->priv_data;
1180
    uint8_t buf[TS_PACKET_SIZE];
1181
    uint8_t *q;
1182
    int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
1183 1184
    int afc_len, stuffing_len;
    int64_t pcr = -1; /* avoid warning */
1185
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
1186
    int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
1187

1188 1189
    av_assert0(ts_st->payload != buf || st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO);
    if (ts->flags & MPEGTS_FLAG_PAT_PMT_AT_FRAMES && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1190 1191 1192
        force_pat = 1;
    }

1193 1194
    is_start = 1;
    while (payload_size > 0) {
1195
        retransmit_si_info(s, force_pat, dts);
1196
        force_pat = 0;
1197

1198 1199
        write_pcr = 0;
        if (ts_st->pid == ts_st->service->pcr_pid) {
1200 1201
            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
                ts_st->service->pcr_packet_count++;
1202
            if (ts_st->service->pcr_packet_count >=
1203
                ts_st->service->pcr_packet_period) {
1204 1205 1206 1207 1208
                ts_st->service->pcr_packet_count = 0;
                write_pcr = 1;
            }
        }

1209
        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
D
Diego Biurrun 已提交
1210
            (dts - get_pcr(ts, s->pb) / 300) > delay) {
1211 1212 1213 1214 1215
            /* pcr insert gets priority over null packet insert */
            if (write_pcr)
                mpegts_insert_pcr_only(s, st);
            else
                mpegts_insert_null_packet(s);
D
Diego Biurrun 已提交
1216 1217
            /* recalculate write_pcr and possibly retransmit si_info */
            continue;
1218 1219
        }

1220
        /* prepare packet header */
D
Diego Biurrun 已提交
1221
        q    = buf;
1222
        *q++ = 0x47;
1223
        val  = ts_st->pid >> 8;
1224 1225
        if (is_start)
            val |= 0x40;
D
Diego Biurrun 已提交
1226 1227
        *q++      = val;
        *q++      = ts_st->pid;
1228
        ts_st->cc = ts_st->cc + 1 & 0xf;
D
Diego Biurrun 已提交
1229
        *q++      = 0x10 | ts_st->cc; // payload indicator + CC
1230 1231 1232 1233 1234
        if (ts_st->discontinuity) {
            set_af_flag(buf, 0x80);
            q = get_ts_payload_start(buf);
            ts_st->discontinuity = 0;
        }
1235 1236 1237 1238 1239 1240 1241
        if (key && is_start && pts != AV_NOPTS_VALUE) {
            // set Random Access for key frames
            if (ts_st->pid == ts_st->service->pcr_pid)
                write_pcr = 1;
            set_af_flag(buf, 0x40);
            q = get_ts_payload_start(buf);
        }
1242
        if (write_pcr) {
1243 1244
            set_af_flag(buf, 0x10);
            q = get_ts_payload_start(buf);
1245
            // add 11, pcr references the last byte of program clock reference base
1246
            if (ts->mux_rate > 1)
1247
                pcr = get_pcr(ts, s->pb);
1248
            else
D
Diego Biurrun 已提交
1249
                pcr = (dts - delay) * 300;
1250
            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
1251
                av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
1252 1253
            extend_af(buf, write_pcr_bits(q, pcr));
            q = get_ts_payload_start(buf);
1254
        }
1255
        if (is_start) {
1256
            int pes_extension = 0;
1257
            int pes_header_stuffing_bytes = 0;
1258 1259 1260 1261
            /* write PES header */
            *q++ = 0x00;
            *q++ = 0x00;
            *q++ = 0x01;
1262
            is_dvb_subtitle = 0;
1263
            is_dvb_teletext = 0;
1264 1265
            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
                if (st->codecpar->codec_id == AV_CODEC_ID_DIRAC)
1266
                    *q++ = 0xfd;
D
Diego Biurrun 已提交
1267
                else
1268
                    *q++ = 0xe0;
1269 1270 1271 1272
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                       (st->codecpar->codec_id == AV_CODEC_ID_MP2 ||
                        st->codecpar->codec_id == AV_CODEC_ID_MP3 ||
                        st->codecpar->codec_id == AV_CODEC_ID_AAC)) {
1273
                *q++ = 0xc0;
1274 1275
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                        st->codecpar->codec_id == AV_CODEC_ID_AC3 &&
1276 1277
                        ts->m2ts_mode) {
                *q++ = 0xfd;
1278 1279 1280
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA &&
                       st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
                *q++ = 0xbd;
1281
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
1282 1283 1284 1285
                *q++ = stream_id != -1 ? stream_id : 0xfc;

                if (stream_id == 0xbd) /* asynchronous KLV */
                    pts = dts = AV_NOPTS_VALUE;
1286 1287
            } else {
                *q++ = 0xbd;
1288 1289
                if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
                    if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
1290
                        is_dvb_subtitle = 1;
1291
                    } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
1292 1293
                        is_dvb_teletext = 1;
                    }
1294 1295
                }
            }
1296
            header_len = 0;
D
Diego Biurrun 已提交
1297
            flags      = 0;
1298 1299
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
D
Diego Biurrun 已提交
1300
                flags      |= 0x80;
1301
            }
1302
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1303
                header_len += 5;
D
Diego Biurrun 已提交
1304
                flags      |= 0x40;
1305
            }
1306 1307
            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
                st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1308 1309
                /* set PES_extension_flag */
                pes_extension = 1;
D
Diego Biurrun 已提交
1310
                flags        |= 0x01;
1311

D
Diego Biurrun 已提交
1312 1313 1314
                /* One byte for PES2 extension flag +
                 * one byte for extension length +
                 * one byte for extension id */
1315 1316
                header_len += 3;
            }
1317 1318 1319 1320
            /* for Blu-ray AC3 Audio the PES Extension flag should be as follow
             * otherwise it will not play sound on blu-ray
             */
            if (ts->m2ts_mode &&
1321 1322
                st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1323 1324 1325 1326 1327
                        /* set PES_extension_flag */
                        pes_extension = 1;
                        flags |= 0x01;
                        header_len += 3;
            }
1328 1329 1330 1331
            if (is_dvb_teletext) {
                pes_header_stuffing_bytes = 0x24 - header_len;
                header_len = 0x24;
            }
1332
            len = payload_size + header_len + 3;
1333 1334 1335 1336 1337
            /* 3 extra bytes should be added to DVB subtitle payload: 0x20 0x00 at the beginning and trailing 0xff */
            if (is_dvb_subtitle) {
                len += 3;
                payload_size++;
            }
1338 1339
            if (len > 0xffff)
                len = 0;
1340
            if (ts->omit_video_pes_length && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1341 1342
                len = 0;
            }
1343 1344
            *q++ = len >> 8;
            *q++ = len;
D
Diego Biurrun 已提交
1345
            val  = 0x80;
1346
            /* data alignment indicator is required for subtitle and data streams */
1347
            if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
1348 1349
                val |= 0x04;
            *q++ = val;
1350 1351
            *q++ = flags;
            *q++ = header_len;
1352
            if (pts != AV_NOPTS_VALUE) {
1353 1354 1355
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
1356
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1357 1358
                write_pts(q, 1, dts);
                q += 5;
1359
            }
1360
            if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1361
                flags = 0x01;  /* set PES_extension_flag_2 */
D
Diego Biurrun 已提交
1362 1363 1364 1365
                *q++  = flags;
                *q++  = 0x80 | 0x01; /* marker bit + extension length */
                /* Set the stream ID extension flag bit to 0 and
                 * write the extended stream ID. */
1366 1367
                *q++ = 0x00 | 0x60;
            }
1368 1369 1370
            /* For Blu-ray AC3 Audio Setting extended flags */
          if (ts->m2ts_mode &&
              pes_extension &&
1371
              st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1372 1373 1374 1375 1376 1377 1378
                      flags = 0x01; /* set PES_extension_flag_2 */
                      *q++ = flags;
                      *q++ = 0x80 | 0x01; /* marker bit + extension length */
                      *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
              }


1379 1380 1381 1382 1383 1384 1385
            if (is_dvb_subtitle) {
                /* First two fields of DVB subtitles PES data:
                 * data_identifier: for DVB subtitle streams shall be coded with the value 0x20
                 * subtitle_stream_id: for DVB subtitle stream shall be identified by the value 0x00 */
                *q++ = 0x20;
                *q++ = 0x00;
            }
1386 1387 1388 1389
            if (is_dvb_teletext) {
                memset(q, 0xff, pes_header_stuffing_bytes);
                q += pes_header_stuffing_bytes;
            }
1390
            is_start = 0;
1391
        }
1392 1393 1394 1395
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1396 1397
        if (len > payload_size)
            len = payload_size;
1398 1399 1400 1401 1402 1403 1404
        stuffing_len = TS_PACKET_SIZE - header_len - len;
        if (stuffing_len > 0) {
            /* add stuffing with AFC */
            if (buf[3] & 0x20) {
                /* stuffing already present: increase its size */
                afc_len = buf[4] + 1;
                memmove(buf + 4 + afc_len + stuffing_len,
1405
                        buf + 4 + afc_len,
1406 1407 1408 1409 1410 1411 1412
                        header_len - (4 + afc_len));
                buf[4] += stuffing_len;
                memset(buf + 4 + afc_len, 0xff, stuffing_len);
            } else {
                /* add stuffing */
                memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
                buf[3] |= 0x20;
D
Diego Biurrun 已提交
1413
                buf[4]  = stuffing_len - 1;
1414 1415 1416 1417 1418 1419
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
1420 1421 1422 1423 1424 1425 1426 1427

        if (is_dvb_subtitle && payload_size == len) {
            memcpy(buf + TS_PACKET_SIZE - len, payload, len - 1);
            buf[TS_PACKET_SIZE - 1] = 0xff; /* end_of_PES_data_field_marker: an 8-bit field with fixed contents 0xff for DVB subtitle */
        } else {
            memcpy(buf + TS_PACKET_SIZE - len, payload, len);
        }

D
Diego Biurrun 已提交
1428
        payload      += len;
1429
        payload_size -= len;
1430
        mpegts_prefix_m2ts_header(s);
1431
        avio_write(s->pb, buf, TS_PACKET_SIZE);
1432
    }
1433
    ts_st->prev_payload_key = key;
1434 1435
}

1436 1437
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1438
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1439 1440
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
1441 1442
                   "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it "
                   "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1443
            return AVERROR_INVALIDDATA;
1444
        }
1445
        av_log(s, AV_LOG_WARNING, "H.264 bitstream error, startcode missing, size %d", pkt->size);
1446 1447
        if (pkt->size)
            av_log(s, AV_LOG_WARNING, " data %08"PRIX32, AV_RB32(pkt->data));
1448
        av_log(s, AV_LOG_WARNING, "\n");
1449 1450 1451 1452
    }
    return 0;
}

1453 1454
static int check_hevc_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1455
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1456 1457 1458 1459
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "HEVC bitstream malformed, no startcode found\n");
            return AVERROR_PATCHWELCOME;
        }
1460
        av_log(s, AV_LOG_WARNING, "HEVC bitstream error, startcode missing, size %d", pkt->size);
1461 1462
        if (pkt->size)
            av_log(s, AV_LOG_WARNING, " data %08"PRIX32, AV_RB32(pkt->data));
1463
        av_log(s, AV_LOG_WARNING, "\n");
1464 1465 1466 1467
    }
    return 0;
}

1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
/* Based on GStreamer's gst-plugins-base/ext/ogg/gstoggstream.c
 * Released under the LGPL v2.1+, written by
 * Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
 */
static int opus_get_packet_samples(AVFormatContext *s, AVPacket *pkt)
{
    static const int durations[32] = {
      480, 960, 1920, 2880,       /* Silk NB */
      480, 960, 1920, 2880,       /* Silk MB */
      480, 960, 1920, 2880,       /* Silk WB */
      480, 960,                   /* Hybrid SWB */
      480, 960,                   /* Hybrid FB */
      120, 240, 480, 960,         /* CELT NB */
      120, 240, 480, 960,         /* CELT NB */
      120, 240, 480, 960,         /* CELT NB */
      120, 240, 480, 960,         /* CELT NB */
    };
    int toc, frame_duration, nframes, duration;

    if (pkt->size < 1)
        return 0;

    toc = pkt->data[0];

    frame_duration = durations[toc >> 3];
    switch (toc & 3) {
    case 0:
        nframes = 1;
        break;
    case 1:
        nframes = 2;
        break;
    case 2:
        nframes = 2;
        break;
    case 3:
        if (pkt->size < 2)
            return 0;
        nframes = pkt->data[1] & 63;
        break;
    }

    duration = nframes * frame_duration;
    if (duration > 5760) {
        av_log(s, AV_LOG_WARNING,
               "Opus packet duration > 120 ms, invalid");
        return 0;
    }

    return duration;
}

1520
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1521
{
1522
    AVStream *st = s->streams[pkt->stream_index];
1523
    int size = pkt->size;
D
Diego Biurrun 已提交
1524 1525
    uint8_t *buf = pkt->data;
    uint8_t *data = NULL;
1526
    MpegTSWrite *ts = s->priv_data;
1527
    MpegTSWriteStream *ts_st = st->priv_data;
1528
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1529
    int64_t dts = pkt->dts, pts = pkt->pts;
1530
    int opus_samples = 0;
1531
    int side_data_size;
1532
    uint8_t *side_data = NULL;
1533 1534 1535 1536 1537 1538 1539
    int stream_id = -1;

    side_data = av_packet_get_side_data(pkt,
                                        AV_PKT_DATA_MPEGTS_STREAM_ID,
                                        &side_data_size);
    if (side_data)
        stream_id = side_data[0];
1540

1541
    if (ts->reemit_pat_pmt) {
D
Diego Biurrun 已提交
1542 1543
        av_log(s, AV_LOG_WARNING,
               "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
1544
        ts->reemit_pat_pmt = 0;
D
Diego Biurrun 已提交
1545
        ts->flags         |= MPEGTS_FLAG_REEMIT_PAT_PMT;
1546 1547 1548
    }

    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
1549 1550
        ts->pat_packet_count = ts->pat_packet_period - 1;
        ts->sdt_packet_count = ts->sdt_packet_period - 1;
D
Diego Biurrun 已提交
1551
        ts->flags           &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
1552 1553
    }

1554
    if (ts->copyts < 1) {
1555 1556 1557 1558 1559
        if (pts != AV_NOPTS_VALUE)
            pts += delay;
        if (dts != AV_NOPTS_VALUE)
            dts += delay;
    }
1560

1561
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1562
        av_log(s, AV_LOG_ERROR, "first pts value must be set\n");
1563
        return AVERROR_INVALIDDATA;
1564 1565 1566
    }
    ts_st->first_pts_check = 0;

1567
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
D
Diego Biurrun 已提交
1568
        const uint8_t *p = buf, *buf_end = p + size;
1569
        uint32_t state = -1;
1570
        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0;
1571 1572 1573
        int ret = ff_check_h264_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1574

1575
        if (extradd && AV_RB24(st->codecpar->extradata) > 1)
1576 1577
            extradd = 0;

1578
        do {
1579
            p = avpriv_find_start_code(p, buf_end, &state);
1580
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
1581 1582
            if ((state & 0x1f) == 7)
                extradd = 0;
1583 1584 1585
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

1586 1587
        if ((state & 0x1f) != 5)
            extradd = 0;
1588
        if ((state & 0x1f) != 9) { // AUD NAL
1589
            data = av_malloc(pkt->size + 6 + extradd);
1590
            if (!data)
1591
                return AVERROR(ENOMEM);
1592
            memcpy(data + 6, st->codecpar->extradata, extradd);
1593
            memcpy(data + 6 + extradd, pkt->data, pkt->size);
1594 1595
            AV_WB32(data, 0x00000001);
            data[4] = 0x09;
1596
            data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
D
Diego Biurrun 已提交
1597
            buf     = data;
1598
            size    = pkt->size + 6 + extradd;
1599
        }
1600
    } else if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
1601 1602
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
1603
            return AVERROR_INVALIDDATA;
1604
        }
1605
        if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
1606 1607 1608 1609
            int ret;
            AVPacket pkt2;

            if (!ts_st->amux) {
1610
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
D
Diego Biurrun 已提交
1611
                                        "and extradata missing\n");
1612
            } else {
1613 1614 1615
            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
1616 1617
            av_assert0(pkt->dts != AV_NOPTS_VALUE);
            pkt2.dts = av_rescale_q(pkt->dts, st->time_base, ts_st->amux->streams[0]->time_base);
D
Diego Biurrun 已提交
1618

1619 1620
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1621
                return AVERROR(ENOMEM);
1622 1623 1624

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1625
                ffio_free_dyn_buf(&ts_st->amux->pb);
1626
                return ret;
A
Alex Converse 已提交
1627
            }
D
Diego Biurrun 已提交
1628
            size            = avio_close_dyn_buf(ts_st->amux->pb, &data);
1629
            ts_st->amux->pb = NULL;
D
Diego Biurrun 已提交
1630
            buf             = data;
1631
            }
1632
        }
1633
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1634 1635 1636
        const uint8_t *p = buf, *buf_end = p + size;
        uint32_t state = -1;
        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0;
1637 1638 1639
        int ret = check_hevc_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1640 1641 1642 1643 1644 1645

        if (extradd && AV_RB24(st->codecpar->extradata) > 1)
            extradd = 0;

        do {
            p = avpriv_find_start_code(p, buf_end, &state);
1646
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", (state & 0x7e)>>1);
1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666
            if ((state & 0x7e) == 2*32)
                extradd = 0;
        } while (p < buf_end && (state & 0x7e) != 2*35 &&
                 (state & 0x7e) >= 2*32);

        if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
            extradd = 0;
        if ((state & 0x7e) != 2*35) { // AUD NAL
            data = av_malloc(pkt->size + 7 + extradd);
            if (!data)
                return AVERROR(ENOMEM);
            memcpy(data + 7, st->codecpar->extradata, extradd);
            memcpy(data + 7 + extradd, pkt->data, pkt->size);
            AV_WB32(data, 0x00000001);
            data[4] = 2*35;
            data[5] = 1;
            data[6] = 0x50; // any slice type (0x4) + rbsp stop one bit
            buf     = data;
            size    = pkt->size + 7 + extradd;
        }
1667
    } else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
1668 1669 1670 1671 1672 1673 1674
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "Opus packet too short\n");
            return AVERROR_INVALIDDATA;
        }

        /* Add Opus control header */
        if ((AV_RB16(pkt->data) >> 5) != 0x3ff) {
1675 1676
            uint8_t *side_data;
            int side_data_size;
1677
            int i, n;
1678 1679
            int ctrl_header_size;
            int trim_start = 0, trim_end = 0;
1680 1681 1682

            opus_samples = opus_get_packet_samples(s, pkt);

1683 1684 1685 1686 1687
            side_data = av_packet_get_side_data(pkt,
                                                AV_PKT_DATA_SKIP_SAMPLES,
                                                &side_data_size);

            if (side_data && side_data_size >= 10) {
1688
                trim_end = AV_RL32(side_data + 4) * 48000 / st->codecpar->sample_rate;
1689 1690 1691 1692 1693 1694 1695 1696 1697
            }

            ctrl_header_size = pkt->size + 2 + pkt->size / 255 + 1;
            if (ts_st->opus_pending_trim_start)
              ctrl_header_size += 2;
            if (trim_end)
              ctrl_header_size += 2;

            data = av_malloc(ctrl_header_size);
1698 1699 1700 1701 1702
            if (!data)
                return AVERROR(ENOMEM);

            data[0] = 0x7f;
            data[1] = 0xe0;
1703 1704 1705 1706
            if (ts_st->opus_pending_trim_start)
                data[1] |= 0x10;
            if (trim_end)
                data[1] |= 0x08;
1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717

            n = pkt->size;
            i = 2;
            do {
                data[i] = FFMIN(n, 255);
                n -= 255;
                i++;
            } while (n >= 0);

            av_assert0(2 + pkt->size / 255 + 1 == i);

1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
            if (ts_st->opus_pending_trim_start) {
                trim_start = FFMIN(ts_st->opus_pending_trim_start, opus_samples);
                AV_WB16(data + i, trim_start);
                i += 2;
                ts_st->opus_pending_trim_start -= trim_start;
            }
            if (trim_end) {
                trim_end = FFMIN(trim_end, opus_samples - trim_start);
                AV_WB16(data + i, trim_end);
                i += 2;
            }

1730 1731
            memcpy(data + i, pkt->data, pkt->size);
            buf     = data;
1732
            size    = ctrl_header_size;
1733 1734 1735 1736 1737
        } else {
            /* TODO: Can we get TS formatted data here? If so we will
             * need to count the samples of that too! */
            av_log(s, AV_LOG_WARNING, "Got MPEG-TS formatted Opus data, unhandled");
        }
1738 1739
    }

1740 1741
    if (pkt->dts != AV_NOPTS_VALUE) {
        int i;
1742
        for(i=0; i<s->nb_streams; i++) {
1743 1744
            AVStream *st2 = s->streams[i];
            MpegTSWriteStream *ts_st2 = st2->priv_data;
1745 1746
            if (   ts_st2->payload_size
               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
1747
                mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
1748 1749
                                 ts_st2->payload_pts, ts_st2->payload_dts,
                                 ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1750
                ts_st2->payload_size = 0;
1751 1752 1753 1754
            }
        }
    }

1755 1756 1757
    if (ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size ||
        (dts != AV_NOPTS_VALUE && ts_st->payload_dts != AV_NOPTS_VALUE &&
         av_compare_ts(dts - ts_st->payload_dts, st->time_base,
1758 1759
                       s->max_delay, AV_TIME_BASE_Q) >= 0) ||
        ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
1760
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1761
                         ts_st->payload_pts, ts_st->payload_dts,
1762
                         ts_st->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1763
        ts_st->payload_size = 0;
1764
        ts_st->opus_queued_samples = 0;
1765 1766
    }

1767
    if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1768
        av_assert0(!ts_st->payload_size);
1769
        // for video and subtitle, write a single pes packet
D
Diego Biurrun 已提交
1770
        mpegts_write_pes(s, st, buf, size, pts, dts,
1771
                         pkt->flags & AV_PKT_FLAG_KEY, stream_id);
1772
        ts_st->opus_queued_samples = 0;
1773 1774 1775 1776
        av_free(data);
        return 0;
    }

1777
    if (!ts_st->payload_size) {
D
Diego Biurrun 已提交
1778 1779
        ts_st->payload_pts   = pts;
        ts_st->payload_dts   = dts;
1780
        ts_st->payload_flags = pkt->flags;
1781
    }
1782

1783 1784
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1785
    ts_st->opus_queued_samples += opus_samples;
1786

1787 1788
    av_free(data);

1789 1790 1791
    return 0;
}

1792
static void mpegts_write_flush(AVFormatContext *s)
1793 1794 1795 1796
{
    int i;

    /* flush current packets */
D
Diego Biurrun 已提交
1797
    for (i = 0; i < s->nb_streams; i++) {
1798 1799
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1800 1801
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1802
                             ts_st->payload_pts, ts_st->payload_dts,
1803
                             ts_st->payload_flags & AV_PKT_FLAG_KEY, -1);
1804
            ts_st->payload_size = 0;
1805
            ts_st->opus_queued_samples = 0;
1806
        }
1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820
    }
}

static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
{
    if (!pkt) {
        mpegts_write_flush(s);
        return 1;
    } else {
        return mpegts_write_packet_internal(s, pkt);
    }
}

static int mpegts_write_end(AVFormatContext *s)
1821 1822 1823 1824 1825 1826 1827 1828
{
    if (s->pb)
        mpegts_write_flush(s);

    return 0;
}

static void mpegts_deinit(AVFormatContext *s)
1829 1830 1831 1832 1833
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

D
Diego Biurrun 已提交
1834
    for (i = 0; i < s->nb_streams; i++) {
1835 1836
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1837 1838 1839 1840 1841 1842
        if (ts_st) {
            av_freep(&ts_st->payload);
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
                ts_st->amux = NULL;
            }
1843
        }
1844
    }
1845

D
Diego Biurrun 已提交
1846
    for (i = 0; i < ts->nb_services; i++) {
1847
        service = ts->services[i];
1848
        av_freep(&service);
1849
    }
1850
    av_freep(&ts->services);
1851
}
1852

1853 1854 1855 1856 1857
static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
{
    int ret = 1;
    AVStream *st = s->streams[pkt->stream_index];

1858
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
1859
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1860 1861 1862
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1863
            ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
1864
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1865
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1866 1867 1868
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1869 1870 1871 1872
            ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
    }

    return ret;
1873 1874
}

1875 1876
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
D
Diego Biurrun 已提交
1877 1878
      offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1879
    { "mpegts_original_network_id", "Set original_network_id field.",
D
Diego Biurrun 已提交
1880
      offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT,
1881
      { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1882
    { "mpegts_service_id", "Set service_id field.",
D
Diego Biurrun 已提交
1883 1884
      offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
    { "mpegts_service_type", "Set service_type field.",
      offsetof(MpegTSWrite, service_type), AV_OPT_TYPE_INT,
      { .i64 = 0x01 }, 0x01, 0xff, AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "digital_tv", "Digital Television.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_TV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "digital_radio", "Digital Radio.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_RADIO }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "teletext", "Teletext.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_TELETEXT }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "advanced_codec_digital_radio", "Advanced Codec Digital Radio.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_RADIO }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "mpeg2_digital_hdtv", "MPEG2 Digital HDTV.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_MPEG2_DIGITAL_HDTV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "advanced_codec_digital_sdtv", "Advanced Codec Digital SDTV.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_SDTV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
    { "advanced_codec_digital_hdtv", "Advanced Codec Digital HDTV.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1909 1910 1911
    { "hevc_digital_hdtv", "HEVC Digital Television Service.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1912
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
D
Diego Biurrun 已提交
1913
      offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
1914
      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1915
    { "mpegts_start_pid", "Set the first pid.",
D
Diego Biurrun 已提交
1916
      offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
1917
      { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
1918
    { "mpegts_m2ts_mode", "Enable m2ts mode.",
1919
      offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
1920
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
D
Diego Biurrun 已提交
1921 1922 1923
    { "muxrate", NULL,
      offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
      { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1924
    { "pes_payload_size", "Minimum PES packet payload in bytes",
D
Diego Biurrun 已提交
1925 1926 1927 1928
      offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT,
      { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
    { "mpegts_flags", "MPEG-TS muxing flags",
      offsetof(MpegTSWrite, flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, INT_MAX,
1929 1930
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1931 1932
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1933
    { "latm", "Use LATM packetization for AAC",
D
Diego Biurrun 已提交
1934 1935
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1936 1937 1938
    { "pat_pmt_at_frames", "Reemit PAT and PMT at each video frame",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_PAT_PMT_AT_FRAMES}, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1939 1940 1941
    { "system_b", "Conform to System B (DVB) instead of System A (ATSC)",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_SYSTEM_B }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1942 1943 1944
    { "initial_discontinuity", "Mark initial packets as discontinuous",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1945 1946
    // backward compatibility
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1947 1948
      offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1949
    { "mpegts_copyts", "don't offset dts/pts",
1950
      offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_BOOL,
1951
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
1952
    { "tables_version", "set PAT, PMT and SDT version",
1953 1954
      offsetof(MpegTSWrite, tables_version), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, 31, AV_OPT_FLAG_ENCODING_PARAM },
1955
    { "omit_video_pes_length", "Omit the PES packet length for video packets",
1956
      offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
1957
      { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
1958
    { "pcr_period", "PCR retransmission time in milliseconds",
D
Diego Biurrun 已提交
1959 1960
      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_INT,
      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1961
    { "pat_period", "PAT/PMT retransmission time limit in seconds",
1962
      offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
1963
      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1964
    { "sdt_period", "SDT retransmission time limit in seconds",
1965
      offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE,
1966
      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1967 1968 1969 1970
    { NULL },
};

static const AVClass mpegts_muxer_class = {
D
Diego Biurrun 已提交
1971 1972 1973 1974
    .class_name = "MPEGTS muxer",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
1975 1976
};

1977
AVOutputFormat ff_mpegts_muxer = {
D
Diego Biurrun 已提交
1978 1979
    .name           = "mpegts",
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1980 1981
    .mime_type      = "video/MP2T",
    .extensions     = "ts,m2t,m2ts,mts",
D
Diego Biurrun 已提交
1982 1983 1984
    .priv_data_size = sizeof(MpegTSWrite),
    .audio_codec    = AV_CODEC_ID_MP2,
    .video_codec    = AV_CODEC_ID_MPEG2VIDEO,
1985
    .init           = mpegts_init,
D
Diego Biurrun 已提交
1986 1987
    .write_packet   = mpegts_write_packet,
    .write_trailer  = mpegts_write_end,
1988 1989
    .deinit         = mpegts_deinit,
    .check_bitstream = mpegts_check_bitstream,
1990
    .flags          = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS | AVFMT_NODIMENSIONS,
D
Diego Biurrun 已提交
1991
    .priv_class     = &mpegts_muxer_class,
1992
};