mpegtsenc.c 71.4 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 82 83
    int nb_services;
    int onid;
    int tsid;
84
    int64_t first_pcr;
85
    int64_t next_pcr;
86
    int mux_rate; ///< set to 1 when VBR
87
    int pes_payload_size;
88 89 90 91

    int transport_stream_id;
    int original_network_id;
    int service_id;
92
    int service_type;
93 94 95

    int pmt_start_pid;
    int start_pid;
96
    int m2ts_mode;
97

98
    int pcr_period_ms;
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
#define MPEGTS_FLAG_SYSTEM_B        0x08
103
#define MPEGTS_FLAG_DISCONT         0x10
104
    int flags;
105
    int copyts;
106
    int tables_version;
107 108
    int64_t pat_period_us;
    int64_t sdt_period_us;
109
    int64_t last_pat_ts;
110
    int64_t last_sdt_ts;
111

R
Reimar Döffinger 已提交
112
    int omit_video_pes_length;
113 114
} MpegTSWrite;

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

119 120 121 122
/* 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

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

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

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

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

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

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

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

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

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

217
#define DEFAULT_PROVIDER_NAME   "FFmpeg"
218
#define DEFAULT_SERVICE_NAME    "Service"
219 220 221 222

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

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

238 239
    int64_t pcr_period; /* PCR period in PCR time base */
    int64_t last_pcr;
240

241 242
    /* For Opus */
    int opus_queued_samples;
243
    int opus_pending_trim_start;
244 245 246 247 248 249
} MpegTSWriteStream;

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

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

263
static void putbuf(uint8_t **q_ptr, const uint8_t *buf, size_t len)
264
{
265 266
    memcpy(*q_ptr, buf, len);
    *q_ptr += len;
267 268
}

269 270 271 272 273 274 275 276 277 278 279 280
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;
}

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

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

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

304
        if (s->nb_programs) {
305 306 307 308 309 310
            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;
311 312 313 314
                    break;
                }

            if (!found)
315 316 317
                continue;
        }

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

389 390 391 392 393 394
        *q++ = stream_type;
        put16(&q, 0xe000 | ts_st->pid);
        desc_length_ptr = q;
        q += 2; /* patched after */

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

416
                put_registration_descriptor(&q, MKTAG('O', 'p', 'u', 's'));
417 418 419 420 421

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

422 423
                if (st->codecpar->extradata && st->codecpar->extradata_size >= 19) {
                    if (st->codecpar->extradata[18] == 0 && st->codecpar->channels <= 2) {
424
                        /* RTP mapping family */
425 426 427
                        *q++ = st->codecpar->channels;
                    } else if (st->codecpar->extradata[18] == 1 && st->codecpar->channels <= 8 &&
                               st->codecpar->extradata_size >= 21 + st->codecpar->channels) {
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
                        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 */

453 454 455 456 457 458 459 460
                        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;
461 462 463 464 465 466 467
                        } else {
                            /* Unsupported, could write an extended descriptor here */
                            av_log(s, AV_LOG_ERROR, "Unsupported Opus Vorbis-style channel mapping");
                            *q++ = 0xff;
                        }
                    } else {
                        /* Unsupported */
468
                        av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]);
469 470
                        *q++ = 0xff;
                    }
471
                } else if (st->codecpar->channels <= 2) {
472
                    /* Assume RTP mapping family */
473
                    *q++ = st->codecpar->channels;
474 475 476 477 478 479
                } else {
                    /* Unsupported */
                    av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping");
                    *q++ = 0xff;
                }
            }
M
Mean 已提交
480

481 482 483 484 485
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

D
Diego Biurrun 已提交
486 487
                *q++     = 0x0a; /* ISO 639 language descriptor */
                len_ptr  = q++;
488 489 490
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
491 492 493 494
                    if (q - data > SECTION_LENGTH - 4) {
                        err = 1;
                        break;
                    }
495 496 497 498 499 500 501 502
                    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 已提交
