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

22
#include "libavutil/bswap.h"
23
#include "libavutil/crc.h"
24
#include "libavutil/dict.h"
25
#include "libavutil/mathematics.h"
26
#include "libavutil/opt.h"
27
#include "libavutil/avassert.h"
28
#include "libavcodec/mpegvideo.h"
29
#include "avformat.h"
30
#include "internal.h"
31 32
#include "mpegts.h"

33 34
#define PCR_TIME_BASE 27000000

35 36 37 38 39 40 41 42 43 44 45 46
/* write DVB SI sections */

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

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

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

typedef struct MpegTSWrite {
58
    const AVClass *av_class;
59 60 61 62
    MpegTSSection pat; /* MPEG2 pat table */
    MpegTSSection sdt; /* MPEG2 sdt table context */
    MpegTSService **services;
    int sdt_packet_count;
63
    int sdt_packet_period;
64
    int pat_packet_count;
65
    int pat_packet_period;
66 67 68
    int nb_services;
    int onid;
    int tsid;
69
    int64_t first_pcr;
70
    int mux_rate; ///< set to 1 when VBR
71
    int pes_payload_size;
72 73 74 75 76 77 78

    int transport_stream_id;
    int original_network_id;
    int service_id;

    int pmt_start_pid;
    int start_pid;
79
    int m2ts_mode;
80

81 82 83 84 85
    int reemit_pat_pmt; // backward compatibility

#define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
#define MPEGTS_FLAG_AAC_LATM        0x02
    int flags;
86 87
} MpegTSWrite;

88 89 90 91
/* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
#define DEFAULT_PES_HEADER_FREQ 16
#define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)

92 93
static const AVOption options[] = {
    { "mpegts_transport_stream_id", "Set transport_stream_id field.",
94
      offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
95
    { "mpegts_original_network_id", "Set original_network_id field.",
96
      offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
97
    { "mpegts_service_id", "Set service_id field.",
98
      offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
99
    { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
100
      offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
101
    { "mpegts_start_pid", "Set the first pid.",
102
      offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
103
    {"mpegts_m2ts_mode", "Enable m2ts mode.",
104
        offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_INT, {.dbl = -1 },
105
        -1,1, AV_OPT_FLAG_ENCODING_PARAM},
106
    { "muxrate", NULL, offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT, {1}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
107 108
    { "pes_payload_size", "Minimum PES packet payload in bytes",
      offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT, {DEFAULT_PES_PAYLOAD_SIZE}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
109 110 111 112 113 114 115 116 117
    { "mpegts_flags", "MPEG-TS muxing flags", offsetof(MpegTSWrite, flags), AV_OPT_TYPE_FLAGS, {.dbl = 0}, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
      0, AV_OPT_TYPE_CONST, {.dbl = MPEGTS_FLAG_REEMIT_PAT_PMT}, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags"},
    { "latm", "Use LATM packetization for AAC",
      0, AV_OPT_TYPE_CONST, {.dbl = MPEGTS_FLAG_AAC_LATM}, 0, INT_MAX,
      AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags"},
    // backward compatibility
118 119
    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
      offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT, {0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
120 121 122 123
    { NULL },
};

static const AVClass mpegts_muxer_class = {
124 125 126 127
    .class_name     = "MPEGTS muxer",
    .item_name      = av_default_item_name,
    .option         = options,
    .version        = LIBAVUTIL_VERSION_INT,
128 129
};

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

139
    crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
140 141 142 143
    buf[len - 4] = (crc >> 24) & 0xff;
    buf[len - 3] = (crc >> 16) & 0xff;
    buf[len - 2] = (crc >> 8) & 0xff;
    buf[len - 1] = (crc) & 0xff;
144

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

static inline void put16(uint8_t **q_ptr, int val)
{
    uint8_t *q;
    q = *q_ptr;
    *q++ = val >> 8;
    *q++ = val;
    *q_ptr = q;
}

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

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

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

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

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

216
#define DEFAULT_PROVIDER_NAME   "FFmpeg"
217 218 219 220 221
#define DEFAULT_SERVICE_NAME    "Service01"

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

typedef struct MpegTSWriteStream {
225
    struct MpegTSService *service;
226 227
    int pid; /* stream associated pid */
    int cc;
228
    int payload_size;
229
    int first_pts_check; ///< first pts check needed
230
    int prev_payload_key;
231
    int64_t payload_pts;
232
    int64_t payload_dts;
233
    int payload_flags;
