mpegtsenc.c 54.6 KB
Newer Older
1
/*
2
 * MPEG2 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 41 42 43 44 45 46 47 48 49 50
/* write DVB SI sections */

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

typedef struct MpegTSSection {
    int pid;
    int cc;
    void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
    void *opaque;
} MpegTSSection;

51 52 53 54 55 56 57
typedef struct MpegTSService {
    MpegTSSection pmt; /* MPEG2 pmt table context */
    int sid;           /* service ID */
    char *name;
    char *provider_name;
    int pcr_pid;
    int pcr_packet_count;
58
    int pcr_packet_period;
59 60
} MpegTSService;

61 62 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,
    MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV  = 0x19
};
71
typedef struct MpegTSWrite {
72
    const AVClass *av_class;
73 74 75 76
    MpegTSSection pat; /* MPEG2 pat table */
    MpegTSSection sdt; /* MPEG2 sdt table context */
    MpegTSService **services;
    int sdt_packet_count;
77
    int sdt_packet_period;
78
    int pat_packet_count;
79
    int pat_packet_period;
80 81 82
    int nb_services;
    int onid;
    int tsid;
83
    int64_t first_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
    int reemit_pat_pmt; // backward compatibility

98
    int pcr_period;
99 100
#define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
#define MPEGTS_FLAG_AAC_LATM        0x02
101
#define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
102
    int flags;
103
    int copyts;
104
    int tables_version;
105 106
    float pat_period;
    int64_t last_pat_ts;
107

R
Reimar Döffinger 已提交
108
    int omit_video_pes_length;
109 110
} MpegTSWrite;

111
/* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
D
Diego Biurrun 已提交
112
#define DEFAULT_PES_HEADER_FREQ  16
113 114
#define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)

115 116 117 118
/* 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

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

131 132
    buf[len - 4] = (crc >> 24) & 0xff;
    buf[len - 3] = (crc >> 16) & 0xff;
D
Diego Biurrun 已提交
133
    buf[len - 2] = (crc >>  8) & 0xff;
134
    buf[len - 1] =  crc        & 0xff;
135

136 137 138
    /* send each packet */
    buf_ptr = buf;
    while (len > 0) {
139
        first = buf == buf_ptr;
D
Diego Biurrun 已提交
140 141
        q     = packet;
        *q++  = 0x47;
142
        b     = s->pid >> 8;
143 144
        if (first)
            b |= 0x40;
D
Diego Biurrun 已提交
145 146
        *q++  = b;
        *q++  = s->pid;
147
        s->cc = s->cc + 1 & 0xf;
D
Diego Biurrun 已提交
148
        *q++  = 0x10 | s->cc;
149 150 151
        if (first)
            *q++ = 0; /* 0 offset */
        len1 = TS_PACKET_SIZE - (q - packet);
152
        if (len1 > len)
153 154 155 156 157 158 159 160 161 162 163
            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 已提交
164
        len     -= len1;
165 166 167 168 169 170
    }
}

static inline void put16(uint8_t **q_ptr, int val)
{
    uint8_t *q;
D
Diego Biurrun 已提交
171 172 173
    q      = *q_ptr;
    *q++   = val >> 8;
    *q++   = val;
174 175 176
    *q_ptr = q;
}

177
static int mpegts_write_section1(MpegTSSection *s, int tid, int id,
D
Diego Biurrun 已提交
178 179
                                 int version, int sec_num, int last_sec_num,
                                 uint8_t *buf, int len)
180 181 182
{
    uint8_t section[1024], *q;
    unsigned int tot_len;
183 184
    /* reserved_future_use field must be set to 1 for SDT */
    unsigned int flags = tid == SDT_TID ? 0xf000 : 0xb000;
185

186 187 188
    tot_len = 3 + 5 + len + 4;
    /* check if not too big */
    if (tot_len > 1024)
189
        return AVERROR_INVALIDDATA;
190

D
Diego Biurrun 已提交
191
    q    = section;
192
    *q++ = tid;
193
    put16(&q, flags | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */
194 195 196 197 198
    put16(&q, id);
    *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
    *q++ = sec_num;
    *q++ = last_sec_num;
    memcpy(q, buf, len);
199

200 201 202 203 204 205 206
    mpegts_write_section(s, section, tot_len);
    return 0;
}

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

207
#define DEFAULT_PROVIDER_NAME   "FFmpeg"
208 209 210 211 212
#define DEFAULT_SERVICE_NAME    "Service01"

/* we retransmit the SI info at this rate */
#define SDT_RETRANS_TIME 500
#define PAT_RETRANS_TIME 100
213
#define PCR_RETRANS_TIME 20
214 215

typedef struct MpegTSWriteStream {
216
    struct MpegTSService *service;
217 218
    int pid; /* stream associated pid */
    int cc;
219
    int payload_size;
220
    int first_pts_check; ///< first pts check needed
221
    int prev_payload_key;
222
    int64_t payload_pts;
223
    int64_t payload_dts;
224
    int payload_flags;
225
    uint8_t *payload;
226
    AVFormatContext *amux;
227
    AVRational user_tb;
228 229 230 231 232 233
} MpegTSWriteStream;

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

237
    q = data;
D
Diego Biurrun 已提交
238
    for (i = 0; i < ts->nb_services; i++) {
239 240 241 242
        service = ts->services[i];
        put16(&q, service->sid);
        put16(&q, 0xe000 | service->pmt.pid);
    }
243
    mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, ts->tables_version, 0, 0,
244 245 246
                          data, q - data);
}

