mpegtsenc.c 37.9 KB
Newer Older
1
/*
2
 * MPEG2 transport stream (aka DVB) muxer
3
 * Copyright (c) 2003 Fabrice Bellard
4
 *
5
 * This file is part of Libav.
6
 *
7
 * Libav 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
 * Libav 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 Libav; 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/intreadwrite.h"
26
#include "libavutil/mathematics.h"
27
#include "libavutil/opt.h"
28
#include "libavcodec/internal.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

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

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

87 88 89 90
/* 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)

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

static const AVClass mpegts_muxer_class = {
120 121 122 123
    .class_name     = "MPEGTS muxer",
    .item_name      = av_default_item_name,
    .option         = options,
    .version        = LIBAVUTIL_VERSION_INT,
124 125
};

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

M
Måns Rullgård 已提交
135
    crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
136 137 138 139
    buf[len - 4] = (crc >> 24) & 0xff;
    buf[len - 3] = (crc >> 16) & 0xff;
    buf[len - 2] = (crc >> 8) & 0xff;
    buf[len - 1] = (crc) & 0xff;
140

141 142 143 144 145 146 147 148 149 150 151
    /* 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;
152
        s->cc = (s->cc + 1) & 0xf;
153
        *q++ = 0x10 | s->cc;
154 155 156
        if (first)
            *q++ = 0; /* 0 offset */
        len1 = TS_PACKET_SIZE - (q - packet);
157
        if (len1 > len)
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
            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;
}

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

191 192 193 194 195 196 197
    tot_len = 3 + 5 + len + 4;
    /* check if not too big */
    if (tot_len > 1024)
        return -1;

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

205 206 207 208 209 210 211
    mpegts_write_section(s, section, tot_len);
    return 0;
}

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

212
#define DEFAULT_PROVIDER_NAME   "Libav"
213 214 215 216 217
#define DEFAULT_SERVICE_NAME    "Service01"

/* we retransmit the SI info at this rate */
#define SDT_RETRANS_TIME 500
#define PAT_RETRANS_TIME 100
218
#define PCR_RETRANS_TIME 20
219 220

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

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

240 241 242 243 244 245 246 247 248 249 250 251
    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)
{
252
    MpegTSWrite *ts = s->priv_data;
253 254 255 256 257 258 259 260 261 262 263 264 265 266
    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;
267

268 269 270
    for(i = 0; i < s->nb_streams; i++) {
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
271
        AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0);
272
        switch(st->codec->codec_id) {
273 274
        case AV_CODEC_ID_MPEG1VIDEO:
        case AV_CODEC_ID_MPEG2VIDEO:
275
            stream_type = STREAM_TYPE_VIDEO_MPEG2;
276
            break;
277
        case AV_CODEC_ID_MPEG4:
278 279
            stream_type = STREAM_TYPE_VIDEO_MPEG4;
            break;
280
        case AV_CODEC_ID_H264:
281 282
            stream_type = STREAM_TYPE_VIDEO_H264;
            break;
283 284 285
        case AV_CODEC_ID_CAVS:
            stream_type = STREAM_TYPE_VIDEO_CAVS;
            break;
286
        case AV_CODEC_ID_DIRAC:
287 288
            stream_type = STREAM_TYPE_VIDEO_DIRAC;
            break;
289 290
        case AV_CODEC_ID_MP2:
        case AV_CODEC_ID_MP3:
291
            stream_type = STREAM_TYPE_AUDIO_MPEG1;
292
            break;
293
        case AV_CODEC_ID_AAC:
294
            stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM) ? STREAM_TYPE_AUDIO_AAC_LATM : STREAM_TYPE_AUDIO_AAC;
295
            break;
296
        case AV_CODEC_ID_AAC_LATM:
297 298
            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
            break;
299
        case AV_CODEC_ID_AC3:
300
            stream_type = STREAM_TYPE_AUDIO_AC3;
301
            break;
302 303 304 305 306 307 308 309 310 311
        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 */
312
        switch(st->codec->codec_type) {
313
        case AVMEDIA_TYPE_AUDIO:
314 315 316 317 318
            if (lang) {
                char *p;
                char *next = lang->value;
                uint8_t *len_ptr;

319
                *q++ = 0x0a; /* ISO 639 language descriptor */
320 321 322 323 324 325 326 327 328 329 330 331
                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++;

332 333 334 335 336 337 338
                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
M
Mans Rullgard 已提交
339
                    *q++ = 0; /* undefined type */
340 341 342 343 344 345

                    *len_ptr += 4;
                }

                if (*len_ptr == 0)
                    q -= 2; /* no language codes were written */
346 347
            }
            break;
348
        case AVMEDIA_TYPE_SUBTITLE:
349 350
            {
                const char *language;
351
                language = lang && strlen(lang->value)==3 ? lang->value : "eng";
352 353 354 355 356 357
                *q++ = 0x59;
                *q++ = 8;
                *q++ = language[0];
                *q++ = language[1];
                *q++ = language[2];
                *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */
358 359 360 361
                if(st->codec->extradata_size == 4) {
                    memcpy(q, st->codec->extradata, 4);
                    q += 4;
                } else {
T
Tomas Härdin 已提交
362 363
                    put16(&q, 1); /* page id */
                    put16(&q, 1); /* ancillary page id */
364
                }
365 366
            }
            break;
367
        case AVMEDIA_TYPE_VIDEO:
368 369 370 371 372 373 374 375 376
            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
                *q++ = 0x05; /*MPEG-2 registration descriptor*/
                *q++ = 4;
                *q++ = 'd';
                *q++ = 'r';
                *q++ = 'a';
                *q++ = 'c';
            }
            break;