234
    uint8_t *payload;
235 236 237 238 239

    uint8_t *adata;
    int adata_pos;
    int adata_size;
    AVFormatContext *amux;
240 241 242 243 244 245 246 247
} MpegTSWriteStream;

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

249 250 251 252 253 254 255 256 257 258 259 260
    q = data;
    for(i = 0; i < ts->nb_services; i++) {
        service = ts->services[i];
        put16(&q, service->sid);
        put16(&q, 0xe000 | service->pmt.pid);
    }
    mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0,
                          data, q - data);
}

static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
{
261
    MpegTSWrite *ts = s->priv_data;
262 263 264 265 266 267 268 269 270 271 272 273 274 275
    uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
    int val, stream_type, i;

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

277 278 279
    for(i = 0; i < s->nb_streams; i++) {
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
280
        AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0);
281
        switch(st->codec->codec_id) {
282 283 284
        case CODEC_ID_MPEG1VIDEO:
        case CODEC_ID_MPEG2VIDEO:
            stream_type = STREAM_TYPE_VIDEO_MPEG2;
285
            break;
286 287 288 289 290 291
        case CODEC_ID_MPEG4:
            stream_type = STREAM_TYPE_VIDEO_MPEG4;
            break;
        case CODEC_ID_H264:
            stream_type = STREAM_TYPE_VIDEO_H264;
            break;
292 293 294
        case CODEC_ID_DIRAC:
            stream_type = STREAM_TYPE_VIDEO_DIRAC;
            break;
295 296
        case CODEC_ID_MP2:
        case CODEC_ID_MP3:
297
            stream_type = STREAM_TYPE_AUDIO_MPEG1;
298
            break;
299
        case CODEC_ID_AAC:
300
            stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM) ? STREAM_TYPE_AUDIO_AAC_LATM : STREAM_TYPE_AUDIO_AAC;
301
            break;
302 303 304
        case CODEC_ID_AAC_LATM:
            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
            break;
305
        case CODEC_ID_AC3:
306
            stream_type = STREAM_TYPE_AUDIO_AC3;
307
            break;
308 309 310 311 312 313 314 315 316 317
        default:
            stream_type = STREAM_TYPE_PRIVATE_DATA;
            break;
        }
        *q++ = stream_type;
        put16(&q, 0xe000 | ts_st->pid);
        desc_length_ptr = q;
        q += 2; /* patched after */

        /* write optional descriptors here */
318
        switch(st->codec->codec_type) {
319
        case AVMEDIA_TYPE_AUDIO:
Mean's avatar
Mean committed
320 321 322 323 324
            if(st->codec->codec_id==CODEC_ID_EAC3){
                *q++=0x7a; // EAC3 descriptor see A038 DVB SI
                *q++=1; // 1 byte, all flags sets to 0
                *q++=0; // omit all fields...
            }
325 326 327 328 329 330 331 332
            if(st->codec->codec_id==CODEC_ID_S302M){
                *q++ = 0x05; /* MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'B';
                *q++ = 'S';
                *q++ = 'S';
                *q++ = 'D';
            }
Mean's avatar
Mean committed
333

334 335 336 337 338
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

339
                *q++ = 0x0a; /* ISO 639 language descriptor */
340 341 342 343 344 345 346 347 348 349 350 351
                len_ptr = q++;
                *len_ptr = 0;

                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
                    next = strchr(p, ',');
                    if (strlen(p) != 3 && (!next || next != p + 3))
                        continue; /* not a 3-letter code */

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

352 353 354 355 356 357 358
                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
359
                    *q++ = 0; /* undefined type */
360 361 362 363 364 365

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
366 367
            }
            break;
368
        case AVMEDIA_TYPE_SUBTITLE:
369 370
            {
                const char *language;
371
                language = lang && strlen(lang->value)==3 ? lang->value : "eng";
372 373 374 375 376 377
                *q++ = 0x59;
                *q++ = 8;
                *q++ = language[0];
                *q++ = language[1];
                *q++ = language[2];
                *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */
378 379 380 381
                if(st->codec->extradata_size == 4) {
                    memcpy(q, st->codec->extradata, 4);
                    q += 4;
                } else {
Tomas Härdin's avatar
Tomas Härdin committed
382 383
                    put16(&q, 1); /* page id */
                    put16(&q, 1); /* ancillary page id */
384
                }
385 386
            }
            break;
387
        case AVMEDIA_TYPE_VIDEO:
388 389 390 391 392 393 394 395 396
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
                *q++ = 0x05; /*MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'd';
                *q++ = 'r';
                *q++ = 'a';
                *q++ = 'c';
            }
            break;
397
        }
398 399 400 401 402 403 404

        val = 0xf000 | (q - desc_length_ptr - 2);
        desc_length_ptr[0] = val >> 8;
        desc_length_ptr[1] = val;
    }
    mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0,
                          data, q - data);
405
}
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429

/* NOTE: str == NULL is accepted for an empty string */
static void putstr8(uint8_t **q_ptr, const char *str)
{
    uint8_t *q;
    int len;

    q = *q_ptr;
    if (!str)
        len = 0;
    else
        len = strlen(str);
    *q++ = len;
    memcpy(q, str, len);
    q += len;
    *q_ptr = q;
}

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

431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
    q = data;
    put16(&q, ts->onid);
    *q++ = 0xff;
    for(i = 0; i < ts->nb_services; i++) {
        service = ts->services[i];
        put16(&q, service->sid);
        *q++ = 0xfc | 0x00; /* currently no EIT info */
        desc_list_len_ptr = q;
        q += 2;
        running_status = 4; /* running */
        free_ca_mode = 0;

        /* write only one descriptor for the service name and provider */
        *q++ = 0x48;
        desc_len_ptr = q;
        q++;
        *q++ = 0x01; /* digital television service */
        putstr8(&q, service->provider_name);
        putstr8(&q, service->name);
        desc_len_ptr[0] = q - desc_len_ptr - 1;

        /* fill descriptor length */
453
        val = (running_status << 13) | (free_ca_mode << 12) |
454 455 456 457 458 459 460 461
            (q - desc_list_len_ptr - 2);
        desc_list_len_ptr[0] = val >> 8;
        desc_list_len_ptr[1] = val;
    }
    mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0,
                          data, q - data);
}