247
static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
248
{
249
    MpegTSWrite *ts = s->priv_data;
250
    uint8_t data[SECTION_LENGTH], *q, *desc_length_ptr, *program_info_length_ptr;
251
    int val, stream_type, i, err = 0;
252 253 254 255 256 257 258 259 260 261 262 263

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

D
Diego Biurrun 已提交
265
    for (i = 0; i < s->nb_streams; i++) {
266 267
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
D
Diego Biurrun 已提交
268
        AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
269

270
        if (q - data > SECTION_LENGTH - 32) {
271 272 273
            err = 1;
            break;
        }
D
Diego Biurrun 已提交
274
        switch (st->codec->codec_id) {
275 276
        case AV_CODEC_ID_MPEG1VIDEO:
        case AV_CODEC_ID_MPEG2VIDEO:
277
            stream_type = STREAM_TYPE_VIDEO_MPEG2;
278
            break;
279
        case AV_CODEC_ID_MPEG4:
280 281
            stream_type = STREAM_TYPE_VIDEO_MPEG4;
            break;
282
        case AV_CODEC_ID_H264:
283 284
            stream_type = STREAM_TYPE_VIDEO_H264;
            break;
285 286 287
        case AV_CODEC_ID_HEVC:
            stream_type = STREAM_TYPE_VIDEO_HEVC;
            break;
288 289 290
        case AV_CODEC_ID_CAVS:
            stream_type = STREAM_TYPE_VIDEO_CAVS;
            break;
291
        case AV_CODEC_ID_DIRAC:
292 293
            stream_type = STREAM_TYPE_VIDEO_DIRAC;
            break;
294 295
        case AV_CODEC_ID_MP2:
        case AV_CODEC_ID_MP3:
296
            stream_type = STREAM_TYPE_AUDIO_MPEG1;
297
            break;
298
        case AV_CODEC_ID_AAC:
D
Diego Biurrun 已提交
299 300 301
            stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
                          ? STREAM_TYPE_AUDIO_AAC_LATM
                          : STREAM_TYPE_AUDIO_AAC;
302
            break;
303
        case AV_CODEC_ID_AAC_LATM:
304 305
            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
            break;
306
        case AV_CODEC_ID_AC3:
307
            stream_type = STREAM_TYPE_AUDIO_AC3;
308
            break;
309 310 311 312 313 314
        case AV_CODEC_ID_DTS:
            stream_type = STREAM_TYPE_AUDIO_DTS;
            break;
        case AV_CODEC_ID_TRUEHD:
            stream_type = STREAM_TYPE_AUDIO_TRUEHD;
            break;
315 316 317 318
        default:
            stream_type = STREAM_TYPE_PRIVATE_DATA;
            break;
        }
319

320 321 322 323 324 325
        *q++ = stream_type;
        put16(&q, 0xe000 | ts_st->pid);
        desc_length_ptr = q;
        q += 2; /* patched after */

        /* write optional descriptors here */
D
Diego Biurrun 已提交
326
        switch (st->codec->codec_type) {
327
        case AVMEDIA_TYPE_AUDIO:
328
            if (st->codec->codec_id==AV_CODEC_ID_EAC3) {
M
Mean 已提交
329 330 331 332
                *q++=0x7a; // EAC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
333
            if (st->codec->codec_id==AV_CODEC_ID_S302M) {
334 335 336 337 338 339 340
                *q++ = 0x05; /* MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'B';
                *q++ = 'S';
                *q++ = 'S';
                *q++ = 'D';
            }
M
Mean 已提交
341

342 343 344 345 346
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

D
Diego Biurrun 已提交
347 348
                *q++     = 0x0a; /* ISO 639 language descriptor */
                len_ptr  = q++;
349 350 351
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
352 353 354 355
                    if (q - data > SECTION_LENGTH - 4) {
                        err = 1;
                        break;
                    }
356 357 358 359 360 361 362 363
                    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 已提交
364 365 366 367 368 369 370 371
                    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 */
372 373 374 375 376 377

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
378 379
            }
            break;
380
        case AVMEDIA_TYPE_SUBTITLE:
D
Diego Biurrun 已提交
381
        {
382 383 384 385 386 387 388 389 390 391
           const char default_language[] = "und";
           const char *language = lang && strlen(lang->value) >= 3 ? lang->value : default_language;

           if (st->codec->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
               uint8_t *len_ptr;
               int extradata_copied = 0;

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

392 393 394 395 396
               while (strlen(language) >= 3) {
                   if (sizeof(data) - (q - data) < 8) { /* 8 bytes per DVB subtitle substream data */
                       err = 1;
                       break;
                   }
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 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 457
                   *q++ = *language++;
                   *q++ = *language++;
                   *q++ = *language++;
                   /* Skip comma */
                   if (*language != '\0')
                       language++;

                   if (st->codec->extradata_size - extradata_copied >= 5) {
                       *q++ = st->codec->extradata[extradata_copied + 4]; /* subtitling_type */
                       memcpy(q, st->codec->extradata + extradata_copied, 4); /* composition_page_id and ancillary_page_id */
                       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;
                       if ((st->codec->extradata_size == 4) && (extradata_copied == 0)) {
                           /* support of old 4-byte extradata format */
                           memcpy(q, st->codec->extradata, 4); /* composition_page_id and ancillary_page_id */
                           extradata_copied += 4;
                           q += 4;
                       } else {
                           put16(&q, 1); /* composition_page_id */
                           put16(&q, 1); /* ancillary_page_id */
                       }
                   }
               }

               *len_ptr = q - len_ptr - 1;
           } else if (st->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
               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++;

                   if (st->codec->extradata_size - 1 > extradata_copied) {
                       memcpy(q, st->codec->extradata + extradata_copied, 2);
                       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;
458
            }
D
Diego Biurrun 已提交
459 460
        }
        break;
461
        case AVMEDIA_TYPE_VIDEO:
462 463 464 465 466 467 468 469 470
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
                *q++ = 0x05; /*MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'd';
                *q++ = 'r';
                *q++ = 'a';
                *q++ = 'c';
            }
            break;
471 472 473 474 475 476 477 478 479 480
        case AVMEDIA_TYPE_DATA:
            if (st->codec->codec_id == AV_CODEC_ID_SMPTE_KLV) {
                *q++ = 0x05; /* MPEG-2 registration descriptor */
                *q++ = 4;
                *q++ = 'K';
                *q++ = 'L';
                *q++ = 'V';
                *q++ = 'A';
            }
            break;
481
        }
482 483 484 485 486

        val = 0xf000 | (q - desc_length_ptr - 2);
        desc_length_ptr[0] = val >> 8;
        desc_length_ptr[1] = val;
    }
487 488 489 490 491 492 493

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

494
    mpegts_write_section1(&service->pmt, PMT_TID, service->sid, ts->tables_version, 0, 0,
495
                          data, q - data);
496
    return 0;
497
}
498

499
/* NOTE: !str is accepted for an empty string */
500 501 502 503 504 505 506 507 508 509 510 511
static void putstr8(uint8_t **q_ptr, const char *str)
{
    uint8_t *q;
    int len;

    q = *q_ptr;
    if (!str)
        len = 0;
    else
        len = strlen(str);
    *q++ = len;
    memcpy(q, str, len);
D
Diego Biurrun 已提交
512
    q     += len;
513 514 515 516 517 518 519
    *q_ptr = q;
}

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

523 524 525
    q = data;
    put16(&q, ts->onid);
    *q++ = 0xff;
D
Diego Biurrun 已提交
526
    for (i = 0; i < ts->nb_services; i++) {
527 528
        service = ts->services[i];
        put16(&q, service->sid);
D
Diego Biurrun 已提交
529
        *q++              = 0xfc | 0x00; /* currently no EIT info */
530
        desc_list_len_ptr = q;
D
Diego Biurrun 已提交
531 532 533
        q                += 2;
        running_status    = 4; /* running */
        free_ca_mode      = 0;
534 535

        /* write only one descriptor for the service name and provider */
D
Diego Biurrun 已提交
536
        *q++         = 0x48;
537 538
        desc_len_ptr = q;
        q++;
539
        *q++         = ts->service_type;
540 541 542 543 544
        putstr8(&q, service->provider_name);
        putstr8(&q, service->name);
        desc_len_ptr[0] = q - desc_len_ptr - 1;

        /* fill descriptor length */
545
        val = (running_status << 13) | (free_ca_mode << 12) |
D
Diego Biurrun 已提交
546
              (q - desc_list_len_ptr - 2);
547 548 549
        desc_list_len_ptr[0] = val >> 8;
        desc_list_len_ptr[1] = val;
    }
550
    mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, ts->tables_version, 0, 0,
551 552 553
                          data, q - data);
}

