From afee3b0301567247a196ee3fa4c1f48ce2c738bc Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Wed, 29 Jun 2011 15:18:47 +0200 Subject: [PATCH] camerabin2: Remove redundant elements Since camerabin2 has switched to encodebin and encodebin has its own queues and conversion elements, those preceding encodebin are no longer necessary and as such can be removed. --- gst/camerabin2/gstcamerabin2.c | 76 ++++++++++++++-------------------- gst/camerabin2/gstcamerabin2.h | 3 -- 2 files changed, 30 insertions(+), 49 deletions(-) diff --git a/gst/camerabin2/gstcamerabin2.c b/gst/camerabin2/gstcamerabin2.c index 555156529f..ed79b62837 100644 --- a/gst/camerabin2/gstcamerabin2.c +++ b/gst/camerabin2/gstcamerabin2.c @@ -245,13 +245,9 @@ gst_camera_bin_start_capture (GstCameraBin2 * camerabin) if (camerabin->audio_src) { gst_element_set_state (camerabin->audio_src, GST_STATE_READY); /* need to reset eos status (pads could be flushing) */ - gst_element_set_state (camerabin->audio_queue, GST_STATE_READY); - gst_element_set_state (camerabin->audio_convert, GST_STATE_READY); gst_element_set_state (camerabin->audio_capsfilter, GST_STATE_READY); gst_element_set_state (camerabin->audio_volume, GST_STATE_READY); - gst_element_sync_state_with_parent (camerabin->audio_queue); - gst_element_sync_state_with_parent (camerabin->audio_convert); gst_element_sync_state_with_parent (camerabin->audio_capsfilter); gst_element_sync_state_with_parent (camerabin->audio_volume); } @@ -341,7 +337,6 @@ gst_camera_bin_src_notify_readyforcapture (GObject * obj, GParamSpec * pspec, gst_element_set_state (camera->videosink, GST_STATE_NULL); gst_element_set_state (camera->video_encodebin, GST_STATE_NULL); gst_element_set_state (camera->videobin_capsfilter, GST_STATE_NULL); - gst_element_set_state (camera->videobin_queue, GST_STATE_NULL); location = g_strdup_printf (camera->location, camera->capture_index++); GST_DEBUG_OBJECT (camera, "Switching videobin location to %s", location); g_object_set (camera->videosink, "location", location, NULL); @@ -349,7 +344,6 @@ gst_camera_bin_src_notify_readyforcapture (GObject * obj, GParamSpec * pspec, gst_element_set_state (camera->videosink, GST_STATE_PLAYING); gst_element_set_state (camera->video_encodebin, GST_STATE_PLAYING); gst_element_set_state (camera->videobin_capsfilter, GST_STATE_PLAYING); - gst_element_set_state (camera->videobin_queue, GST_STATE_PLAYING); } } @@ -377,10 +371,6 @@ gst_camera_bin_dispose (GObject * object) if (camerabin->audio_capsfilter) gst_object_unref (camerabin->audio_capsfilter); - if (camerabin->audio_queue) - gst_object_unref (camerabin->audio_queue); - if (camerabin->audio_convert) - gst_object_unref (camerabin->audio_convert); if (camerabin->audio_volume) gst_object_unref (camerabin->audio_volume); @@ -399,8 +389,6 @@ gst_camera_bin_dispose (GObject * object) gst_object_unref (camerabin->videosink); if (camerabin->video_encodebin) gst_object_unref (camerabin->video_encodebin); - if (camerabin->videobin_queue) - gst_object_unref (camerabin->videobin_queue); if (camerabin->videobin_capsfilter) gst_object_unref (camerabin->videobin_capsfilter); @@ -798,7 +786,8 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message) static void gst_camera_bin_check_and_replace_filter (GstCameraBin2 * camera, GstElement ** current_filter, GstElement * new_filter, - GstElement * previous_element, GstElement * next_element) + GstElement * previous_element, GstElement * next_element, + const gchar * prev_elem_pad) { if (*current_filter == new_filter) { GST_DEBUG_OBJECT (camera, "Current filter is the same as the previous, " @@ -822,9 +811,21 @@ gst_camera_bin_check_and_replace_filter (GstCameraBin2 * camera, if (new_filter) { *current_filter = gst_object_ref (new_filter); gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (new_filter)); - gst_element_link_many (previous_element, new_filter, next_element, NULL); + } + + if (prev_elem_pad) { + if (new_filter) { + gst_element_link_pads (previous_element, prev_elem_pad, new_filter, NULL); + gst_element_link (new_filter, next_element); + } else { + gst_element_link_pads (previous_element, prev_elem_pad, next_element, + NULL); + } } else { - gst_element_link (previous_element, next_element); + if (new_filter) + gst_element_link_many (previous_element, new_filter, next_element, NULL); + else + gst_element_link (previous_element, next_element); } } @@ -1081,13 +1082,6 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) g_object_set (camera->videosink, "async", FALSE, NULL); /* audio elements */ - camera->audio_queue = gst_element_factory_make ("queue", "audio-queue"); - camera->audio_convert = gst_element_factory_make ("audioconvert", - "audio-convert"); - if (!camera->audio_convert) { - missing_element_name = "audioconvert"; - goto missing_element; - } if (!camera->audio_volume) { missing_element_name = "volume"; goto missing_element; @@ -1160,8 +1154,6 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) camera->image_profile_switch = TRUE; } - camera->videobin_queue = - gst_element_factory_make ("queue", "videobin-queue"); camera->imagebin_queue = gst_element_factory_make ("queue", "imagebin-queue"); camera->viewfinderbin_queue = @@ -1171,20 +1163,16 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) NULL); g_object_set (camera->imagebin_queue, "max-size-time", (guint64) 0, "silent", TRUE, NULL); - g_object_set (camera->videobin_queue, "silent", TRUE, NULL); gst_bin_add_many (GST_BIN_CAST (camera), gst_object_ref (camera->video_encodebin), gst_object_ref (camera->videosink), gst_object_ref (camera->image_encodebin), gst_object_ref (camera->imagesink), - gst_object_ref (camera->videobin_queue), gst_object_ref (camera->imagebin_queue), gst_object_ref (camera->viewfinderbin_queue), NULL); /* Linking can be optimized TODO */ - gst_element_link_many (camera->videobin_queue, camera->videobin_capsfilter, - NULL); gst_element_link (camera->video_encodebin, camera->videosink); gst_element_link_many (camera->imagebin_queue, camera->imagebin_capsfilter, @@ -1297,8 +1285,12 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) "sink"); gst_element_link_pads (camera->src, "imgsrc", camera->imagebin_queue, "sink"); - gst_element_link_pads (camera->src, "vidsrc", camera->videobin_queue, - "sink"); + if (!gst_element_link_pads (camera->src, "vidsrc", + camera->videobin_capsfilter, "sink")) { + GST_ERROR_OBJECT (camera, + "Failed to link camera source's vidsrc pad to video bin capsfilter"); + goto fail; + } gst_pad_add_buffer_probe (imgsrc, (GCallback) gst_camera_bin_image_src_buffer_probe, camera); @@ -1307,13 +1299,13 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) gst_camera_bin_check_and_replace_filter (camera, &camera->image_filter, camera->user_image_filter, camera->imagebin_queue, - camera->imagebin_capsfilter); + camera->imagebin_capsfilter, NULL); gst_camera_bin_check_and_replace_filter (camera, &camera->video_filter, - camera->user_video_filter, camera->videobin_queue, - camera->videobin_capsfilter); + camera->user_video_filter, camera->src, camera->videobin_capsfilter, + "vidsrc"); gst_camera_bin_check_and_replace_filter (camera, &camera->viewfinder_filter, camera->user_viewfinder_filter, camera->viewfinderbin_queue, - camera->viewfinderbin_capsfilter); + camera->viewfinderbin_capsfilter, NULL); /* check if we need to replace the camera audio src */ has_audio = gst_camera_bin_video_profile_has_audio (camera); @@ -1321,10 +1313,8 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) if ((camera->user_audio_src && camera->user_audio_src != camera->audio_src) || !has_audio) { gst_bin_remove (GST_BIN_CAST (camera), camera->audio_src); - gst_bin_remove (GST_BIN_CAST (camera), camera->audio_queue); gst_bin_remove (GST_BIN_CAST (camera), camera->audio_volume); gst_bin_remove (GST_BIN_CAST (camera), camera->audio_capsfilter); - gst_bin_remove (GST_BIN_CAST (camera), camera->audio_convert); gst_object_unref (camera->audio_src); camera->audio_src = NULL; } @@ -1344,20 +1334,18 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) if (new_audio_src) { gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (camera->audio_src)); - gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (camera->audio_queue)); gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (camera->audio_volume)); gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (camera->audio_capsfilter)); - gst_bin_add (GST_BIN_CAST (camera), gst_object_ref (camera->audio_convert)); - gst_element_link_many (camera->audio_src, camera->audio_queue, - camera->audio_volume, - camera->audio_capsfilter, camera->audio_convert, NULL); + gst_element_link_many (camera->audio_src, camera->audio_volume, + camera->audio_capsfilter, NULL); } if ((profile_switched && has_audio) || new_audio_src) { if (GST_PAD_LINK_FAILED (gst_camera_bin_link_encodebin (camera, - camera->video_encodebin, camera->audio_convert, AUDIO_PAD))) { + camera->video_encodebin, camera->audio_capsfilter, + AUDIO_PAD))) { goto fail; } } @@ -1423,20 +1411,16 @@ gst_camera_bin_change_state (GstElement * element, GstStateChange trans) camera->image_location_list = NULL; /* explicitly set to READY as they might be outside of the bin */ - gst_element_set_state (camera->audio_queue, GST_STATE_READY); gst_element_set_state (camera->audio_volume, GST_STATE_READY); gst_element_set_state (camera->audio_capsfilter, GST_STATE_READY); - gst_element_set_state (camera->audio_convert, GST_STATE_READY); break; case GST_STATE_CHANGE_READY_TO_NULL: if (camera->audio_src) gst_element_set_state (camera->audio_src, GST_STATE_NULL); /* explicitly set to NULL as they might be outside of the bin */ - gst_element_set_state (camera->audio_queue, GST_STATE_NULL); gst_element_set_state (camera->audio_volume, GST_STATE_NULL); gst_element_set_state (camera->audio_capsfilter, GST_STATE_NULL); - gst_element_set_state (camera->audio_convert, GST_STATE_NULL); break; default: diff --git a/gst/camerabin2/gstcamerabin2.h b/gst/camerabin2/gstcamerabin2.h index 8ab108ac2c..1dc9c00986 100644 --- a/gst/camerabin2/gstcamerabin2.h +++ b/gst/camerabin2/gstcamerabin2.h @@ -45,7 +45,6 @@ struct _GstCameraBin2 GstElement *video_encodebin; gulong video_encodebin_signal_id; GstElement *videosink; - GstElement *videobin_queue; GstElement *videobin_capsfilter; GstElement *viewfinderbin; @@ -67,10 +66,8 @@ struct _GstCameraBin2 GstElement *audio_src; GstElement *user_audio_src; - GstElement *audio_queue; GstElement *audio_volume; GstElement *audio_capsfilter; - GstElement *audio_convert; gint processing_counter; /* atomic int */