diff --git a/gst/asfdemux/asfheaders.c b/gst/asfdemux/asfheaders.c index 3815add522..fdbf3d00da 100644 --- a/gst/asfdemux/asfheaders.c +++ b/gst/asfdemux/asfheaders.c @@ -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} } diff --git a/gst/asfdemux/asfheaders.h b/gst/asfdemux/asfheaders.h index a52ff6a337..ff43fa6f8a 100644 --- a/gst/asfdemux/asfheaders.h +++ b/gst/asfdemux/asfheaders.h @@ -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[]; diff --git a/gst/asfdemux/asfpacket.c b/gst/asfdemux/asfpacket.c index 1d4bcfb4c1..88d1b7f10b 100644 --- a/gst/asfdemux/asfpacket.c +++ b/gst/asfdemux/asfpacket.c @@ -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); diff --git a/gst/asfdemux/asfpacket.h b/gst/asfdemux/asfpacket.h index 1ca3e6604a..283088101c 100644 --- a/gst/asfdemux/asfpacket.h +++ b/gst/asfdemux/asfpacket.h @@ -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;