diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 6a4a6f86be..588c780f05 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -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: diff --git a/gst/qtdemux/qtdemux_fourcc.h b/gst/qtdemux/qtdemux_fourcc.h index 3f4483cba9..d7875cc668 100644 --- a/gst/qtdemux/qtdemux_fourcc.h +++ b/gst/qtdemux/qtdemux_fourcc.h @@ -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 diff --git a/gst/qtdemux/qtdemux_types.c b/gst/qtdemux/qtdemux_types.c index cf7fd05a4f..38da35b3d5 100644 --- a/gst/qtdemux/qtdemux_types.c +++ b/gst/qtdemux/qtdemux_types.c @@ -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,}, };