mpegtsenc.c 71.2 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 57 58 59 60
    int sid;           /* service ID */
    char *name;
    char *provider_name;
    int pcr_pid;
    int pcr_packet_count;
61
    int pcr_packet_period;
62
    AVProgram *program;
63 64
} MpegTSService;

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

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

    int pmt_start_pid;
    int start_pid;
99
    int m2ts_mode;
100

101 102
    int reemit_pat_pmt; // backward compatibility

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

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

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

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

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

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

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

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

        s->write_packet(s, packet);

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

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

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

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

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

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

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

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

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

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

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

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

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

267
/* NOTE: !str is accepted for an empty string */
268
static void putstr8(uint8_t **q_ptr, const char *str, int write_len)
269 270 271 272 273 274 275 276 277
{
    uint8_t *q;
    int len;

    q = *q_ptr;
    if (!str)
        len = 0;
    else
        len = strlen(str);
278 279
    if (write_len)
        *q++ = len;
280 281 282 283 284
    memcpy(q, str, len);
    q     += len;
    *q_ptr = q;
}

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

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

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

    /* put program info here */

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

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

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

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

            if (!found)
319 320 321
                continue;
        }

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

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

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

                *q++ = 0x05; /* MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'O';
                *q++ = 'p';
                *q++ = 'u';
                *q++ = 's';

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

437 438
                if (st->codecpar->extradata && st->codecpar->extradata_size >= 19) {
                    if (st->codecpar->extradata[18] == 0 && st->codecpar->channels <= 2) {
439
                        /* RTP mapping family */
440 441 442
                        *q++ = st->codecpar->channels;
                    } else if (st->codecpar->extradata[18] == 1 && st->codecpar->channels <= 8 &&
                               st->codecpar->extradata_size >= 21 + st->codecpar->channels) {
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
                        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 */

468 469 470 471 472 473 474 475
                        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;
476 477 478 479 480 481 482
                        } else {
                            /* Unsupported, could write an extended descriptor here */
                            av_log(s, AV_LOG_ERROR, "Unsupported Opus Vorbis-style channel mapping");
                            *q++ = 0xff;
                        }
                    } else {
                        /* Unsupported */
483
                        av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]);
484 485
                        *q++ = 0xff;
                    }
486
                } else if (st->codecpar->channels <= 2) {
487
                    /* Assume RTP mapping family */
488
                    *q++ = st->codecpar->channels;
489 490 491 492 493 494
                } else {
                    /* Unsupported */
                    av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping");
                    *q++ = 0xff;
                }
            }
M
Mean 已提交
495

496 497 498 499 500
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

D
Diego Biurrun 已提交
501 502
                *q++     = 0x0a; /* ISO 639 language descriptor */
                len_ptr  = q++;
503 504 505
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
506 507 508 509
                    if (q - data > SECTION_LENGTH - 4) {
                        err = 1;
                        break;
                    }
510 511 512 513 514 515 516 517
                    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 已提交
518 519 520 521 522 523 524 525
                    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 */
526 527 528 529 530 531

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
532 533
            }
            break;
534
        case AVMEDIA_TYPE_SUBTITLE:
D
Diego Biurrun 已提交
535
        {
536 537 538
           const char default_language[] = "und";
           const char *language = lang && strlen(lang->value) >= 3 ? lang->value : default_language;

539
           if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
540 541 542 543 544 545
               uint8_t *len_ptr;
               int extradata_copied = 0;

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

546 547 548 549 550
               while (strlen(language) >= 3) {
                   if (sizeof(data) - (q - data) < 8) { /* 8 bytes per DVB subtitle substream data */
                       err = 1;
                       break;
                   }
551 552 553 554 555 556 557
                   *q++ = *language++;
                   *q++ = *language++;
                   *q++ = *language++;
                   /* Skip comma */
                   if (*language != '\0')
                       language++;

558 559 560
                   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 */
561 562 563 564 565 566 567
                       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;
568
                       if ((st->codecpar->extradata_size == 4) && (extradata_copied == 0)) {
569
                           /* support of old 4-byte extradata format */
570
                           memcpy(q, st->codecpar->extradata, 4); /* composition_page_id and ancillary_page_id */
571 572 573 574 575 576 577 578 579 580
                           extradata_copied += 4;
                           q += 4;
                       } else {
                           put16(&q, 1); /* composition_page_id */
                           put16(&q, 1); /* ancillary_page_id */
                       }
                   }
               }

               *len_ptr = q - len_ptr - 1;