462 463 464
static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
                                         int sid,
                                         const char *provider_name,
465 466 467 468 469 470 471
                                         const char *name)
{
    MpegTSService *service;

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
472
    service->pmt.pid = ts->pmt_start_pid + ts->nb_services;
473 474 475 476 477 478 479 480
    service->sid = sid;
    service->provider_name = av_strdup(provider_name);
    service->name = av_strdup(name);
    service->pcr_pid = 0x1fff;
    dynarray_add(&ts->services, &ts->nb_services, service);
    return service;
}

481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
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));
    }
}

499 500 501
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
502
    mpegts_prefix_m2ts_header(ctx);
503
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
504 505
}

506 507 508 509
/* Write callback for audio packetizer */
static int mpegts_audio_write(void *opaque, uint8_t *buf, int size)
{
    MpegTSWriteStream *ts_st = (MpegTSWriteStream *)opaque;
510
    if (ts_st->adata_pos + (int64_t)size > ts_st->adata_size)
511 512 513 514 515 516 517 518
        return AVERROR(EIO);

    memcpy(ts_st->adata + ts_st->adata_pos, buf, size);
    ts_st->adata_pos += size;

    return 0;
}

519 520 521 522 523
static int mpegts_write_header(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st;
    MpegTSService *service;
524
    AVStream *st, *pcr_st = NULL;
525
    AVDictionaryEntry *title, *provider;
526
    int i, j;
527
    const char *service_name;
528
    const char *provider_name;
529
    int *pids;
530
    int ret;
531

532 533 534
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

535 536 537
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

538 539
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
540
    /* allocate a single DVB service */
541
    title = av_dict_get(s->metadata, "service_name", NULL, 0);
542
    if (!title)
543
        title = av_dict_get(s->metadata, "title", NULL, 0);
544
    service_name = title ? title->value : DEFAULT_SERVICE_NAME;
545
    provider = av_dict_get(s->metadata, "service_provider", NULL, 0);
546
    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
547
    service = mpegts_add_service(ts, ts->service_id, provider_name, service_name);
548 549
    service->pmt.write_packet = section_write_packet;
    service->pmt.opaque = s;
550
    service->pmt.cc = 15;
551 552

    ts->pat.pid = PAT_PID;
553
    ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write
554 555 556 557
    ts->pat.write_packet = section_write_packet;
    ts->pat.opaque = s;

    ts->sdt.pid = SDT_PID;
558
    ts->sdt.cc = 15;
559 560 561
    ts->sdt.write_packet = section_write_packet;
    ts->sdt.opaque = s;

562
    pids = av_malloc(s->nb_streams * sizeof(*pids));
563 564 565
    if (!pids)
        return AVERROR(ENOMEM);

566 567 568
    /* assign pids to each stream */
    for(i = 0;i < s->nb_streams; i++) {
        st = s->streams[i];
569
        avpriv_set_pts_info(st, 33, 1, 90000);
570
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
571 572
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
573
            goto fail;
574
        }
575
        st->priv_data = ts_st;
576
        ts_st->payload = av_mallocz(ts->pes_payload_size);
577 578
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
579
            goto fail;
580
        }
