81
/* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
82
#define DEFAULT_PES_HEADER_FREQ 16
83
#define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)
79
85
static const AVOption options[] = {
80
86
{ "mpegts_transport_stream_id", "Set transport_stream_id field.",
81
offsetof(MpegTSWrite, transport_stream_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
87
offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
82
88
{ "mpegts_original_network_id", "Set original_network_id field.",
83
offsetof(MpegTSWrite, original_network_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
89
offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
84
90
{ "mpegts_service_id", "Set service_id field.",
85
offsetof(MpegTSWrite, service_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
91
offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
86
92
{ "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
87
offsetof(MpegTSWrite, pmt_start_pid), FF_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
93
offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
88
94
{ "mpegts_start_pid", "Set the first pid.",
89
offsetof(MpegTSWrite, start_pid), FF_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
95
offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
96
{ "muxrate", NULL, offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT, {1}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
97
{ "pes_payload_size", "Minimum PES packet payload in bytes",
98
offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT, {DEFAULT_PES_PAYLOAD_SIZE}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
481
490
/* assign pids to each stream */
482
491
for(i = 0;i < s->nb_streams; i++) {
483
492
st = s->streams[i];
484
av_set_pts_info(st, 33, 1, 90000);
493
avpriv_set_pts_info(st, 33, 1, 90000);
485
494
ts_st = av_mallocz(sizeof(MpegTSWriteStream));
488
497
st->priv_data = ts_st;
498
ts_st->payload = av_mallocz(ts->pes_payload_size);
489
501
ts_st->service = service;
490
502
/* MPEG pid values < 16 are reserved. Applications which set st->id in
491
503
* this range are assigned a calculated pid. */
712
/* Set an adaptation field flag in an MPEG-TS packet*/
713
static void set_af_flag(uint8_t *pkt, int flag)
715
// expect at least one flag to set
718
if ((pkt[3] & 0x20) == 0) {
719
// no AF yet, set adaptation field flag
721
// 1 byte length, no flags
728
/* Extend the adaptation field by size bytes */
729
static void extend_af(uint8_t *pkt, int size)
731
// expect already existing adaptation field
732
assert(pkt[3] & 0x20);
736
/* Get a pointer to MPEG-TS payload (right after TS packet header) */
737
static uint8_t *get_ts_payload_start(uint8_t *pkt)
740
return pkt + 5 + pkt[4];
691
745
/* Add a pes header to the front of payload, and segment into an integer number of
692
746
* ts packets. The final ts packet is padded using an over-sized adaptation header
693
747
* to exactly fill the last ts packet.
741
795
*q++ = ts_st->pid;
742
796
ts_st->cc = (ts_st->cc + 1) & 0xf;
743
*q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0);
797
*q++ = 0x10 | ts_st->cc; // payload indicator + CC
798
if (key && is_start && pts != AV_NOPTS_VALUE) {
799
// set Random Access for key frames
800
if (ts_st->pid == ts_st->service->pcr_pid)
802
set_af_flag(buf, 0x40);
803
q = get_ts_payload_start(buf);
806
set_af_flag(buf, 0x10);
807
q = get_ts_payload_start(buf);
745
808
// add 11, pcr references the last byte of program clock reference base
746
809
if (ts->mux_rate > 1)
747
810
pcr = get_pcr(ts, s->pb);
897
960
uint32_t state = -1;
899
962
if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
900
av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, "
963
av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
901
964
"no startcode found, use -vbsf h264_mp4toannexb\n");
906
p = ff_find_start_code(p, buf_end, &state);
969
p = avpriv_mpv_find_start_code(p, buf_end, &state);
907
970
//av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
908
971
} while (p < buf_end && (state & 0x1f) != 9 &&
909
972
(state & 0x1f) != 5 && (state & 0x1f) != 1);
950
1018
if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
951
1019
// for video and subtitle, write a single pes packet
952
mpegts_write_pes(s, st, buf, size, pts, dts);
1020
mpegts_write_pes(s, st, buf, size, pts, dts, pkt->flags & AV_PKT_FLAG_KEY);
957
if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
958
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
959
ts_st->payload_pts, ts_st->payload_dts);
960
ts_st->payload_index = 0;
1025
if (ts_st->payload_size + size > ts->pes_payload_size) {
1026
if (ts_st->payload_size) {
1027
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1028
ts_st->payload_pts, ts_st->payload_dts,
1029
ts_st->payload_flags & AV_PKT_FLAG_KEY);
1030
ts_st->payload_size = 0;
1032
if (size > ts->pes_payload_size) {
1033
mpegts_write_pes(s, st, buf, size, pts, dts,
1034
pkt->flags & AV_PKT_FLAG_KEY);
963
if (!ts_st->payload_index) {
1040
if (!ts_st->payload_size) {
964
1041
ts_st->payload_pts = pts;
965
1042
ts_st->payload_dts = dts;
1043
ts_st->payload_flags = pkt->flags;
968
memcpy(ts_st->payload + ts_st->payload_index, buf, size);
969
ts_st->payload_index += size;
1046
memcpy(ts_st->payload + ts_st->payload_size, buf, size);
1047
ts_st->payload_size += size;
985
1063
for(i = 0; i < s->nb_streams; i++) {
986
1064
st = s->streams[i];
987
1065
ts_st = st->priv_data;
988
if (ts_st->payload_index > 0) {
989
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
990
ts_st->payload_pts, ts_st->payload_dts);
1066
if (ts_st->payload_size > 0) {
1067
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1068
ts_st->payload_pts, ts_st->payload_dts,
1069
ts_st->payload_flags & AV_PKT_FLAG_KEY);
1071
av_freep(&ts_st->payload);
992
1072
av_freep(&ts_st->adts);
994
1074
avio_flush(s->pb);
1007
1087
AVOutputFormat ff_mpegts_muxer = {
1009
NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
1012
sizeof(MpegTSWrite),
1014
CODEC_ID_MPEG2VIDEO,
1015
mpegts_write_header,
1016
mpegts_write_packet,
1089
.long_name = NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
1090
.mime_type = "video/x-mpegts",
1091
.extensions = "ts,m2t",
1092
.priv_data_size = sizeof(MpegTSWrite),
1093
.audio_codec = CODEC_ID_MP2,
1094
.video_codec = CODEC_ID_MPEG2VIDEO,
1095
.write_header = mpegts_write_header,
1096
.write_packet = mpegts_write_packet,
1097
.write_trailer = mpegts_write_end,
1018
1098
.priv_class = &mpegts_muxer_class,