581
           } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
               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++;

597 598
                   if (st->codecpar->extradata_size - 1 > extradata_copied) {
                       memcpy(q, st->codecpar->extradata + extradata_copied, 2);
599 600 601 602 603 604 605 606 607 608 609 610 611
                       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;
612
            }
D
Diego Biurrun 已提交
613 614
        }
        break;
615
        case AVMEDIA_TYPE_VIDEO:
616 617 618 619 620 621 622
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
                *q++ = 0x05; /*MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'd';
                *q++ = 'r';
                *q++ = 'a';
                *q++ = 'c';
623 624 625 626 627 628 629
            } else if (stream_type == STREAM_TYPE_VIDEO_VC1) {
                *q++ = 0x05; /*MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'V';
                *q++ = 'C';
                *q++ = '-';
                *q++ = '1';
630 631
            }
            break;
632
        case AVMEDIA_TYPE_DATA:
633
            if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV) {
634 635 636 637 638 639
                *q++ = 0x05; /* MPEG-2 registration descriptor */
                *q++ = 4;
                *q++ = 'K';
                *q++ = 'L';
                *q++ = 'V';
                *q++ = 'A';
640
            } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
641 642 643 644 645 646 647 648 649
                const char *tag = "ID3 ";
                *q++ = 0x26; /* metadata descriptor */
                *q++ = 13;
                put16(&q, 0xffff);    /* metadata application format */
                putstr8(&q, tag, 0);
                *q++ = 0xff;        /* metadata format */
                putstr8(&q, tag, 0);
                *q++ = 0;            /* metadata service ID */
                *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
650 651
            }
            break;
652
        }
653 654 655 656 657

        val = 0xf000 | (q - desc_length_ptr - 2);
        desc_length_ptr[0] = val >> 8;
        desc_length_ptr[1] = val;
    }
658 659 660 661 662 663 664

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

665
    mpegts_write_section1(&service->pmt, PMT_TID, service->sid, ts->tables_version, 0, 0,
666
                          data, q - data);
667
    return 0;
668
}
669 670 671 672 673

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

677 678 679
    q = data;
    put16(&q, ts->onid);
    *q++ = 0xff;
D
Diego Biurrun 已提交
680
    for (i = 0; i < ts->nb_services; i++) {
681 682
        service = ts->services[i];
        put16(&q, service->sid);
D
Diego Biurrun 已提交
683
        *q++              = 0xfc | 0x00; /* currently no EIT info */
684
        desc_list_len_ptr = q;
D
Diego Biurrun 已提交
685 686 687
        q                += 2;
        running_status    = 4; /* running */
        free_ca_mode      = 0;
688 689

        /* write only one descriptor for the service name and provider */
D
Diego Biurrun 已提交
690
        *q++         = 0x48;
691 692
        desc_len_ptr = q;
        q++;
693
        *q++         = ts->service_type;
694 695
        putstr8(&q, service->provider_name, 1);
        putstr8(&q, service->name, 1);
696 697 698
        desc_len_ptr[0] = q - desc_len_ptr - 1;

        /* fill descriptor length */
699
        val = (running_status << 13) | (free_ca_mode << 12) |
D
Diego Biurrun 已提交
700
              (q - desc_list_len_ptr - 2);
701 702 703
        desc_list_len_ptr[0] = val >> 8;
        desc_list_len_ptr[1] = val;
    }
704
    mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, ts->tables_version, 0, 0,
705 706 707
                          data, q - data);
}