581
        ts_st->service = service;
582 583 584
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
585
            ts_st->pid = ts->start_pid + i;
586 587 588 589
        } else if (st->id < 0x1FFF) {
            ts_st->pid = st->id;
        } else {
            av_log(s, AV_LOG_ERROR, "Invalid stream id %d, must be less than 8191\n", st->id);
590
            ret = AVERROR(EINVAL);
591 592 593 594
            goto fail;
        }
        if (ts_st->pid == service->pmt.pid) {
            av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
595
            ret = AVERROR(EINVAL);
596 597 598 599 600
            goto fail;
        }
        for (j = 0; j < i; j++)
            if (pids[j] == ts_st->pid) {
                av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
601
                ret = AVERROR(EINVAL);
602 603 604
                goto fail;
            }
        pids[i] = ts_st->pid;
605
        ts_st->payload_pts = AV_NOPTS_VALUE;
606
        ts_st->payload_dts = AV_NOPTS_VALUE;
607
        ts_st->first_pts_check = 1;
608
        ts_st->cc = 15;
609
        /* update PCR pid by using the first video stream */
610
        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
611
            service->pcr_pid == 0x1fff) {
612
            service->pcr_pid = ts_st->pid;
613
            pcr_st = st;
614
        }
615
        if (st->codec->codec_id == CODEC_ID_AAC &&
616 617 618 619 620 621 622 623
            st->codec->extradata_size > 0)
        {
            AVStream *ast;
            uint8_t *buffer;
            int buffer_size = 32768;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
                ret = AVERROR(ENOMEM);
624
                goto fail;
625 626 627 628 629 630 631 632 633 634 635
            }
            buffer = av_malloc(buffer_size);
            if (!buffer) {
                ret = AVERROR(ENOMEM);
                goto fail;
            }
            ts_st->amux->pb = avio_alloc_context(buffer, buffer_size, AVIO_FLAG_WRITE,
                                                 ts_st, NULL, mpegts_audio_write, NULL);
            if (!ts_st->amux->pb) {
                av_free(buffer);
                ret = AVERROR(ENOMEM);
636
                goto fail;
637
            }
638 639 640 641 642
            ts_st->amux->oformat = av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts", NULL, NULL);
            if (!ts_st->amux->oformat) {
                ret = AVERROR(EINVAL);
                goto fail;
            }
643 644 645 646 647 648
            ast = avformat_new_stream(ts_st->amux, NULL);
            ret = avcodec_copy_context(ast->codec, st->codec);
            if (ret != 0)
                goto fail;
            ret = avformat_write_header(ts_st->amux, NULL);
            if (ret < 0)
649
                goto fail;
650
        }
651
    }
652

653 654
    av_free(pids);

655 656
    /* if no video stream, use the first stream as PCR */
    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
657 658
        pcr_st = s->streams[0];
        ts_st = pcr_st->priv_data;
659 660 661
        service->pcr_pid = ts_st->pid;
    }

662
    if (ts->mux_rate > 1) {
Baptiste Coudurier's avatar
Baptiste Coudurier committed
663 664 665 666 667 668 669
        service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) /
            (TS_PACKET_SIZE * 8 * 1000);
        ts->sdt_packet_period      = (ts->mux_rate * SDT_RETRANS_TIME) /
            (TS_PACKET_SIZE * 8 * 1000);
        ts->pat_packet_period      = (ts->mux_rate * PAT_RETRANS_TIME) /
            (TS_PACKET_SIZE * 8 * 1000);

670
        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
671
    } else {
672
        /* Arbitrary values, PAT/PMT will also be written on video key frames */
673 674
        ts->sdt_packet_period = 200;
        ts->pat_packet_period = 40;
675
        if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
            if (!pcr_st->codec->frame_size) {
                av_log(s, AV_LOG_WARNING, "frame size not set\n");
                service->pcr_packet_period =
                    pcr_st->codec->sample_rate/(10*512);
            } else {
                service->pcr_packet_period =
                    pcr_st->codec->sample_rate/(10*pcr_st->codec->frame_size);
            }
        } else {
            // max delta PCR 0.1s
            service->pcr_packet_period =
                pcr_st->codec->time_base.den/(10*pcr_st->codec->time_base.num);
        }
    }

