summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAndoni Morales Alastruey <ylatuya@gmail.com>2012-05-29 10:48:54 -0700
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-05-31 12:45:18 +0200
commite1f50d10d5d140b40a6d2692e6492b6dcb6e9a76 (patch)
tree6bc922ffee05d98cb90d96bd0d8aff1a41b8f90e /sys
parent261fe743d1f9c286202356a91c9f0c8231db9b2a (diff)
dshowdecwrapper: add support for VC1 and fix plugins ranks
Diffstat (limited to 'sys')
-rw-r--r--sys/dshowdecwrapper/gstdshowaudiodec.cpp4
-rw-r--r--sys/dshowdecwrapper/gstdshowfakesrc.cpp4
-rw-r--r--sys/dshowdecwrapper/gstdshowvideodec.cpp27
3 files changed, 25 insertions, 10 deletions
diff --git a/sys/dshowdecwrapper/gstdshowaudiodec.cpp b/sys/dshowdecwrapper/gstdshowaudiodec.cpp
index 2c7898219..d32c3890a 100644
--- a/sys/dshowdecwrapper/gstdshowaudiodec.cpp
+++ b/sys/dshowdecwrapper/gstdshowaudiodec.cpp
@@ -583,7 +583,7 @@ gst_dshowaudiodec_chain (GstPad * pad, GstBuffer * buffer)
goto beach;
}
- if (adec->last_ret < GST_FLOW_UNEXPECTED) {
+ if (GST_FLOW_IS_FATAL (adec->last_ret)) {
GST_DEBUG_OBJECT (adec, "last decoding iteration generated a fatal error "
"%s", gst_flow_get_name (adec->last_ret));
goto beach;
@@ -1171,7 +1171,7 @@ dshow_adec_register (GstPlugin * plugin)
audio_dec_codecs[i].element_name, &info, (GTypeFlags)0);
g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (audio_dec_codecs + i));
if (!gst_element_register (plugin, audio_dec_codecs[i].element_name,
- GST_RANK_SECONDARY, type)) {
+ GST_RANK_MARGINAL, type)) {
return FALSE;
}
GST_CAT_DEBUG (dshowaudiodec_debug, "Registered %s",
diff --git a/sys/dshowdecwrapper/gstdshowfakesrc.cpp b/sys/dshowdecwrapper/gstdshowfakesrc.cpp
index 12a3f7720..194d5dd0e 100644
--- a/sys/dshowdecwrapper/gstdshowfakesrc.cpp
+++ b/sys/dshowdecwrapper/gstdshowfakesrc.cpp
@@ -1,4 +1,5 @@
/* GStreamer
+ * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com>
* Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net>
*
* gstdshowfakesrc.cpp:
@@ -129,6 +130,9 @@ STDMETHODIMP FakeOutputPin::PushBuffer(byte *buffer,
hres = Deliver(pSample);
pSample->Release();
}
+ else {
+ GST_WARNING ("unable to obtain a delivery buffer");
+ }
return S_OK;
}
diff --git a/sys/dshowdecwrapper/gstdshowvideodec.cpp b/sys/dshowdecwrapper/gstdshowvideodec.cpp
index 2b3716d44..a1798d6c0 100644
--- a/sys/dshowdecwrapper/gstdshowvideodec.cpp
+++ b/sys/dshowdecwrapper/gstdshowvideodec.cpp
@@ -88,6 +88,7 @@ static gboolean gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec *
#define GUID_MEDIASUBTYPE_WMVV3 {0x33564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
#define GUID_MEDIASUBTYPE_WMVP {0x50564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
#define GUID_MEDIASUBTYPE_WMVA {0x41564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
+#define GUID_MEDIASUBTYPE_WVC1 {0x31435657, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
#define GUID_MEDIASUBTYPE_CVID {0x64697663, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
#define GUID_MEDIASUBTYPE_MP4S {0x5334504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
#define GUID_MEDIASUBTYPE_MP42 {0x3234504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }}
@@ -168,7 +169,7 @@ static const VideoCodecEntry video_dec_codecs[] = {
{"dshowvdec_wmvp", "Windows Media Video 9 Image",
GST_MAKE_FOURCC ('W', 'M', 'V', 'P'),
GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVP,
- "video/x-wmv, wmvversion = (int) 3, " "format = (fourcc) WMVP",
+ "video/x-wmv, wmvversion = (int) 3, " "format = (fourcc) { WMVP, MSS1 }",
GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2,
"video/x-raw-yuv, format=(fourcc)YUY2",
preferred_wmv_filters},
@@ -181,6 +182,14 @@ static const VideoCodecEntry video_dec_codecs[] = {
"video/x-raw-yuv, format=(fourcc)YUY2",
preferred_wmv_filters},
+ {"dshowvdec_wvc1", "Windows Media VC1 video",
+ GST_MAKE_FOURCC ('W', 'V', 'C', '1'),
+ GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WVC1,
+ "video/x-wmv, wmvversion = (int) 3, " "format = (fourcc) WVC1",
+ GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2,
+ "video/x-raw-yuv, format=(fourcc)YUY2",
+ preferred_wmv_filters},
+
{"dshowvdec_cinepak", "Cinepack",
0x64697663,
GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_CVID,
@@ -266,7 +275,7 @@ static const VideoCodecEntry video_dec_codecs[] = {
{"dshowvdec_divx3", "DIVX 3.0 Video",
GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
- GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_DIV3,
+ GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP43,
"video/x-divx, divxversion=(int)3",
GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2,
"video/x-raw-yuv, format=(fourcc)YUY2"}
@@ -857,7 +866,7 @@ gst_dshowvideodec_chain (GstPad * pad, GstBuffer * buffer)
goto beach;
}
- if (vdec->last_ret < GST_FLOW_UNEXPECTED) {
+ if (GST_FLOW_IS_FATAL (vdec->last_ret)) {
GST_DEBUG_OBJECT (vdec, "last decoding iteration generated a fatal error "
"%s", gst_flow_get_name (vdec->last_ret));
goto beach;
@@ -988,8 +997,6 @@ gst_dshowvideodec_flush (GstDshowVideoDec * vdec)
/* flush dshow decoder and reset timestamp */
vdec->fakesrc->GetOutputPin()->Flush();
-
- /* Reset the flow return state tracker */
vdec->last_ret = GST_FLOW_OK;
return TRUE;
@@ -1246,6 +1253,7 @@ dshow_vdec_register (GstPlugin * plugin)
for (i = 0; i < sizeof (video_dec_codecs) / sizeof (VideoCodecEntry); i++) {
GType type;
CComPtr<IBaseFilter> filter;
+ guint rank = GST_RANK_MARGINAL;
filter = gst_dshow_find_filter (
video_dec_codecs[i].input_majortype,
@@ -1255,13 +1263,16 @@ dshow_vdec_register (GstPlugin * plugin)
video_dec_codecs[i].preferred_filters);
if (filter != NULL) {
- GST_DEBUG ("Registering %s", video_dec_codecs[i].element_name);
+ if (video_dec_codecs[i].format == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) {
+ /* FFMPEG WVC1 decoder sucks, get higher priority for ours */
+ rank = GST_RANK_MARGINAL + 2;
+ }
+ GST_DEBUG ("Registering %s with rank %u", video_dec_codecs[i].element_name, rank);
type = g_type_register_static (GST_TYPE_ELEMENT,
video_dec_codecs[i].element_name, &info, (GTypeFlags)0);
g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (video_dec_codecs + i));
- if (!gst_element_register (plugin, video_dec_codecs[i].element_name,
- GST_RANK_PRIMARY, type)) {
+ if (!gst_element_register (plugin, video_dec_codecs[i].element_name, rank, type)) {
return FALSE;
}
GST_DEBUG ("Registered %s", video_dec_codecs[i].element_name);