377
        }
378 379 380 381 382 383 384

        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);
385
}
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409

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

411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
    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 */
433
        val = (running_status << 13) | (free_ca_mode << 12) |
434 435 436 437 438 439 440 441
            (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);
}

442 443 444
static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
                                         int sid,
                                         const char *provider_name,
445 446 447 448 449 450 451
                                         const char *name)
{
    MpegTSService *service;

    service = av_mallocz(sizeof(MpegTSService));
    if (!service)
        return NULL;
452
    service->pmt.pid = ts->pmt_start_pid + ts->nb_services;
453 454 455 456 457 458 459 460 461 462 463
    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;
}

static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
    AVFormatContext *ctx = s->opaque;
464
    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
465 466 467 468 469 470 471
}

static int mpegts_write_header(AVFormatContext *s)
{
    MpegTSWrite *ts = s->priv_data;
    MpegTSWriteStream *ts_st;
    MpegTSService *service;
472
    AVStream *st, *pcr_st = NULL;
473
    AVDictionaryEntry *title, *provider;
474
    int i, j;
475
    const char *service_name;
476
    const char *provider_name;
477
    int *pids;
478
    int ret;
479

480 481 482
    if (s->max_delay < 0) /* Not set by the caller */
        s->max_delay = 0;

483 484 485
    // round up to a whole number of TS packets
    ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;

486 487
    ts->tsid = ts->transport_stream_id;
    ts->onid = ts->original_network_id;
488
    /* allocate a single DVB service */
489
    title = av_dict_get(s->metadata, "service_name", NULL, 0);
490
    if (!title)
491
        title = av_dict_get(s->metadata, "title", NULL, 0);
492
    service_name = title ? title->value : DEFAULT_SERVICE_NAME;
493
    provider = av_dict_get(s->metadata, "service_provider", NULL, 0);
494
    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
495
    service = mpegts_add_service(ts, ts->service_id, provider_name, service_name);
496 497
    service->pmt.write_packet = section_write_packet;
    service->pmt.opaque = s;
498
    service->pmt.cc = 15;
499 500

    ts->pat.pid = PAT_PID;
501
    ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write
502 503 504 505
    ts->pat.write_packet = section_write_packet;
    ts->pat.opaque = s;

    ts->sdt.pid = SDT_PID;
506
    ts->sdt.cc = 15;
507 508 509
    ts->sdt.write_packet = section_write_packet;
    ts->sdt.opaque = s;

510
    pids = av_malloc(s->nb_streams * sizeof(*pids));
511 512 513
    if (!pids)
        return AVERROR(ENOMEM);

514 515 516
    /* assign pids to each stream */
    for(i = 0;i < s->nb_streams; i++) {
        st = s->streams[i];
517
        avpriv_set_pts_info(st, 33, 1, 90000);
518
        ts_st = av_mallocz(sizeof(MpegTSWriteStream));
519 520
        if (!ts_st) {
            ret = AVERROR(ENOMEM);
521
            goto fail;
522
        }
523
        st->priv_data = ts_st;
524
        ts_st->payload = av_mallocz(ts->pes_payload_size);
525 526
        if (!ts_st->payload) {
            ret = AVERROR(ENOMEM);
527
            goto fail;
528
        }
529
        ts_st->service = service;
530 531 532
        /* MPEG pid values < 16 are reserved. Applications which set st->id in
         * this range are assigned a calculated pid. */
        if (st->id < 16) {
533
            ts_st->pid = ts->start_pid + i;
534 535 536 537
        } 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);
538
            ret = AVERROR(EINVAL);
539 540 541 542
            goto fail;
        }
        if (ts_st->pid == service->pmt.pid) {
            av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
543
            ret = AVERROR(EINVAL);
544 545 546 547 548
            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);
