camerabin2: Adds properties for capture caps

Adds properties for selecting caps for video and image captures
This commit is contained in:
Thiago Santos 2010-12-14 18:42:51 -03:00
parent 42092fe928
commit 85bf8f2335

View file

@ -64,7 +64,9 @@ enum
PROP_LOCATION, PROP_LOCATION,
PROP_CAMERA_SRC, PROP_CAMERA_SRC,
PROP_IMAGE_CAPTURE_SUPPORTED_CAPS, PROP_IMAGE_CAPTURE_SUPPORTED_CAPS,
PROP_VIDEO_CAPTURE_SUPPORTED_CAPS PROP_VIDEO_CAPTURE_SUPPORTED_CAPS,
PROP_IMAGE_CAPTURE_CAPS,
PROP_VIDEO_CAPTURE_CAPS
}; };
enum enum
@ -305,6 +307,20 @@ gst_camera_bin_class_init (GstCameraBinClass * klass)
"Formats supported for capturing videos represented as GstCaps", "Formats supported for capturing videos represented as GstCaps",
GST_TYPE_CAPS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); GST_TYPE_CAPS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class,
PROP_IMAGE_CAPTURE_CAPS,
g_param_spec_boxed ("image-capture-caps",
"Image capture caps",
"Caps for image capture",
GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class,
PROP_VIDEO_CAPTURE_CAPS,
g_param_spec_boxed ("video-capture-caps",
"Video capture caps",
"Caps for video capture",
GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* GstCameraBin::capture-start: * GstCameraBin::capture-start:
@ -332,15 +348,28 @@ gst_camera_bin_class_init (GstCameraBinClass * klass)
} }
static void static void
gst_camera_bin_init (GstCameraBin * camerabin) gst_camera_bin_init (GstCameraBin * camera)
{ {
camerabin->mode = DEFAULT_MODE; camera->mode = DEFAULT_MODE;
camerabin->video_location = g_strdup (DEFAULT_VID_LOCATION); camera->video_location = g_strdup (DEFAULT_VID_LOCATION);
camerabin->image_location = g_strdup (DEFAULT_IMG_LOCATION); camera->image_location = g_strdup (DEFAULT_IMG_LOCATION);
camerabin->viewfinderbin = gst_element_factory_make ("viewfinderbin", camera->viewfinderbin = gst_element_factory_make ("viewfinderbin", "vf-bin");
"vf-bin");
gst_bin_add (GST_BIN (camerabin), gst_object_ref (camerabin->viewfinderbin)); /* capsfilters are created here as we proxy their caps properties and
* this way we avoid having to store the caps while on NULL state to
* set them later */
camera->videobin_capsfilter = gst_element_factory_make ("capsfilter",
"videobin-capsfilter");
camera->imagebin_capsfilter = gst_element_factory_make ("capsfilter",
"imagebin-capsfilter");
camera->viewfinderbin_capsfilter = gst_element_factory_make ("capsfilter",
"viewfinderbin-capsfilter");
gst_bin_add_many (GST_BIN (camera),
gst_object_ref (camera->viewfinderbin),
gst_object_ref (camera->videobin_capsfilter),
gst_object_ref (camera->imagebin_capsfilter),
gst_object_ref (camera->viewfinderbin_capsfilter), NULL);
} }
/** /**
@ -373,21 +402,11 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
camera->viewfinderbin_queue = camera->viewfinderbin_queue =
gst_element_factory_make ("queue", "viewfinderbin-queue"); gst_element_factory_make ("queue", "viewfinderbin-queue");
camera->videobin_capsfilter = gst_element_factory_make ("capsfilter",
"videobin-capsfilter");
camera->imagebin_capsfilter = gst_element_factory_make ("capsfilter",
"imagebin-capsfilter");
camera->viewfinderbin_capsfilter = gst_element_factory_make ("capsfilter",
"viewfinderbin-capsfilter");
gst_bin_add_many (GST_BIN_CAST (camera), gst_bin_add_many (GST_BIN_CAST (camera),
gst_object_ref (camera->videobin), gst_object_ref (camera->imagebin), gst_object_ref (camera->videobin), gst_object_ref (camera->imagebin),
gst_object_ref (camera->videobin_queue), gst_object_ref (camera->videobin_queue),
gst_object_ref (camera->imagebin_queue), gst_object_ref (camera->imagebin_queue),
gst_object_ref (camera->viewfinderbin_queue), gst_object_ref (camera->viewfinderbin_queue), NULL);
gst_object_ref (camera->videobin_capsfilter),
gst_object_ref (camera->imagebin_capsfilter),
gst_object_ref (camera->viewfinderbin_capsfilter), NULL);
/* Linking can be optimized TODO */ /* Linking can be optimized TODO */
gst_element_link_many (camera->videobin_queue, camera->videobin_capsfilter, gst_element_link_many (camera->videobin_queue, camera->videobin_capsfilter,
@ -531,6 +550,14 @@ gst_camera_bin_set_property (GObject * object, guint prop_id,
case PROP_CAMERA_SRC: case PROP_CAMERA_SRC:
gst_camera_bin_set_camera_src (camera, g_value_get_object (value)); gst_camera_bin_set_camera_src (camera, g_value_get_object (value));
break; break;
case PROP_IMAGE_CAPTURE_CAPS:
g_object_set (camera->imagebin_capsfilter, "caps",
gst_value_get_caps (value), NULL);
break;
case PROP_VIDEO_CAPTURE_CAPS:
g_object_set (camera->videobin_capsfilter, "caps",
gst_value_get_caps (value), NULL);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -592,6 +619,20 @@ gst_camera_bin_get_property (GObject * object, guint prop_id,
} }
} }
break; break;
case PROP_IMAGE_CAPTURE_CAPS:{
GstCaps *caps = NULL;
g_object_get (camera->imagebin_capsfilter, "caps", &caps, NULL);
gst_value_set_caps (value, caps);
gst_caps_unref (caps);
}
break;
case PROP_VIDEO_CAPTURE_CAPS:{
GstCaps *caps = NULL;
g_object_get (camera->videobin_capsfilter, "caps", &caps, NULL);
gst_value_set_caps (value, caps);
gst_caps_unref (caps);
}
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;