D
Diego Biurrun 已提交
554
static MpegTSService *mpegts_add_service(MpegTSWrite *ts, int sid,
555
                                         const char *provider_name,
556 557 558 559 560 561 562
                                         const char *name)
{
    MpegTSService *service;

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
D
Diego Biurrun 已提交
563 564
    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
    service->sid           = sid;
565
    service->pcr_pid       = 0x1fff;
566
    service->provider_name = av_strdup(provider_name);
D
Diego Biurrun 已提交
567
    service->name          = av_strdup(name);
568 569 570 571 572
    if (!service->provider_name || !service->name)
        goto fail;
    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
        goto fail;

573
    return service;
574 575 576 577 578
fail:
    av_freep(&service->provider_name);
    av_freep(&service->name);
    av_free(service);
    return NULL;
579 580
}

581 582 583 584 585 586 587 588 589 590 591 592 593 594
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,
595
                   sizeof(tp_extra_header));
596 597 598
    }
}

599 600 601
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
602
    mpegts_prefix_m2ts_header(ctx);
603
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
604 605 606 607 608 609 610
}

static int mpegts_write_header(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st;
    MpegTSService *service;
611
    AVStream *st, *pcr_st = NULL;
612
    AVDictionaryEntry *title, *provider;
613
    int i, j;
614
    const char *service_name;
615
    const char *provider_name;
616
    int *pids;
617
    int ret;
618

619 620 621
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

622 623 624
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

625 626
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
627
    /* allocate a single DVB service */
628
    title = av_dict_get(s->metadata, "service_name", NULL, 0);
629
    if (!title)
630
        title = av_dict_get(s->metadata, "title", NULL, 0);
D
Diego Biurrun 已提交
631 632
    service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
    provider      = av_dict_get(s->metadata, "service_provider", NULL, 0);
633
    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
D
Diego Biurrun 已提交
634 635 636
    service       = mpegts_add_service(ts, ts->service_id,
                                       provider_name, service_name);

637 638 639
    if (!service)
        return AVERROR(ENOMEM);

640
    service->pmt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
641 642
    service->pmt.opaque       = s;
    service->pmt.cc           = 15;
643

D
Diego Biurrun 已提交
644 645 646 647
    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;
648
    ts->pat.write_packet = section_write_packet;
D
Diego Biurrun 已提交
649
    ts->pat.opaque       = s;
650

D
Diego Biurrun 已提交
651 652
    ts->sdt.pid          = SDT_PID;
    ts->sdt.cc           = 15;
653
    ts->sdt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
654
    ts->sdt.opaque       = s;
655

656
    pids = av_malloc_array(s->nb_streams, sizeof(*pids));
657
    if (!pids) {
658 659
        ret = AVERROR(ENOMEM);
        goto fail;
660
    }
661

662
    /* assign pids to each stream */
D
Diego Biurrun 已提交
663
    for (i = 0; i < s->nb_streams; i++) {
664
        st = s->streams[i];
665

666
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
667 668
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
669
            goto fail;
670
        }
671
        st->priv_data = ts_st;
672 673 674 675

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

676
        ts_st->payload = av_mallocz(ts->pes_payload_size);
677 678
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
679
            goto fail;
680
        }