691 692
    // output a PCR as soon as possible
    service->pcr_packet_count = service->pcr_packet_period;
693 694
    ts->pat_packet_count = ts->pat_packet_period-1;
    ts->sdt_packet_count = ts->sdt_packet_period-1;
695

696 697 698 699 700
    if (ts->mux_rate == 1)
        av_log(s, AV_LOG_INFO, "muxrate VBR, ");
    else
        av_log(s, AV_LOG_INFO, "muxrate %d, ", ts->mux_rate);
    av_log(s, AV_LOG_INFO, "pcr every %d pkts, "
701
           "sdt every %d, pat/pmt every %d pkts\n",
702
           service->pcr_packet_period,
703
           ts->sdt_packet_period, ts->pat_packet_period);
704

705 706 707 708 709 710 711 712
    if (ts->m2ts_mode == -1) {
        if (av_match_ext(s->filename, "m2ts")) {
            ts->m2ts_mode = 1;
        } else {
            ts->m2ts_mode = 0;
        }
    }

713
    avio_flush(s->pb);
714 715 716 717

    return 0;

 fail:
718
    av_free(pids);
719
    for(i = 0;i < s->nb_streams; i++) {
720
        MpegTSWriteStream *ts_st;
721
        st = s->streams[i];
722 723 724
        ts_st = st->priv_data;
        if (ts_st) {
            av_freep(&ts_st->payload);
725
            if (ts_st->amux) {
726 727
                av_freep(&ts_st->amux->pb->buffer);
                av_freep(&ts_st->amux->pb);
728
                avformat_free_context(ts_st->amux);
729
                ts_st->amux = NULL;
730
            }
731
        }
732
        av_freep(&st->priv_data);
733
    }
734
    return ret;
735 736 737
}

/* send SDT, PAT and PMT tables regulary */
738
static void retransmit_si_info(AVFormatContext *s, int force_pat)
739 740 741 742
{
    MpegTSWrite *ts = s->priv_data;
    int i;

743
    if (++ts->sdt_packet_count == ts->sdt_packet_period) {
744 745 746
        ts->sdt_packet_count = 0;
        mpegts_write_sdt(s);
    }
747
    if (++ts->pat_packet_count == ts->pat_packet_period || force_pat) {
748 749 750 751 752 753 754 755
        ts->pat_packet_count = 0;
        mpegts_write_pat(s);
        for(i = 0; i < ts->nb_services; i++) {
            mpegts_write_pmt(s, ts->services[i]);
        }
    }
}

756
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
757 758 759 760 761 762 763
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
    *buf++ = pcr_high >> 9;
    *buf++ = pcr_high >> 1;
764
    *buf++ = pcr_high << 7 | pcr_low >> 8 | 0x7e;
765 766
    *buf++ = pcr_low;

767
    return 6;
768 769
}

770 771 772 773 774 775 776 777 778 779 780 781
/* Write a single null transport stream packet */
static void mpegts_insert_null_packet(AVFormatContext *s)
{
    uint8_t *q;
    uint8_t buf[TS_PACKET_SIZE];

    q = buf;
    *q++ = 0x47;
    *q++ = 0x00 | 0x1f;
    *q++ = 0xff;
    *q++ = 0x10;
    memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
782
    mpegts_prefix_m2ts_header(s);
783
    avio_write(s->pb, buf, TS_PACKET_SIZE);
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
}

/* 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];

    q = buf;
    *q++ = 0x47;
    *q++ = ts_st->pid >> 8;
    *q++ = ts_st->pid;
    *q++ = 0x20 | ts_st->cc;   /* Adaptation only */
    /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
    *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
    *q++ = 0x10;               /* Adaptation flags: PCR present */

    /* PCR coded into 6 bytes */
804
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
805 806 807

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
808
    mpegts_prefix_m2ts_header(s);
809
    avio_write(s->pb, buf, TS_PACKET_SIZE);
810 811
}

812 813 814 815 816 817 818 819 820 821 822 823 824 825
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

    val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
    *q++ = val;
    val = (((pts >> 15) & 0x7fff) << 1) | 1;
    *q++ = val >> 8;
    *q++ = val;
    val = (((pts) & 0x7fff) << 1) | 1;
    *q++ = val >> 8;
    *q++ = val;
}