D
Diego Biurrun 已提交
708
static MpegTSService *mpegts_add_service(MpegTSWrite *ts, int sid,
709
                                         const char *provider_name,
710 711 712 713 714 715 716
                                         const char *name)
{
    MpegTSService *service;

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
D
Diego Biurrun 已提交
717 718
    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
    service->sid           = sid;
719
    service->pcr_pid       = 0x1fff;
720
    service->provider_name = av_strdup(provider_name);
D
Diego Biurrun 已提交
721
    service->name          = av_strdup(name);
722 723 724 725 726
    if (!service->provider_name || !service->name)
        goto fail;
    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
        goto fail;

727
    return service;
728 729 730 731 732
fail:
    av_freep(&service->provider_name);
    av_freep(&service->name);
    av_free(service);
    return NULL;
733 734
}

735 736 737 738 739 740 741 742 743 744 745 746 747 748
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,
749
                   sizeof(tp_extra_header));
750 751 752
    }
}

753 754 755
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
756
    mpegts_prefix_m2ts_header(ctx);
757
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
758 759
}

760
static int mpegts_init(AVFormatContext *s)
761 762 763 764
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st;
    MpegTSService *service;
765
    AVStream *st, *pcr_st = NULL;
766
    AVDictionaryEntry *title, *provider;
767
    int i, j;
768
    const char *service_name;
769
    const char *provider_name;
770
    int *pids;
771
    int ret;
772

773 774 775
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

776 777 778
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

779 780
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
    if (!s->nb_programs) {
        /* allocate a single DVB service */
        title = av_dict_get(s->metadata, "service_name", NULL, 0);
        if (!title)
            title = av_dict_get(s->metadata, "title", NULL, 0);
        service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
        provider      = av_dict_get(s->metadata, "service_provider", NULL, 0);
        provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
        service       = mpegts_add_service(ts, ts->service_id,
                                           provider_name, service_name);

        if (!service)
            return AVERROR(ENOMEM);

        service->pmt.write_packet = section_write_packet;
        service->pmt.opaque       = s;
        service->pmt.cc           = 15;
798
        service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816
    } else {
        for (i = 0; i < s->nb_programs; i++) {
            AVProgram *program = s->programs[i];
            title = av_dict_get(program->metadata, "service_name", NULL, 0);
            if (!title)
                title = av_dict_get(program->metadata, "title", NULL, 0);
            service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
            provider      = av_dict_get(program->metadata, "service_provider", NULL, 0);
            provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
            service       = mpegts_add_service(ts, program->id,
                                               provider_name, service_name);

            if (!service)
                return AVERROR(ENOMEM);

            service->pmt.write_packet = section_write_packet;
            service->pmt.opaque       = s;
            service->pmt.cc           = 15;
817
            service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
818
            service->program          = program;
819 820
        }
    }
821

D
Diego Biurrun 已提交
822 823 824 825
    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;
826
    ts->pat.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
827
    ts->pat.write_packet = section_write_packet;
D
Diego Biurrun 已提交
828
    ts->pat.opaque       = s;
829

D
Diego Biurrun 已提交
830 831
    ts->sdt.pid          = SDT_PID;
    ts->sdt.cc           = 15;
832
    ts->sdt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
833
    ts->sdt.write_packet = section_write_packet;
D
Diego Biurrun 已提交
834
    ts->sdt.opaque       = s;
835

836
    pids = av_malloc_array(s->nb_streams, sizeof(*pids));
837
    if (!pids) {
838 839
        ret = AVERROR(ENOMEM);
        goto fail;
840
    }
841

842
    /* assign pids to each stream */
D
Diego Biurrun 已提交
843
    for (i = 0; i < s->nb_streams; i++) {
844
        AVProgram *program;
845
        st = s->streams[i];
846

847
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
848 849
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
850
            goto fail;
851
        }
852
        st->priv_data = ts_st;
853 854 855 856

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

857
        ts_st->payload = av_mallocz(ts->pes_payload_size);
858 859
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
860
            goto fail;
861
        }
862 863 864 865 866 867 868 869 870 871 872

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

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

942
    av_freep(&pids);
943

944 945
    /* if no video stream, use the first stream as PCR */
    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
D
Diego Biurrun 已提交
946 947
        pcr_st           = s->streams[0];
        ts_st            = pcr_st->priv_data;
948
        service->pcr_pid = ts_st->pid;
949 950
    } else
        ts_st = pcr_st->priv_data;
951