681
        ts_st->service = service;
682 683 684
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
685
            ts_st->pid = ts->start_pid + i;
686 687 688
        } else if (st->id < 0x1FFF) {
            ts_st->pid = st->id;
        } else {
D
Diego Biurrun 已提交
689 690
            av_log(s, AV_LOG_ERROR,
                   "Invalid stream id %d, must be less than 8191\n", st->id);
691
            ret = AVERROR(EINVAL);
692 693 694 695
            goto fail;
        }
        if (ts_st->pid == service->pmt.pid) {
            av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
696
            ret = AVERROR(EINVAL);
697 698
            goto fail;
        }
D
Diego Biurrun 已提交
699
        for (j = 0; j < i; j++) {
700 701
            if (pids[j] == ts_st->pid) {
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
702
                ret = AVERROR(EINVAL);
703 704
                goto fail;
            }
D
Diego Biurrun 已提交
705 706 707 708
        }
        pids[i]                = ts_st->pid;
        ts_st->payload_pts     = AV_NOPTS_VALUE;
        ts_st->payload_dts     = AV_NOPTS_VALUE;
709
        ts_st->first_pts_check = 1;
D
Diego Biurrun 已提交
710
        ts_st->cc              = 15;
711
        /* update PCR pid by using the first video stream */
712
        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
713
            service->pcr_pid == 0x1fff) {
714
            service->pcr_pid = ts_st->pid;
D
Diego Biurrun 已提交
715
            pcr_st           = st;
716
        }
717
        if (st->codec->codec_id == AV_CODEC_ID_AAC &&
D
Diego Biurrun 已提交
718
            st->codec->extradata_size > 0) {
719 720 721 722
            AVStream *ast;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
                ret = AVERROR(ENOMEM);
723
                goto fail;
724
            }
D
Diego Biurrun 已提交
725 726 727
            ts_st->amux->oformat =
                av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
                                NULL, NULL);
728 729 730 731
            if (!ts_st->amux->oformat) {
                ret = AVERROR(EINVAL);
                goto fail;
            }
732
            if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
733 734 735
                ret = AVERROR(ENOMEM);
                goto fail;
            }
736 737 738
            ret = avcodec_copy_context(ast->codec, st->codec);
            if (ret != 0)
                goto fail;
739
            ast->time_base = st->time_base;
740 741
            ret = avformat_write_header(ts_st->amux, NULL);
            if (ret < 0)
742
                goto fail;
743
        }
744
    }
745

746
    av_freep(&pids);
747

748 749
    /* if no video stream, use the first stream as PCR */
    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
D
Diego Biurrun 已提交
750 751
        pcr_st           = s->streams[0];
        ts_st            = pcr_st->priv_data;
752
        service->pcr_pid = ts_st->pid;
753 754
    } else
        ts_st = pcr_st->priv_data;
755

756
    if (ts->mux_rate > 1) {
757
        service->pcr_packet_period = (ts->mux_rate * ts->pcr_period) /
D
Diego Biurrun 已提交
758
                                     (TS_PACKET_SIZE * 8 * 1000);
B
Baptiste Coudurier 已提交
759
        ts->sdt_packet_period      = (ts->mux_rate * SDT_RETRANS_TIME) /
D
Diego Biurrun 已提交
760
                                     (TS_PACKET_SIZE * 8 * 1000);
B
Baptiste Coudurier 已提交
761
        ts->pat_packet_period      = (ts->mux_rate * PAT_RETRANS_TIME) /
D
Diego Biurrun 已提交
762
                                     (TS_PACKET_SIZE * 8 * 1000);
B
Baptiste Coudurier 已提交
763

764
        if (ts->copyts < 1)
765
            ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
766
    } else {
767
        /* Arbitrary values, PAT/PMT will also be written on video key frames */
768 769
        ts->sdt_packet_period = 200;
        ts->pat_packet_period = 40;
770
        if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
771 772 773
            if (!pcr_st->codec->frame_size) {
                av_log(s, AV_LOG_WARNING, "frame size not set\n");
                service->pcr_packet_period =
D
Diego Biurrun 已提交
774
                    pcr_st->codec->sample_rate / (10 * 512);
775 776
            } else {
                service->pcr_packet_period =
D
Diego Biurrun 已提交
777
                    pcr_st->codec->sample_rate / (10 * pcr_st->codec->frame_size);
778 779 780
            }
        } else {
            // max delta PCR 0.1s
781
            // TODO: should be avg_frame_rate
782
            service->pcr_packet_period =
783
                ts_st->user_tb.den / (10 * ts_st->user_tb.num);
784
        }
785
        if (!service->pcr_packet_period)
786
            service->pcr_packet_period = 1;
787 788
    }

789 790 791 792 793 794
    ts->last_pat_ts = AV_NOPTS_VALUE;
    // The user specified a period, use only it
    if (ts->pat_period < INT_MAX/2) {
        ts->pat_packet_period = INT_MAX;
    }

795 796
    // output a PCR as soon as possible
    service->pcr_packet_count = service->pcr_packet_period;
D
Diego Biurrun 已提交
797 798
    ts->pat_packet_count      = ts->pat_packet_period - 1;
    ts->sdt_packet_count      = ts->sdt_packet_period - 1;
799

800
    if (ts->mux_rate == 1)
801
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
802
    else
803
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
D
Diego Biurrun 已提交
804 805
    av_log(s, AV_LOG_VERBOSE,
           "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
806
           service->pcr_packet_period,
807
           ts->sdt_packet_period, ts->pat_packet_period);
808