503 504 505 506 507 508 509 510
                    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 */
511 512 513 514 515 516

                    *len_ptr += 4;
                }

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

524
           if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
525 526 527 528 529 530
               uint8_t *len_ptr;
               int extradata_copied = 0;

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

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

543 544 545
                   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 */
546 547 548 549 550 551 552
                       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;
553
                       if ((st->codecpar->extradata_size == 4) && (extradata_copied == 0)) {
554
                           /* support of old 4-byte extradata format */
555
                           memcpy(q, st->codecpar->extradata, 4); /* composition_page_id and ancillary_page_id */
556 557 558 559 560 561 562 563 564 565
                           extradata_copied += 4;
                           q += 4;
                       } else {
                           put16(&q, 1); /* composition_page_id */
                           put16(&q, 1); /* ancillary_page_id */
                       }
                   }
               }

               *len_ptr = q - len_ptr - 1;
566
           } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581
               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++;

582 583
                   if (st->codecpar->extradata_size - 1 > extradata_copied) {
                       memcpy(q, st->codecpar->extradata + extradata_copied, 2);
584 585 586 587 588 589 590 591 592 593 594 595 596
                       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;
597
            }
D
Diego Biurrun 已提交
598 599
        }
        break;
600
        case AVMEDIA_TYPE_VIDEO:
601
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
602
                put_registration_descriptor(&q, MKTAG('d', 'r', 'a', 'c'));
603
            } else if (stream_type == STREAM_TYPE_VIDEO_VC1) {
604
                put_registration_descriptor(&q, MKTAG('V', 'C', '-', '1'));
605 606
            } else if (stream_type == STREAM_TYPE_VIDEO_HEVC && s->strict_std_compliance <= FF_COMPLIANCE_NORMAL) {
                put_registration_descriptor(&q, MKTAG('H', 'E', 'V', 'C'));
607 608
            }
            break;
609
        case AVMEDIA_TYPE_DATA:
610
            if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV) {
611
                put_registration_descriptor(&q, MKTAG('K', 'L', 'V', 'A'));
612
            } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
613 614 615 616
                const char *tag = "ID3 ";
                *q++ = 0x26; /* metadata descriptor */
                *q++ = 13;
                put16(&q, 0xffff);    /* metadata application format */
617
                putbuf(&q, tag, strlen(tag));
618
                *q++ = 0xff;        /* metadata format */
619
                putbuf(&q, tag, strlen(tag));
620 621
                *q++ = 0;            /* metadata service ID */
                *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
622 623
            }
            break;
624
        }
625 626 627 628 629

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

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

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

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

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

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

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

680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
/* 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;
}

716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
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,
                   sizeof(tp_extra_header));
    }
}

static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
    mpegts_prefix_m2ts_header(ctx);
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
}
740

741
static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
742 743
                                         const AVDictionary *metadata,
                                         AVProgram *program)
744
{
745
    MpegTSWrite *ts = s->priv_data;
746
    MpegTSService *service;
747
    AVDictionaryEntry *title, *provider;
748
    char default_service_name[32];
749 750 751 752 753 754
    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);
755 756
    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;
757 758
    provider      = av_dict_get(metadata, "service_provider", NULL, 0);
    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
759 760 761 762

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
D
Diego Biurrun 已提交
763 764
    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
    service->sid           = sid;
765
    service->pcr_pid       = 0x1fff;
766
    if (encode_str8(service->provider_name, provider_name) < 0 ||
767
        encode_str8(service->name, service_name) < 0) {
768
        av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
769
        goto fail;
770
    }
771 772 773
    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
        goto fail;

774 775 776 777 778 779
    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;

780
    return service;
781 782 783
fail:
    av_free(service);
    return NULL;
784 785
}

786 787 788 789 790
static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st = pcr_st->priv_data;

791 792 793
    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);
794
    } else {
795
        /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */
796
        int64_t frame_period = 0;
