mpegtsenc.c 74.5 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
    int pcr_pid;
60
    AVProgram *program;
61 62
} MpegTSService;

63 64 65 66 67 68 69 70
// 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,
71 72
    MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV  = 0x19,
    MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV            = 0x1F,
73
};
74
typedef struct MpegTSWrite {
75
    const AVClass *av_class;
76 77
    MpegTSSection pat; /* MPEG-2 PAT table */
    MpegTSSection sdt; /* MPEG-2 SDT table context */
78
    MpegTSService **services;
79 80
    int64_t sdt_period; /* SDT period in PCR time base */
    int64_t pat_period; /* PAT/PMT period in PCR time base */
81
    int nb_services;
82
    int64_t first_pcr;
83
    int64_t next_pcr;
84
    int mux_rate; ///< set to 1 when VBR
85
    int pes_payload_size;
86 87 88 89

    int transport_stream_id;
    int original_network_id;
    int service_id;
90
    int service_type;
91 92 93

    int pmt_start_pid;
    int start_pid;
94
    int m2ts_mode;
95 96 97 98
    int m2ts_video_pid;
    int m2ts_audio_pid;
    int m2ts_pgssub_pid;
    int m2ts_textsub_pid;
99

100
    int pcr_period_ms;
101 102
#define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
#define MPEGTS_FLAG_AAC_LATM        0x02
103
#define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
104
#define MPEGTS_FLAG_SYSTEM_B        0x08
105
#define MPEGTS_FLAG_DISCONT         0x10
106
    int flags;
107
    int copyts;
108
    int tables_version;
109 110
    int64_t pat_period_us;
    int64_t sdt_period_us;
111
    int64_t last_pat_ts;
112
    int64_t last_sdt_ts;
113

R
Reimar Döffinger 已提交
114
    int omit_video_pes_length;
115 116
} MpegTSWrite;

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

121 122 123 124
/* 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

125
/* NOTE: 4 bytes must be left at the end for the crc32 */
126
static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
127 128 129 130 131 132 133
{
    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 已提交
134 135 136
    crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE),
                            -1, buf, len - 4));

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

142 143 144
    /* send each packet */
    buf_ptr = buf;
    while (len > 0) {
145
        first = buf == buf_ptr;
D
Diego Biurrun 已提交
146 147
        q     = packet;
        *q++  = 0x47;
148
        b     = s->pid >> 8;
149 150
        if (first)
            b |= 0x40;
D
Diego Biurrun 已提交
151 152
        *q++  = b;
        *q++  = s->pid;
153
        s->cc = s->cc + 1 & 0xf;
D
Diego Biurrun 已提交
154
        *q++  = 0x10 | s->cc;
155 156 157 158 159 160
        if (s->discontinuity) {
            q[-1] |= 0x20;
            *q++ = 1;
            *q++ = 0x80;
            s->discontinuity = 0;
        }
161 162 163
        if (first)
            *q++ = 0; /* 0 offset */
        len1 = TS_PACKET_SIZE - (q - packet);
164
        if (len1 > len)
165 166 167 168 169 170 171 172 173 174 175
            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 已提交
176
        len     -= len1;
177 178 179 180 181 182
    }
}

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

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

198 199 200
    tot_len = 3 + 5 + len + 4;
    /* check if not too big */
    if (tot_len > 1024)
201
        return AVERROR_INVALIDDATA;
202

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

212 213 214 215 216 217 218
    mpegts_write_section(s, section, tot_len);
    return 0;
}

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

219
#define DEFAULT_PROVIDER_NAME   "FFmpeg"
220
#define DEFAULT_SERVICE_NAME    "Service"
221 222 223 224

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

typedef struct MpegTSWriteStream {
    int pid; /* stream associated pid */
    int cc;
230
    int discontinuity;
231
    int payload_size;
232
    int first_pts_check; ///< first pts check needed
233
    int prev_payload_key;
234
    int64_t payload_pts;
235
    int64_t payload_dts;
236
    int payload_flags;
237
    uint8_t *payload;
238
    AVFormatContext *amux;
239
    int data_st_warning;
240

241 242
    int64_t pcr_period; /* PCR period in PCR time base */
    int64_t last_pcr;
243

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

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

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

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

272 273 274 275 276 277 278 279 280 281 282 283
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;
}

284 285 286
static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
{
    MpegTSWrite *ts = s->priv_data;
287
    MpegTSWriteStream *ts_st = st->priv_data;
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
    int stream_type;

    switch (st->codecpar->codec_id) {
    case AV_CODEC_ID_MPEG1VIDEO:
    case AV_CODEC_ID_MPEG2VIDEO:
        stream_type = STREAM_TYPE_VIDEO_MPEG2;
        break;
    case AV_CODEC_ID_MPEG4:
        stream_type = STREAM_TYPE_VIDEO_MPEG4;
        break;
    case AV_CODEC_ID_H264:
        stream_type = STREAM_TYPE_VIDEO_H264;
        break;
    case AV_CODEC_ID_HEVC:
        stream_type = STREAM_TYPE_VIDEO_HEVC;
        break;
    case AV_CODEC_ID_CAVS:
        stream_type = STREAM_TYPE_VIDEO_CAVS;
        break;
    case AV_CODEC_ID_DIRAC:
        stream_type = STREAM_TYPE_VIDEO_DIRAC;
        break;
    case AV_CODEC_ID_VC1:
        stream_type = STREAM_TYPE_VIDEO_VC1;
        break;
    case AV_CODEC_ID_MP2:
    case AV_CODEC_ID_MP3:
        if (   st->codecpar->sample_rate > 0
            && st->codecpar->sample_rate < 32000) {
            stream_type = STREAM_TYPE_AUDIO_MPEG2;
        } else {
            stream_type = STREAM_TYPE_AUDIO_MPEG1;
        }
        break;
    case AV_CODEC_ID_AAC:
        stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
                      ? STREAM_TYPE_AUDIO_AAC_LATM
                      : STREAM_TYPE_AUDIO_AAC;
        break;
    case AV_CODEC_ID_AAC_LATM:
        stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
        break;
    case AV_CODEC_ID_AC3:
        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;
        break;
    case AV_CODEC_ID_DTS:
        stream_type = STREAM_TYPE_AUDIO_DTS;
        break;
    case AV_CODEC_ID_TRUEHD:
        stream_type = STREAM_TYPE_AUDIO_TRUEHD;
        break;
    case AV_CODEC_ID_OPUS:
        stream_type = STREAM_TYPE_PRIVATE_DATA;
        break;
    case AV_CODEC_ID_TIMED_ID3:
        stream_type = STREAM_TYPE_METADATA;
        break;
352 353 354 355
    case AV_CODEC_ID_DVB_SUBTITLE:
    case AV_CODEC_ID_DVB_TELETEXT:
        stream_type = STREAM_TYPE_PRIVATE_DATA;
        break;
356
    default:
357 358 359 360
        av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
                    "Stream %d, codec %s, is muxed as a private data stream "
                    "and may not be recognized upon reading.\n", st->index,
                    avcodec_get_name(st->codecpar->codec_id));
361 362 363 364 365 366 367
        stream_type = STREAM_TYPE_PRIVATE_DATA;
        break;
    }

    return stream_type;
}