549
                ret = AVERROR(EINVAL);
550 551 552
                goto fail;
            }
        pids[i] = ts_st->pid;
553
        ts_st->payload_pts = AV_NOPTS_VALUE;
554
        ts_st->payload_dts = AV_NOPTS_VALUE;
555
        ts_st->first_pts_check = 1;
556
        ts_st->cc = 15;
557
        /* update PCR pid by using the first video stream */
558
        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
559
            service->pcr_pid == 0x1fff) {
560
            service->pcr_pid = ts_st->pid;
561
            pcr_st = st;
562
        }
563
        if (st->codec->codec_id == AV_CODEC_ID_AAC &&
564 565 566 567 568 569
            st->codec->extradata_size > 0)
        {
            AVStream *ast;
            ts_st->amux = avformat_alloc_context();
            if (!ts_st->amux) {
                ret = AVERROR(ENOMEM);
570
                goto fail;
571
            }
572 573 574 575 576
            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;
            }
577 578 579 580 581 582
            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)
583
                goto fail;
584
        }
585
    }
586

587 588
    av_free(pids);

589 590
    /* if no video stream, use the first stream as PCR */
    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
591 592
        pcr_st = s->streams[0];
        ts_st = pcr_st->priv_data;
593 594 595
        service->pcr_pid = ts_st->pid;
    }

596
    if (ts->mux_rate > 1) {
B
Baptiste Coudurier 已提交
597 598 599 600 601 602 603
        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);

604
        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
605 606 607 608
    } else {
        /* Arbitrary values, PAT/PMT could be written on key frames */
        ts->sdt_packet_period = 200;
        ts->pat_packet_period = 40;
609
        if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
            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);
        }
    }

625 626
    // output a PCR as soon as possible
    service->pcr_packet_count = service->pcr_packet_period;
627 628
    ts->pat_packet_count = ts->pat_packet_period-1;
    ts->sdt_packet_count = ts->sdt_packet_period-1;
629

630
    if (ts->mux_rate == 1)
631
        av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
632
    else
633 634
        av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
    av_log(s, AV_LOG_VERBOSE, "pcr every %d pkts, "
635
           "sdt every %d, pat/pmt every %d pkts\n",
636
           service->pcr_packet_period,
637
           ts->sdt_packet_period, ts->pat_packet_period);
638

639
    avio_flush(s->pb);
640 641 642 643

    return 0;

 fail:
644
    av_free(pids);
645
    for(i = 0;i < s->nb_streams; i++) {
646
        MpegTSWriteStream *ts_st;
647
        st = s->streams[i];
648 649 650
        ts_st = st->priv_data;
        if (ts_st) {
            av_freep(&ts_st->payload);
651 652
            if (ts_st->amux) {
                avformat_free_context(ts_st->amux);
653
                ts_st->amux = NULL;
654
            }
655
        }
656
        av_freep(&st->priv_data);
657
    }
658
    return ret;
659 660 661 662 663 664 665 666
}

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

667
    if (++ts->sdt_packet_count == ts->sdt_packet_period) {
668 669 670
        ts->sdt_packet_count = 0;
        mpegts_write_sdt(s);
    }
