asf: Detect more payload extensions.
authorEdward Hervey <bilboed@bilboed.com>
Mon, 11 May 2009 10:37:46 +0000 (12:37 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 12 May 2009 09:53:45 +0000 (11:53 +0200)
These should help fix interlaced/PAR issues with more files.

gst/asfdemux/asfheaders.c
gst/asfdemux/asfheaders.h
gst/asfdemux/asfpacket.c
gst/asfdemux/asfpacket.h

index 3815add..fdbf3d0 100644 (file)
@@ -25,6 +25,11 @@ const ASFGuidHash asf_payload_ext_guids[] = {
   {ASF_PAYLOAD_EXTENSION_DURATION, "ASF_PAYLOAD_EXTENSION_DURATION",
         {0xC6BD9450, 0x4907867F, 0x79C7A383, 0xAD33B721}
       },
+  {ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT, "ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT",
+      {0xD590DC20, 0x436C07BC, 0xBBF3f79C, 0xDCA4F1FB}},
+  {ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO,
+        "ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO",
+      {0x1b1ee554, 0x4bc8f9ea, 0x6b371a82, 0xb8c4e474}},
   {ASF_PAYLOAD_EXTENSION_UNDEFINED, "ASF_PAYLOAD_EXTENSION_UNDEFINED",
         {0, 0, 0, 0}
       }
index a52ff6a..ff43fa6 100644 (file)
@@ -84,7 +84,9 @@ typedef enum {
 
 typedef enum {
   ASF_PAYLOAD_EXTENSION_UNDEFINED = 0,
-  ASF_PAYLOAD_EXTENSION_DURATION
+  ASF_PAYLOAD_EXTENSION_DURATION,
+  ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT,
+  ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO
 } AsfPayloadExtensionID;
 
 extern const ASFGuidHash asf_payload_ext_guids[];
index 1d4bcfb..88d1b7f 100644 (file)
@@ -224,7 +224,31 @@ asf_payload_parse_replicated_data_extensions (AsfStream * stream,
           GST_WARNING ("unexpected DURATION extensions len %u", ext->len);
         }
         break;
+      case ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT:
+        if (ext->len == 1) {
+          guint8 data = payload->rep_data[off];
+
+          payload->interlaced = data & 0x1;
+          payload->rff = data & 0x8;
+          payload->tff = (data & 0x2) || !(data & 0x4);
+          GST_WARNING ("data:0x%x, interlaced:%d, rff:%d, tff:%d",
+              data, payload->interlaced, payload->rff, payload->tff);
+        } else {
+          GST_WARNING ("unexpected SYSTEM_CONTE extensions len %u", ext->len);
+        }
+        break;
+      case ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO:
+        if (ext->len == 2) {
+          payload->par_x = payload->rep_data[off];
+          payload->par_y = payload->rep_data[off + 1];
+          GST_WARNING ("PAR %d / %d", payload->par_x, payload->par_y);
+        } else {
+          GST_WARNING ("unexpected SYSTEM_PIXEL_ASPECT_RATIO extensions len %u",
+              ext->len);
+        }
+        break;
       default:
+        GST_WARNING ("UNKNOWN PAYLOAD EXTENSION !");
         break;
     }
     off += ext->len;
@@ -254,6 +278,11 @@ gst_asf_demux_parse_payload (GstASFDemux * demux, AsfPacket * packet,
 
   payload.ts = GST_CLOCK_TIME_NONE;
   payload.duration = GST_CLOCK_TIME_NONE;
+  payload.par_x = 0;
+  payload.par_y = 0;
+  payload.interlaced = FALSE;
+  payload.tff = FALSE;
+  payload.rff = FALSE;
 
   payload.mo_number =
       asf_packet_read_varlen_int (packet->prop_flags, 4, p_data, p_size);
index 1ca3e66..2830881 100644 (file)
@@ -36,6 +36,11 @@ typedef struct {
   guint8        rep_data[256];     /* the length should be stored in a byte  */
   GstClockTime  ts;
   GstClockTime  duration;          /* is not always available                */
+  guint8        par_x;             /* not always available (0:deactivated)   */
+  guint8        par_y;             /* not always available (0:deactivated)   */
+  gboolean      interlaced;        /* default: FALSE */
+  gboolean      tff;
+  gboolean      rff;
   GstBuffer    *buf;
 } AsfPayload;