826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
/* 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
    assert(flag);

    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
    assert(pkt[3] & 0x20);
    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;
}

859 860 861 862 863
/* Add a pes header to the front of payload, and segment into an integer number of
 * ts packets. The final ts packet is padded using an over-sized adaptation header
 * to exactly fill the last ts packet.
 * NOTE: 'payload' contains a complete PES payload.
 */
864 865
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
866
                             int64_t pts, int64_t dts, int key)
867 868
{
    MpegTSWriteStream *ts_st = st->priv_data;
869
    MpegTSWrite *ts = s->priv_data;
870
    uint8_t buf[TS_PACKET_SIZE];
871
    uint8_t *q;
872
    int val, is_start, len, header_len, write_pcr, private_code, flags;
873 874
    int afc_len, stuffing_len;
    int64_t pcr = -1; /* avoid warning */
875
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
876
    int force_pat = st->codec->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
877

878 879
    is_start = 1;
    while (payload_size > 0) {
880 881
        retransmit_si_info(s, force_pat);
        force_pat = 0;
882

883 884
        write_pcr = 0;
        if (ts_st->pid == ts_st->service->pcr_pid) {
885 886
            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
                ts_st->service->pcr_packet_count++;
887
            if (ts_st->service->pcr_packet_count >=
888
                ts_st->service->pcr_packet_period) {
889 890 891 892 893
                ts_st->service->pcr_packet_count = 0;
                write_pcr = 1;
            }
        }

894
        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
895
            (dts - get_pcr(ts, s->pb)/300) > delay) {
896 897 898 899 900 901 902 903
            /* pcr insert gets priority over null packet insert */
            if (write_pcr)
                mpegts_insert_pcr_only(s, st);
            else
                mpegts_insert_null_packet(s);
            continue; /* recalculate write_pcr and possibly retransmit si_info */
        }

904 905 906 907 908 909 910 911 912
        /* prepare packet header */
        q = buf;
        *q++ = 0x47;
        val = (ts_st->pid >> 8);
        if (is_start)
            val |= 0x40;
        *q++ = val;
        *q++ = ts_st->pid;
        ts_st->cc = (ts_st->cc + 1) & 0xf;
913 914 915 916 917 918 919 920
        *q++ = 0x10 | ts_st->cc; // payload indicator + CC
        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);
        }
921
        if (write_pcr) {
922 923
            set_af_flag(buf, 0x10);
            q = get_ts_payload_start(buf);
924
            // add 11, pcr references the last byte of program clock reference base
925
            if (ts->mux_rate > 1)
926
                pcr = get_pcr(ts, s->pb);
927
            else
928 929
                pcr = (dts - delay)*300;
            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
930
                av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
931 932
            extend_af(buf, write_pcr_bits(q, pcr));
            q = get_ts_payload_start(buf);
933
        }
934
        if (is_start) {
935
            int pes_extension = 0;
936 937 938 939
            /* write PES header */
            *q++ = 0x00;
            *q++ = 0x00;
            *q++ = 0x01;
940
            private_code = 0;
941
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
942 943 944 945
                if (st->codec->codec_id == CODEC_ID_DIRAC) {
                    *q++ = 0xfd;
                } else
                    *q++ = 0xe0;
946
            } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
947
                       (st->codec->codec_id == CODEC_ID_MP2 ||
948 949
                        st->codec->codec_id == CODEC_ID_MP3 ||
                        st->codec->codec_id == CODEC_ID_AAC)) {
950
                *q++ = 0xc0;
951 952
            } else {
                *q++ = 0xbd;
953
                if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
954 955 956
                    private_code = 0x20;
                }
            }
957 958 959 960 961 962
            header_len = 0;
            flags = 0;
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
                flags |= 0x80;
            }
963
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
964 965 966
                header_len += 5;
                flags |= 0x40;
            }
967
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
968 969 970 971 972 973 974 975 976 977 978 979
                st->codec->codec_id == CODEC_ID_DIRAC) {
                /* set PES_extension_flag */
                pes_extension = 1;
                flags |= 0x01;

                /*
                * One byte for PES2 extension flag +
                * one byte for extension length +
                * one byte for extension id
                */
                header_len += 3;
            }
980
            len = payload_size + header_len + 3;
981
            if (private_code != 0)
982
                len++;
983 984
            if (len > 0xffff)
                len = 0;