671
    if (++ts->pat_packet_count == ts->pat_packet_period) {
672 673 674 675 676 677 678 679
        ts->pat_packet_count = 0;
        mpegts_write_pat(s);
        for(i = 0; i < ts->nb_services; i++) {
            mpegts_write_pmt(s, ts->services[i]);
        }
    }
}

680
static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
681
{
682
    return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
683 684 685
           ts->first_pcr;
}

686
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
687 688 689 690 691 692 693
{
    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;
694
    *buf++ = pcr_high << 7 | pcr_low >> 8 | 0x7e;
695 696
    *buf++ = pcr_low;

697
    return 6;
698 699
}

700 701 702 703 704 705 706 707 708 709 710 711
/* 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));
712
    avio_write(s->pb, buf, TS_PACKET_SIZE);
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
}

/* 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 */
733
    q += write_pcr_bits(q, get_pcr(ts, s->pb));
734 735 736

    /* stuffing bytes */
    memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
737
    avio_write(s->pb, buf, TS_PACKET_SIZE);
738 739
}

740 741 742 743 744 745 746 747 748 749 750 751 752 753
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;
}

754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
/* 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;
}

787 788 789 790 791
/* 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.
 */
792 793
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
                             const uint8_t *payload, int payload_size,
794
                             int64_t pts, int64_t dts, int key)
795 796
{
    MpegTSWriteStream *ts_st = st->priv_data;
797
    MpegTSWrite *ts = s->priv_data;
798
    uint8_t buf[TS_PACKET_SIZE];
799
    uint8_t *q;
800
    int val, is_start, len, header_len, write_pcr, private_code, flags;
801 802
    int afc_len, stuffing_len;
    int64_t pcr = -1; /* avoid warning */
803
    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
804

805 806 807
    is_start = 1;
    while (payload_size > 0) {
        retransmit_si_info(s);
808

809 810
        write_pcr = 0;
        if (ts_st->pid == ts_st->service->pcr_pid) {
811 812
            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
                ts_st->service->pcr_packet_count++;
813
            if (ts_st->service->pcr_packet_count >=
814
                ts_st->service->pcr_packet_period) {
815 816 817 818 819
                ts_st->service->pcr_packet_count = 0;
                write_pcr = 1;
            }
        }

820
        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
821
            (dts - get_pcr(ts, s->pb)/300) > delay) {
822 823 824 825 826 827 828 829
            /* 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 */
        }

830 831 832 833 834 835 836 837 838
        /* 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;
839 840 841 842 843 844 845 846
        *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);
        }
847
        if (write_pcr) {
848 849
            set_af_flag(buf, 0x10);
            q = get_ts_payload_start(buf);
850
            // add 11, pcr references the last byte of program clock reference base
851
            if (ts->mux_rate > 1)
852
                pcr = get_pcr(ts, s->pb);
853
            else
854 855
                pcr = (dts - delay)*300;
            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
856
                av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
857 858
            extend_af(buf, write_pcr_bits(q, pcr));
            q = get_ts_payload_start(buf);
859
        }
860
        if (is_start) {
861
            int pes_extension = 0;
862 863 864 865
            /* write PES header */
            *q++ = 0x00;
            *q++ = 0x00;
            *q++ = 0x01;
866
            private_code = 0;
867
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
868
                if (st->codec->codec_id == AV_CODEC_ID_DIRAC) {
869 870 871
                    *q++ = 0xfd;
                } else
                    *q++ = 0xe0;
872
            } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
873 874 875
                       (st->codec->codec_id == AV_CODEC_ID_MP2 ||
                        st->codec->codec_id == AV_CODEC_ID_MP3 ||
                        st->codec->codec_id == AV_CODEC_ID_AAC)) {
876
                *q++ = 0xc0;
877 878
            } else {
                *q++ = 0xbd;
879
                if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
880 881 882
                    private_code = 0x20;
                }
            }
883 884 885 886 887 888
            header_len = 0;
            flags = 0;
            if (pts != AV_NOPTS_VALUE) {
                header_len += 5;
                flags |= 0x80;
            }