368 369 370
static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
{
    int stream_type;
371
    MpegTSWriteStream *ts_st = st->priv_data;
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407

    switch (st->codecpar->codec_id) {
    case AV_CODEC_ID_MPEG2VIDEO:
        stream_type = STREAM_TYPE_VIDEO_MPEG2;
        break;
    case AV_CODEC_ID_H264:
        stream_type = STREAM_TYPE_VIDEO_H264;
        break;
    case AV_CODEC_ID_VC1:
        stream_type = STREAM_TYPE_VIDEO_VC1;
        break;
    case AV_CODEC_ID_HEVC:
        stream_type = STREAM_TYPE_VIDEO_HEVC;
        break;
    case AV_CODEC_ID_PCM_BLURAY:
        stream_type = 0x80;
        break;
    case AV_CODEC_ID_AC3:
        stream_type = 0x81;
        break;
    case AV_CODEC_ID_DTS:
        stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
        break;
    case AV_CODEC_ID_TRUEHD:
        stream_type = 0x83;
        break;
    case AV_CODEC_ID_EAC3:
        stream_type = 0x84;
        break;
    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
        stream_type = 0x90;
        break;
    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
        stream_type = 0x92;
        break;
    default:
408 409 410 411
        av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
                    "Stream %d, codec %s, is muxed as a private data stream "
                    "and may not be recognized upon reading.\n", st->index,
                    avcodec_get_name(st->codecpar->codec_id));
412 413 414 415 416 417 418
        stream_type = STREAM_TYPE_PRIVATE_DATA;
        break;
    }

    return stream_type;
}

419
static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
420
{
421
    MpegTSWrite *ts = s->priv_data;
422
    uint8_t data[SECTION_LENGTH], *q, *desc_length_ptr, *program_info_length_ptr;
423
    int val, stream_type, i, err = 0;
424 425 426 427 428 429 430 431

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

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

    /* put program info here */
432 433 434 435 436 437 438 439
    if (ts->m2ts_mode) {
        put_registration_descriptor(&q, MKTAG('H', 'D', 'M', 'V'));
        *q++ = 0x88;        // descriptor_tag - hdmv_copy_control_descriptor
        *q++ = 0x04;        // descriptor_length
        put16(&q, 0x0fff);  // CA_System_ID
        *q++ = 0xfc;        // private_data_byte
        *q++ = 0xfc;        // private_data_byte
    }
440 441 442 443

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

D
Diego Biurrun 已提交
445
    for (i = 0; i < s->nb_streams; i++) {
446 447
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
D
Diego Biurrun 已提交
448
        AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
449

450
        if (s->nb_programs) {
451 452 453 454 455 456
            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;
457 458 459 460
                    break;
                }

            if (!found)
461 462 463
                continue;
        }

464
        if (q - data > SECTION_LENGTH - 32) {
465 466 467
            err = 1;
            break;
        }
468

469
        stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st);
470

471 472 473 474 475 476
        *q++ = stream_type;
        put16(&q, 0xe000 | ts_st->pid);
        desc_length_ptr = q;
        q += 2; /* patched after */

        /* write optional descriptors here */
477
        switch (st->codecpar->codec_type) {
478
        case AVMEDIA_TYPE_AUDIO:
479
            if (st->codecpar->codec_id==AV_CODEC_ID_AC3 && (ts->flags & MPEGTS_FLAG_SYSTEM_B)) {
480 481 482 483
                *q++=0x6a; // AC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
484
            if (st->codecpar->codec_id==AV_CODEC_ID_EAC3 && (ts->flags & MPEGTS_FLAG_SYSTEM_B)) {
M
Mean 已提交
485 486 487 488
                *q++=0x7a; // EAC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
489 490
            if (st->codecpar->codec_id==AV_CODEC_ID_S302M)
                put_registration_descriptor(&q, MKTAG('B', 'S', 'S', 'D'));
491
            if (st->codecpar->codec_id==AV_CODEC_ID_OPUS) {
492 493 494 495 496 497
                /* 6 bytes registration descriptor, 4 bytes Opus audio descriptor */
                if (q - data > SECTION_LENGTH - 6 - 4) {
                    err = 1;
                    break;
                }

498
                put_registration_descriptor(&q, MKTAG('O', 'p', 'u', 's'));
499 500 501 502 503

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

504 505
                if (st->codecpar->extradata && st->codecpar->extradata_size >= 19) {
                    if (st->codecpar->extradata[18] == 0 && st->codecpar->channels <= 2) {
506
                        /* RTP mapping family */
507 508 509
                        *q++ = st->codecpar->channels;
                    } else if (st->codecpar->extradata[18] == 1 && st->codecpar->channels <= 8 &&
                               st->codecpar->extradata_size >= 21 + st->codecpar->channels) {
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
                        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 */

535 536 537 538 539 540 541 542
                        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;
543 544 545 546 547 548 549
                        } else {
                            /* Unsupported, could write an extended descriptor here */
                            av_log(s, AV_LOG_ERROR, "Unsupported Opus Vorbis-style channel mapping");
                            *q++ = 0xff;
                        }
                    } else {
                        /* Unsupported */
550
                        av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]);
551 552
                        *q++ = 0xff;
                    }
553
                } else if (st->codecpar->channels <= 2) {
554
                    /* Assume RTP mapping family */
555
                    *q++ = st->codecpar->channels;
556 557 558 559 560 561
                } else {
                    /* Unsupported */
                    av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping");
                    *q++ = 0xff;
                }
            }
M
Mean 已提交
562

563 564 565 566 567
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

D
Diego Biurrun 已提交
568 569
                *q++     = 0x0a; /* ISO 639 language descriptor */
                len_ptr  = q++;
570 571 572
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
573 574 575 576
                    if (q - data > SECTION_LENGTH - 4) {
                        err = 1;
                        break;
                    }
577 578 579 580 581 582 583 584
                    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 已提交
585 586 587 588 589 590 591 592
                    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 */
593 594 595 596 597 598

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
599 600
            }
            break;
601
        case AVMEDIA_TYPE_SUBTITLE:
D
Diego Biurrun 已提交
602
        {
603 604 605
           const char default_language[] = "und";
           const char *language = lang && strlen(lang->value) >= 3 ? lang->value : default_language;

606
           if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
607 608 609 610 611 612
               uint8_t *len_ptr;
               int extradata_copied = 0;

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

613 614 615 616 617
               while (strlen(language) >= 3) {
                   if (sizeof(data) - (q - data) < 8) { /* 8 bytes per DVB subtitle substream data */
                       err = 1;
                       break;
                   }
618 619 620 621 622 623 624
                   *q++ = *language++;
                   *q++ = *language++;
                   *q++ = *language++;
                   /* Skip comma */
                   if (*language != '\0')
                       language++;

625 626 627
                   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 */
628 629 630 631 632 633 634
                       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;
635
                       if ((st->codecpar->extradata_size == 4) && (extradata_copied == 0)) {
636
                           /* support of old 4-byte extradata format */
637
                           memcpy(q, st->codecpar->extradata, 4); /* composition_page_id and ancillary_page_id */
638 639 640 641 642 643 644 645 646 647
                           extradata_copied += 4;
                           q += 4;
                       } else {
                           put16(&q, 1); /* composition_page_id */
                           put16(&q, 1); /* ancillary_page_id */
                       }
                   }
               }

               *len_ptr = q - len_ptr - 1;
