mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
dshowvideosrc: factorize dshow format to gst caps conversion
This commit is contained in:
parent
a22eca4e67
commit
9a1597e58b
2 changed files with 31 additions and 82 deletions
|
@ -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);
|
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,
|
gst_structure_set (video_structure,
|
||||||
"width", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cx, vscc->MaxOutputSize.cx,
|
"width", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cx, vscc->MaxOutputSize.cx,
|
||||||
"height", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cy, vscc->MaxOutputSize.cy,
|
"height", GST_TYPE_INT_RANGE, vscc->MinOutputSize.cy, vscc->MaxOutputSize.cy,
|
||||||
|
|
|
@ -573,7 +573,6 @@ gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src->caps) {
|
if (src->caps) {
|
||||||
GST_LOG ("getcaps returned %s", gst_caps_to_string (src->caps));
|
|
||||||
return gst_caps_ref (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))
|
if (isize != sizeof (vscc))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
caps = gst_caps_new_empty ();
|
||||||
|
|
||||||
for (; i < icount; i++) {
|
for (; i < icount; i++) {
|
||||||
GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1);
|
GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1);
|
||||||
GstCaptureVideoDefault *video_default = g_new0 (GstCaptureVideoDefault, 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;
|
pin_mediatype->capture_pin = pin;
|
||||||
|
|
||||||
hres = streamcaps->GetStreamCaps(i, &pin_mediatype->mediatype, (BYTE *) & vscc);
|
hres = streamcaps->GetStreamCaps(i, &pin_mediatype->mediatype, (BYTE *) & vscc);
|
||||||
if (hres == S_OK && pin_mediatype->mediatype) {
|
if (FAILED (hres) || !pin_mediatype->mediatype) {
|
||||||
VIDEOINFOHEADER *video_info;
|
gst_dshow_free_pin_mediatype (pin_mediatype);
|
||||||
|
g_free (video_default);
|
||||||
|
} else {
|
||||||
GstCaps *mediacaps = NULL;
|
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)) {
|
if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_I420, FORMAT_VideoInfo)) {
|
||||||
|
|
||||||
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_I420, NULL, &vscc,
|
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_I420, NULL, &vscc,
|
||||||
(VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default);
|
(VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default);
|
||||||
|
|
||||||
if (mediacaps) {
|
} else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_RGB24, FORMAT_VideoInfo)) {
|
||||||
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)) {
|
|
||||||
|
|
||||||
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_BGR, NULL, &vscc,
|
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_BGR, NULL, &vscc,
|
||||||
(VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default);
|
(VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat, video_default);
|
||||||
|
|
||||||
if (mediacaps) {
|
} else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_VideoInfo)) {
|
||||||
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)) {
|
|
||||||
|
|
||||||
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN,
|
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN,
|
||||||
"video/x-dv, systemstream=FALSE", &vscc, (VIDEOINFOHEADER *)
|
"video/x-dv, systemstream=FALSE", &vscc, (VIDEOINFOHEADER *)
|
||||||
pin_mediatype->mediatype->pbFormat, video_default);
|
pin_mediatype->mediatype->pbFormat, video_default);
|
||||||
|
|
||||||
if (mediacaps) {
|
} else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, MEDIASUBTYPE_dvsd, FORMAT_DvInfo)) {
|
||||||
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;
|
|
||||||
|
|
||||||
video_default->granularityWidth = 0;
|
video_default->granularityWidth = 0;
|
||||||
video_default->granularityHeight = 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,
|
mediacaps = gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN,
|
||||||
"video/x-dv, systemstream=TRUE", &vscc, (VIDEOINFOHEADER *)
|
"video/x-dv, systemstream=TRUE", &vscc, (VIDEOINFOHEADER *)
|
||||||
pin_mediatype->mediatype->pbFormat, video_default);
|
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;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
gst_dshow_free_pin_mediatype (pin_mediatype);
|
if (mediacaps) {
|
||||||
g_free (video_default);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue