]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
parsers: mpeg2video - implement packet backlog
authorJaroslav Kysela <perex@perex.cz>
Wed, 17 Feb 2016 20:25:45 +0000 (21:25 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 17 Feb 2016 20:26:20 +0000 (21:26 +0100)
src/parsers/parsers.c

index ee144efa18290c486a57c20835d9476260db3459..1327534159f5b2055564e45969702b64d91e20cb 100644 (file)
@@ -982,6 +982,11 @@ parse_pes_header(service_t *t, elementary_stream_t *st,
   return -1;
 } 
 
+/**
+ *
+ * MPEG2 video parser
+ *
+ */
 
 /**
  * MPEG2VIDEO frame duration table (in 90kHz clock domain)
@@ -1143,7 +1148,6 @@ parser_global_data_move(elementary_stream_t *st, const uint8_t *data, size_t len
   st->es_buf.sb_ptr -= len;
 }
 
-
 /**
  * MPEG2VIDEO specific reassembly
  *
@@ -1210,6 +1214,8 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len,
       if(parse_mpeg2video_seq_start(t, st, &bs) != PARSER_APPEND)
         return PARSER_RESET;
       parser_global_data_move(st, buf, len);
+      if (!st->es_priv)
+        st->es_priv = malloc(1); /* starting mark */
     }
     return PARSER_DROP;
 
@@ -1264,7 +1270,12 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len,
       }
       pkt->pkt_duration = st->es_frame_duration;
 
-      parser_deliver(t, st, pkt);
+      if (st->es_priv) {
+        if (!TAILQ_EMPTY(&st->es_backlog))
+          parser_do_backlog(t, st, NULL, pkt ? pkt->pkt_meta : NULL);
+        parser_deliver(t, st, pkt);
+      } else if (config.parser_backlog)
+        parser_backlog(t, st, pkt);
       st->es_curpkt = NULL;
 
       return PARSER_RESET;
@@ -1290,7 +1301,9 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len,
 
 
 /**
+ *
  * H.264 (AVC) parser
+ *
  */
 static void
 parse_h264_backlog(service_t *t, elementary_stream_t *st, th_pkt_t *pkt)
@@ -1514,7 +1527,9 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len,
 }
 
 /**
+ *
  * H.265 (HEVC) parser
+ *
  */
 static int
 parse_hevc(service_t *t, elementary_stream_t *st, size_t len,
@@ -1900,9 +1915,10 @@ parser_do_backlog(service_t *t, elementary_stream_t *st,
   size_t metalen;
 
   tvhtrace("parser",
-           "pkt bcklog %2d %-12s - backlog flush start -",
+           "pkt bcklog %2d %-12s - backlog flush start - (meta %ld)",
            st->es_index,
-           streaming_component_type2txt(st->es_type));
+           streaming_component_type2txt(st->es_type),
+           meta ? (long)pktbuf_len(meta) : -1);
   TAILQ_FOREACH(sm, &st->es_backlog, sm_link) {
     pkt = sm->sm_data;
     if (pkt->pkt_meta) {
@@ -1945,7 +1961,8 @@ parser_do_backlog(service_t *t, elementary_stream_t *st,
       meta = NULL;
     }
 
-    pkt_cb(t, st, pkt);
+    if (pkt_cb)
+      pkt_cb(t, st, pkt);
 
     if (absdts == PTS_UNSET) {
       absdts = pkt->pkt_dts;