648
           } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
               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++;

664 665
                   if (st->codecpar->extradata_size - 1 > extradata_copied) {
                       memcpy(q, st->codecpar->extradata + extradata_copied, 2);
666 667 668 669 670 671 672 673 674 675 676 677 678
                       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;
679
            }
D
Diego Biurrun 已提交
680 681
        }
        break;
682
        case AVMEDIA_TYPE_VIDEO:
683
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
684
                put_registration_descriptor(&q, MKTAG('d', 'r', 'a', 'c'));
685
            } else if (stream_type == STREAM_TYPE_VIDEO_VC1) {
686
                put_registration_descriptor(&q, MKTAG('V', 'C', '-', '1'));
687 688
            } else if (stream_type == STREAM_TYPE_VIDEO_HEVC && s->strict_std_compliance <= FF_COMPLIANCE_NORMAL) {
                put_registration_descriptor(&q, MKTAG('H', 'E', 'V', 'C'));
689 690
            }
            break;
691
        case AVMEDIA_TYPE_DATA:
692
            if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV) {
693
                put_registration_descriptor(&q, MKTAG('K', 'L', 'V', 'A'));
694
            } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
695 696 697 698
                const char *tag = "ID3 ";
                *q++ = 0x26; /* metadata descriptor */
                *q++ = 13;
                put16(&q, 0xffff);    /* metadata application format */
699
                putbuf(&q, tag, strlen(tag));
700
                *q++ = 0xff;        /* metadata format */
701
                putbuf(&q, tag, strlen(tag));
702 703
                *q++ = 0;            /* metadata service ID */
                *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
704 705
            }
            break;
706
        }
707 708 709 710 711

        val = 0xf000 | (q - desc_length_ptr - 2);
        desc_length_ptr[0] = val >> 8;
        desc_length_ptr[1] = val;
    }
712 713 714 715 716 717 718

    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);

719
    mpegts_write_section1(&service->pmt, PMT_TID, service->sid, ts->tables_version, 0, 0,
720
                          data, q - data);
721
    return 0;
722
}
723 724 725 726 727

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

731
    q = data;
732
    put16(&q, ts->original_network_id);
733
    *q++ = 0xff;
D
Diego Biurrun 已提交
734
    for (i = 0; i < ts->nb_services; i++) {
735 736
        service = ts->services[i];
        put16(&q, service->sid);
D
Diego Biurrun 已提交
737
        *q++              = 0xfc | 0x00; /* currently no EIT info */
738
        desc_list_len_ptr = q;
D
Diego Biurrun 已提交
739 740 741
        q                += 2;
        running_status    = 4; /* running */
        free_ca_mode      = 0;
742 743

        /* write only one descriptor for the service name and provider */
D
Diego Biurrun 已提交
744
        *q++         = 0x48;
745 746
        desc_len_ptr = q;
        q++;
747
        *q++         = ts->service_type;
748 749
        putbuf(&q, service->provider_name, service->provider_name[0] + 1);
        putbuf(&q, service->name, service->name[0] + 1);
750 751 752
        desc_len_ptr[0] = q - desc_len_ptr - 1;

        /* fill descriptor length */
753
        val = (running_status << 13) | (free_ca_mode << 12) |
D
Diego Biurrun 已提交
754
              (q - desc_list_len_ptr - 2);
755 756 757
        desc_list_len_ptr[0] = val >> 8;
        desc_list_len_ptr[1] = val;
    }
758
    mpegts_write_section1(&ts->sdt, SDT_TID, ts->transport_stream_id, ts->tables_version, 0, 0,
759 760 761
                          data, q - data);
}

762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
/* 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;
}

798 799 800 801 802 803
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;
}

804
static void write_packet(AVFormatContext *s, const uint8_t *packet)
805 806 807 808 809 810 811 812 813
{
    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,
                   sizeof(tp_extra_header));
    }
814
    avio_write(s->pb, packet, TS_PACKET_SIZE);
815 816 817 818 819
}

static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
820
    write_packet(ctx, packet);
821
}
822

823
static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
824 825
                                         const AVDictionary *metadata,
                                         AVProgram *program)
826
{
827
    MpegTSWrite *ts = s->priv_data;
828
    MpegTSService *service;
829
    AVDictionaryEntry *title, *provider;
830
    char default_service_name[32];
831 832 833 834 835 836
    const char *service_name;
    const char *provider_name;

    title = av_dict_get(metadata, "service_name", NULL, 0);
    if (!title)
        title = av_dict_get(metadata, "title", NULL, 0);
837 838
    snprintf(default_service_name, sizeof(default_service_name), "%s%02d", DEFAULT_SERVICE_NAME, ts->nb_services + 1);
    service_name  = title ? title->value : default_service_name;
839 840
    provider      = av_dict_get(metadata, "service_provider", NULL, 0);
    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
841 842 843 844

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
D
Diego Biurrun 已提交
845 846
    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
    service->sid           = sid;
847
    service->pcr_pid       = 0x1fff;
848
    if (encode_str8(service->provider_name, provider_name) < 0 ||
849
        encode_str8(service->name, service_name) < 0) {
850
        av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
851
        goto fail;
852
    }
853 854 855
    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
        goto fail;

856 857 858 859 860 861
    service->pmt.write_packet = section_write_packet;
    service->pmt.opaque       = s;
    service->pmt.cc           = 15;
    service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
    service->program          = program;

862
    return service;
863 864 865
fail:
    av_free(service);
    return NULL;
866 867
}

868 869 870 871 872
static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st = pcr_st->priv_data;

873 874 875
    if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
        int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
        ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
876
    } else {
877
        /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */
878
        int64_t frame_period = 0;
879 880 881
        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
            if (!frame_size) {
882 883
               av_log(s, AV_LOG_WARNING, "frame size not set\n");
               frame_size = 512;
884
            }
885 886 887
            frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE, pcr_st->codecpar->sample_rate, AV_ROUND_UP);
        } else if (pcr_st->avg_frame_rate.num) {
            frame_period = av_rescale_rnd(pcr_st->avg_frame_rate.den, PCR_TIME_BASE, pcr_st->avg_frame_rate.num, AV_ROUND_UP);
888
        }
889 890 891 892
        if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
            ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 / frame_period);
        else
            ts_st->pcr_period = 1;
893 894 895
    }

    // output a PCR as soon as possible
896
    ts_st->last_pcr   = ts->first_pcr - ts_st->pcr_period;
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
}