985 986
            *q++ = len >> 8;
            *q++ = len;
987 988
            val = 0x80;
            /* data alignment indicator is required for subtitle data */
989
            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
990 991
                val |= 0x04;
            *q++ = val;
992 993
            *q++ = flags;
            *q++ = header_len;
994
            if (pts != AV_NOPTS_VALUE) {
995 996 997
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
998
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
999 1000
                write_pts(q, 1, dts);
                q += 5;
1001
            }
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
            if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) {
                flags = 0x01;  /* set PES_extension_flag_2 */
                *q++ = flags;
                *q++ = 0x80 | 0x01;  /* marker bit + extension length */
                /*
                * Set the stream id extension flag bit to 0 and
                * write the extended stream id
                */
                *q++ = 0x00 | 0x60;
            }
1012 1013
            if (private_code != 0)
                *q++ = private_code;
1014
            is_start = 0;
1015
        }
1016 1017 1018 1019
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
1020 1021
        if (len > payload_size)
            len = payload_size;
1022 1023 1024 1025 1026 1027 1028
        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,
1029
                        buf + 4 + afc_len,
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
                        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;
                buf[4] = stuffing_len - 1;
                if (stuffing_len >= 2) {
                    buf[5] = 0x00;
                    memset(buf + 6, 0xff, stuffing_len - 2);
                }
            }
        }
        memcpy(buf + TS_PACKET_SIZE - len, payload, len);
1045 1046
        payload += len;
        payload_size -= len;
1047
        mpegts_prefix_m2ts_header(s);
1048
        avio_write(s->pb, buf, TS_PACKET_SIZE);
1049
    }
1050
    avio_flush(s->pb);
1051
    ts_st->prev_payload_key = key;
1052 1053
}

1054
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1055
{
1056
    AVStream *st = s->streams[pkt->stream_index];
1057
    int size = pkt->size;
1058
    uint8_t *buf= pkt->data;
1059
    uint8_t *data= NULL;
1060
    MpegTSWrite *ts = s->priv_data;
1061
    MpegTSWriteStream *ts_st = st->priv_data;
1062
    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
1063 1064
    int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;

1065
    if (ts->reemit_pat_pmt) {
1066 1067 1068 1069 1070 1071
        av_log(s, AV_LOG_WARNING, "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
        ts->reemit_pat_pmt = 0;
        ts->flags |= MPEGTS_FLAG_REEMIT_PAT_PMT;
    }

    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
1072 1073
        ts->pat_packet_count = ts->pat_packet_period - 1;
        ts->sdt_packet_count = ts->sdt_packet_period - 1;
1074
        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
1075 1076
    }

1077 1078 1079 1080
    if (pkt->pts != AV_NOPTS_VALUE)
        pts = pkt->pts + delay;
    if (pkt->dts != AV_NOPTS_VALUE)
        dts = pkt->dts + delay;
1081

1082 1083
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
        av_log(s, AV_LOG_ERROR, "first pts value must set\n");
1084
        return AVERROR_INVALIDDATA;
1085 1086 1087
    }
    ts_st->first_pts_check = 0;

1088
    if (st->codec->codec_id == CODEC_ID_H264) {
1089 1090 1091
        const uint8_t *p = buf, *buf_end = p+size;
        uint32_t state = -1;

1092
        if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
1093
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
1094
                   "no startcode found, use the h264_mp4toannexb bitstream filter (-bsf h264_mp4toannexb)\n");
1095
            return AVERROR(EINVAL);
1096
        }
1097 1098

        do {
1099
            p = avpriv_mpv_find_start_code(p, buf_end, &state);
1100 1101 1102 1103 1104
            //av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

        if ((state & 0x1f) != 9) { // AUD NAL
1105 1106
            data = av_malloc(pkt->size+6);
            if (!data)
1107
                return AVERROR(ENOMEM);
1108 1109 1110
            memcpy(data+6, pkt->data, pkt->size);
            AV_WB32(data, 0x00000001);
            data[4] = 0x09;
1111
            data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
1112 1113 1114
            buf  = data;
            size = pkt->size+6;
        }
1115
    } else if (st->codec->codec_id == CODEC_ID_AAC) {
1116 1117
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
1118
            return AVERROR_INVALIDDATA;
1119
        }
1120
        if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
1121 1122 1123 1124
            int ret;
            AVPacket pkt2;

            if (!ts_st->amux) {
1125
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
1126
                       "and extradata missing\n");