952
    if (ts->mux_rate > 1) {
953
        service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period /
D
Diego Biurrun 已提交
954
                                     (TS_PACKET_SIZE * 8 * 1000);
955
        ts->sdt_packet_period      = (int64_t)ts->mux_rate * SDT_RETRANS_TIME /
D
Diego Biurrun 已提交
956
                                     (TS_PACKET_SIZE * 8 * 1000);
957
        ts->pat_packet_period      = (int64_t)ts->mux_rate * PAT_RETRANS_TIME /
D
Diego Biurrun 已提交
958
                                     (TS_PACKET_SIZE * 8 * 1000);
B
Baptiste Coudurier 已提交
959

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

986
    ts->last_pat_ts = AV_NOPTS_VALUE;
987
    ts->last_sdt_ts = AV_NOPTS_VALUE;
988 989 990 991
    // The user specified a period, use only it
    if (ts->pat_period < INT_MAX/2) {
        ts->pat_packet_period = INT_MAX;
    }
992 993 994
    if (ts->sdt_period < INT_MAX/2) {
        ts->sdt_packet_period = INT_MAX;
    }
995

996 997
    // output a PCR as soon as possible
    service->pcr_packet_count = service->pcr_packet_period;
D
Diego Biurrun 已提交
998 999
    ts->pat_packet_count      = ts->pat_packet_period - 1;
    ts->sdt_packet_count      = ts->sdt_packet_period - 1;
1000

1001
    if (ts->mux_rate == 1)
1002
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
1003
    else
1004
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
D
Diego Biurrun 已提交
1005 1006
    av_log(s, AV_LOG_VERBOSE,
           "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
1007
           service->pcr_packet_period,
1008
           ts->sdt_packet_period, ts->pat_packet_period);
1009

1010 1011 1012 1013 1014 1015 1016 1017
    if (ts->m2ts_mode == -1) {
        if (av_match_ext(s->filename, "m2ts")) {
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

1018 1019
    return 0;

D
Diego Biurrun 已提交
1020
fail:
1021
    av_freep(&pids);
1022
    return ret;
1023 1024
}

1025
/* send SDT, PAT and PMT tables regularly */
1026
static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts)
1027 1028 1029 1030
{
    MpegTSWrite *ts = s->priv_data;
    int i;

1031 1032 1033 1034
    if (++ts->sdt_packet_count == ts->sdt_packet_period ||
        (dts != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
        (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0)
    ) {
1035
        ts->sdt_packet_count = 0;
1036 1037
        if (dts != AV_NOPTS_VALUE)
            ts->last_sdt_ts = FFMAX(dts, ts->last_sdt_ts);
1038 1039
        mpegts_write_sdt(s);
    }
1040 1041 1042 1043
    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) {
1044
        ts->pat_packet_count = 0;
1045 1046
        if (dts != AV_NOPTS_VALUE)
            ts->last_pat_ts = FFMAX(dts, ts->last_pat_ts);
1047
        mpegts_write_pat(s);
D
Diego Biurrun 已提交
1048
        for (i = 0; i < ts->nb_services; i++)
1049 1050 1051 1052
            mpegts_write_pmt(s, ts->services[i]);
    }
}

1053
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
1054 1055 1056 1057 1058
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
D
Diego Biurrun 已提交
1059 1060 1061
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
1062 1063
    *buf++ = pcr_low;

1064
    return 6;
1065 1066
}

1067 1068 1069 1070 1071 1072
/* 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 已提交
1073
    q    = buf;
1074 1075 1076 1077 1078
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
1079
    mpegts_prefix_m2ts_header(s);
1080
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
}

/* 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 已提交
1091
    q    = buf;
1092 1093 1094 1095 1096 1097 1098
    *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 */
1099 1100 1101 1102
    if (ts_st->discontinuity) {
        q[-1] |= 0x80;
        ts_st->discontinuity = 0;
    }
1103 1104

    /* PCR coded into 6 bytes */
1105
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
1106 1107 1108

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
1109
    mpegts_prefix_m2ts_header(s);
1110
    avio_write(s->pb, buf, TS_PACKET_SIZE);
1111 1112
}

1113 1114 1115 1116
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

D
Diego Biurrun 已提交
1117
    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
1118
    *q++ = val;