static void select_pcr_streams(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;

    for (int i = 0; i < ts->nb_services; i++) {
        MpegTSService *service = ts->services[i];
        AVStream *pcr_st = NULL;
        AVProgram *program = service->program;
        int nb_streams = program ? program->nb_stream_indexes : s->nb_streams;

        for (int j = 0; j < nb_streams; j++) {
            AVStream *st = s->streams[program ? program->stream_index[j] : j];
            if (!pcr_st ||
                pcr_st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
            {
                pcr_st = st;
            }
        }

        if (pcr_st) {
            MpegTSWriteStream *ts_st = pcr_st->priv_data;
            service->pcr_pid = ts_st->pid;
            enable_pcr_generation_for_stream(s, pcr_st);
922 923
            av_log(s, AV_LOG_VERBOSE, "service %i using PCR in pid=%i, pcr_period=%"PRId64"ms\n",
                service->sid, service->pcr_pid, av_rescale(ts_st->pcr_period, 1000, PCR_TIME_BASE));
924 925 926 927
        }
    }
}

928
static int mpegts_init(AVFormatContext *s)
929 930
{
    MpegTSWrite *ts = s->priv_data;
931
    int i, j;
932
    int ret;
933

934 935 936 937 938 939 940 941
    if (ts->m2ts_mode == -1) {
        if (av_match_ext(s->url, "m2ts")) {
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

942 943 944 945 946
    ts->m2ts_video_pid   = M2TS_VIDEO_PID;
    ts->m2ts_audio_pid   = M2TS_AUDIO_START_PID;
    ts->m2ts_pgssub_pid  = M2TS_PGSSUB_START_PID;
    ts->m2ts_textsub_pid = M2TS_TEXTSUB_PID;

947
    if (ts->m2ts_mode) {
948
        ts->pmt_start_pid = M2TS_PMT_PID;
949 950 951 952 953
        if (s->nb_programs > 1) {
            av_log(s, AV_LOG_ERROR, "Only one program is allowed in m2ts mode!\n");
            return AVERROR(EINVAL);
        }
    }
954

955 956 957
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

958 959 960
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

961 962
    if (!s->nb_programs) {
        /* allocate a single DVB service */
963
        if (!mpegts_add_service(s, ts->service_id, s->metadata, NULL))
964 965 966 967
            return AVERROR(ENOMEM);
    } else {
        for (i = 0; i < s->nb_programs; i++) {
            AVProgram *program = s->programs[i];
968
            if (!mpegts_add_service(s, program->id, program->metadata, program))
969 970 971
                return AVERROR(ENOMEM);
        }
    }
972

D
Diego Biurrun 已提交
973 974 975 976
    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;
977
    ts->pat.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
978
    ts->pat.write_packet = section_write_packet;
D
Diego Biurrun 已提交
979
    ts->pat.opaque       = s;
980

D
Diego Biurrun 已提交
981 982
    ts->sdt.pid          = SDT_PID;
    ts->sdt.cc           = 15;
983
    ts->sdt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
984
    ts->sdt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
985
    ts->sdt.opaque       = s;
986 987

    /* assign pids to each stream */
D
Diego Biurrun 已提交
988
    for (i = 0; i < s->nb_streams; i++) {
989 990
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st;
991

992
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
993
        if (!ts_st) {
994
            return AVERROR(ENOMEM);
995
        }
996
        st->priv_data = ts_st;
997 998 999

        avpriv_set_pts_info(st, 33, 1, 90000);

1000
        ts_st->payload = av_mallocz(ts->pes_payload_size);
1001
        if (!ts_st->payload) {
1002
            return AVERROR(ENOMEM);
1003
        }
1004

1005 1006 1007
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
            if (ts->m2ts_mode) {
                switch (st->codecpar->codec_type) {
                case AVMEDIA_TYPE_VIDEO:
                    ts_st->pid = ts->m2ts_video_pid++;
                    break;
                case AVMEDIA_TYPE_AUDIO:
                    ts_st->pid = ts->m2ts_audio_pid++;
                    break;
                case AVMEDIA_TYPE_SUBTITLE:
                    switch (st->codecpar->codec_id) {
                    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
                        ts_st->pid = ts->m2ts_pgssub_pid++;
                        break;
                    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
                        ts_st->pid = ts->m2ts_textsub_pid++;
                        break;
                    }
                    break;
                }
                if (ts->m2ts_video_pid   > M2TS_VIDEO_PID + 1          ||
                    ts->m2ts_audio_pid   > M2TS_AUDIO_START_PID + 32   ||
                    ts->m2ts_pgssub_pid  > M2TS_PGSSUB_START_PID + 32  ||
                    ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1        ||
                    ts_st->pid < 16) {
                    av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
1033
                    return AVERROR(EINVAL);
1034 1035 1036 1037
                }
            } else {
                ts_st->pid = ts->start_pid + i;
            }
1038
        } else {
1039 1040 1041
            ts_st->pid = st->id;
        }
        if (ts_st->pid >= 0x1FFF) {
D
Diego Biurrun 已提交
1042 1043
            av_log(s, AV_LOG_ERROR,
                   "Invalid stream id %d, must be less than 8191\n", st->id);
1044
            return AVERROR(EINVAL);
1045
        }
1046
        for (j = 0; j < ts->nb_services; j++) {
1047 1048 1049
            if (ts->services[j]->pmt.pid > LAST_OTHER_PID) {
                av_log(s, AV_LOG_ERROR,
                       "Invalid PMT PID %d, must be less than %d\n", ts->services[j]->pmt.pid, LAST_OTHER_PID + 1);
1050
                return AVERROR(EINVAL);
1051
            }
1052
            if (ts_st->pid == ts->services[j]->pmt.pid) {
1053
                av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary and PMT PID\n", ts_st->pid);
1054
                return AVERROR(EINVAL);
1055
            }
1056
        }
D
Diego Biurrun 已提交
1057
        for (j = 0; j < i; j++) {
1058 1059
            MpegTSWriteStream *ts_st_prev = s->streams[j]->priv_data;
            if (ts_st_prev->pid == ts_st->pid) {
1060
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
1061
                return AVERROR(EINVAL);
1062
            }
D
Diego Biurrun 已提交
1063 1064 1065
        }
        ts_st->payload_pts     = AV_NOPTS_VALUE;
        ts_st->payload_dts     = AV_NOPTS_VALUE;
1066
        ts_st->first_pts_check = 1;
D
Diego Biurrun 已提交
1067
        ts_st->cc              = 15;
1068
        ts_st->discontinuity   = ts->flags & MPEGTS_FLAG_DISCONT;
1069 1070
        if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
            st->codecpar->extradata_size > 0) {
1071 1072 1073
            AVStream *ast;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
1074
                return AVERROR(ENOMEM);
1075
            }
D
Diego Biurrun 已提交
1076 1077 1078
            ts_st->amux->oformat =
                av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
                                NULL, NULL);
1079
            if (!ts_st->amux->oformat) {
1080
                return AVERROR(EINVAL);
1081
            }
1082
            if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
1083
                return AVERROR(ENOMEM);
1084
            }
1085
            ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
1086
            if (ret != 0)
1087
                return ret;
1088
            ast->time_base = st->time_base;
1089 1090
            ret = avformat_write_header(ts_st->amux, NULL);
            if (ret < 0)
1091
                return ret;
1092
        }
1093 1094
        if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
            ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate;
1095
        }
1096
    }
1097

1098 1099 1100
    if (ts->copyts < 1)
        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);

1101 1102
    select_pcr_streams(s);

1103
    ts->last_pat_ts = AV_NOPTS_VALUE;
1104
    ts->last_sdt_ts = AV_NOPTS_VALUE;
1105 1106
    ts->pat_period = av_rescale(ts->pat_period_us, PCR_TIME_BASE, AV_TIME_BASE);
    ts->sdt_period = av_rescale(ts->sdt_period_us, PCR_TIME_BASE, AV_TIME_BASE);
1107

1108
    if (ts->mux_rate == 1)
1109
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
1110
    else
