int merge;
int type;
int tracknum;
+ int disabled;
int64_t nextpts;
} mk_track;
for(i = 0; i < ss->ss_num_components; i++) {
ssc = &ss->ss_components[i];
+ mkm->tracks[i].disabled = ssc->ssc_disabled;
+
+ if(ssc->ssc_disabled)
+ continue;
+
mkm->tracks[i].index = ssc->ssc_index;
mkm->tracks[i].type = ssc->ssc_type;
mkm->tracks[i].nextpts = PTS_UNSET;
}
}
- if(t != NULL) {
+ if(t != NULL && !t->disabled) {
if(t->merge)
pkt = pkt_merge_header(pkt);
mk_write_frame_i(mkm, t, pkt);
} globalheaders_t;
+#define MAX_SCAN_TIME 5000 // in ms
+
/**
*
pktbuf_ref_inc(ssc->ssc_gh);
}
break;
-
}
-
}
*
*/
static int
-headers_complete(globalheaders_t *gh)
+header_complete(streaming_start_component_t *ssc)
+{
+ if((SCT_ISAUDIO(ssc->ssc_type) || SCT_ISVIDEO(ssc->ssc_type)) &&
+ ssc->ssc_frameduration == 0)
+ return 0;
+
+ if(SCT_ISAUDIO(ssc->ssc_type) &&
+ (ssc->ssc_sri == 0 || ssc->ssc_channels == 0))
+ return 0;
+
+ if(ssc->ssc_gh == NULL &&
+ (ssc->ssc_type == SCT_H264 ||
+ ssc->ssc_type == SCT_MPEG2VIDEO ||
+ ssc->ssc_type == SCT_AAC))
+ return 0;
+ return 1;
+}
+
+/**
+ *
+ */
+static int
+headers_complete(globalheaders_t *gh, int64_t qd)
{
streaming_start_t *ss = gh->gh_ss;
streaming_start_component_t *ssc;
for(i = 0; i < ss->ss_num_components; i++) {
ssc = &ss->ss_components[i];
- if((SCT_ISAUDIO(ssc->ssc_type) || SCT_ISVIDEO(ssc->ssc_type)) &&
- ssc->ssc_frameduration == 0)
- return 0;
+ if(!header_complete(ssc)) {
- if(SCT_ISAUDIO(ssc->ssc_type) &&
- (ssc->ssc_sri == 0 || ssc->ssc_channels == 0))
- return 0;
-
- if(ssc->ssc_gh == NULL &&
- (ssc->ssc_type == SCT_H264 ||
- ssc->ssc_type == SCT_MPEG2VIDEO ||
- ssc->ssc_type == SCT_AAC))
- return 0;
+ if(qd > (MAX_SCAN_TIME * 90)) {
+ ssc->ssc_disabled = 1;
+ } else {
+ return 0;
+ }
+ }
}
return 1;
}
+/**
+ *
+ */
+static int64_t
+gh_queue_delay(globalheaders_t *gh)
+{
+ th_pktref_t *f = TAILQ_FIRST(&gh->gh_holdq);
+ th_pktref_t *l = TAILQ_LAST(&gh->gh_holdq, th_pktref_queue);
+
+ return l->pr_pkt->pkt_dts - f->pr_pkt->pkt_dts;
+}
+
+
/**
*
*/
free(sm);
- if(!headers_complete(gh))
+ if(!headers_complete(gh, gh_queue_delay(gh)))
break;
// Send our modified start