889
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
890 891 892
                header_len += 5;
                flags |= 0x40;
            }
893
            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
894
                st->codec->codec_id == AV_CODEC_ID_DIRAC) {
895 896 897 898 899 900 901 902 903 904 905
                /* 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;
            }
906
            len = payload_size + header_len + 3;
907
            if (private_code != 0)
908
                len++;
909 910
            if (len > 0xffff)
                len = 0;
911 912
            *q++ = len >> 8;
            *q++ = len;
913 914
            val = 0x80;
            /* data alignment indicator is required for subtitle data */
915
            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
916 917
                val |= 0x04;
            *q++ = val;
918 919
            *q++ = flags;
            *q++ = header_len;
920
            if (pts != AV_NOPTS_VALUE) {
921 922 923
                write_pts(q, flags >> 6, pts);
                q += 5;
            }
924
            if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
925 926
                write_pts(q, 1, dts);
                q += 5;
927
            }
928
            if (pes_extension && st->codec->codec_id == AV_CODEC_ID_DIRAC) {
929 930 931 932 933 934 935 936 937
                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;
            }
938 939
            if (private_code != 0)
                *q++ = private_code;
940
            is_start = 0;
941
        }
942 943 944 945
        /* header size */
        header_len = q - buf;
        /* data len */
        len = TS_PACKET_SIZE - header_len;
946 947
        if (len > payload_size)
            len = payload_size;
948 949 950 951 952 953 954
        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,
955
                        buf + 4 + afc_len,
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
                        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);
971 972
        payload += len;
        payload_size -= len;
973
        avio_write(s->pb, buf, TS_PACKET_SIZE);
974
    }
975
    avio_flush(s->pb);
976 977
}

978
static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
979
{
980
    AVStream *st = s->streams[pkt->stream_index];
981
    int size = pkt->size;
982
    uint8_t *buf= pkt->data;
983
    uint8_t *data= NULL;
984
    MpegTSWrite *ts = s->priv_data;
985
    MpegTSWriteStream *ts_st = st->priv_data;
986
    const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
987 988
    int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;

989
    if (ts->reemit_pat_pmt) {
990 991 992 993 994 995
        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) {
996 997
        ts->pat_packet_count = ts->pat_packet_period - 1;
        ts->sdt_packet_count = ts->sdt_packet_period - 1;
998
        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
999 1000
    }

1001 1002 1003 1004
    if (pkt->pts != AV_NOPTS_VALUE)
        pts = pkt->pts + delay;
    if (pkt->dts != AV_NOPTS_VALUE)
        dts = pkt->dts + delay;
1005

1006 1007
    if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
        av_log(s, AV_LOG_ERROR, "first pts value must set\n");
1008
        return AVERROR(EINVAL);
1009 1010 1011
    }
    ts_st->first_pts_check = 0;

1012
    if (st->codec->codec_id == AV_CODEC_ID_H264) {
1013 1014 1015
        const uint8_t *p = buf, *buf_end = p+size;
        uint32_t state = -1;

1016
        if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
D
Diego Biurrun 已提交
1017
            av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
M
Mike Melanson 已提交
1018
                   "no startcode found, use -bsf h264_mp4toannexb\n");
1019
            return AVERROR(EINVAL);
1020
        }
1021 1022

        do {
1023
            p = avpriv_find_start_code(p, buf_end, &state);
1024
            av_dlog(s, "nal %d\n", state & 0x1f);
1025 1026 1027 1028
        } while (p < buf_end && (state & 0x1f) != 9 &&
                 (state & 0x1f) != 5 && (state & 0x1f) != 1);

        if ((state & 0x1f) != 9) { // AUD NAL
1029 1030
            data = av_malloc(pkt->size+6);
            if (!data)
1031
                return AVERROR(ENOMEM);
1032 1033 1034
            memcpy(data+6, pkt->data, pkt->size);
            AV_WB32(data, 0x00000001);
            data[4] = 0x09;
1035
            data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
1036 1037 1038
            buf  = data;
            size = pkt->size+6;
        }