1111
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
D
Diego Biurrun 已提交
1112
    av_log(s, AV_LOG_VERBOSE,
1113 1114 1115
           "sdt every %"PRId64" ms, pat/pmt every %"PRId64" ms\n",
           av_rescale(ts->sdt_period, 1000, PCR_TIME_BASE),
           av_rescale(ts->pat_period, 1000, PCR_TIME_BASE));
1116

1117 1118 1119
    return 0;
}

1120
/* send SDT, PAT and PMT tables regularly */
1121
static void retransmit_si_info(AVFormatContext *s, int force_pat, int force_sdt, int64_t pcr)
1122 1123 1124 1125
{
    MpegTSWrite *ts = s->priv_data;
    int i;

1126 1127 1128
    if ((pcr != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
        (pcr != AV_NOPTS_VALUE && pcr - ts->last_sdt_ts >= ts->sdt_period) ||
        force_sdt
1129
    ) {
1130 1131
        if (pcr != AV_NOPTS_VALUE)
            ts->last_sdt_ts = FFMAX(pcr, ts->last_sdt_ts);
1132 1133
        mpegts_write_sdt(s);
    }
1134 1135
    if ((pcr != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
        (pcr != AV_NOPTS_VALUE && pcr - ts->last_pat_ts >= ts->pat_period) ||
1136
        force_pat) {
1137 1138
        if (pcr != AV_NOPTS_VALUE)
            ts->last_pat_ts = FFMAX(pcr, ts->last_pat_ts);
1139
        mpegts_write_pat(s);
D
Diego Biurrun 已提交
1140
        for (i = 0; i < ts->nb_services; i++)
1141 1142 1143 1144
            mpegts_write_pmt(s, ts->services[i]);
    }
}

1145
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
1146 1147 1148 1149 1150
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
D
Diego Biurrun 已提交
1151 1152 1153
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
1154 1155
    *buf++ = pcr_low;

1156
    return 6;
1157 1158
}

1159 1160 1161 1162 1163 1164
/* 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 已提交
1165
    q    = buf;
1166 1167 1168 1169 1170
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
1171
    write_packet(s, buf);
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
}

/* 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 已提交
1182
    q    = buf;
1183 1184 1185 1186 1187 1188 1189
    *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 */
1190 1191 1192 1193
    if (ts_st->discontinuity) {
        q[-1] |= 0x80;
        ts_st->discontinuity = 0;
    }
1194 1195

    /* PCR coded into 6 bytes */
1196
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
1197 1198 1199

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
1200
    write_packet(s, buf);
1201 1202
}

1203 1204 1205 1206
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

D
Diego Biurrun 已提交
1207
    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
1208
    *q++ = val;
D
Diego Biurrun 已提交
1209
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
1210 1211
    *q++ = val >> 8;
    *q++ = val;
D
Diego Biurrun 已提交
1212
    val  = (((pts) & 0x7fff) << 1) | 1;
1213 1214 1215 1216
    *q++ = val >> 8;
    *q++ = val;
}

1217 1218 1219 1220
/* 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 已提交
1221
    av_assert0(flag);
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236

    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 已提交
1237
    av_assert0(pkt[3] & 0x20);
1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
    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 已提交
1250 1251 1252 1253
/* 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. */
1254 1255
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
1256
                             int64_t pts, int64_t dts, int key, int stream_id)
1257 1258
{
    MpegTSWriteStream *ts_st = st->priv_data;
1259
    MpegTSWrite *ts = s->priv_data;
1260
    uint8_t buf[TS_PACKET_SIZE];
1261
    uint8_t *q;
1262
    int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
1263
    int afc_len, stuffing_len;
1264
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
1265
    int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
1266
    int force_sdt = 0;
1267

1268 1269
    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) {
1270 1271 1272
        force_pat = 1;
    }

1273 1274 1275 1276 1277 1278
    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
        force_pat = 1;
        force_sdt = 1;
        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
    }

1279 1280
    is_start = 1;
    while (payload_size > 0) {
1281 1282 1283 1284 1285
        int64_t pcr = AV_NOPTS_VALUE;
        if (ts->mux_rate > 1)
            pcr = get_pcr(ts, s->pb);
        else if (dts != AV_NOPTS_VALUE)
            pcr = (dts - delay) * 300;
1286

1287
        retransmit_si_info(s, force_pat, force_sdt, pcr);
1288
        force_pat = 0;
1289
        force_sdt = 0;
1290

1291
        write_pcr = 0;
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317
        if (ts->mux_rate > 1) {
            /* Send PCR packets for all PCR streams if needed */
            pcr = get_pcr(ts, s->pb);
            if (pcr >= ts->next_pcr) {
                int64_t next_pcr = INT64_MAX;
                for (int i = 0; i < s->nb_streams; i++) {
                    /* Make the current stream the last, because for that we
                     * can insert the pcr into the payload later */
                    int st2_index = i < st->index ? i : (i + 1 == s->nb_streams ? st->index : i + 1);
                    AVStream *st2 = s->streams[st2_index];
                    MpegTSWriteStream *ts_st2 = st2->priv_data;
                    if (ts_st2->pcr_period) {
                        if (pcr - ts_st2->last_pcr >= ts_st2->pcr_period) {
                            ts_st2->last_pcr = FFMAX(pcr - ts_st2->pcr_period, ts_st2->last_pcr + ts_st2->pcr_period);
                            if (st2 != st) {
                                mpegts_insert_pcr_only(s, st2);
                                pcr = get_pcr(ts, s->pb);
                            } else {
                                write_pcr = 1;
                            }
                        }
                        next_pcr = FFMIN(next_pcr, ts_st2->last_pcr + ts_st2->pcr_period);
                    }
                }
                ts->next_pcr = next_pcr;
            }
1318 1319 1320 1321 1322 1323 1324 1325 1326
            if (dts != AV_NOPTS_VALUE && (dts - pcr / 300) > delay) {
                /* pcr insert gets priority over null packet insert */
                if (write_pcr)
                    mpegts_insert_pcr_only(s, st);
                else
                    mpegts_insert_null_packet(s);
                /* recalculate write_pcr and possibly retransmit si_info */
                continue;
            }
1327
        } else if (ts_st->pcr_period && pcr != AV_NOPTS_VALUE) {
1328 1329
            if (pcr - ts_st->last_pcr >= ts_st->pcr_period && is_start) {
                ts_st->last_pcr = FFMAX(pcr - ts_st->pcr_period, ts_st->last_pcr + ts_st->pcr_period);
1330 1331 1332 1333
                write_pcr = 1;
            }
        }

1334
        /* prepare packet header */
D
Diego Biurrun 已提交
1335
        q    = buf;
1336
        *q++ = 0x47;
1337
        val  = ts_st->pid >> 8;
1338 1339
        if (ts->m2ts_mode && st->codecpar->codec_id == AV_CODEC_ID_AC3)
            val |= 0x20;
1340 1341
        if (is_start)
            val |= 0x40;
D
Diego Biurrun 已提交
1342 1343
        *q++      = val;
        *q++      = ts_st->pid;
1344
        ts_st->cc = ts_st->cc + 1 & 0xf;
D
Diego Biurrun 已提交
1345
        *q++      = 0x10 | ts_st->cc; // payload indicator + CC
1346 1347 1348 1349 1350
        if (ts_st->discontinuity) {
            set_af_flag(buf, 0x80);
            q = get_ts_payload_start(buf);
            ts_st->discontinuity = 0;
        }
1351 1352
        if (key && is_start && pts != AV_NOPTS_VALUE) {
            // set Random Access for key frames
1353
            if (ts_st->pcr_period)
1354 1355 1356 1357
                write_pcr = 1;
            set_af_flag(buf, 0x40);
            q = get_ts_payload_start(buf);
        }
1358
        if (write_pcr) {
1359 1360
            set_af_flag(buf, 0x10);
            q = get_ts_payload_start(buf);
1361
            // add 11, pcr references the last byte of program clock reference base
1362
            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
1363
                av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
1364 1365
            extend_af(buf, write_pcr_bits(q, pcr));
            q = get_ts_payload_start(buf);
1366
        }
1367
        if (is_start) {
1368
            int pes_extension = 0;
1369
            int pes_header_stuffing_bytes = 0;
1370 1371 1372 1373
            /* write PES header */
            *q++ = 0x00;
            *q++ = 0x00;
            *q++ = 0x01;
1374
            is_dvb_subtitle = 0;
1375
            is_dvb_teletext = 0;
1376 1377
            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
                if (st->codecpar->codec_id == AV_CODEC_ID_DIRAC)
1378
                    *q++ = 0xfd;
D
Diego Biurrun 已提交
1379
                else
1380
                    *q++ = 0xe0;
1381 1382 1383 1384
            } 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)) {
1385
                *q++ = 0xc0;
1386 1387
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                        st->codecpar->codec_id == AV_CODEC_ID_AC3 &&
1388 1389
                        ts->m2ts_mode) {
                *q++ = 0xfd;
1390 1391 1392
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA &&
                       st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
                *q++ = 0xbd;
1393
            } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