809 810 811 812 813 814 815 816
    if (ts->m2ts_mode == -1) {
        if (av_match_ext(s->filename, "m2ts")) {
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

817 818
    return 0;

D
Diego Biurrun 已提交
819
fail:
820
    av_freep(&pids);
D
Diego Biurrun 已提交
821 822
    for (i = 0; i < s->nb_streams; i++) {
        st    = s->streams[i];
823 824 825
        ts_st = st->priv_data;
        if (ts_st) {
            av_freep(&ts_st->payload);
826 827
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
828
                ts_st->amux = NULL;
829
            }
830
        }
831
        av_freep(&st->priv_data);
832
    }
833 834 835 836 837

    for (i = 0; i < ts->nb_services; i++) {
        service = ts->services[i];
        av_freep(&service->provider_name);
        av_freep(&service->name);
838
        av_freep(&service);
839
    }
840
    av_freep(&ts->services);
841
    return ret;
842 843 844
}

/* send SDT, PAT and PMT tables regulary */
845
static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts)
846 847 848 849
{
    MpegTSWrite *ts = s->priv_data;
    int i;

850
    if (++ts->sdt_packet_count == ts->sdt_packet_period) {
851 852 853
        ts->sdt_packet_count = 0;
        mpegts_write_sdt(s);
    }
854 855 856 857
    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) {
858
        ts->pat_packet_count = 0;
859 860
        if (dts != AV_NOPTS_VALUE)
            ts->last_pat_ts = FFMAX(dts, ts->last_pat_ts);
861
        mpegts_write_pat(s);
D
Diego Biurrun 已提交
862
        for (i = 0; i < ts->nb_services; i++)
863 864 865 866
            mpegts_write_pmt(s, ts->services[i]);
    }
}

867
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
868 869 870 871 872
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
D
Diego Biurrun 已提交
873 874 875
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
876 877
    *buf++ = pcr_low;

878
    return 6;
879 880
}

881 882 883 884 885 886
/* 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 已提交
887
    q    = buf;
888 889 890 891 892
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
893
    mpegts_prefix_m2ts_header(s);
894
    avio_write(s->pb, buf, TS_PACKET_SIZE);
895 896 897 898 899 900 901 902 903 904
}

/* 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 已提交
905
    q    = buf;
906 907 908 909 910 911 912 913 914
    *q++ = 0x47;
    *q++ = ts_st->pid >> 8;
    *q++ = ts_st->pid;
    *q++ = 0x20 | ts_st->cc;   /* Adaptation only */
    /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
    *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
    *q++ = 0x10;               /* Adaptation flags: PCR present */

    /* PCR coded into 6 bytes */
915
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
916 917 918

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
919
    mpegts_prefix_m2ts_header(s);
920
    avio_write(s->pb, buf, TS_PACKET_SIZE);
921 922
}

923 924 925 926
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

D
Diego Biurrun 已提交
927
    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
928
    *q++ = val;
D
Diego Biurrun 已提交
929
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
930 931
    *q++ = val >> 8;
    *q++ = val;
D
Diego Biurrun 已提交
932
    val  = (((pts) & 0x7fff) << 1) | 1;
933 934 935 936
    *q++ = val >> 8;
    *q++ = val;
}

937 938 939 940
/* 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 已提交
941
    av_assert0(flag);
942 943 944 945 946 947 948 949 950 951 952 953 954 955 956

    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 已提交
957
    av_assert0(pkt[3] & 0x20);
958 959 960 961 962 963 964 965 966 967 968 969
    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 已提交
970 971 972 973
/* 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. */
974 975
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
976
                             int64_t pts, int64_t dts, int key)
977 978
{
    MpegTSWriteStream *ts_st = st->priv_data;
979
    MpegTSWrite *ts = s->priv_data;
980
    uint8_t buf[TS_PACKET_SIZE];
981
    uint8_t *q;
982
    int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
983 984
    int afc_len, stuffing_len;
    int64_t pcr = -1; /* avoid warning */
985
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
986
    int force_pat = st->codec->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
987

988 989 990 991 992
    av_assert0(ts_st->payload != buf || st->codec->codec_type != AVMEDIA_TYPE_VIDEO);
    if (ts->flags & MPEGTS_FLAG_PAT_PMT_AT_FRAMES && st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
        force_pat = 1;
    }

993 994
    is_start = 1;
    while (payload_size > 0) {
995
        retransmit_si_info(s, force_pat, dts);
996
        force_pat = 0;
997

998 999
        write_pcr = 0;
        if (ts_st->pid == ts_st->service->pcr_pid) {
1000 1001
            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
                ts_st->service->pcr_packet_count++;
1002
            if (ts_st->service->pcr_packet_count >=
1003
                ts_st->service->pcr_packet_period) {
1004 1005 1006 1007 1008
                ts_st->service->pcr_packet_count = 0;
                write_pcr = 1;
            }
        }

1009
        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
D
Diego Biurrun 已提交
1010
            (dts - get_pcr(ts, s->pb) / 300) > delay) {
1011 1012 1013 1014 1015
            /* 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 已提交
1016 1017
            /* recalculate write_pcr and possibly retransmit si_info */
            continue;
1018 1019
        }

1020
        /* prepare packet header */
D
Diego Biurrun 已提交
1021
        q    = buf;
1022
        *q++ = 0x47;
1023
        val  = ts_st->pid >> 8;
1024 1025
        if (is_start)
            val |= 0x40;
D
Diego Biurrun 已提交
1026 1027
        *q++      = val;
        *q++      = ts_st->pid;
1028
        ts_st->cc = ts_st->cc + 1 & 0xf;
D
Diego Biurrun 已提交
1029
        *q++      = 0x10 | ts_st->cc; // payload indicator + CC
1030 1031 1032 1033 1034 1035 1036
        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);
        }
