mpegvideoparse: support field encoding for interlaced video
authorMatej Knopp <matej.knopp@gmail.com>
Tue, 30 Jul 2013 13:17:23 +0000 (15:17 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Tue, 13 Aug 2013 12:00:57 +0000 (14:00 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=705144

gst/videoparsers/gstmpegvideoparse.c

index 073a330..b5a6d01 100644 (file)
@@ -540,6 +540,21 @@ gst_mpegv_parse_process_sc (GstMpegvParse * mpvparse,
     else
       GST_LOG_OBJECT (mpvparse, "Couldn't parse picture at offset %d",
           mpvparse->pic_offset);
+
+    /* if terminating packet is a picture, we need to check if it has same TSN as the picture that is being
+       terminated. If it does, we need to keep those together, as these packets are two fields of the same
+       frame */
+    if (packet->type == GST_MPEG_VIDEO_PACKET_PICTURE) {
+      if (info->size - off < 2) {       /* we need at least two bytes to read the TSN */
+        ret = FALSE;
+      } else {
+        /* TSN is stored in first 10 bits */
+        int tsn = info->data[off] << 2 | (info->data[off + 1] & 0xC0) >> 6;
+
+        if (tsn == mpvparse->pichdr.tsn)        /* prevent termination if TSN is same */
+          ret = FALSE;
+      }
+    }
   }
 
   return ret;