1394 1395 1396 1397
                *q++ = stream_id != -1 ? stream_id : 0xfc;

                if (stream_id == 0xbd) /* asynchronous KLV */
                    pts = dts = AV_NOPTS_VALUE;
1398 1399
            } else {
                *q++ = 0xbd;
1400 1401
                if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
                    if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
1402
                        is_dvb_subtitle = 1;
1403
                    } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
1404 1405
                        is_dvb_teletext = 1;
                    }
1406 1407
                }
            }
1408
            header_len = 0;
D
Diego Biurrun 已提交
1409
            flags      = 0;
1410 1411
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
D
Diego Biurrun 已提交
1412
                flags      |= 0x80;
1413
            }
1414
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1415
                header_len += 5;
D
Diego Biurrun 已提交
1416
                flags      |= 0x40;
1417
            }
1418 1419
            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
                st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1420 1421
                /* set PES_extension_flag */
                pes_extension = 1;
D
Diego Biurrun 已提交
1422
                flags        |= 0x01;
1423

D
Diego Biurrun 已提交
1424 1425 1426
                /* One byte for PES2 extension flag +
                 * one byte for extension length +
                 * one byte for extension id */
1427 1428
                header_len += 3;
            }
1429 1430 1431 1432
            /* 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 &&
1433 1434
                st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                st->codecpar->codec_id == AV_CODEC_ID_AC3) {
J
Jun Zhao 已提交
1435 1436 1437 1438
                /* set PES_extension_flag */
                pes_extension = 1;
                flags |= 0x01;
                header_len += 3;
1439
            }
1440 1441 1442 1443
            if (is_dvb_teletext) {
                pes_header_stuffing_bytes = 0x24 - header_len;
                header_len = 0x24;
            }
1444
            len = payload_size + header_len + 3;
1445 1446 1447 1448 1449
            /* 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++;
            }
1450 1451
            if (len > 0xffff)
                len = 0;
1452
            if (ts->omit_video_pes_length && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1453 1454
                len = 0;
            }
1455 1456
            *q++ = len >> 8;
            *q++ = len;
D
Diego Biurrun 已提交
1457
            val  = 0x80;
1458
            /* data alignment indicator is required for subtitle and data streams */
1459
            if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
1460 1461
                val |= 0x04;
            *q++ = val;
1462 1463
            *q++ = flags;
            *q++ = header_len;
1464
            if (pts != AV_NOPTS_VALUE) {
1465 1466 1467
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
1468
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1469 1470
                write_pts(q, 1, dts);
                q += 5;
1471
            }
1472
            if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1473
                flags = 0x01;  /* set PES_extension_flag_2 */
D
Diego Biurrun 已提交
1474 1475 1476 1477
                *q++  = flags;
                *q++  = 0x80 | 0x01; /* marker bit + extension length */
                /* Set the stream ID extension flag bit to 0 and
                 * write the extended stream ID. */
1478 1479
                *q++ = 0x00 | 0x60;
            }
1480
            /* For Blu-ray AC3 Audio Setting extended flags */
J
Jun Zhao 已提交
1481 1482 1483 1484 1485 1486 1487 1488
            if (ts->m2ts_mode &&
                pes_extension &&
                st->codecpar->codec_id == AV_CODEC_ID_AC3) {
                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) */
            }
1489 1490


1491 1492 1493 1494 1495 1496 1497
            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;
            }
1498 1499 1500 1501
            if (is_dvb_teletext) {
                memset(q, 0xff, pes_header_stuffing_bytes);
                q += pes_header_stuffing_bytes;
            }
1502
            is_start = 0;
1503
        }
1504 1505 1506 1507
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1508 1509
        if (len > payload_size)
            len = payload_size;
1510 1511 1512 1513 1514 1515 1516
        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,
1517
                        buf + 4 + afc_len,
1518 1519 1520 1521 1522 1523 1524
                        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 已提交
1525
                buf[4]  = stuffing_len - 1;
1526 1527 1528 1529 1530 1531
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
1532 1533 1534 1535 1536 1537 1538 1539

        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 已提交
1540
        payload      += len;
1541
        payload_size -= len;
1542
        write_packet(s, buf);
1543
    }
1544
    ts_st->prev_payload_key = key;
1545 1546
}

1547 1548
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1549
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1550 1551
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
1552 1553
                   "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it "
                   "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1554
            return AVERROR_INVALIDDATA;
1555
        }
1556
        av_log(s, AV_LOG_WARNING, "H.264 bitstream error, startcode missing, size %d", pkt->size);
1557 1558
        if (pkt->size)
            av_log(s, AV_LOG_WARNING, " data %08"PRIX32, AV_RB32(pkt->data));
1559
        av_log(s, AV_LOG_WARNING, "\n");
1560 1561 1562 1563
    }
    return 0;
}

1564 1565
static int check_hevc_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1566
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1567 1568 1569 1570
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "HEVC bitstream malformed, no startcode found\n");
            return AVERROR_PATCHWELCOME;
        }
1571
        av_log(s, AV_LOG_WARNING, "HEVC bitstream error, startcode missing, size %d", pkt->size);
1572 1573
        if (pkt->size)
            av_log(s, AV_LOG_WARNING, " data %08"PRIX32, AV_RB32(pkt->data));
1574
        av_log(s, AV_LOG_WARNING, "\n");
1575 1576 1577 1578
    }
    return 0;
}

