uint8_t header[MAX_PES_HEADER_SIZE];
AVBufferRef *buffer;
SLConfigDescr sl;
+ int merged_st;
} PESContext;
extern AVInputFormat ff_mpegts_demuxer;
offset += tss->section_h_size;
tss->section_h_size = -1;
} else {
+ tss->section_h_size = -1;
tss->end_of_section_reached = 0;
break;
}
PESContext *pes = filter->u.pes_filter.opaque;
av_buffer_unref(&pes->buffer);
/* referenced private data will be freed later in
- * avformat_close_input */
- if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
+ * avformat_close_input (pes->st->priv_data == pes) */
+ if (!pes->st || pes->merged_st) {
av_freep(&filter->u.pes_filter.opaque);
}
}
int service_type = ((component_type & service_type_mask) >> 3);
if (service_type == 0x02 /* 0b010 */) {
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
- av_log(ts->stream, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
+ av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
}
}
}
int service_type = ((component_type & service_type_mask) >> 3);
if (service_type == 0x02 /* 0b010 */) {
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
- av_log(ts->stream, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
+ av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
}
}
}
}
static AVStream *find_matching_stream(MpegTSContext *ts, int pid,
- int stream_id, int pmt_stream_idx)
+ int stream_identifier, int pmt_stream_idx)
{
AVFormatContext *s = ts->stream;
int i;
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
- if (stream_id != -1) { /* match based on "stream identifier descriptor" if present */
- if (st->stream_identifier == stream_id+1) {
+ if (stream_identifier != -1) { /* match based on "stream identifier descriptor" if present */
+ if (st->stream_identifier == stream_identifier+1) {
found = st;
break;
}
int program_info_length, pcr_pid, pid, stream_type;
int desc_list_len;
uint32_t prog_reg_desc = 0; /* registration descriptor */
- int stream_id = -1;
+ int stream_identifier = -1;
int mp4_descr_count = 0;
Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
goto out;
if (ts->merge_pmt_versions)
- stream_id = parse_stream_identifier_desc(p, p_end);
+ stream_identifier = parse_stream_identifier_desc(p, p_end);
/* now create stream */
if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
pes = ts->pids[pid]->u.pes_filter.opaque;
if (ts->merge_pmt_versions && !pes->st) {
- st = find_matching_stream(ts, pid, stream_id, i);
+ st = find_matching_stream(ts, pid, stream_identifier, i);
if (st) {
pes->st = st;
pes->stream_type = stream_type;
+ pes->merged_st = 1;
}
}
if (!pes->st) {
mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
pes = add_pes_stream(ts, pid, pcr_pid);
if (ts->merge_pmt_versions && pes && !pes->st) {
- st = find_matching_stream(ts, pid, stream_id, i);
+ st = find_matching_stream(ts, pid, stream_identifier, i);
if (st) {
pes->st = st;
pes->stream_type = stream_type;
+ pes->merged_st = 1;
}
}
if (pes && !pes->st) {
st = ts->stream->streams[idx];
}
if (ts->merge_pmt_versions && !st) {
- st = find_matching_stream(ts, pid, stream_id, i);
+ st = find_matching_stream(ts, pid, stream_identifier, i);
}
if (!st) {
st = avformat_new_stream(ts->stream, NULL);