1037
        if (write_pcr) {
1038 1039
            set_af_flag(buf, 0x10);
            q = get_ts_payload_start(buf);
1040
            // add 11, pcr references the last byte of program clock reference base
1041
            if (ts->mux_rate > 1)
1042
                pcr = get_pcr(ts, s->pb);
1043
            else
D
Diego Biurrun 已提交
1044
                pcr = (dts - delay) * 300;
1045
            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
1046
                av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
1047 1048
            extend_af(buf, write_pcr_bits(q, pcr));
            q = get_ts_payload_start(buf);
1049
        }
1050
        if (is_start) {
1051
            int pes_extension = 0;
1052
            int pes_header_stuffing_bytes = 0;
1053 1054 1055 1056
            /* write PES header */
            *q++ = 0x00;
            *q++ = 0x00;
            *q++ = 0x01;
1057
            is_dvb_subtitle = 0;
1058
            is_dvb_teletext = 0;
1059
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
D
Diego Biurrun 已提交
1060
                if (st->codec->codec_id == AV_CODEC_ID_DIRAC)
1061
                    *q++ = 0xfd;
D
Diego Biurrun 已提交
1062
                else
1063
                    *q++ = 0xe0;
1064
            } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1065 1066 1067
                       (st->codec->codec_id == AV_CODEC_ID_MP2 ||
                        st->codec->codec_id == AV_CODEC_ID_MP3 ||
                        st->codec->codec_id == AV_CODEC_ID_AAC)) {
1068
                *q++ = 0xc0;
1069
            } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1070
                        st->codec->codec_id == AV_CODEC_ID_AC3 &&
1071 1072
                        ts->m2ts_mode) {
                *q++ = 0xfd;
1073 1074
            } else {
                *q++ = 0xbd;
1075
                if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1076 1077 1078 1079 1080
                    if (st->codec->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
                        is_dvb_subtitle = 1;
                    } else if (st->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
                        is_dvb_teletext = 1;
                    }
1081 1082
                }
            }
1083
            header_len = 0;
D
Diego Biurrun 已提交
1084
            flags      = 0;
1085 1086
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
D
Diego Biurrun 已提交
1087
                flags      |= 0x80;
1088
            }
1089
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1090
                header_len += 5;
D
Diego Biurrun 已提交
1091
                flags      |= 0x40;
1092
            }
1093
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1094
                st->codec->codec_id == AV_CODEC_ID_DIRAC) {
1095 1096
                /* set PES_extension_flag */
                pes_extension = 1;
D
Diego Biurrun 已提交
1097
                flags        |= 0x01;
1098

D
Diego Biurrun 已提交
1099 1100 1101
                /* One byte for PES2 extension flag +
                 * one byte for extension length +
                 * one byte for extension id */
1102 1103
                header_len += 3;
            }
1104 1105 1106 1107 1108
            /* 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 &&
                st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1109
                st->codec->codec_id == AV_CODEC_ID_AC3) {
1110 1111 1112 1113 1114
                        /* set PES_extension_flag */
                        pes_extension = 1;
                        flags |= 0x01;
                        header_len += 3;
            }
1115 1116 1117 1118
            if (is_dvb_teletext) {
                pes_header_stuffing_bytes = 0x24 - header_len;
                header_len = 0x24;
            }
1119
            len = payload_size + header_len + 3;
1120 1121 1122 1123 1124
            /* 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++;
            }
1125 1126
            if (len > 0xffff)
                len = 0;
1127
            if (ts->omit_video_pes_length && st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1128 1129
                len = 0;
            }
1130 1131
            *q++ = len >> 8;
            *q++ = len;
D
Diego Biurrun 已提交
1132
            val  = 0x80;
1133 1134
            /* data alignment indicator is required for subtitle and data streams */
            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA)
1135 1136
                val |= 0x04;
            *q++ = val;
1137 1138
            *q++ = flags;
            *q++ = header_len;
1139
            if (pts != AV_NOPTS_VALUE) {
1140 1141 1142
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
1143
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1144 1145
                write_pts(q, 1, dts);
                q += 5;
1146
            }
1147
            if (pes_extension && st->codec->codec_id == AV_CODEC_ID_DIRAC) {
1148
                flags = 0x01;  /* set PES_extension_flag_2 */
D
Diego Biurrun 已提交
1149 1150 1151 1152
                *q++  = flags;
                *q++  = 0x80 | 0x01; /* marker bit + extension length */
                /* Set the stream ID extension flag bit to 0 and
                 * write the extended stream ID. */
1153 1154
                *q++ = 0x00 | 0x60;
            }
1155 1156 1157
            /* For Blu-ray AC3 Audio Setting extended flags */
          if (ts->m2ts_mode &&
              pes_extension &&
1158
              st->codec->codec_id == AV_CODEC_ID_AC3) {
1159 1160 1161 1162 1163 1164 1165
                      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) */
              }


1166 1167 1168 1169 1170 1171 1172
            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;
            }
1173 1174 1175 1176
            if (is_dvb_teletext) {
                memset(q, 0xff, pes_header_stuffing_bytes);
                q += pes_header_stuffing_bytes;
            }
1177
            is_start = 0;
1178
        }
1179 1180 1181 1182
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1183 1184
        if (len > payload_size)
            len = payload_size;
1185 1186 1187 1188 1189 1190 1191
        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,
1192
                        buf + 4 + afc_len,
1193 1194 1195 1196 1197 1198 1199
                        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 已提交
1200
                buf[4]  = stuffing_len - 1;
1201 1202 1203 1204 1205 1206
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
1207 1208 1209 1210 1211 1212 1213 1214

        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 已提交
1215
        payload      += len;
1216
        payload_size -= len;
1217
        mpegts_prefix_m2ts_header(s);