1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
/* 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;
}

1631
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1632
{
1633
    AVStream *st = s->streams[pkt->stream_index];
1634
    int size = pkt->size;
D
Diego Biurrun 已提交
1635 1636
    uint8_t *buf = pkt->data;
    uint8_t *data = NULL;
1637
    MpegTSWrite *ts = s->priv_data;
1638
    MpegTSWriteStream *ts_st = st->priv_data;
1639
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1640
    const int64_t max_audio_delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) / 2;
1641
    int64_t dts = pkt->dts, pts = pkt->pts;
1642
    int opus_samples = 0;
1643
    int side_data_size;
1644
    uint8_t *side_data = NULL;
1645 1646 1647 1648 1649 1650 1651
    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];
1652

1653
    if (ts->copyts < 1) {
1654 1655 1656 1657 1658
        if (pts != AV_NOPTS_VALUE)
            pts += delay;
        if (dts != AV_NOPTS_VALUE)
            dts += delay;
    }
1659

1660
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1661
        av_log(s, AV_LOG_ERROR, "first pts value must be set\n");
1662
        return AVERROR_INVALIDDATA;
1663 1664 1665
    }
    ts_st->first_pts_check = 0;

1666
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
D
Diego Biurrun 已提交
1667
        const uint8_t *p = buf, *buf_end = p + size;
1668
        uint32_t state = -1;
1669
        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0;
1670 1671 1672
        int ret = ff_check_h264_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1673

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

1677
        do {
1678
            p = avpriv_find_start_code(p, buf_end, &state);
1679
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
1680 1681
            if ((state & 0x1f) == 7)
                extradd = 0;
1682 1683 1684
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

1685 1686
        if ((state & 0x1f) != 5)
            extradd = 0;
1687
        if ((state & 0x1f) != 9) { // AUD NAL
1688
            data = av_malloc(pkt->size + 6 + extradd);
1689
            if (!data)
1690
                return AVERROR(ENOMEM);
1691
            memcpy(data + 6, st->codecpar->extradata, extradd);
1692
            memcpy(data + 6 + extradd, pkt->data, pkt->size);
1693 1694
            AV_WB32(data, 0x00000001);
            data[4] = 0x09;
1695
            data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
D
Diego Biurrun 已提交
1696
            buf     = data;
1697
            size    = pkt->size + 6 + extradd;
1698
        }
1699
    } else if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
1700 1701
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
1702
            return AVERROR_INVALIDDATA;
1703
        }
1704
        if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
1705 1706 1707 1708
            int ret;
            AVPacket pkt2;

            if (!ts_st->amux) {
1709
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
D
Diego Biurrun 已提交
1710
                                        "and extradata missing\n");
1711
            } else {
1712 1713 1714
            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
1715 1716
            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 已提交
1717

1718 1719
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1720
                return ret;
1721 1722 1723

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1724
                ffio_free_dyn_buf(&ts_st->amux->pb);
1725
                return ret;
A
Alex Converse 已提交
1726
            }
D
Diego Biurrun 已提交
1727
            size            = avio_close_dyn_buf(ts_st->amux->pb, &data);
1728
            ts_st->amux->pb = NULL;
D
Diego Biurrun 已提交
1729
            buf             = data;
1730
            }
1731
        }
1732
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1733 1734 1735
        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;
1736 1737 1738
        int ret = check_hevc_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1739 1740 1741 1742 1743 1744

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

        do {
            p = avpriv_find_start_code(p, buf_end, &state);
1745
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", (state & 0x7e)>>1);
1746 1747 1748 1749 1750
            if ((state & 0x7e) == 2*32)
                extradd = 0;
        } while (p < buf_end && (state & 0x7e) != 2*35 &&
                 (state & 0x7e) >= 2*32);

J
Jun Zhao 已提交
1751
        if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765
            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;
        }
1766
    } else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
1767 1768 1769 1770 1771 1772 1773
        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) {
1774 1775
            uint8_t *side_data;
            int side_data_size;
1776
            int i, n;
1777 1778
            int ctrl_header_size;
            int trim_start = 0, trim_end = 0;
1779 1780 1781

            opus_samples = opus_get_packet_samples(s, pkt);

1782 1783 1784 1785 1786
            side_data = av_packet_get_side_data(pkt,
                                                AV_PKT_DATA_SKIP_SAMPLES,
                                                &side_data_size);

            if (side_data && side_data_size >= 10) {
1787
                trim_end = AV_RL32(side_data + 4) * 48000 / st->codecpar->sample_rate;
1788 1789 1790 1791 1792 1793 1794 1795 1796
            }

            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);
1797 1798 1799 1800 1801
            if (!data)
                return AVERROR(ENOMEM);

            data[0] = 0x7f;
            data[1] = 0xe0;
1802 1803 1804 1805
            if (ts_st->opus_pending_trim_start)
                data[1] |= 0x10;
            if (trim_end)
                data[1] |= 0x08;
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816

            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);

1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
            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;
            }

1829 1830
            memcpy(data + i, pkt->data, pkt->size);
            buf     = data;
1831
            size    = ctrl_header_size;
1832 1833 1834 1835 1836
        } 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");
        }
1837 1838
    }

1839 1840
    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 &&
1841
         dts - ts_st->payload_dts >= max_audio_delay) ||
1842
        ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
1843
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1844
                         ts_st->payload_pts, ts_st->payload_dts,
1845
                         ts_st->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1846
        ts_st->payload_size = 0;
1847
        ts_st->opus_queued_samples = 0;
1848 1849
    }

1850
    if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1851
        av_assert0(!ts_st->payload_size);
1852
        // for video and subtitle, write a single pes packet
D
Diego Biurrun 已提交
1853
        mpegts_write_pes(s, st, buf, size, pts, dts,
1854
                         pkt->flags & AV_PKT_FLAG_KEY, stream_id);
1855
        ts_st->opus_queued_samples = 0;
1856 1857 1858 1859
        av_free(data);
        return 0;
    }

1860
    if (!ts_st->payload_size) {
D
Diego Biurrun 已提交
1861 1862
        ts_st->payload_pts   = pts;
        ts_st->payload_dts   = dts;
1863
        ts_st->payload_flags = pkt->flags;
1864
    }
1865

1866 1867
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1868
    ts_st->opus_queued_samples += opus_samples;
1869

1870 1871
    av_free(data);

1872 1873 1874
    return 0;
}

1875
static void mpegts_write_flush(AVFormatContext *s)
1876
{
1877
    MpegTSWrite *ts = s->priv_data;
1878 1879 1880
    int i;

    /* flush current packets */
D
Diego Biurrun 已提交
1881
    for (i = 0; i < s->nb_streams; i++) {
1882 1883
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1884 1885
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1886
                             ts_st->payload_pts, ts_st->payload_dts,
1887
                             ts_st->payload_flags & AV_PKT_FLAG_KEY, -1);
1888
            ts_st->payload_size = 0;
1889
            ts_st->opus_queued_samples = 0;
1890
        }
1891
    }
1892 1893 1894 1895 1896 1897

    if (ts->m2ts_mode) {
        int packets = (avio_tell(s->pb) / (TS_PACKET_SIZE + 4)) % 32;
        while (packets++ < 32)
            mpegts_insert_null_packet(s);
    }
1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910
}

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)
1911 1912 1913 1914 1915 1916 1917 1918
{
    if (s->pb)
        mpegts_write_flush(s);

    return 0;
}

static void mpegts_deinit(AVFormatContext *s)
1919 1920 1921 1922 1923
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

