85
90
static const AVOption options[] = {
86
91
{ "mpegts_transport_stream_id", "Set transport_stream_id field.",
87
offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
92
offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT, {.i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
88
93
{ "mpegts_original_network_id", "Set original_network_id field.",
89
offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
94
offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT, {.i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
90
95
{ "mpegts_service_id", "Set service_id field.",
91
offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
96
offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT, {.i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
92
97
{ "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
93
offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
98
offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, {.i64 = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
94
99
{ "mpegts_start_pid", "Set the first pid.",
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},
100
offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, {.i64 = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
101
{ "muxrate", NULL, offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
97
102
{ "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},
103
offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT_PES_PAYLOAD_SIZE}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
104
{ "mpegts_flags", "MPEG-TS muxing flags", offsetof(MpegTSWrite, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, INT_MAX,
105
AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
106
{ "resend_headers", "Reemit PAT/PMT before writing the next packet",
107
0, AV_OPT_TYPE_CONST, {.i64 = MPEGTS_FLAG_REEMIT_PAT_PMT}, 0, INT_MAX,
108
AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags"},
109
{ "latm", "Use LATM packetization for AAC",
110
0, AV_OPT_TYPE_CONST, {.i64 = MPEGTS_FLAG_AAC_LATM}, 0, INT_MAX,
111
AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags"},
112
// backward compatibility
113
{ "resend_headers", "Reemit PAT/PMT before writing the next packet",
114
offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
253
269
MpegTSWriteStream *ts_st = st->priv_data;
254
270
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0);
255
271
switch(st->codec->codec_id) {
256
case CODEC_ID_MPEG1VIDEO:
257
case CODEC_ID_MPEG2VIDEO:
272
case AV_CODEC_ID_MPEG1VIDEO:
273
case AV_CODEC_ID_MPEG2VIDEO:
258
274
stream_type = STREAM_TYPE_VIDEO_MPEG2;
276
case AV_CODEC_ID_MPEG4:
261
277
stream_type = STREAM_TYPE_VIDEO_MPEG4;
279
case AV_CODEC_ID_H264:
264
280
stream_type = STREAM_TYPE_VIDEO_H264;
282
case AV_CODEC_ID_DIRAC:
267
283
stream_type = STREAM_TYPE_VIDEO_DIRAC;
285
case AV_CODEC_ID_MP2:
286
case AV_CODEC_ID_MP3:
271
287
stream_type = STREAM_TYPE_AUDIO_MPEG1;
274
stream_type = STREAM_TYPE_AUDIO_AAC;
289
case AV_CODEC_ID_AAC:
290
stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM) ? STREAM_TYPE_AUDIO_AAC_LATM : STREAM_TYPE_AUDIO_AAC;
276
case CODEC_ID_AAC_LATM:
292
case AV_CODEC_ID_AAC_LATM:
277
293
stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
295
case AV_CODEC_ID_AC3:
280
296
stream_type = STREAM_TYPE_AUDIO_AC3;
529
556
service->pcr_pid = ts_st->pid;
532
if (st->codec->codec_id == CODEC_ID_AAC &&
533
st->codec->extradata_size > 0) {
534
ts_st->adts = av_mallocz(sizeof(*ts_st->adts));
537
if (ff_adts_decode_extradata(s, ts_st->adts, st->codec->extradata,
538
st->codec->extradata_size) < 0)
559
if (st->codec->codec_id == AV_CODEC_ID_AAC &&
560
st->codec->extradata_size > 0)
563
ts_st->amux = avformat_alloc_context();
565
ret = AVERROR(ENOMEM);
568
ts_st->amux->oformat = av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts", NULL, NULL);
569
if (!ts_st->amux->oformat) {
570
ret = AVERROR(EINVAL);
573
ast = avformat_new_stream(ts_st->amux, NULL);
574
ret = avcodec_copy_context(ast->codec, st->codec);
577
ret = avformat_write_header(ts_st->amux, NULL);
589
624
ts->sdt_packet_count = ts->sdt_packet_period-1;
591
626
if (ts->mux_rate == 1)
592
av_log(s, AV_LOG_INFO, "muxrate VBR, ");
627
av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
594
av_log(s, AV_LOG_INFO, "muxrate %d, ", ts->mux_rate);
595
av_log(s, AV_LOG_INFO, "pcr every %d pkts, "
629
av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
630
av_log(s, AV_LOG_VERBOSE, "pcr every %d pkts, "
596
631
"sdt every %d, pat/pmt every %d pkts\n",
597
632
service->pcr_packet_period,
598
633
ts->sdt_packet_period, ts->pat_packet_period);
952
1002
if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
953
1003
av_log(s, AV_LOG_ERROR, "first pts value must set\n");
1004
return AVERROR(EINVAL);
956
1006
ts_st->first_pts_check = 0;
958
if (st->codec->codec_id == CODEC_ID_H264) {
1008
if (st->codec->codec_id == AV_CODEC_ID_H264) {
959
1009
const uint8_t *p = buf, *buf_end = p+size;
960
1010
uint32_t state = -1;
962
1012
if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
963
1013
av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
964
"no startcode found, use -vbsf h264_mp4toannexb\n");
1014
"no startcode found, use -bsf h264_mp4toannexb\n");
1015
return AVERROR(EINVAL);
969
1019
p = avpriv_mpv_find_start_code(p, buf_end, &state);
970
//av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
1020
av_dlog(s, "nal %d\n", state & 0x1f);
971
1021
} while (p < buf_end && (state & 0x1f) != 9 &&
972
1022
(state & 0x1f) != 5 && (state & 0x1f) != 1);
974
1024
if ((state & 0x1f) != 9) { // AUD NAL
975
1025
data = av_malloc(pkt->size+6);
1027
return AVERROR(ENOMEM);
978
1028
memcpy(data+6, pkt->data, pkt->size);
979
1029
AV_WB32(data, 0x00000001);
983
1033
size = pkt->size+6;
985
} else if (st->codec->codec_id == CODEC_ID_AAC) {
1035
} else if (st->codec->codec_id == AV_CODEC_ID_AAC) {
1036
if (pkt->size < 2) {
1037
av_log(s, AV_LOG_ERROR, "AAC packet too short\n");
1038
return AVERROR(EINVAL);
988
1040
if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
989
ADTSContext *adts = ts_st->adts;
992
av_log(s, AV_LOG_ERROR, "aac bitstream not in adts format "
1045
av_log(s, AV_LOG_ERROR, "AAC bitstream not in ADTS format "
993
1046
"and extradata missing\n");
1047
return AVERROR(EINVAL);
996
new_size = ADTS_HEADER_SIZE+adts->pce_size+pkt->size;
997
if ((unsigned)new_size >= INT_MAX)
999
data = av_malloc(new_size);
1050
av_init_packet(&pkt2);
1051
pkt2.data = pkt->data;
1052
pkt2.size = pkt->size;
1053
ret = avio_open_dyn_buf(&ts_st->amux->pb);
1001
1055
return AVERROR(ENOMEM);
1002
err = ff_adts_write_frame_header(adts, data, pkt->size,
1057
ret = av_write_frame(ts_st->amux, &pkt2);
1059
avio_close_dyn_buf(ts_st->amux->pb, &data);
1060
ts_st->amux->pb = NULL;
1008
if (adts->pce_size) {
1009
memcpy(data+ADTS_HEADER_SIZE, adts->pce_data, adts->pce_size);
1012
memcpy(data+ADTS_HEADER_SIZE+adts->pce_size, pkt->data, pkt->size);
1064
size = avio_close_dyn_buf(ts_st->amux->pb, &data);
1065
ts_st->amux->pb = NULL;
1054
static int mpegts_write_end(AVFormatContext *s)
1106
static void mpegts_write_flush(AVFormatContext *s)
1056
MpegTSWrite *ts = s->priv_data;
1057
MpegTSWriteStream *ts_st;
1058
MpegTSService *service;
1062
1110
/* flush current packets */
1063
1111
for(i = 0; i < s->nb_streams; i++) {
1065
ts_st = st->priv_data;
1112
AVStream *st = s->streams[i];
1113
MpegTSWriteStream *ts_st = st->priv_data;
1066
1114
if (ts_st->payload_size > 0) {
1067
1115
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1068
1116
ts_st->payload_pts, ts_st->payload_dts,
1069
1117
ts_st->payload_flags & AV_PKT_FLAG_KEY);
1118
ts_st->payload_size = 0;
1124
static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
1127
mpegts_write_flush(s);
1130
return mpegts_write_packet_internal(s, pkt);
1134
static int mpegts_write_end(AVFormatContext *s)
1136
MpegTSWrite *ts = s->priv_data;
1137
MpegTSService *service;
1140
mpegts_write_flush(s);
1142
for(i = 0; i < s->nb_streams; i++) {
1143
AVStream *st = s->streams[i];
1144
MpegTSWriteStream *ts_st = st->priv_data;
1071
1145
av_freep(&ts_st->payload);
1072
av_freep(&ts_st->adts);
1147
avformat_free_context(ts_st->amux);
1076
1152
for(i = 0; i < ts->nb_services; i++) {
1077
1153
service = ts->services[i];
1087
1163
AVOutputFormat ff_mpegts_muxer = {
1088
1164
.name = "mpegts",
1089
.long_name = NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
1165
.long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
1090
1166
.mime_type = "video/x-mpegts",
1091
1167
.extensions = "ts,m2t",
1092
1168
.priv_data_size = sizeof(MpegTSWrite),
1093
.audio_codec = CODEC_ID_MP2,
1094
.video_codec = CODEC_ID_MPEG2VIDEO,
1169
.audio_codec = AV_CODEC_ID_MP2,
1170
.video_codec = AV_CODEC_ID_MPEG2VIDEO,
1095
1171
.write_header = mpegts_write_header,
1096
1172
.write_packet = mpegts_write_packet,
1097
1173
.write_trailer = mpegts_write_end,
1098
.priv_class = &mpegts_muxer_class,
1174
.flags = AVFMT_ALLOW_FLUSH,
1175
.priv_class = &mpegts_muxer_class,