qtdemux: support wma & vc-1

https://bugzilla.gnome.org/show_bug.cgi?id=596321
This commit is contained in:
Marc-André Lureau 2009-09-23 18:47:42 +02:00 committed by Mark Nauwelaerts
parent 6f05c5c050
commit 293e6a61b4
3 changed files with 99 additions and 0 deletions

View file

@ -6149,6 +6149,30 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
qtdemux_parse_theora_extension (qtdemux, stream, xdxt);
break;
}
case FOURCC_ovc1:
{
GNode *ovc1;
gchar *ovc1_data;
guint ovc1_len;
GstBuffer *buf;
GST_DEBUG_OBJECT (qtdemux, "parse ovc1 header");
ovc1 = qtdemux_tree_get_child_by_type (stsd, FOURCC_ovc1);
if (!ovc1)
break;
ovc1_data = ovc1->data;
ovc1_len = QT_UINT32 (ovc1_data);
if (ovc1_len <= 198) {
GST_WARNING_OBJECT (qtdemux, "Too small ovc1 header, skipping");
break;
}
buf = gst_buffer_new_and_alloc (ovc1_len - 198);
memcpy (GST_BUFFER_DATA (buf), ovc1_data + 198, ovc1_len - 198);
gst_caps_set_simple (stream->caps,
"codec_data", GST_TYPE_BUFFER, buf, NULL);
gst_buffer_unref (buf);
break;
}
default:
break;
}
@ -6321,6 +6345,67 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
}
break;
}
case FOURCC_owma:
{
GNode *owma;
const gchar *owma_data, *codec_name = NULL;
guint owma_len;
GstBuffer *buf;
gint version = 1;
/* from http://msdn.microsoft.com/en-us/library/dd757720(VS.85).aspx */
typedef struct
{
gint16 wFormatTag;
gint16 nChannels;
gint32 nSamplesPerSec;
gint32 nAvgBytesPerSec;
gint16 nBlockAlign;
gint16 wBitsPerSample;
gint16 cbSize;
} WAVEFORMATEX;
WAVEFORMATEX *wfex;
GST_DEBUG_OBJECT (qtdemux, "parse owma");
owma = qtdemux_tree_get_child_by_type (stsd, FOURCC_owma);
if (!owma)
break;
owma_data = owma->data;
owma_len = QT_UINT32 (owma_data);
if (owma_len <= 54) {
GST_WARNING_OBJECT (qtdemux, "Too small owma header, skipping");
break;
}
wfex = (WAVEFORMATEX *) (owma_data + 36);
buf = gst_buffer_new_and_alloc (owma_len - 54);
memcpy (GST_BUFFER_DATA (buf), owma_data + 54, owma_len - 54);
if (wfex->wFormatTag == 0x0161) {
codec_name = "Windows Media Audio";
version = 2;
} else if (wfex->wFormatTag == 0x0162) {
codec_name = "Windows Media Audio 9 Pro";
version = 3;
} else if (wfex->wFormatTag == 0x0163) {
codec_name = "Windows Media Audio 9 Lossless";
/* is that correct? gstffmpegcodecmap.c is missing it, but
* fluendo codec seems to support it */
version = 4;
}
gst_caps_set_simple (stream->caps,
"codec_data", GST_TYPE_BUFFER, buf,
"wmaversion", G_TYPE_INT, version,
"block_align", G_TYPE_INT, wfex->nBlockAlign,
"bitrate", G_TYPE_INT, wfex->nAvgBytesPerSec,
"width", G_TYPE_INT, wfex->wBitsPerSample,
"depth", G_TYPE_INT, wfex->wBitsPerSample, NULL);
gst_buffer_unref (buf);
if (codec_name) {
g_free (codec);
codec = g_strdup (codec_name);
}
break;
}
default:
break;
}
@ -8327,6 +8412,12 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
case GST_MAKE_FOURCC ('V', 'P', '8', '0'):
_codec ("On2 VP8");
caps = gst_caps_from_string ("video/x-vp8");
case FOURCC_ovc1:
_codec ("VC-1");
caps = gst_caps_new_simple ("video/x-wmv",
"wmvversion", G_TYPE_INT, 3,
"format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('W', 'V', 'C', '1'),
NULL);
break;
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
default:
@ -8523,6 +8614,10 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
_codec ("QualComm PureVoice");
caps = gst_caps_from_string ("audio/qcelp");
break;
case FOURCC_owma:
_codec ("WMA");
caps = gst_caps_new_simple ("audio/x-wma", NULL);
break;
case GST_MAKE_FOURCC ('q', 't', 'v', 'r'):
/* ? */
default:

View file

@ -222,6 +222,8 @@ G_BEGIN_DECLS
#define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f')
#define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x')
#define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n')
#define FOURCC_ovc1 GST_MAKE_FOURCC('o','v','c','1')
#define FOURCC_owma GST_MAKE_FOURCC('o','w','m','a')
G_END_DECLS

View file

@ -169,6 +169,8 @@ static const QtNodeType qt_node_types[] = {
{FOURCC_mvex, "mvex", QT_FLAG_CONTAINER,},
{FOURCC_mehd, "movie extends header", 0,
qtdemux_dump_mehd},
{FOURCC_ovc1, "ovc1", 0},
{FOURCC_owma, "owma", 0},
{0, "unknown", 0,},
};