1218
        avio_write(s->pb, buf, TS_PACKET_SIZE);
1219
    }
1220
    ts_st->prev_payload_key = key;
1221 1222
}

1223 1224
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1225
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1226 1227
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
1228 1229
                   "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it "
                   "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1230
            return AVERROR_INVALIDDATA;
1231
        }
1232 1233 1234
        av_log(s, AV_LOG_WARNING, "H.264 bitstream error, startcode missing, size %d", pkt->size);
        if (pkt->size) av_log(s, AV_LOG_WARNING, " data %08X", AV_RB32(pkt->data));
        av_log(s, AV_LOG_WARNING, "\n");
1235 1236 1237 1238
    }
    return 0;
}

1239 1240
static int check_hevc_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1241
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1242 1243 1244 1245
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "HEVC bitstream malformed, no startcode found\n");
            return AVERROR_PATCHWELCOME;
        }
1246 1247 1248
        av_log(s, AV_LOG_WARNING, "HEVC bitstream error, startcode missing, size %d", pkt->size);
        if (pkt->size) av_log(s, AV_LOG_WARNING, " data %08X", AV_RB32(pkt->data));
        av_log(s, AV_LOG_WARNING, "\n");
1249 1250 1251 1252
    }
    return 0;
}

1253
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1254
{
1255
    AVStream *st = s->streams[pkt->stream_index];
1256
    int size = pkt->size;
D
Diego Biurrun 已提交
1257 1258
    uint8_t *buf = pkt->data;
    uint8_t *data = NULL;
1259
    MpegTSWrite *ts = s->priv_data;
1260
    MpegTSWriteStream *ts_st = st->priv_data;
1261
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1262
    int64_t dts = pkt->dts, pts = pkt->pts;
1263

1264
    if (ts->reemit_pat_pmt) {
D
Diego Biurrun 已提交
1265 1266
        av_log(s, AV_LOG_WARNING,
               "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
1267
        ts->reemit_pat_pmt = 0;
D
Diego Biurrun 已提交
1268
        ts->flags         |= MPEGTS_FLAG_REEMIT_PAT_PMT;
1269 1270 1271
    }

    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
1272 1273
        ts->pat_packet_count = ts->pat_packet_period - 1;
        ts->sdt_packet_count = ts->sdt_packet_period - 1;
D
Diego Biurrun 已提交
1274
        ts->flags           &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
1275 1276
    }

1277
    if (ts->copyts < 1) {
1278 1279 1280 1281 1282
        if (pts != AV_NOPTS_VALUE)
            pts += delay;
        if (dts != AV_NOPTS_VALUE)
            dts += delay;
    }
1283

1284
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1285
        av_log(s, AV_LOG_ERROR, "first pts value must be set\n");
1286
        return AVERROR_INVALIDDATA;
1287 1288 1289
    }
    ts_st->first_pts_check = 0;

1290
    if (st->codec->codec_id == AV_CODEC_ID_H264) {
D
Diego Biurrun 已提交
1291
        const uint8_t *p = buf, *buf_end = p + size;
1292
        uint32_t state = -1;
1293
        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codec->extradata_size : 0;
1294 1295 1296
        int ret = ff_check_h264_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1297

1298 1299 1300
        if (extradd && AV_RB24(st->codec->extradata) > 1)
            extradd = 0;

1301
        do {
1302
            p = avpriv_find_start_code(p, buf_end, &state);
1303
            av_log(s, AV_LOG_TRACE, "nal %d\n", state & 0x1f);
1304 1305
            if ((state & 0x1f) == 7)
                extradd = 0;
1306 1307 1308
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

1309 1310
        if ((state & 0x1f) != 5)
            extradd = 0;
1311
        if ((state & 0x1f) != 9) { // AUD NAL
1312
            data = av_malloc(pkt->size + 6 + extradd);
1313
            if (!data)
1314
                return AVERROR(ENOMEM);
1315 1316
            memcpy(data + 6, st->codec->extradata, extradd);
            memcpy(data + 6 + extradd, pkt->data, pkt->size);
1317 1318
            AV_WB32(data, 0x00000001);
            data[4] = 0x09;
1319
            data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
D
Diego Biurrun 已提交
1320
            buf     = data;
1321
            size    = pkt->size + 6 + extradd;
1322
        }
1323
    } else if (st->codec->codec_id == AV_CODEC_ID_AAC) {
1324 1325
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
1326
            return AVERROR_INVALIDDATA;
1327
        }
1328
        if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
1329 1330 1331 1332
            int ret;
            AVPacket pkt2;

            if (!ts_st->amux) {
1333
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
D
Diego Biurrun 已提交
1334
                                        "and extradata missing\n");
1335 1336 1337
                if (!st->nb_frames)
                    return AVERROR_INVALIDDATA;
            } else {
1338 1339 1340
            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
1341 1342
            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 已提交
1343

1344 1345
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1346
                return AVERROR(ENOMEM);
1347 1348 1349

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1350
                ffio_free_dyn_buf(&ts_st->amux->pb);
1351
                return ret;
A
Alex Converse 已提交
1352
            }
D
Diego Biurrun 已提交
1353
            size            = avio_close_dyn_buf(ts_st->amux->pb, &data);
1354
            ts_st->amux->pb = NULL;
D
Diego Biurrun 已提交
1355
            buf             = data;
1356
            }
1357
        }
1358 1359 1360 1361
    } else if (st->codec->codec_id == AV_CODEC_ID_HEVC) {
        int ret = check_hevc_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1362 1363
    }

