diff options
author | Julien Isorce <julien.isorce@gmail.com> | 2009-09-03 17:49:41 +0200 |
---|---|---|
committer | Julien Isorce <julien.isorce@gmail.com> | 2009-09-03 17:49:41 +0200 |
commit | 9a1597e58b9b4420dcf0237afe92bbd266944ffe (patch) | |
tree | 56c5cd074bc7f3c6e539052a8f2ec7245fcbd9d1 /sys/dshowsrcwrapper | |
parent | a22eca4e67b3bff1c4018187156005c3d5897644 (diff) | |
download | gstreamer-plugins-bad-9a1597e58b9b4420dcf0237afe92bbd266944ffe.tar.gz |
dshowvideosrc: factorize dshow format to gst caps conversion
Diffstat (limited to 'sys/dshowsrcwrapper')
-rwxr-xr-x | sys/dshowsrcwrapper/gstdshow.cpp | 10 | ||||
-rwxr-xr-x | sys/dshowsrcwrapper/gstdshowvideosrc.cpp | 101 |
2 files changed, 30 insertions, 81 deletions
diff --git a/sys/dshowsrcwrapper/gstdshow.cpp b/sys/dshowsrcwrapper/gstdshow.cpp index 319d4df80..afec3ce94 100755 --- a/sys/dshowsrcwrapper/gstdshow.cpp +++ b/sys/dshowsrcwrapper/gstdshow.cpp @@ -365,6 +365,16 @@ GstCaps *gst_dshow_new_video_caps (GstVideoFormat video_format, const gchar* nam video_structure = gst_caps_get_structure (video_caps, 0); + /* Hope GST_TYPE_INT_RANGE_STEP will exits in future gstreamer releases */ + /* because we could use : */ + /* "width", GST_TYPE_INT_RANGE_STEP, video_default->minWidth, video_default->maxWidth, video_default->granularityWidth */ + /* instead of : */ + /* "width", GST_TYPE_INT_RANGE, video_default->minWidth, video_default->maxWidth */ + + /* For framerate we do not need a step (granularity) because */ + /* "The IAMStreamConfig::SetFormat method will set the frame rate to the closest */ + /* value that the filter supports" as it said in the VIDEO_STREAM_CONFIG_CAPS dshwo doc */
+
gst_structure_set (video_structure,
"width", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cx, vscc->MaxOutputSize.cx,
"height", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cy, vscc->MaxOutputSize.cy, diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp index 32c19f86f..5dbbb0b4e 100755 --- a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp +++ b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp @@ -573,7 +573,6 @@ gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc) } if (src->caps) { - GST_LOG ("getcaps returned %s", gst_caps_to_string (src->caps)); return gst_caps_ref (src->caps); } @@ -896,6 +895,8 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin, if (isize != sizeof (vscc)) return NULL; + caps = gst_caps_new_empty (); + for (; i < icount; i++) { GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1); GstCaptureVideoDefault *video_default = g_new0 (GstCaptureVideoDefault, 1); @@ -904,85 +905,26 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin, pin_mediatype->capture_pin = pin; hres = streamcaps->GetStreamCaps(i, &pin_mediatype->mediatype, (BYTE *) & vscc); - if (hres == S_OK && pin_mediatype->mediatype) { - VIDEOINFOHEADER *video_info; + if (FAILED (hres) || !pin_mediatype->mediatype) { + gst_dshow_free_pin_mediatype (pin_mediatype); + g_free (video_default); + } else { GstCaps *mediacaps = NULL; - if (!caps) - caps = gst_caps_new_empty (); - - /* some remarks: */ - /* Hope GST_TYPE_INT_RANGE_STEP will exits in future gstreamer releases */ - /* because we could use : */ - /* "width", GST_TYPE_INT_RANGE_STEP, video_default->minWidth, video_default->maxWidth, video_default->granularityWidth */ - /* instead of : */ - /* "width", GST_TYPE_INT_RANGE, video_default->minWidth, video_default->maxWidth */ - - /* For framerate we do not need a step (granularity) because */ - /* "The IAMStreamConfig::SetFormat method will set the frame rate to the closest */ - /* value that the filter supports" as it said in the VIDEO_STREAM_CONFIG_CAPS dshwo doc */ - - /* I420 */ if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_I420, FORMAT_VideoInfo)) { - mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_I420, NULL, &vscc, (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default); - if (mediacaps) { - src->pins_mediatypes = - g_list_append (src->pins_mediatypes, pin_mediatype); - src->video_defaults = - g_list_append (src->video_defaults, video_default); - gst_caps_append (caps, mediacaps); - } else { - gst_dshow_free_pin_mediatype (pin_mediatype); - g_free (video_default); - } - continue; - } - - /* BGR */ - if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_RGB24, FORMAT_VideoInfo)) { - + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_RGB24, FORMAT_VideoInfo)) { mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_BGR, NULL, &vscc, (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default); - if (mediacaps) { - src->pins_mediatypes = - g_list_append (src->pins_mediatypes, pin_mediatype); - src->video_defaults = - g_list_append (src->video_defaults, video_default); - gst_caps_append (caps, mediacaps); - } else { - gst_dshow_free_pin_mediatype (pin_mediatype); - g_free (video_default); - } - continue; - } - - /* DVSD */ - if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_VideoInfo)) { - + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_VideoInfo)) { mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, "video/x-dv, systemstream=FALSE", &vscc, (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default); - if (mediacaps) { - src->pins_mediatypes = - g_list_append (src->pins_mediatypes, pin_mediatype); - src->video_defaults = - g_list_append (src->video_defaults, video_default); - gst_caps_append (caps, mediacaps); - } else { - gst_dshow_free_pin_mediatype (pin_mediatype); - g_free (video_default); - } - continue; - } - - /* DV stream */ - if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_DvInfo)) { - video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_DvInfo)) { video_default->granularityWidth = 0; video_default->granularityHeight = 0; @@ -990,22 +932,19 @@ gst_dshowvideosrc_getcaps_from_streamcaps (GstDshowVideoSrc * src, IPin * pin, mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, "video/x-dv, systemstream=TRUE", &vscc, (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default); + } - if (mediacaps) { - src->pins_mediatypes = - g_list_append (src->pins_mediatypes, pin_mediatype); - src->video_defaults = - g_list_append (src->video_defaults, video_default); - gst_caps_append (caps, mediacaps); - } else { - gst_dshow_free_pin_mediatype (pin_mediatype); - g_free (video_default); - } - continue; + if (mediacaps) { + src->pins_mediatypes = + g_list_append (src->pins_mediatypes, pin_mediatype); + src->video_defaults = + g_list_append (src->video_defaults, video_default); + gst_caps_append (caps, mediacaps); + } else { + gst_dshow_free_pin_mediatype (pin_mediatype); + g_free (video_default); } - } else { - gst_dshow_free_pin_mediatype (pin_mediatype); - g_free (video_default); + } } |