1039
    } else if (st->codec->codec_id == AV_CODEC_ID_AAC) {
1040 1041 1042 1043
        if (pkt->size < 2) {
            av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
            return AVERROR(EINVAL);
        }
1044
        if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
1045 1046 1047 1048 1049
            int ret;
            AVPacket pkt2;

            if (!ts_st->amux) {
                av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
1050
                       "and extradata missing\n");
1051
                return AVERROR(EINVAL);
1052
            }
1053 1054 1055 1056

            av_init_packet(&pkt2);
            pkt2.data = pkt->data;
            pkt2.size = pkt->size;
1057 1058
            ret = avio_open_dyn_buf(&ts_st->amux->pb);
            if (ret < 0)
1059
                return AVERROR(ENOMEM);
1060 1061 1062

            ret = av_write_frame(ts_st->amux, &pkt2);
            if (ret < 0) {
1063 1064
                avio_close_dyn_buf(ts_st->amux->pb, &data);
                ts_st->amux->pb = NULL;
A
Alex Converse 已提交
1065
                av_free(data);
1066
                return ret;
A
Alex Converse 已提交
1067
            }
1068 1069 1070
            size = avio_close_dyn_buf(ts_st->amux->pb, &data);
            ts_st->amux->pb = NULL;
            buf = data;
1071
        }
1072 1073
    }

1074
    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
1075
        // for video and subtitle, write a single pes packet
1076
        mpegts_write_pes(s, st, buf, size, pts, dts, pkt->flags & AV_PKT_FLAG_KEY);
1077
        av_free(data);
1078 1079 1080
        return 0;
    }

1081
    if (ts_st->payload_size + size > ts->pes_payload_size) {
1082 1083 1084 1085 1086 1087
        if (ts_st->payload_size) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
                             ts_st->payload_pts, ts_st->payload_dts,
                             ts_st->payload_flags & AV_PKT_FLAG_KEY);
            ts_st->payload_size = 0;
        }
1088
        if (size > ts->pes_payload_size) {
1089 1090 1091 1092 1093
            mpegts_write_pes(s, st, buf, size, pts, dts,
                             pkt->flags & AV_PKT_FLAG_KEY);
            av_free(data);
            return 0;
        }
1094 1095
    }

1096
    if (!ts_st->payload_size) {
1097 1098
        ts_st->payload_pts = pts;
        ts_st->payload_dts = dts;
1099
        ts_st->payload_flags = pkt->flags;
1100
    }
1101

1102 1103
    memcpy(ts_st->payload + ts_st->payload_size, buf, size);
    ts_st->payload_size += size;
1104

1105 1106
    av_free(data);

1107 1108 1109
    return 0;
}

1110
static void mpegts_write_flush(AVFormatContext *s)
1111 1112 1113 1114 1115
{
    int i;

    /* flush current packets */
    for(i = 0; i < s->nb_streams; i++) {
1116 1117
        AVStream *st = s->streams[i];
        MpegTSWriteStream *ts_st = st->priv_data;
1118 1119
        if (ts_st->payload_size > 0) {
            mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1120 1121
                             ts_st->payload_pts, ts_st->payload_dts,
                             ts_st->payload_flags & AV_PKT_FLAG_KEY);
1122
            ts_st->payload_size = 0;
1123
        }
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
    }
    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;
1149
        av_freep(&ts_st->payload);
1150 1151
        if (ts_st->amux) {
            avformat_free_context(ts_st->amux);
1152
            ts_st->amux = NULL;
1153
        }
1154
    }
1155

1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
    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;
}

1167
AVOutputFormat ff_mpegts_muxer = {
1168
    .name              = "mpegts",
1169
    .long_name         = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1170 1171 1172
    .mime_type         = "video/x-mpegts",
    .extensions        = "ts,m2t",
    .priv_data_size    = sizeof(MpegTSWrite),
1173 1174
    .audio_codec       = AV_CODEC_ID_MP2,
    .video_codec       = AV_CODEC_ID_MPEG2VIDEO,
1175 1176 1177
    .write_header      = mpegts_write_header,
    .write_packet      = mpegts_write_packet,
    .write_trailer     = mpegts_write_end,
1178
    .flags             = AVFMT_ALLOW_FLUSH,
1179
    .priv_class        = &mpegts_muxer_class,
1180
};