1127
                return AVERROR_INVALIDDATA;
1128
            }
1129 1130 1131 1132 1133 1134 1135

            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
            ts_st->adata_size = 1024 + pkt->size;
            ts_st->adata = data = av_malloc(ts_st->adata_size);
            ts_st->adata_pos = 0;
1136
            if (!data)
1137
                return AVERROR(ENOMEM);
1138 1139 1140

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1141
                av_free(data);
1142
                return ret;
1143
            }
1144 1145 1146 1147
            avio_flush(ts_st->amux->pb);
            if (ts_st->amux->pb->error < 0) {
                av_free(data);
                return ts_st->amux->pb->error;
1148
            }
1149 1150
            buf = ts_st->adata;
            size = ts_st->adata_pos;
1151
        }
1152 1153
    }

1154 1155 1156 1157 1158 1159 1160
    if (pkt->dts != AV_NOPTS_VALUE) {
        int i;
        for(i=0; i<s->nb_streams; i++){
            AVStream *st2 = s->streams[i];
            MpegTSWriteStream *ts_st2 = st2->priv_data;
            if(   ts_st2->payload_size
               && ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2){
1161 1162 1163 1164
                mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
                                ts_st2->payload_pts, ts_st2->payload_dts,
                                ts_st2->payload_flags & AV_PKT_FLAG_KEY);
                ts_st2->payload_size = 0;
1165 1166 1167 1168
            }
        }
    }

1169
    if (ts_st->payload_size && ts_st->payload_size + size > ts->pes_payload_size) {
1170
        mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1171 1172
                         ts_st->payload_pts, ts_st->payload_dts,
                         ts_st->payload_flags & AV_PKT_FLAG_KEY);
1173
        ts_st->payload_size = 0;
1174 1175
    }

1176
    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO || size > ts->pes_payload_size) {
1177
        av_assert0(!ts_st->payload_size);
1178 1179 1180 1181 1182 1183
        // for video and subtitle, write a single pes packet
        mpegts_write_pes(s, st, buf, size, pts, dts, pkt->flags & AV_PKT_FLAG_KEY);
        av_free(data);
        return 0;
    }

1184
    if (!ts_st->payload_size) {
1185 1186
        ts_st->payload_pts = pts;
        ts_st->payload_dts = dts;
1187
        ts_st->payload_flags = pkt->flags;
1188
    }
1189

1190 1191
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1192

1193 1194
    av_free(data);

1195 1196 1197
    return 0;
}

1198
static void mpegts_write_flush(AVFormatContext *s)
1199 1200 1201 1202 1203
{
    int i;

    /* flush current packets */
    for(i = 0; i < s->nb_streams; i++) {
1204 1205
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1206 1207
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1208 1209
                             ts_st->payload_pts, ts_st->payload_dts,
                             ts_st->payload_flags & AV_PKT_FLAG_KEY);
1210
            ts_st->payload_size = 0;
1211
        }
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
    }
    avio_flush(s->pb);
}

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

static int mpegts_write_end(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSService *service;
    int i;

    mpegts_write_flush(s);

    for(i = 0; i < s->nb_streams; i++) {
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1237
        av_freep(&ts_st->payload);
1238
        if (ts_st->amux) {
1239 1240
            av_freep(&ts_st->amux->pb->buffer);
            av_freep(&ts_st->amux->pb);
1241
            avformat_free_context(ts_st->amux);
1242
            ts_st->amux = NULL;
1243
        }
1244
    }
1245

1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
    for(i = 0; i < ts->nb_services; i++) {
        service = ts->services[i];
        av_freep(&service->provider_name);
        av_freep(&service->name);
        av_free(service);
    }
    av_free(ts->services);

    return 0;
}

1257
AVOutputFormat ff_mpegts_muxer = {
1258 1259 1260
    .name              = "mpegts",
    .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
    .mime_type         = "video/x-mpegts",
1261
    .extensions        = "ts,m2t,m2ts,mts",
1262 1263 1264 1265 1266 1267
    .priv_data_size    = sizeof(MpegTSWrite),
    .audio_codec       = CODEC_ID_MP2,
    .video_codec       = CODEC_ID_MPEG2VIDEO,
    .write_header      = mpegts_write_header,
    .write_packet      = mpegts_write_packet,
    .write_trailer     = mpegts_write_end,
1268
    .flags             = AVFMT_ALLOW_FLUSH,
1269
    .priv_class        = &mpegts_muxer_class,
1270
};