797 798 799
        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
            if (!frame_size) {
800 801
               av_log(s, AV_LOG_WARNING, "frame size not set\n");
               frame_size = 512;
802
            }
803 804 805
            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);
806
        }
807 808 809 810
        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;
811 812 813
    }

    // output a PCR as soon as possible
814
    ts_st->last_pcr   = ts->first_pcr - ts_st->pcr_period;
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
}

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);
840 841
            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));
842 843 844 845
        }
    }
}

846
static int mpegts_init(AVFormatContext *s)
847 848
{
    MpegTSWrite *ts = s->priv_data;
849 850
    int i, j;
    int *pids;
851
    int ret;
852

853 854 855
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

856 857 858
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

859 860
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
861 862
    if (!s->nb_programs) {
        /* allocate a single DVB service */
863
        if (!mpegts_add_service(s, ts->service_id, s->metadata, NULL))
864 865 866 867
            return AVERROR(ENOMEM);
    } else {
        for (i = 0; i < s->nb_programs; i++) {
            AVProgram *program = s->programs[i];
868
            if (!mpegts_add_service(s, program->id, program->metadata, program))
869 870 871
                return AVERROR(ENOMEM);
        }
    }
872

D
Diego Biurrun 已提交
873 874 875 876
    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;
877
    ts->pat.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
878
    ts->pat.write_packet = section_write_packet;
D
Diego Biurrun 已提交
879
    ts->pat.opaque       = s;
880

D
Diego Biurrun 已提交
881 882
    ts->sdt.pid          = SDT_PID;
    ts->sdt.cc           = 15;
883
    ts->sdt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
884
    ts->sdt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
885
    ts->sdt.opaque       = s;
886

887
    pids = av_malloc_array(s->nb_streams, sizeof(*pids));
888
    if (!pids) {
889 890
        ret = AVERROR(ENOMEM);
        goto fail;
891
    }
892

893
    /* assign pids to each stream */
D
Diego Biurrun 已提交
894
    for (i = 0; i < s->nb_streams; i++) {
895 896
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st;
897

898
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
899 900
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
901
            goto fail;
902
        }
903
        st->priv_data = ts_st;
904 905 906

        avpriv_set_pts_info(st, 33, 1, 90000);

907
        ts_st->payload = av_mallocz(ts->pes_payload_size);
908 909
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
910
            goto fail;
911
        }
912

913 914 915
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
916
            ts_st->pid = ts->start_pid + i;
917 918 919
        } else if (st->id < 0x1FFF) {
            ts_st->pid = st->id;
        } else {
D
Diego Biurrun 已提交
920 921
            av_log(s, AV_LOG_ERROR,
                   "Invalid stream id %d, must be less than 8191\n", st->id);
922
            ret = AVERROR(EINVAL);
923 924
            goto fail;
        }
925 926 927 928 929 930
        for (j = 0; j < ts->nb_services; j++) {
            if (ts_st->pid == ts->services[j]->pmt.pid) {
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
                ret = AVERROR(EINVAL);
                goto fail;
            }
931
        }
D
Diego Biurrun 已提交
932
        for (j = 0; j < i; j++) {
933 934
            if (pids[j] == ts_st->pid) {
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
935
                ret = AVERROR(EINVAL);
936 937
                goto fail;
            }
D
Diego Biurrun 已提交
938 939 940 941
        }
        pids[i]                = ts_st->pid;
        ts_st->payload_pts     = AV_NOPTS_VALUE;
        ts_st->payload_dts     = AV_NOPTS_VALUE;
942
        ts_st->first_pts_check = 1;
D
Diego Biurrun 已提交
943
        ts_st->cc              = 15;
944
        ts_st->discontinuity   = ts->flags & MPEGTS_FLAG_DISCONT;
945 946
        if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
            st->codecpar->extradata_size > 0) {
947 948 949 950
            AVStream *ast;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
                ret = AVERROR(ENOMEM);
951
                goto fail;
952
            }
D
Diego Biurrun 已提交
953 954 955
            ts_st->amux->oformat =
                av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
                                NULL, NULL);
