mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
first little steps, trying to revive the real media demuxer.
Original commit message from CVS: first little steps, trying to revive the real media demuxer. works better : tag/info extraction audio/video streams recognition container mime type to do : no mime type on caps fixing lots more
This commit is contained in:
parent
f91304c7a7
commit
99d911272e
1 changed files with 71 additions and 30 deletions
|
@ -100,7 +100,7 @@ static GstStaticPadTemplate gst_rmdemux_sink_template =
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS ("video/x-pn-realvideo")
|
GST_STATIC_CAPS ("application/vnd.rn-realmedia")
|
||||||
);
|
);
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_rmdemux_videosrc_template =
|
static GstStaticPadTemplate gst_rmdemux_videosrc_template =
|
||||||
|
@ -307,7 +307,7 @@ gst_rmdemux_loop (GstElement * element)
|
||||||
//int size;
|
//int size;
|
||||||
int ret;
|
int ret;
|
||||||
int rlen;
|
int rlen;
|
||||||
int debug = 0;
|
int debug = 1;
|
||||||
|
|
||||||
/* FIXME _tell gets the offset wrong */
|
/* FIXME _tell gets the offset wrong */
|
||||||
//cur_offset = gst_bytestream_tell(rmdemux->bs);
|
//cur_offset = gst_bytestream_tell(rmdemux->bs);
|
||||||
|
@ -339,7 +339,7 @@ gst_rmdemux_loop (GstElement * element)
|
||||||
g_print ("fourcc " GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS (fourcc));
|
g_print ("fourcc " GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS (fourcc));
|
||||||
g_print ("length %08x\n", length);
|
g_print ("length %08x\n", length);
|
||||||
|
|
||||||
rlen = MIN (length, 4096);
|
rlen = MIN (length, 4096) - 8;
|
||||||
|
|
||||||
switch (fourcc) {
|
switch (fourcc) {
|
||||||
case GST_MAKE_FOURCC ('.', 'R', 'M', 'F'):
|
case GST_MAKE_FOURCC ('.', 'R', 'M', 'F'):
|
||||||
|
@ -520,7 +520,7 @@ gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream)
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get
|
gst_pad_new_from_template (gst_static_pad_template_get
|
||||||
(&gst_rmdemux_audiosrc_template), g_strdup_printf ("audio_%02d",
|
(&gst_rmdemux_audiosrc_template), g_strdup_printf ("audio_%02d",
|
||||||
rmdemux->n_audio_streams));
|
rmdemux->n_audio_streams));
|
||||||
stream->caps = gst_caps_new_simple ("audio/x-ac3", NULL);
|
stream->caps = gst_caps_new_simple ("audio/x-pn-realaudio", NULL);
|
||||||
gst_caps_set_simple (stream->caps,
|
gst_caps_set_simple (stream->caps,
|
||||||
"rate", G_TYPE_INT, (int) stream->rate,
|
"rate", G_TYPE_INT, (int) stream->rate,
|
||||||
"channels", G_TYPE_INT, stream->n_channels, NULL);
|
"channels", G_TYPE_INT, stream->n_channels, NULL);
|
||||||
|
@ -686,9 +686,11 @@ gst_rmdemux_parse_mdpr (GstRMDemux * rmdemux, void *data, int length)
|
||||||
offset += re_skip_pascal_string (data + offset);
|
offset += re_skip_pascal_string (data + offset);
|
||||||
stream2_type_string = re_get_pascal_string (data + offset);
|
stream2_type_string = re_get_pascal_string (data + offset);
|
||||||
offset += re_skip_pascal_string (data + offset);
|
offset += re_skip_pascal_string (data + offset);
|
||||||
if (strcmp (stream1_type_string, "Video Stream") == 0) {
|
/* It could either be "Video Stream" or "The Video Stream",
|
||||||
|
same thing for Audio */
|
||||||
|
if (strstr (stream1_type_string, "Video Stream")) {
|
||||||
stream_type = GST_RMDEMUX_STREAM_VIDEO;
|
stream_type = GST_RMDEMUX_STREAM_VIDEO;
|
||||||
} else if (strcmp (stream1_type_string, "Audio Stream") == 0) {
|
} else if (strstr (stream1_type_string, "Audio Stream")) {
|
||||||
stream_type = GST_RMDEMUX_STREAM_AUDIO;
|
stream_type = GST_RMDEMUX_STREAM_AUDIO;
|
||||||
} else if (strcmp (stream1_type_string, "") == 0 &&
|
} else if (strcmp (stream1_type_string, "") == 0 &&
|
||||||
strcmp (stream2_type_string, "logical-fileinfo") == 0) {
|
strcmp (stream2_type_string, "logical-fileinfo") == 0) {
|
||||||
|
@ -706,35 +708,56 @@ gst_rmdemux_parse_mdpr (GstRMDemux * rmdemux, void *data, int length)
|
||||||
stream->subtype = stream_type;
|
stream->subtype = stream_type;
|
||||||
switch (stream_type) {
|
switch (stream_type) {
|
||||||
case GST_RMDEMUX_STREAM_VIDEO:
|
case GST_RMDEMUX_STREAM_VIDEO:
|
||||||
|
/* VIDO[RV10/RV30/RV40] */
|
||||||
stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
||||||
|
|
||||||
stream->width = RMDEMUX_GUINT16_GET (data + offset + 12);
|
stream->width = RMDEMUX_GUINT16_GET (data + offset + 12);
|
||||||
stream->height = RMDEMUX_GUINT16_GET (data + offset + 14);
|
stream->height = RMDEMUX_GUINT16_GET (data + offset + 14);
|
||||||
stream->rate = RMDEMUX_GUINT16_GET (data + offset + 16);
|
stream->rate = RMDEMUX_GUINT16_GET (data + offset + 16);
|
||||||
break;
|
break;
|
||||||
case GST_RMDEMUX_STREAM_AUDIO:
|
case GST_RMDEMUX_STREAM_AUDIO:
|
||||||
|
/* .ra4, .ra5 */
|
||||||
stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
||||||
|
|
||||||
stream->rate = RMDEMUX_GUINT32_GET (data + offset + 48);
|
stream->rate = RMDEMUX_GUINT32_GET (data + offset + 48);
|
||||||
|
/* cook (cook), sipro (sipr), dnet (dnet) */
|
||||||
break;
|
break;
|
||||||
case GST_RMDEMUX_STREAM_FILEINFO:
|
case GST_RMDEMUX_STREAM_FILEINFO:
|
||||||
{
|
{
|
||||||
int end;
|
int element_nb;
|
||||||
int length;
|
|
||||||
|
|
||||||
length = RMDEMUX_GUINT32_GET (data + offset);
|
/* Length of this section */
|
||||||
end = offset + length;
|
g_print ("length2: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset));
|
||||||
offset += 4;
|
offset += 4;
|
||||||
//re_hexdump_bytes(data + offset,14,offset);
|
|
||||||
offset += 14;
|
/* Unknown : 00 00 00 00 */
|
||||||
offset += re_dump_pascal_string (data + offset);
|
re_hexdump_bytes (data + offset, 4, offset);
|
||||||
//re_hexdump_bytes(data + offset,10,offset);
|
offset += 4;
|
||||||
offset += 10;
|
|
||||||
while (offset < end) {
|
/* Number of variables that would follow (loop iterations) */
|
||||||
//re_hexdump_bytes(data + offset,6,offset);
|
element_nb = RMDEMUX_GUINT32_GET (data + offset);
|
||||||
|
offset += 4;
|
||||||
|
|
||||||
|
while (element_nb) {
|
||||||
|
printf ("\n");
|
||||||
|
|
||||||
|
/* Category Id : 00 00 00 XX 00 00 */
|
||||||
|
re_hexdump_bytes (data + offset, 6, offset);
|
||||||
offset += 6;
|
offset += 6;
|
||||||
|
|
||||||
|
/* Variable Name */
|
||||||
offset += re_dump_pascal_string (data + offset);
|
offset += re_dump_pascal_string (data + offset);
|
||||||
//re_hexdump_bytes(data + offset,5,offset);
|
|
||||||
|
/* Variable Value Type */
|
||||||
|
/* 00 00 00 00 00 => integer/boolean, preceded by length */
|
||||||
|
/* 00 00 00 02 00 => pascal string, preceded by length, no trailing \0 */
|
||||||
|
re_hexdump_bytes (data + offset, 5, offset);
|
||||||
offset += 5;
|
offset += 5;
|
||||||
|
|
||||||
|
/* Variable Value */
|
||||||
offset += re_dump_pascal_string (data + offset);
|
offset += re_dump_pascal_string (data + offset);
|
||||||
|
|
||||||
|
element_nb--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -769,7 +792,8 @@ gst_rmdemux_dump_mdpr (GstRMDemux * rmdemux, void *data, int length)
|
||||||
offset += re_dump_pascal_string (data + offset);
|
offset += re_dump_pascal_string (data + offset);
|
||||||
g_print ("length: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset));
|
g_print ("length: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset));
|
||||||
offset += 4;
|
offset += 4;
|
||||||
if (strcmp (stream_type, "Video Stream") == 0) {
|
|
||||||
|
if (strstr (stream_type, "Video Stream")) {
|
||||||
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 0));
|
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 0));
|
||||||
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 4));
|
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 4));
|
||||||
fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
||||||
|
@ -778,7 +802,7 @@ gst_rmdemux_dump_mdpr (GstRMDemux * rmdemux, void *data, int length)
|
||||||
g_print ("height: %d\n", RMDEMUX_GUINT16_GET (data + offset + 14));
|
g_print ("height: %d\n", RMDEMUX_GUINT16_GET (data + offset + 14));
|
||||||
g_print ("rate: %d\n", RMDEMUX_GUINT16_GET (data + offset + 16));
|
g_print ("rate: %d\n", RMDEMUX_GUINT16_GET (data + offset + 16));
|
||||||
offset += 18;
|
offset += 18;
|
||||||
} else if (strcmp (stream_type, "Audio Stream") == 0) {
|
} else if (strstr (stream_type, "Audio Stream")) {
|
||||||
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 0));
|
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 0));
|
||||||
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 4));
|
g_print ("unknown: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset + 4));
|
||||||
fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
fourcc = RMDEMUX_FOURCC_GET (data + offset + 8);
|
||||||
|
@ -792,25 +816,42 @@ gst_rmdemux_dump_mdpr (GstRMDemux * rmdemux, void *data, int length)
|
||||||
g_print ("rate2: %d\n", RMDEMUX_GUINT32_GET (data + offset + 52));
|
g_print ("rate2: %d\n", RMDEMUX_GUINT32_GET (data + offset + 52));
|
||||||
offset += 56;
|
offset += 56;
|
||||||
} else if (strcmp (stream_type, "") == 0) {
|
} else if (strcmp (stream_type, "") == 0) {
|
||||||
int end;
|
|
||||||
|
|
||||||
end = offset + RMDEMUX_GUINT32_GET (data + offset);
|
int element_nb;
|
||||||
|
|
||||||
|
/* Length of this section */
|
||||||
g_print ("length2: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset));
|
g_print ("length2: 0x%08x\n", RMDEMUX_GUINT32_GET (data + offset));
|
||||||
offset += 4;
|
offset += 4;
|
||||||
re_hexdump_bytes (data + offset, 14, offset);
|
|
||||||
offset += 14;
|
/* Unknown : 00 00 00 00 */
|
||||||
offset += re_dump_pascal_string (data + offset);
|
re_hexdump_bytes (data + offset, 4, offset);
|
||||||
re_hexdump_bytes (data + offset, 10, offset);
|
offset += 4;
|
||||||
offset += 10;
|
|
||||||
while (offset < end) {
|
/* Number of variables that would follow (loop iterations) */
|
||||||
|
element_nb = RMDEMUX_GUINT32_GET (data + offset);
|
||||||
|
offset += 4;
|
||||||
|
|
||||||
|
while (element_nb) {
|
||||||
|
printf ("\n");
|
||||||
|
|
||||||
|
/* Category Id : 00 00 00 XX 00 00 */
|
||||||
re_hexdump_bytes (data + offset, 6, offset);
|
re_hexdump_bytes (data + offset, 6, offset);
|
||||||
offset += 6;
|
offset += 6;
|
||||||
|
|
||||||
|
/* Variable Name */
|
||||||
offset += re_dump_pascal_string (data + offset);
|
offset += re_dump_pascal_string (data + offset);
|
||||||
|
|
||||||
|
/* Variable Value Type */
|
||||||
|
/* 00 00 00 00 00 => integer/boolean, preceded by length */
|
||||||
|
/* 00 00 00 02 00 => pascal string, preceded by length, no trailing \0 */
|
||||||
re_hexdump_bytes (data + offset, 5, offset);
|
re_hexdump_bytes (data + offset, 5, offset);
|
||||||
offset += 5;
|
offset += 5;
|
||||||
offset += re_dump_pascal_string (data + offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Variable Value */
|
||||||
|
offset += re_dump_pascal_string (data + offset);
|
||||||
|
|
||||||
|
element_nb--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
re_hexdump_bytes (data + offset, length - offset, offset);
|
re_hexdump_bytes (data + offset, length - offset, offset);
|
||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
|
|
Loading…
Reference in a new issue