1364 1365
    if (pkt->dts != AV_NOPTS_VALUE) {
        int i;
1366
        for(i=0; i<s->nb_streams; i++) {
1367 1368
            AVStream *st2 = s->streams[i];
            MpegTSWriteStream *ts_st2 = st2->priv_data;
1369 1370
            if (   ts_st2->payload_size
               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
1371 1372 1373 1374
                mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
                                ts_st2->payload_pts, ts_st2->payload_dts,
                                ts_st2->payload_flags & AV_PKT_FLAG_KEY);
                ts_st2->payload_size = 0;
1375 1376 1377 1378
            }
        }
    }

1379 1380 1381 1382
    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,
                       s->max_delay, AV_TIME_BASE_Q) >= 0))) {
1383
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1384 1385
                         ts_st->payload_pts, ts_st->payload_dts,
                         ts_st->payload_flags & AV_PKT_FLAG_KEY);
1386
        ts_st->payload_size = 0;
1387 1388
    }

1389
    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1390
        av_assert0(!ts_st->payload_size);
1391
        // for video and subtitle, write a single pes packet
D
Diego Biurrun 已提交
1392 1393
        mpegts_write_pes(s, st, buf, size, pts, dts,
                         pkt->flags & AV_PKT_FLAG_KEY);
1394 1395 1396 1397
        av_free(data);
        return 0;
    }

1398
    if (!ts_st->payload_size) {
D
Diego Biurrun 已提交
1399 1400
        ts_st->payload_pts   = pts;
        ts_st->payload_dts   = dts;
1401
        ts_st->payload_flags = pkt->flags;
1402
    }
1403

1404 1405
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1406

1407 1408
    av_free(data);

1409 1410 1411
    return 0;
}

1412
static void mpegts_write_flush(AVFormatContext *s)
1413 1414 1415 1416
{
    int i;

    /* flush current packets */
D
Diego Biurrun 已提交
1417
    for (i = 0; i < s->nb_streams; i++) {
1418 1419
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1420 1421
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1422 1423
                             ts_st->payload_pts, ts_st->payload_dts,
                             ts_st->payload_flags & AV_PKT_FLAG_KEY);
1424
            ts_st->payload_size = 0;
1425
        }
1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444
    }
}

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)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

1445 1446
    if (s->pb)
        mpegts_write_flush(s);
1447

D
Diego Biurrun 已提交
1448
    for (i = 0; i < s->nb_streams; i++) {
1449 1450
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1451
        av_freep(&ts_st->payload);
1452 1453
        if (ts_st->amux) {
            avformat_free_context(ts_st->amux);
1454
            ts_st->amux = NULL;
1455
        }
1456
    }
1457

D
Diego Biurrun 已提交
1458
    for (i = 0; i < ts->nb_services; i++) {
1459 1460 1461
        service = ts->services[i];
        av_freep(&service->provider_name);
        av_freep(&service->name);
1462
        av_freep(&service);
1463
    }
1464
    av_freep(&ts->services);
1465 1466 1467 1468

    return 0;
}

1469 1470
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
D
Diego Biurrun 已提交
1471 1472
      offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1473
    { "mpegts_original_network_id", "Set original_network_id field.",
D
Diego Biurrun 已提交
1474 1475
      offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1476
    { "mpegts_service_id", "Set service_id field.",
D
Diego Biurrun 已提交
1477 1478
      offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502
    { "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" },
1503
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
D
Diego Biurrun 已提交
1504
      offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
1505
      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1506
    { "mpegts_start_pid", "Set the first pid.",
D
Diego Biurrun 已提交
1507
      offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
1508
      { .i64 = 0x0100 }, 0x0020, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
1509 1510 1511
    { "mpegts_m2ts_mode", "Enable m2ts mode.",
      offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_INT,
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
D
Diego Biurrun 已提交
1512 1513 1514
    { "muxrate", NULL,
      offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
      { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1515
    { "pes_payload_size", "Minimum PES packet payload in bytes",
D
Diego Biurrun 已提交
1516 1517 1518 1519
      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,
1520 1521
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1522 1523
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1524
    { "latm", "Use LATM packetization for AAC",
D
Diego Biurrun 已提交
1525 1526
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1527 1528 1529
    { "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" },
1530 1531
    // backward compatibility
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1532 1533
      offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1534
    { "mpegts_copyts", "don't offset dts/pts",
1535 1536
      offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_INT,
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
1537
    { "tables_version", "set PAT, PMT and SDT version",
1538 1539
      offsetof(MpegTSWrite, tables_version), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, 31, AV_OPT_FLAG_ENCODING_PARAM },
1540
    { "omit_video_pes_length", "Omit the PES packet length for video packets",
1541 1542
      offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_INT,
      { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
1543
    { "pcr_period", "PCR retransmission time",
D
Diego Biurrun 已提交
1544 1545
      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_INT,
      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1546 1547 1548
    { "pat_period", "PAT/PMT retransmission time limit in seconds",
      offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_FLOAT,
      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1549 1550 1551 1552
    { NULL },
};

static const AVClass mpegts_muxer_class = {
D
Diego Biurrun 已提交
1553 1554 1555 1556
    .class_name = "MPEGTS muxer",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
1557 1558
};

1559
AVOutputFormat ff_mpegts_muxer = {
D
Diego Biurrun 已提交
1560 1561
    .name           = "mpegts",
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1562 1563
    .mime_type      = "video/MP2T",
    .extensions     = "ts,m2t,m2ts,mts",
D
Diego Biurrun 已提交
1564 1565 1566 1567 1568 1569
    .priv_data_size = sizeof(MpegTSWrite),
    .audio_codec    = AV_CODEC_ID_MP2,
    .video_codec    = AV_CODEC_ID_MPEG2VIDEO,
    .write_header   = mpegts_write_header,
    .write_packet   = mpegts_write_packet,
    .write_trailer  = mpegts_write_end,
1570
    .flags          = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS,
D
Diego Biurrun 已提交
1571
    .priv_class     = &mpegts_muxer_class,
1572
};