mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-20 09:23:46 +00:00
qtdemux: support wma & vc-1
https://bugzilla.gnome.org/show_bug.cgi?id=596321
This commit is contained in:
parent
6f05c5c050
commit
293e6a61b4
3 changed files with 99 additions and 0 deletions
|
@ -6149,6 +6149,30 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
qtdemux_parse_theora_extension (qtdemux, stream, xdxt);
|
qtdemux_parse_theora_extension (qtdemux, stream, xdxt);
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6321,6 +6345,67 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -8327,6 +8412,12 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
|
||||||
case GST_MAKE_FOURCC ('V', 'P', '8', '0'):
|
case GST_MAKE_FOURCC ('V', 'P', '8', '0'):
|
||||||
_codec ("On2 VP8");
|
_codec ("On2 VP8");
|
||||||
caps = gst_caps_from_string ("video/x-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;
|
break;
|
||||||
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
|
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
|
||||||
default:
|
default:
|
||||||
|
@ -8523,6 +8614,10 @@ qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
|
||||||
_codec ("QualComm PureVoice");
|
_codec ("QualComm PureVoice");
|
||||||
caps = gst_caps_from_string ("audio/qcelp");
|
caps = gst_caps_from_string ("audio/qcelp");
|
||||||
break;
|
break;
|
||||||
|
case FOURCC_owma:
|
||||||
|
_codec ("WMA");
|
||||||
|
caps = gst_caps_new_simple ("audio/x-wma", NULL);
|
||||||
|
break;
|
||||||
case GST_MAKE_FOURCC ('q', 't', 'v', 'r'):
|
case GST_MAKE_FOURCC ('q', 't', 'v', 'r'):
|
||||||
/* ? */
|
/* ? */
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -222,6 +222,8 @@ G_BEGIN_DECLS
|
||||||
#define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f')
|
#define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f')
|
||||||
#define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x')
|
#define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x')
|
||||||
#define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n')
|
#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
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,8 @@ static const QtNodeType qt_node_types[] = {
|
||||||
{FOURCC_mvex, "mvex", QT_FLAG_CONTAINER,},
|
{FOURCC_mvex, "mvex", QT_FLAG_CONTAINER,},
|
||||||
{FOURCC_mehd, "movie extends header", 0,
|
{FOURCC_mehd, "movie extends header", 0,
|
||||||
qtdemux_dump_mehd},
|
qtdemux_dump_mehd},
|
||||||
|
{FOURCC_ovc1, "ovc1", 0},
|
||||||
|
{FOURCC_owma, "owma", 0},
|
||||||
{0, "unknown", 0,},
|
{0, "unknown", 0,},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue