diff --git a/src/parsers/parser_avc.c b/src/parsers/parser_avc.c index e5571470..bd0b911e 100644 --- a/src/parsers/parser_avc.c +++ b/src/parsers/parser_avc.c @@ -236,6 +236,5 @@ avc_convert_pkt(th_pkt_t *src) pktbuf_len(src->pkt_payload)); pkt->pkt_payload = pktbuf_make(payload.sb_data, payload.sb_ptr); - pkt_ref_dec(src); return pkt; } diff --git a/src/plumbing/globalheaders.c b/src/plumbing/globalheaders.c index 6e23fbc7..b5f9ac00 100644 --- a/src/plumbing/globalheaders.c +++ b/src/plumbing/globalheaders.c @@ -172,6 +172,7 @@ convertpkt(streaming_start_component_t *ssc, th_pkt_t *pkt) return avc_convert_pkt(pkt); default: + pkt_ref_inc(pkt); return pkt; } } @@ -217,10 +218,9 @@ gh_hold(globalheaders_t *gh, streaming_message_t *sm) apply_header(ssc, pkt); - pr = pktref_create(pkt); - TAILQ_INSERT_TAIL(&gh->gh_holdq, pr, pr_link); + pktref_enqueue(&gh->gh_holdq, pkt); - free(sm); + streaming_msg_free(sm); if(!headers_complete(gh, gh_queue_delay(gh))) break; @@ -273,7 +273,7 @@ gh_hold(globalheaders_t *gh, streaming_message_t *sm) static void gh_pass(globalheaders_t *gh, streaming_message_t *sm) { - th_pkt_t *pkt; + th_pkt_t *pkt, *pkt2; streaming_start_component_t *ssc; switch(sm->sm_type) { @@ -306,8 +306,10 @@ gh_pass(globalheaders_t *gh, streaming_message_t *sm) pkt = sm->sm_data; ssc = streaming_start_component_find_by_index(gh->gh_ss, pkt->pkt_componentindex); - sm->sm_data = convertpkt(ssc, pkt); + sm->sm_data = pkt2 = convertpkt(ssc, pkt); streaming_target_deliver2(gh->gh_output, sm); + if (pkt == pkt2) + pkt_ref_dec(pkt); break; } }