D
Diego Biurrun 已提交
1119
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
1120 1121
    *q++ = val >> 8;
    *q++ = val;
D
Diego Biurrun 已提交
1122
    val  = (((pts) & 0x7fff) << 1) | 1;
1123 1124 1125 1126
    *q++ = val >> 8;
    *q++ = val;
}

1127 1128 1129 1130
/* 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 已提交
1131
    av_assert0(flag);
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146

    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 已提交
1147
    av_assert0(pkt[3] & 0x20);
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
    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 已提交
1160 1161 1162 1163
/* 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. */
1164 1165
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
1166
                             int64_t pts, int64_t dts, int key, int stream_id)
1167 1168
{
    MpegTSWriteStream *ts_st = st->priv_data;
1169
    MpegTSWrite *ts = s->priv_data;
1170
    uint8_t buf[TS_PACKET_SIZE];
1171
    uint8_t *q;
1172
    int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
1173 1174
    int afc_len, stuffing_len;
    int64_t pcr = -1; /* avoid warning */
1175
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
1176
    int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
1177

1178 1179
    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) {
1180 1181 1182
        force_pat = 1;
    }

1183 1184
    is_start = 1;
    while (payload_size > 0) {
1185
        retransmit_si_info(s, force_pat, dts);
1186
        force_pat = 0;
1187

1188 1189
        write_pcr = 0;
        if (ts_st->pid == ts_st->service->pcr_pid) {
1190 1191
            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
                ts_st->service->pcr_packet_count++;
1192
            if (ts_st->service->pcr_packet_count >=
1193
                ts_st->service->pcr_packet_period) {
1194 1195 1196 1197 1198
                ts_st->service->pcr_packet_count = 0;
                write_pcr = 1;
            }
        }

1199
        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
D
Diego Biurrun 已提交
1200
            (dts - get_pcr(ts, s->pb) / 300) > delay) {
1201 1202 1203 1204 1205
            /* 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 已提交
1206 1207
            /* recalculate write_pcr and possibly retransmit si_info */
            continue;
1208 1209
        }

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

                if (stream_id == 0xbd) /* asynchronous KLV */
                    pts = dts = AV_NOPTS_VALUE;
1276 1277
            } else {
                *q++ = 0xbd;
1278 1279
                if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
                    if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
1280
                        is_dvb_subtitle = 1;
1281
                    } else if (st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
1282 1283
                        is_dvb_teletext = 1;
                    }
1284 1285
                }
            }
1286
            header_len = 0;
D
Diego Biurrun 已提交
1287
            flags      = 0;
1288 1289
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
D
Diego Biurrun 已提交
1290
                flags      |= 0x80;
1291
            }
1292
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1293
                header_len += 5;
D
Diego Biurrun 已提交
1294
                flags      |= 0x40;
1295
            }
1296 1297
            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
                st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1298 1299
                /* set PES_extension_flag */
                pes_extension = 1;
D
Diego Biurrun 已提交
1300
                flags        |= 0x01;
1301

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


1369 1370 1371 1372 1373 1374 1375
            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;
            }
1376 1377 1378 1379
            if (is_dvb_teletext) {
                memset(q, 0xff, pes_header_stuffing_bytes);
                q += pes_header_stuffing_bytes;
            }
1380
            is_start = 0;
1381
        }
1382 1383 1384 1385
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1386 1387
        if (len > payload_size)
            len = payload_size;
1388 1389 1390 1391 1392 1393 1394
        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,
1395
                        buf + 4 + afc_len,
1396 1397 1398 1399 1400 1401 1402
                        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 已提交
1403
                buf[4]  = stuffing_len - 1;
1404 1405 1406 1407 1408 1409
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
1410 1411 1412 1413 1414 1415 1416 1417

        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 已提交
1418
        payload      += len;
1419
        payload_size -= len;
1420
        mpegts_prefix_m2ts_header(s);
1421
        avio_write(s->pb, buf, TS_PACKET_SIZE);
1422
    }
1423
    ts_st->prev_payload_key = key;
1424 1425
}

1426 1427
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1428
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1429 1430
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
1431 1432
                   "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it "
                   "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1433
            return AVERROR_INVALIDDATA;
1434
        }