956 957 958 959
            if (!ts_st->amux->oformat) {
                ret = AVERROR(EINVAL);
                goto fail;
            }
960
            if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
961 962 963
                ret = AVERROR(ENOMEM);
                goto fail;
            }
964
            ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
965 966
            if (ret != 0)
                goto fail;
967
            ast->time_base = st->time_base;
968 969
            ret = avformat_write_header(ts_st->amux, NULL);
            if (ret < 0)
970
                goto fail;
971
        }
972 973
        if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
            ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate;
974
        }
975
    }
976

977
    av_freep(&pids);
978

979 980 981
    if (ts->copyts < 1)
        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);

982 983
    select_pcr_streams(s);

984
    ts->last_pat_ts = AV_NOPTS_VALUE;
985
    ts->last_sdt_ts = AV_NOPTS_VALUE;
986 987
    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);
988

989
    if (ts->mux_rate == 1)
990
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
991
    else
992
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
D
Diego Biurrun 已提交
993
    av_log(s, AV_LOG_VERBOSE,
994 995 996
           "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));
997

998
    if (ts->m2ts_mode == -1) {
999
        if (av_match_ext(s->url, "m2ts")) {
1000 1001 1002 1003 1004 1005
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

1006 1007
    return 0;

D
Diego Biurrun 已提交
1008
fail:
1009
    av_freep(&pids);
1010
    return ret;
1011 1012
}

1013
/* send SDT, PAT and PMT tables regularly */
1014
static void retransmit_si_info(AVFormatContext *s, int force_pat, int force_sdt, int64_t pcr)
1015 1016 1017 1018
{
    MpegTSWrite *ts = s->priv_data;
    int i;

1019 1020 1021
    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
1022
    ) {
1023 1024
        if (pcr != AV_NOPTS_VALUE)
            ts->last_sdt_ts = FFMAX(pcr, ts->last_sdt_ts);
1025 1026
        mpegts_write_sdt(s);
    }
1027 1028
    if ((pcr != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
        (pcr != AV_NOPTS_VALUE && pcr - ts->last_pat_ts >= ts->pat_period) ||
1029
        force_pat) {
1030 1031
        if (pcr != AV_NOPTS_VALUE)
            ts->last_pat_ts = FFMAX(pcr, ts->last_pat_ts);
1032
        mpegts_write_pat(s);
D
Diego Biurrun 已提交
1033
        for (i = 0; i < ts->nb_services; i++)
1034 1035 1036 1037
            mpegts_write_pmt(s, ts->services[i]);
    }
}

1038
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
1039 1040 1041 1042 1043
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
D
Diego Biurrun 已提交
1044 1045 1046
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
1047 1048
    *buf++ = pcr_low;

1049
    return 6;
1050 1051
}

1052 1053 1054 1055 1056 1057
/* 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 已提交
1058
    q    = buf;
1059 1060 1061 1062 1063
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
1064
    mpegts_prefix_m2ts_header(s);
1065
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
}

/* 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 已提交
1076
    q    = buf;
1077 1078 1079 1080 1081 1082 1083
    *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 */
1084 1085 1086 1087
    if (ts_st->discontinuity) {
        q[-1] |= 0x80;
        ts_st->discontinuity = 0;
    }
1088 1089

    /* PCR coded into 6 bytes */
1090
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
1091 1092 1093

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
1094
    mpegts_prefix_m2ts_header(s);
1095
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1096 1097
}

1098 1099 1100 1101
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

D
Diego Biurrun 已提交
1102
    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
1103
    *q++ = val;
D
Diego Biurrun 已提交
1104
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
1105 1106
    *q++ = val >> 8;
    *q++ = val;
D
Diego Biurrun 已提交
1107
    val  = (((pts) & 0x7fff) << 1) | 1;
1108 1109 1110 1111
    *q++ = val >> 8;
    *q++ = val;
}

