asfdemux: Handle PAR/interlaced information stored in packet payload.
authorEdward Hervey <bilboed@bilboed.com>
Fri, 26 Jun 2009 08:41:28 +0000 (10:41 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Fri, 26 Jun 2009 08:42:29 +0000 (10:42 +0200)
This is the 'other' way to store non 1/1 PAR in asf streams (by storing it
in the ASF Packet payload extensions).

gst/asfdemux/gstasfdemux.c
gst/asfdemux/gstasfdemux.h

index 85298adb7f189142c6fc8e86bed0759c1a7e04a4..20ead35bd85fedb4abfa1c573fefb4fb1f925794 100644 (file)
@@ -1278,6 +1278,26 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force)
       stream->discont = FALSE;
     }
 
+    if (G_UNLIKELY (stream->is_video && payload->par_x && payload->par_y &&
+            (payload->par_x != stream->par_x) &&
+            (payload->par_y != stream->par_y))) {
+      GST_DEBUG ("Updating PAR (%d/%d => %d/%d)",
+          stream->par_x, stream->par_y, payload->par_x, payload->par_y);
+      stream->par_x = payload->par_x;
+      stream->par_y = payload->par_y;
+      gst_caps_set_simple (stream->caps, "pixel-aspect-ratio",
+          GST_TYPE_FRACTION, stream->par_x, stream->par_y, NULL);
+      gst_pad_set_caps (stream->pad, stream->caps);
+    }
+
+    if (G_UNLIKELY (stream->interlaced != payload->interlaced)) {
+      GST_DEBUG ("Updating interlaced status (%d => %d)", stream->interlaced,
+          payload->interlaced);
+      stream->interlaced = payload->interlaced;
+      gst_caps_set_simple (stream->caps, "interlaced", G_TYPE_BOOLEAN,
+          stream->interlaced, NULL);
+    }
+
     gst_buffer_set_caps (payload->buf, stream->caps);
 
     /* (sort of) interpolate timestamps using upstream "frame of reference",
@@ -1772,6 +1792,17 @@ gst_asf_demux_setup_pad (GstASFDemux * demux, GstPad * src_pad,
   stream->is_video = is_video;
   stream->pending_tags = tags;
   stream->discont = TRUE;
+  if (is_video) {
+    GstStructure *st;
+    gint par_x, par_y;
+    st = gst_caps_get_structure (caps, 0);
+    if (gst_structure_get_fraction (st, "pixel-aspect-ratio", &par_x, &par_y) &&
+        par_x > 0 && par_y > 0) {
+      GST_DEBUG ("PAR %d/%d", par_x, par_y);
+      stream->par_x = par_x;
+      stream->par_y = par_y;
+    }
+  }
 
   stream->payloads = g_array_new (FALSE, FALSE, sizeof (AsfPayload));
 
@@ -1901,7 +1932,6 @@ gst_asf_demux_add_video_stream (GstASFDemux * demux,
               ax, ay, NULL);
       }
     }
-    /* remove the framerate we will guess and add it later */
     s = gst_caps_get_structure (caps, 0);
     gst_structure_remove_field (s, "framerate");
   }
index 0919a40663ac7c45b7aed9b08114f9c680696d12..ca4a2f7b47a0a4a5d273f22484ff71e7513c05e1 100644 (file)
@@ -98,6 +98,11 @@ typedef struct
   GstFlowReturn   last_flow; /* last flow return */
   GArray         *payloads;  /* pending payloads */
 
+  /* Video stream PAR & interlacing */
+  guint8       par_x;
+  guint8       par_y;
+  gboolean      interlaced;
+
   /* extended stream properties (optional) */
   AsfStreamExtProps  ext_props;