1435 1436 1437
        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");
1438 1439 1440 1441
    }
    return 0;
}

1442 1443
static int check_hevc_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
{
1444
    if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) {
1445 1446 1447 1448
        if (!st->nb_frames) {
            av_log(s, AV_LOG_ERROR, "HEVC bitstream malformed, no startcode found\n");
            return AVERROR_PATCHWELCOME;
        }
1449 1450 1451
        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");
1452 1453 1454 1455
    }
    return 0;
}

1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
/* 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;
}

1508
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1509
{
1510
    AVStream *st = s->streams[pkt->stream_index];
1511
    int size = pkt->size;
D
Diego Biurrun 已提交
1512 1513
    uint8_t *buf = pkt->data;
    uint8_t *data = NULL;
1514
    MpegTSWrite *ts = s->priv_data;
1515
    MpegTSWriteStream *ts_st = st->priv_data;
1516
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1517
    int64_t dts = pkt->dts, pts = pkt->pts;
1518
    int opus_samples = 0;
1519 1520 1521 1522 1523 1524 1525 1526 1527
    int side_data_size;
    char *side_data = NULL;
    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];
1528

1529
    if (ts->reemit_pat_pmt) {
D
Diego Biurrun 已提交
1530 1531
        av_log(s, AV_LOG_WARNING,
               "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
1532
        ts->reemit_pat_pmt = 0;
D
Diego Biurrun 已提交
1533
        ts->flags         |= MPEGTS_FLAG_REEMIT_PAT_PMT;
1534 1535 1536
    }

    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
1537 1538
        ts->pat_packet_count = ts->pat_packet_period - 1;
        ts->sdt_packet_count = ts->sdt_packet_period - 1;
D
Diego Biurrun 已提交
1539
        ts->flags           &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
1540 1541
    }

1542
    if (ts->copyts < 1) {
1543 1544 1545 1546 1547
        if (pts != AV_NOPTS_VALUE)
            pts += delay;
        if (dts != AV_NOPTS_VALUE)
            dts += delay;
    }
1548

1549
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1550
        av_log(s, AV_LOG_ERROR, "first pts value must be set\n");
1551
        return AVERROR_INVALIDDATA;
1552 1553 1554
    }
    ts_st->first_pts_check = 0;

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

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

1566
        do {
1567
            p = avpriv_find_start_code(p, buf_end, &state);
1568
            av_log(s, AV_LOG_TRACE, "nal %d\n", state & 0x1f);
1569 1570
            if ((state & 0x1f) == 7)
                extradd = 0;
1571 1572 1573
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

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

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

1607 1608
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1609
                return AVERROR(ENOMEM);
1610 1611 1612

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1613
                ffio_free_dyn_buf(&ts_st->amux->pb);
1614
                return ret;
A
Alex Converse 已提交
1615
            }
D
Diego Biurrun 已提交
1616
            size            = avio_close_dyn_buf(ts_st->amux->pb, &data);
1617
            ts_st->amux->pb = NULL;
D
Diego Biurrun 已提交
1618
            buf             = data;
1619
            }
1620
        }
1621
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1622 1623 1624
        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;
1625 1626 1627
        int ret = check_hevc_startcode(s, st, pkt);
        if (ret < 0)
            return ret;
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654

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

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

        if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
            extradd = 0;
        if ((state & 0x7e) != 2*35) { // AUD NAL
            data = av_malloc(pkt->size + 7 + extradd);
            if (!data)
                return AVERROR(ENOMEM);
            memcpy(data + 7, st->codecpar->extradata, extradd);
            memcpy(data + 7 + extradd, pkt->data, pkt->size);
            AV_WB32(data, 0x00000001);
            data[4] = 2*35;
            data[5] = 1;
            data[6] = 0x50; // any slice type (0x4) + rbsp stop one bit
            buf     = data;
            size    = pkt->size + 7 + extradd;
        }
1655
    } else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
1656 1657 1658 1659 1660 1661 1662
        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) {
1663 1664
            uint8_t *side_data;
            int side_data_size;
1665
            int i, n;
1666 1667
            int ctrl_header_size;
            int trim_start = 0, trim_end = 0;
1668 1669 1670

            opus_samples = opus_get_packet_samples(s, pkt);

1671 1672 1673 1674 1675
            side_data = av_packet_get_side_data(pkt,
                                                AV_PKT_DATA_SKIP_SAMPLES,
                                                &side_data_size);

            if (side_data && side_data_size >= 10) {
1676
                trim_end = AV_RL32(side_data + 4) * 48000 / st->codecpar->sample_rate;
1677 1678 1679 1680 1681 1682 1683 1684 1685
            }

            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);
1686 1687 1688 1689 1690
            if (!data)
                return AVERROR(ENOMEM);

            data[0] = 0x7f;
            data[1] = 0xe0;
1691 1692 1693 1694
            if (ts_st->opus_pending_trim_start)
                data[1] |= 0x10;
            if (trim_end)
                data[1] |= 0x08;
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705

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

1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717
            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;
            }

1718 1719
            memcpy(data + i, pkt->data, pkt->size);
            buf     = data;
1720
            size    = ctrl_header_size;
1721 1722 1723 1724 1725
        } 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");
        }
1726 1727
    }

1728 1729
    if (pkt->dts != AV_NOPTS_VALUE) {
        int i;
1730
        for(i=0; i<s->nb_streams; i++) {
1731 1732
            AVStream *st2 = s->streams[i];
            MpegTSWriteStream *ts_st2 = st2->priv_data;
1733 1734
            if (   ts_st2->payload_size
               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
1735
                mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
1736 1737
                                 ts_st2->payload_pts, ts_st2->payload_dts,
                                 ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1738
                ts_st2->payload_size = 0;
1739 1740 1741 1742
            }
        }
    }

1743 1744 1745
    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,
1746 1747
                       s->max_delay, AV_TIME_BASE_Q) >= 0) ||
        ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
1748
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1749
                         ts_st->payload_pts, ts_st->payload_dts,
1750
                         ts_st->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1751
        ts_st->payload_size = 0;
1752
        ts_st->opus_queued_samples = 0;
1753 1754
    }

1755
    if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1756
        av_assert0(!ts_st->payload_size);
1757
        // for video and subtitle, write a single pes packet
D
Diego Biurrun 已提交
1758
        mpegts_write_pes(s, st, buf, size, pts, dts,
1759
                         pkt->flags & AV_PKT_FLAG_KEY, stream_id);
1760
        ts_st->opus_queued_samples = 0;
1761 1762 1763 1764
        av_free(data);
        return 0;
    }

1765
    if (!ts_st->payload_size) {
D
Diego Biurrun 已提交
1766 1767
        ts_st->payload_pts   = pts;
        ts_st->payload_dts   = dts;
1768
        ts_st->payload_flags = pkt->flags;
1769
    }
1770

1771 1772
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1773
    ts_st->opus_queued_samples += opus_samples;
1774

1775 1776
    av_free(data);

1777 1778 1779
    return 0;
}

1780
static void mpegts_write_flush(AVFormatContext *s)
1781 1782 1783 1784
{
    int i;

    /* flush current packets */