1112 1113 1114 1115
/* 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 已提交
1116
    av_assert0(flag);
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131

    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 已提交
1132
    av_assert0(pkt[3] & 0x20);
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144
    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 已提交
1145 1146 1147 1148
/* 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. */
1149 1150
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
1151
                             int64_t pts, int64_t dts, int key, int stream_id)
1152 1153
{
    MpegTSWriteStream *ts_st = st->priv_data;
1154
    MpegTSWrite *ts = s->priv_data;
1155
    uint8_t buf[TS_PACKET_SIZE];
1156
    uint8_t *q;
1157
    int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
1158
    int afc_len, stuffing_len;
1159
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
1160
    int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
1161
    int force_sdt = 0;
1162

1163 1164
    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) {
1165 1166 1167
        force_pat = 1;
    }

1168 1169 1170 1171 1172 1173
    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
        force_pat = 1;
        force_sdt = 1;
        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
    }

1174 1175
    is_start = 1;
    while (payload_size > 0) {
1176 1177 1178 1179 1180
        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;
1181

1182
        retransmit_si_info(s, force_pat, force_sdt, pcr);
1183
        force_pat = 0;
1184
        force_sdt = 0;
1185

1186
        write_pcr = 0;
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
        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;
            }
1213 1214 1215 1216 1217 1218 1219 1220 1221
            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;
            }
1222
        } else if (ts_st->pcr_period && pcr != AV_NOPTS_VALUE) {
1223 1224
            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);
1225 1226 1227 1228
                write_pcr = 1;
            }
        }

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

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

D
Diego Biurrun 已提交
1317 1318 1319
                /* One byte for PES2 extension flag +
                 * one byte for extension length +
                 * one byte for extension id */
1320 1321
                header_len += 3;
            }
1322 1323 1324 1325
            /* 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 &&
1326 1327
                st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1328 1329 1330 1331 1332
                        /* set PES_extension_flag */
                        pes_extension = 1;
                        flags |= 0x01;
                        header_len += 3;
            }
1333 1334 1335 1336
            if (is_dvb_teletext) {
                pes_header_stuffing_bytes = 0x24 - header_len;
                header_len = 0x24;
            }
1337
            len = payload_size + header_len + 3;
1338 1339 1340 1341 1342
            /* 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++;
            }
1343 1344
            if (len > 0xffff)
                len = 0;
1345
            if (ts->omit_video_pes_length && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1346 1347
                len = 0;
            }
1348 1349
            *q++ = len >> 8;
            *q++ = len;
D
Diego Biurrun 已提交
1350
            val  = 0x80;
1351
            /* data alignment indicator is required for subtitle and data streams */
1352
            if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
1353 1354
                val |= 0x04;
            *q++ = val;
1355 1356
            *q++ = flags;
            *q++ = header_len;
1357
            if (pts != AV_NOPTS_VALUE) {
1358 1359 1360
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
1361
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1362 1363
                write_pts(q, 1, dts);
                q += 5;
1364
            }
1365
            if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1366
                flags = 0x01;  /* set PES_extension_flag_2 */
D
Diego Biurrun 已提交
1367 1368 1369 1370
                *q++  = flags;
                *q++  = 0x80 | 0x01; /* marker bit + extension length */
                /* Set the stream ID extension flag bit to 0 and
                 * write the extended stream ID. */
1371 1372
                *q++ = 0x00 | 0x60;
            }
1373 1374 1375
            /* For Blu-ray AC3 Audio Setting extended flags */
          if (ts->m2ts_mode &&
              pes_extension &&
1376
              st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1377 1378 1379 1380 1381 1382 1383
                      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) */
              }


1384 1385 1386 1387 1388 1389 1390
            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;
            }
1391 1392 1393 1394
            if (is_dvb_teletext) {
                memset(q, 0xff, pes_header_stuffing_bytes);
                q += pes_header_stuffing_bytes;
            }
1395
            is_start = 0;
1396
        }
1397 1398 1399 1400
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1401 1402
        if (len > payload_size)
            len = payload_size;
