]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
htsp: another fix for H264 - headers merge
authorJaroslav Kysela <perex@perex.cz>
Wed, 19 Nov 2014 10:39:44 +0000 (11:39 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 19 Nov 2014 10:39:46 +0000 (11:39 +0100)
The real headers merge is in avc_convert_pkt() but this is called
only from the global headers plugin. Add the global headers plugin
to all HTSP chains.

This patch removes the merging from the TS parser.

src/parsers/parser_avc.c
src/parsers/parsers.c
src/profile.c

index 3efacf09d42c49ff198c6ef509cfbe6acf2d8bb4..468314840fdda32983b9c725b0f312a2da8b9d6d 100644 (file)
@@ -95,10 +95,11 @@ static int
 avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size)
 {
   sbuf_t sb;
+
   sbuf_init(&sb);
+
   avc_parse_nal_units(&sb, buf_in, *size);
 
-  free(*buf);
   *buf = sb.sb_data;
   *size = sb.sb_ptr;
   return 0;
@@ -126,7 +127,7 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len)
     /* check for h264 start code */
     if (RB32(data) == 0x00000001 ||
        RB24(data) == 0x000001) {
-      uint8_t *buf=NULL, *end, *start;
+      uint8_t *buf, *end, *start;
       uint32_t *sps_size_array=0, *pps_size_array=0;
       uint32_t pps_count=0,sps_count=0;
       uint8_t **sps_array=0, **pps_array=0;
@@ -210,30 +211,28 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len)
 th_pkt_t *
 avc_convert_pkt(th_pkt_t *src)
 {
-  th_pkt_t *pkt = malloc(sizeof(th_pkt_t));
+  sbuf_t payload, headers;
+  th_pkt_t *pkt = malloc(sizeof(*pkt));
+
   *pkt = *src;
   pkt->pkt_refcount = 1;
   pkt->pkt_meta = NULL;
-  pkt->pkt_payload = NULL;
+
+  sbuf_init(&payload);
 
   if (src->pkt_meta) {
-    sbuf_t headers;
     sbuf_init(&headers);
-    
     isom_write_avcc(&headers, pktbuf_ptr(src->pkt_meta),
-                   pktbuf_len(src->pkt_meta));
+                             pktbuf_len(src->pkt_meta));
     pkt->pkt_meta = pktbuf_make(headers.sb_data, headers.sb_ptr);
   }
 
-  sbuf_t payload;
-  sbuf_init(&payload);
-
   if(src->pkt_meta)
     avc_parse_nal_units(&payload, pktbuf_ptr(src->pkt_meta),
-                       pktbuf_len(src->pkt_meta));
+                                  pktbuf_len(src->pkt_meta));
 
   avc_parse_nal_units(&payload, pktbuf_ptr(src->pkt_payload),
-                     pktbuf_len(src->pkt_payload));
+                               pktbuf_len(src->pkt_payload));
   
   pkt->pkt_payload = pktbuf_make(payload.sb_data, payload.sb_ptr);
   return pkt;
index a637941a08180674090bb4fdc07e41b8986d336c..1a590f9876a55e89ec27d1aa1d045296e15786c9 100644 (file)
@@ -1230,27 +1230,18 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len,
     if (st->es_incomplete)
       return 4;
     th_pkt_t *pkt = st->es_curpkt;
-    size_t metalen = 0;
 
     if(pkt != NULL) {
       if(st->es_global_data) {
         pkt->pkt_meta = pktbuf_make(st->es_global_data,
-                                    metalen = st->es_global_data_len);
+                                    st->es_global_data_len);
         st->es_global_data = NULL;
         st->es_global_data_len = 0;
       }
 
-      if (metalen) {
-        pkt->pkt_payload = pktbuf_alloc(NULL, metalen + st->es_buf.sb_ptr - 4);
-        memcpy(pktbuf_ptr(pkt->pkt_payload), pktbuf_ptr(pkt->pkt_meta), metalen);
-        memcpy(pktbuf_ptr(pkt->pkt_payload) + metalen, st->es_buf.sb_data, st->es_buf.sb_ptr - 4);
-        sbuf_reset(&st->es_buf, 16000);
-      } else {
-        pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data,
-                                       st->es_buf.sb_ptr - 4);
-        sbuf_steal_data(&st->es_buf);
-      }
-
+      pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data,
+                                     st->es_buf.sb_ptr - 4);
+      sbuf_steal_data(&st->es_buf);
       parser_deliver(t, st, pkt, st->es_buf.sb_err);
 
       st->es_curpkt = NULL;
index e14b5719465415080e61058bf25ffd392857b018..ac215bdda895efb83b04ccc74710004d8c761fbc 100644 (file)
@@ -524,10 +524,8 @@ profile_sharer_deliver(profile_chain_t *prch, streaming_message_t *sm)
     if (!prch->prch_ts_delta)
       goto deliver;
     th_pkt_t *pkt = sm->sm_data;
-    if (prch->prch_ts_delta == PTS_UNSET) {
+    if (prch->prch_ts_delta == PTS_UNSET)
       prch->prch_ts_delta = MAX(0, pkt->pkt_dts - 10000);
-      printf("ts delta: %li\n", (long)prch->prch_ts_delta);
-    }
     /*
      * time correction here
      */
@@ -805,6 +803,8 @@ profile_htsp_work(profile_chain_t *prch,
     dst = prch->prch_timeshift = timeshift_create(dst, timeshift_period);
 #endif
 
+  dst = prch->prch_gh = globalheaders_create(dst);
+
   if (profile_sharer_create(prsh, prch, dst))
     goto fail;
 
@@ -1296,6 +1296,8 @@ profile_transcode_work(profile_chain_t *prch,
   props.tp_bandwidth  = profile_transcode_bandwidth(pro);
   strncpy(props.tp_language, pro->pro_language ?: "", 3);
 
+  dst = prch->prch_gh = globalheaders_create(dst);
+
 #if ENABLE_TIMESHIFT
   if (timeshift_period > 0)
     dst = prch->prch_timeshift = timeshift_create(dst, timeshift_period);
@@ -1364,9 +1366,7 @@ profile_transcode_open(profile_chain_t *prch,
 
   prch->prch_sq.sq_maxsize = qsize;
 
-  prch->prch_gh = globalheaders_create(&prch->prch_sq.sq_st);
-
-  r = profile_transcode_work(prch, prch->prch_gh, 0, 0);
+  r = profile_transcode_work(prch, &prch->prch_sq.sq_st, 0, 0);
   if (r) {
     profile_chain_close(prch);
     return r;