D
Diego Biurrun 已提交
1785
    for (i = 0; i < s->nb_streams; i++) {
1786 1787
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1788 1789
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1790
                             ts_st->payload_pts, ts_st->payload_dts,
1791
                             ts_st->payload_flags & AV_PKT_FLAG_KEY, -1);
1792
            ts_st->payload_size = 0;
1793
            ts_st->opus_queued_samples = 0;
1794
        }
1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808
    }
}

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)
1809 1810 1811 1812 1813 1814 1815 1816
{
    if (s->pb)
        mpegts_write_flush(s);

    return 0;
}

static void mpegts_deinit(AVFormatContext *s)
1817 1818 1819 1820 1821
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

D
Diego Biurrun 已提交
1822
    for (i = 0; i < s->nb_streams; i++) {
1823 1824
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1825 1826 1827 1828 1829 1830
        if (ts_st) {
            av_freep(&ts_st->payload);
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
                ts_st->amux = NULL;
            }
1831
        }
1832
    }
1833

D
Diego Biurrun 已提交
1834
    for (i = 0; i < ts->nb_services; i++) {
1835 1836 1837
        service = ts->services[i];
        av_freep(&service->provider_name);
        av_freep(&service->name);
1838
        av_freep(&service);
1839
    }
1840
    av_freep(&ts->services);