D
Diego Biurrun 已提交
1924
    for (i = 0; i < s->nb_streams; i++) {
1925 1926
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1927 1928 1929 1930 1931 1932
        if (ts_st) {
            av_freep(&ts_st->payload);
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
                ts_st->amux = NULL;
            }
1933
        }
1934
    }
1935

D
Diego Biurrun 已提交
1936
    for (i = 0; i < ts->nb_services; i++) {
1937
        service = ts->services[i];
1938
        av_freep(&service);
1939
    }
1940
    av_freep(&ts->services);
1941
}
1942

1943 1944 1945 1946 1947
static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
{
    int ret = 1;
    AVStream *st = s->streams[pkt->stream_index];

1948
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
1949
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1950 1951 1952
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1953
            ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
1954
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1955
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1956 1957 1958
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1959 1960 1961 1962
            ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
    }

    return ret;
1963 1964
}

1965 1966
#define OFFSET(x) offsetof(MpegTSWrite, x)
#define ENC AV_OPT_FLAG_ENCODING_PARAM
1967 1968
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
L
Limin Wang 已提交
1969
      OFFSET(transport_stream_id), AV_OPT_TYPE_INT, { .i64 = 0x0001 }, 0x0001, 0xffff, ENC },
1970
    { "mpegts_original_network_id", "Set original_network_id field.",
L
Limin Wang 已提交
1971
      OFFSET(original_network_id), AV_OPT_TYPE_INT, { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, ENC },
1972
    { "mpegts_service_id", "Set service_id field.",
L
Limin Wang 已提交
1973
      OFFSET(service_id), AV_OPT_TYPE_INT, { .i64 = 0x0001 }, 0x0001, 0xffff, ENC },
1974
    { "mpegts_service_type", "Set service_type field.",
L
Limin Wang 已提交
1975
      OFFSET(service_type), AV_OPT_TYPE_INT, { .i64 = 0x01 }, 0x01, 0xff, ENC, "mpegts_service_type" },
1976
    { "digital_tv", "Digital Television.",
L
Limin Wang 已提交
1977
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_TV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1978
    { "digital_radio", "Digital Radio.",
L
Limin Wang 已提交
1979
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_RADIO }, 0x01, 0xff, ENC, "mpegts_service_type" },
1980
    { "teletext", "Teletext.",
L
Limin Wang 已提交
1981
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_TELETEXT }, 0x01, 0xff, ENC, "mpegts_service_type" },
1982
    { "advanced_codec_digital_radio", "Advanced Codec Digital Radio.",
L
Limin Wang 已提交
1983
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_RADIO }, 0x01, 0xff, ENC, "mpegts_service_type" },
1984
    { "mpeg2_digital_hdtv", "MPEG2 Digital HDTV.",
L
Limin Wang 已提交
1985
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_MPEG2_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1986
    { "advanced_codec_digital_sdtv", "Advanced Codec Digital SDTV.",
L
Limin Wang 已提交
1987
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_SDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1988
    { "advanced_codec_digital_hdtv", "Advanced Codec Digital HDTV.",
L
Limin Wang 已提交
1989
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1990
    { "hevc_digital_hdtv", "HEVC Digital Television Service.",
L
Limin Wang 已提交
1991
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1992
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
L
Limin Wang 已提交
1993
      OFFSET(pmt_start_pid), AV_OPT_TYPE_INT, { .i64 = 0x1000 }, FIRST_OTHER_PID, LAST_OTHER_PID, ENC },
1994
    { "mpegts_start_pid", "Set the first pid.",
L
Limin Wang 已提交
1995 1996 1997
      OFFSET(start_pid), AV_OPT_TYPE_INT, { .i64 = 0x0100 }, FIRST_OTHER_PID, LAST_OTHER_PID, ENC },
    { "mpegts_m2ts_mode", "Enable m2ts mode.", OFFSET(m2ts_mode), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
    { "muxrate", NULL, OFFSET(mux_rate), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
1998
    { "pes_payload_size", "Minimum PES packet payload in bytes",
L
Limin Wang 已提交
1999 2000
      OFFSET(pes_payload_size), AV_OPT_TYPE_INT, { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, ENC },
    { "mpegts_flags", "MPEG-TS muxing flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, INT_MAX, ENC, "mpegts_flags" },
2001
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
L
Limin Wang 已提交
2002
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX, ENC, "mpegts_flags" },
2003
    { "latm", "Use LATM packetization for AAC",
L
Limin Wang 已提交
2004
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX, ENC, "mpegts_flags" },
2005
    { "pat_pmt_at_frames", "Reemit PAT and PMT at each video frame",
L
Limin Wang 已提交
2006
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_PAT_PMT_AT_FRAMES}, 0, INT_MAX, ENC, "mpegts_flags" },
2007
    { "system_b", "Conform to System B (DVB) instead of System A (ATSC)",
L
Limin Wang 已提交
2008
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_SYSTEM_B }, 0, INT_MAX, ENC, "mpegts_flags" },
2009
    { "initial_discontinuity", "Mark initial packets as discontinuous",
L
Limin Wang 已提交
2010 2011 2012
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX, ENC, "mpegts_flags" },
    { "mpegts_copyts", "don't offset dts/pts", OFFSET(copyts), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
    { "tables_version", "set PAT, PMT and SDT version", OFFSET(tables_version), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 31, ENC },
2013
    { "omit_video_pes_length", "Omit the PES packet length for video packets",
L
Limin Wang 已提交
2014
      OFFSET(omit_video_pes_length), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, ENC },
2015
    { "pcr_period", "PCR retransmission time in milliseconds",
L
Limin Wang 已提交
2016
      OFFSET(pcr_period_ms), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, ENC },
2017
    { "pat_period", "PAT/PMT retransmission time limit in seconds",
L
Limin Wang 已提交
2018
      OFFSET(pat_period_us), AV_OPT_TYPE_DURATION, { .i64 = PAT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, ENC },
2019
    { "sdt_period", "SDT retransmission time limit in seconds",
L
Limin Wang 已提交
2020
      OFFSET(sdt_period_us), AV_OPT_TYPE_DURATION, { .i64 = SDT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, ENC },
2021 2022 2023 2024
    { NULL },
};

static const AVClass mpegts_muxer_class = {
D
Diego Biurrun 已提交
2025 2026 2027 2028
    .class_name = "MPEGTS muxer",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
2029 2030
};

2031
AVOutputFormat ff_mpegts_muxer = {
D
Diego Biurrun 已提交
2032 2033
    .name           = "mpegts",
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
2034 2035
    .mime_type      = "video/MP2T",
    .extensions     = "ts,m2t,m2ts,mts",
D
Diego Biurrun 已提交
2036 2037 2038
    .priv_data_size = sizeof(MpegTSWrite),
    .audio_codec    = AV_CODEC_ID_MP2,
    .video_codec    = AV_CODEC_ID_MPEG2VIDEO,
2039
    .init           = mpegts_init,
D
Diego Biurrun 已提交
2040 2041
    .write_packet   = mpegts_write_packet,
    .write_trailer  = mpegts_write_end,
2042 2043
    .deinit         = mpegts_deinit,
    .check_bitstream = mpegts_check_bitstream,
2044
    .flags          = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS | AVFMT_NODIMENSIONS,
D
Diego Biurrun 已提交
2045
    .priv_class     = &mpegts_muxer_class,
2046
};