int pcr_pid;
int pcr_packet_count;
int pcr_packet_period;
+ AVProgram *program;
} MpegTSService;
// service_type values as defined in ETSI 300 468
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
if (s->nb_programs) {
- int j, k, found = 0;
-
- for (j = 0; j < s->nb_programs; j++)
- if (s->programs[j]->id == service->sid) {
- for (k = 0; k < s->programs[j]->nb_stream_indexes; k++)
- if (s->programs[j]->stream_index[k] == i) {
- found = 1;
- break;
- }
+ int k, found = 0;
+ AVProgram *program = service->program;
+
+ for (k = 0; k < program->nb_stream_indexes; k++)
+ if (program->stream_index[k] == i) {
+ found = 1;
break;
}
service->pmt.write_packet = section_write_packet;
service->pmt.opaque = s;
service->pmt.cc = 15;
+ service->program = program;
}
}
/* assign pids to each stream */
for (i = 0; i < s->nb_streams; i++) {
+ AVProgram *program;
st = s->streams[i];
ts_st = av_mallocz(sizeof(MpegTSWriteStream));
ret = AVERROR(ENOMEM);
goto fail;
}
+
+ program = av_find_program_from_stream(s, NULL, i);
+ if (program) {
+ for (j = 0; j < ts->nb_services; j++) {
+ if (ts->services[j]->program == program) {
+ service = ts->services[j];
+ break;
+ }
+ }
+ }
+
ts_st->service = service;
/* MPEG pid values < 16 are reserved. Applications which set st->id in
* this range are assigned a calculated pid. */
* NOTE: 'payload' contains a complete PES payload. */
static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
const uint8_t *payload, int payload_size,
- int64_t pts, int64_t dts, int key)
+ int64_t pts, int64_t dts, int key, int stream_id)
{
MpegTSWriteStream *ts_st = st->priv_data;
MpegTSWrite *ts = s->priv_data;
st->codec->codec_id == AV_CODEC_ID_AC3 &&
ts->m2ts_mode) {
*q++ = 0xfd;
+ } else if (st->codec->codec_type == AVMEDIA_TYPE_DATA) {
+ *q++ = stream_id != -1 ? stream_id : 0xfc;
+
+ if (stream_id == 0xbd) /* asynchronous KLV */
+ pts = dts = AV_NOPTS_VALUE;
} else {
*q++ = 0xbd;
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
int64_t dts = pkt->dts, pts = pkt->pts;
int opus_samples = 0;
+ int side_data_size;
+ char *side_data = NULL;
+ int stream_id = -1;
+
+ side_data = av_packet_get_side_data(pkt,
+ AV_PKT_DATA_MPEGTS_STREAM_ID,
+ &side_data_size);
+ if (side_data)
+ stream_id = side_data[0];
if (ts->reemit_pat_pmt) {
av_log(s, AV_LOG_WARNING,
if ( ts_st2->payload_size
&& (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
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_pts, ts_st2->payload_dts,
+ ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
ts_st2->payload_size = 0;
}
}
ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
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_flags & AV_PKT_FLAG_KEY, stream_id);
ts_st->payload_size = 0;
ts_st->opus_queued_samples = 0;
}
av_assert0(!ts_st->payload_size);
// for video and subtitle, write a single pes packet
mpegts_write_pes(s, st, buf, size, pts, dts,
- pkt->flags & AV_PKT_FLAG_KEY);
+ pkt->flags & AV_PKT_FLAG_KEY, stream_id);
ts_st->opus_queued_samples = 0;
av_free(data);
return 0;
if (ts_st->payload_size > 0) {
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_flags & AV_PKT_FLAG_KEY, -1);
ts_st->payload_size = 0;
ts_st->opus_queued_samples = 0;
}