1403 1404 1405 1406 1407 1408 1409
        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,
1410
                        buf + 4 + afc_len,
1411 1412 1413 1414 1415 1416 1417
                        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 已提交
1418
                buf[4]  = stuffing_len - 1;
1419 1420 1421 1422 1423 1424
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
1425 1426 1427 1428 1429 1430 1431 1432

        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 已提交
1433
        payload      += len;
1434
        payload_size -= len;
1435
        mpegts_prefix_m2ts_header(s);
1436
        avio_write(s->pb, buf, TS_PACKET_SIZE);
1437
    }
1438
    ts_st->prev_payload_key = key;
1439 1440
}

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

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

1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
/* 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;
}

1525
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1526
{
1527
    AVStream *st = s->streams[pkt->stream_index];
1528
    int size = pkt->size;
D
Diego Biurrun 已提交
1529 1530
    uint8_t *buf = pkt->data;
    uint8_t *data = NULL;
1531
    MpegTSWrite *ts = s->priv_data;
1532
    MpegTSWriteStream *ts_st = st->priv_data;
1533
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1534
    const int64_t max_audio_delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) / 2;
1535
    int64_t dts = pkt->dts, pts = pkt->pts;
1536
    int opus_samples = 0;
1537
    int side_data_size;
1538
    uint8_t *side_data = NULL;
1539 1540 1541 1542 1543 1544 1545
    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];
1546

1547
    if (ts->copyts < 1) {
1548 1549 1550 1551 1552
        if (pts != AV_NOPTS_VALUE)
            pts += delay;
        if (dts != AV_NOPTS_VALUE)
            dts += delay;
    }
1553

1554
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1555
        av_log(s, AV_LOG_ERROR, "first pts value must be set\n");
1556
        return AVERROR_INVALIDDATA;
1557 1558 1559
    }
    ts_st->first_pts_check = 0;

1560
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
D
Diego Biurrun 已提交
1561
        const uint8_t *p = buf, *buf_end = p + size;
1562
        uint32_t state = -1;
1563
        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0;
1564 1565 1566
        int ret = ff_check_h264_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1567

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

1571
        do {
1572
            p = avpriv_find_start_code(p, buf_end, &state);
1573
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
1574 1575
            if ((state & 0x1f) == 7)
                extradd = 0;
1576 1577 1578
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

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

            if (!ts_st->amux) {
1603
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
D
Diego Biurrun 已提交
1604
                                        "and extradata missing\n");
1605
            } else {
1606 1607 1608
            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
1609 1610
            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 已提交
1611

1612 1613
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1614
                return AVERROR(ENOMEM);
1615 1616 1617

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1618
                ffio_free_dyn_buf(&ts_st->amux->pb);
1619
                return ret;
A
Alex Converse 已提交
1620
            }
D
Diego Biurrun 已提交
1621
            size            = avio_close_dyn_buf(ts_st->amux->pb, &data);
1622
            ts_st->amux->pb = NULL;
D
Diego Biurrun 已提交
1623
            buf             = data;
1624
            }
1625
        }
1626
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1627 1628 1629
        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;
1630 1631 1632
        int ret = check_hevc_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1633 1634 1635 1636 1637 1638

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

        do {
            p = avpriv_find_start_code(p, buf_end, &state);
1639
            av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", (state & 0x7e)>>1);
1640 1641 1642 1643 1644
            if ((state & 0x7e) == 2*32)
                extradd = 0;
        } while (p < buf_end && (state & 0x7e) != 2*35 &&
                 (state & 0x7e) >= 2*32);

J
Jun Zhao 已提交
1645
        if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
            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;
        }
1660
    } else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
1661 1662 1663 1664 1665 1666 1667
        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) {
1668 1669
            uint8_t *side_data;
            int side_data_size;
1670
            int i, n;
1671 1672
            int ctrl_header_size;
            int trim_start = 0, trim_end = 0;
1673 1674 1675

            opus_samples = opus_get_packet_samples(s, pkt);

1676 1677 1678 1679 1680
            side_data = av_packet_get_side_data(pkt,
                                                AV_PKT_DATA_SKIP_SAMPLES,
                                                &side_data_size);

            if (side_data && side_data_size >= 10) {
1681
                trim_end = AV_RL32(side_data + 4) * 48000 / st->codecpar->sample_rate;
1682 1683 1684 1685 1686 1687 1688 1689 1690
            }

            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);
1691 1692 1693 1694 1695
            if (!data)
                return AVERROR(ENOMEM);

            data[0] = 0x7f;
            data[1] = 0xe0;
1696 1697 1698 1699
            if (ts_st->opus_pending_trim_start)
                data[1] |= 0x10;
            if (trim_end)
                data[1] |= 0x08;
1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710

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

1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722
            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;
            }

1723 1724
            memcpy(data + i, pkt->data, pkt->size);
            buf     = data;
1725
            size    = ctrl_header_size;
1726 1727 1728 1729 1730
        } 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");
        }
1731 1732
    }

1733 1734
    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 &&
1735
         dts - ts_st->payload_dts >= max_audio_delay) ||
1736
        ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
1737
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1738
                         ts_st->payload_pts, ts_st->payload_dts,
1739
                         ts_st->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1740
        ts_st->payload_size = 0;
1741
        ts_st->opus_queued_samples = 0;
1742 1743
    }

1744
    if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1745
        av_assert0(!ts_st->payload_size);
1746
        // for video and subtitle, write a single pes packet
D
Diego Biurrun 已提交
1747
        mpegts_write_pes(s, st, buf, size, pts, dts,
1748
                         pkt->flags & AV_PKT_FLAG_KEY, stream_id);
1749
        ts_st->opus_queued_samples = 0;
1750 1751 1752 1753
        av_free(data);
        return 0;
    }

1754
    if (!ts_st->payload_size) {
D
Diego Biurrun 已提交
1755 1756
        ts_st->payload_pts   = pts;
        ts_st->payload_dts   = dts;
1757
        ts_st->payload_flags = pkt->flags;
1758
    }
1759

1760 1761
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1762
    ts_st->opus_queued_samples += opus_samples;
1763

1764 1765
    av_free(data);

1766 1767 1768
    return 0;
}

1769
static void mpegts_write_flush(AVFormatContext *s)
1770 1771 1772 1773
{
    int i;

    /* flush current packets */