1841
}
1842

1843 1844 1845 1846 1847
static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
{
    int ret = 1;
    AVStream *st = s->streams[pkt->stream_index];

1848
    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
1849
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1850 1851 1852
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1853
            ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
1854
    } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
1855
        if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
1856 1857 1858
                             (AV_RB24(pkt->data) != 0x000001 ||
                              (st->codecpar->extradata_size > 0 &&
                               st->codecpar->extradata[0] == 1)))
1859 1860 1861 1862
            ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
    }

    return ret;
1863 1864
}

1865 1866
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
D
Diego Biurrun 已提交
1867 1868
      offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1869
    { "mpegts_original_network_id", "Set original_network_id field.",
D
Diego Biurrun 已提交
1870
      offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT,
1871
      { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1872
    { "mpegts_service_id", "Set service_id field.",
D
Diego Biurrun 已提交
1873 1874
      offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT,
      { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898
    { "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" },
1899 1900 1901
    { "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" },
1902
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
D
Diego Biurrun 已提交
1903
      offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
1904
      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1905
    { "mpegts_start_pid", "Set the first pid.",
D
Diego Biurrun 已提交
1906
      offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
1907
      { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
1908
    { "mpegts_m2ts_mode", "Enable m2ts mode.",
1909
      offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
1910
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
D
Diego Biurrun 已提交
1911 1912 1913
    { "muxrate", NULL,
      offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
      { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1914
    { "pes_payload_size", "Minimum PES packet payload in bytes",
D
Diego Biurrun 已提交
1915 1916 1917 1918
      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,
1919 1920
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1921 1922
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1923
    { "latm", "Use LATM packetization for AAC",
D
Diego Biurrun 已提交
1924 1925
      0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1926 1927 1928
    { "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" },
1929 1930 1931
    { "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" },
1932 1933 1934
    { "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" },
1935 1936
    // backward compatibility
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
D
Diego Biurrun 已提交
1937 1938
      offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1939
    { "mpegts_copyts", "don't offset dts/pts",
1940
      offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_BOOL,
1941
      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
1942
    { "tables_version", "set PAT, PMT and SDT version",
1943 1944
      offsetof(MpegTSWrite, tables_version), AV_OPT_TYPE_INT,
      { .i64 = 0 }, 0, 31, AV_OPT_FLAG_ENCODING_PARAM },
1945
    { "omit_video_pes_length", "Omit the PES packet length for video packets",
1946
      offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
1947
      { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
1948
    { "pcr_period", "PCR retransmission time",
D
Diego Biurrun 已提交
1949 1950
      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_INT,
      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1951
    { "pat_period", "PAT/PMT retransmission time limit in seconds",
1952
      offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
1953
      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1954
    { "sdt_period", "SDT retransmission time limit in seconds",
1955
      offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE,
1956
      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1957 1958 1959 1960
    { NULL },
};

static const AVClass mpegts_muxer_class = {
D
Diego Biurrun 已提交
1961 1962 1963 1964
    .class_name = "MPEGTS muxer",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
1965 1966
};

1967
AVOutputFormat ff_mpegts_muxer = {
D
Diego Biurrun 已提交
1968 1969
    .name           = "mpegts",
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1970 1971
    .mime_type      = "video/MP2T",
    .extensions     = "ts,m2t,m2ts,mts",
D
Diego Biurrun 已提交
1972 1973 1974
    .priv_data_size = sizeof(MpegTSWrite),
    .audio_codec    = AV_CODEC_ID_MP2,
    .video_codec    = AV_CODEC_ID_MPEG2VIDEO,
1975
    .init           = mpegts_init,
D
Diego Biurrun 已提交
1976 1977
    .write_packet   = mpegts_write_packet,
    .write_trailer  = mpegts_write_end,
1978 1979
    .deinit         = mpegts_deinit,
    .check_bitstream = mpegts_check_bitstream,
1980
    .flags          = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS,
D
Diego Biurrun 已提交
1981
    .priv_class     = &mpegts_muxer_class,
1982
};