D
Diego Biurrun 已提交
1774
    for (i = 0; i < s->nb_streams; i++) {
1775 1776
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1777 1778
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1779
                             ts_st->payload_pts, ts_st->payload_dts,
1780
                             ts_st->payload_flags & AV_PKT_FLAG_KEY, -1);
1781
            ts_st->payload_size = 0;
1782
            ts_st->opus_queued_samples = 0;
1783
        }
1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797
    }
}

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)
1798 1799 1800 1801 1802 1803 1804 1805
{
    if (s->pb)
        mpegts_write_flush(s);

    return 0;
}

static void mpegts_deinit(AVFormatContext *s)
1806 1807 1808 1809 1810
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

D
Diego Biurrun 已提交
1811
    for (i = 0; i < s->nb_streams; i++) {
1812 1813
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1814 1815 1816 1817 1818 1819
        if (ts_st) {
            av_freep(&ts_st->payload);
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
                ts_st->amux = NULL;
            }
1820
        }
1821
    }
1822

D
Diego Biurrun 已提交
1823
    for (i = 0; i < ts->nb_services; i++) {
1824
        service = ts->services[i];
1825
        av_freep(&service);
1826
    }
1827
    av_freep(&ts->services);
1828
}
1829

1830 1831 1832 1833 1834
static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
{
    int ret = 1;
    AVStream *st = s->streams[pkt->stream_index];

1835
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
1836
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1837 1838 1839
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1840
            ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
1841
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1842
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1843 1844 1845
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1846 1847 1848 1849
            ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
    }

    return ret;
1850 1851
}

1852 1853
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
D
Diego Biurrun 已提交
1854 1855
      offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1856
    { "mpegts_original_network_id", "Set original_network_id field.",
D
Diego Biurrun 已提交
1857
      offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT,
1858
      { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1859
    { "mpegts_service_id", "Set service_id field.",
D
Diego Biurrun 已提交
1860 1861
      offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885
    { "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" },
1886 1887 1888
    { "hevc_digital_hdtv", "HEVC Digital Television Service.",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV }, 0x01, 0xff,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1889
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
D
Diego Biurrun 已提交
1890
      offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
1891
      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1892
    { "mpegts_start_pid", "Set the first pid.",
D
Diego Biurrun 已提交
1893
      offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
1894
      { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
1895
    { "mpegts_m2ts_mode", "Enable m2ts mode.",
1896
      offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
1897
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
D
Diego Biurrun 已提交
1898 1899 1900
    { "muxrate", NULL,
      offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
      { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1901
    { "pes_payload_size", "Minimum PES packet payload in bytes",
D
Diego Biurrun 已提交
1902 1903 1904 1905
      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,
1906 1907
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1908 1909
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1910
    { "latm", "Use LATM packetization for AAC",
D
Diego Biurrun 已提交
1911 1912
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1913 1914 1915
    { "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" },
1916 1917 1918
    { "system_b", "Conform to System B (DVB) instead of System A (ATSC)",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_SYSTEM_B }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1919 1920 1921
    { "initial_discontinuity", "Mark initial packets as discontinuous",
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1922
    { "mpegts_copyts", "don't offset dts/pts",
1923
      offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_BOOL,
1924
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
1925
    { "tables_version", "set PAT, PMT and SDT version",
1926 1927
      offsetof(MpegTSWrite, tables_version), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, 31, AV_OPT_FLAG_ENCODING_PARAM },
1928
    { "omit_video_pes_length", "Omit the PES packet length for video packets",
1929
      offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
1930
      { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
1931
    { "pcr_period", "PCR retransmission time in milliseconds",
1932
      offsetof(MpegTSWrite, pcr_period_ms), AV_OPT_TYPE_INT,
1933
      { .i64 = -1 }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1934
    { "pat_period", "PAT/PMT retransmission time limit in seconds",
1935 1936
      offsetof(MpegTSWrite, pat_period_us), AV_OPT_TYPE_DURATION,
      { .i64 = PAT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1937
    { "sdt_period", "SDT retransmission time limit in seconds",
1938 1939
      offsetof(MpegTSWrite, sdt_period_us), AV_OPT_TYPE_DURATION,
      { .i64 = SDT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1940 1941 1942 1943
    { NULL },
};

static const AVClass mpegts_muxer_class = {
D
Diego Biurrun 已提交
1944 1945 1946 1947
    .class_name = "MPEGTS muxer",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
1948 1949
};

1950
AVOutputFormat ff_mpegts_muxer = {
D
Diego Biurrun 已提交
1951 1952
    .name           = "mpegts",
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1953 1954
    .mime_type      = "video/MP2T",
    .extensions     = "ts,m2t,m2ts,mts",
D
Diego Biurrun 已提交
1955 1956 1957
    .priv_data_size = sizeof(MpegTSWrite),
    .audio_codec    = AV_CODEC_ID_MP2,
    .video_codec    = AV_CODEC_ID_MPEG2VIDEO,
1958
    .init           = mpegts_init,
D
Diego Biurrun 已提交
1959 1960
    .write_packet   = mpegts_write_packet,
    .write_trailer  = mpegts_write_end,
1961 1962
    .deinit         = mpegts_deinit,
    .check_bitstream = mpegts_check_bitstream,
1963
    .flags          = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS | AVFMT_NODIMENSIONS,
D
Diego Biurrun 已提交
1964
    .priv_class     = &mpegts_muxer_class,
1965
};