Fix the issue that camera preview is stopped in 'SelfCamera' app.
authoreojin.ham <eojin.ham@samsung.com>
Sat, 29 Jun 2013 06:32:21 +0000 (15:32 +0900)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Mon, 1 Jul 2013 05:49:23 +0000 (05:49 +0000)
[Title] Fix the issue that camera preview is stopped in 'SelfCamera' app.
[Problem] N_SE-42804
[Cause] Sometimes main task function of tcp clipet src is stopped.
[Solution] Remove server-client model for local media stream and change it to one line pipeline.

Change-Id: I31971df1825375f206c1a14fadf9aa343de15370

Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
Source/WebCore/platform/graphics/gstreamer/tizen/WebKitCameraSourceGStreamerTizen.cpp
Source/WebCore/platform/mediastream/tizen/MediaStreamManager.cpp

index 5f89131..b23a085 100755 (executable)
@@ -464,6 +464,15 @@ void MediaPlayerPrivateGStreamer::load(const String& url)
 
     LOG_MEDIA_MESSAGE("Load %s", cleanUrl.utf8().data());
 
+#if ENABLE(TIZEN_MEDIA_STREAM)
+    // Workaround modification for getUserMedia.
+    // When 'playing' event is fired videoWidth and videoHeight are not available.
+    // Set m_videoSize as frame size which comes from webkitCameraSource.
+    // This size is fixed.
+    if (isLocalMediaStream())
+        m_videoSize = IntSize(480, 640);
+#endif
+
     if (m_preload == MediaPlayer::None) {
         LOG_MEDIA_MESSAGE("Delaying load.");
         m_delayingLoad = true;
@@ -1493,7 +1502,12 @@ void MediaPlayerPrivateGStreamer::updateStates()
         // On-disk buffering was attempted but the media is live. This
         // can't work so disable on-disk buffering and reset the
         // pipeline.
+
+#if ENABLE(TIZEN_MEDIA_STREAM)
+        if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto && !isLocalMediaStream()) {
+#else
         if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto) {
+#endif
             setPreload(MediaPlayer::None);
             gst_element_set_state(m_playBin.get(), GST_STATE_NULL);
             gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED);
@@ -1504,7 +1518,11 @@ void MediaPlayerPrivateGStreamer::updateStates()
         }
 
         // A live stream was paused, reset the pipeline.
+#if ENABLE(TIZEN_MEDIA_STREAM)
+        if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream() && !isLocalMediaStream()) {
+#else
         if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream()) {
+#endif
             gst_element_set_state(m_playBin.get(), GST_STATE_NULL);
             gst_element_set_state(m_playBin.get(), GST_STATE_PLAYING);
 #if ENABLE(TIZEN_GSTREAMER_AUDIO)
index 8fbfac0..ef5416f 100644 (file)
@@ -34,7 +34,7 @@
 #endif
 
 #define RADIAN_VALUE (57.2957)
-#define VCAPS "video/x-raw-yuv, format=(fourcc)I420, width=(int)320, height=(int)240, framerate=(fraction)30/1"
+#define VIDEO_CAPS "video/x-raw-yuv, format=(fourcc)I420, width=(int)640, height=(int)480, framerate=(fraction)30/1"
 
 enum {
     ROTATE_0,
@@ -65,14 +65,7 @@ class RotationManager {
 
 #define WEBKIT_CAMERA_SRC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_CAMERA_SRC, WebKitCameraSrcPrivate))
 struct _WebKitCameraSrcPrivate {
-    GstElement* src;
-    GstElement* demux;
-    GstElement* dec;
     GstElement* flip;
-    GstElement* autoconv;
-    GstElement* videoCaps;
-    GstElement* videoRate;
-    GstPad* srcpad;
     gchar* uri;
     gboolean isRecording;
 
@@ -103,14 +96,6 @@ static void webKitCameraSrcSetProperty(GObject*, guint propertyID, const GValue*
 static void webKitCameraSrcGetProperty(GObject*, guint propertyID, GValue*, GParamSpec*);
 static GstStateChangeReturn webKitCameraSrcChangeState(GstElement*, GstStateChange);
 
-/*
-// Defined but not used.
-static gboolean webKitCameraSrcQueryWithParent(GstPad*, GstObject*, GstQuery*);
-#ifndef GST_API_VERSION_1
-static gboolean webKitCameraSrcQuery(GstPad*, GstQuery*);
-#endif
-*/
-
 static void webKitCameraSrcStop(WebKitCameraSrc*, bool);
 
 #define webkit_camera_src_parent_class parent_class
@@ -162,59 +147,38 @@ static void webkit_camera_src_class_init(WebKitCameraSrcClass* klass)
     g_type_class_add_private(klass, sizeof(WebKitCameraSrcPrivate));
 }
 
-static void newPadCallback(GstElement* element, GstPad* pad, WebKitCameraSrc* src)
-{
-#if ENABLE(TIZEN_DLOG_SUPPORT)
-    TIZEN_LOGI("");
-#endif
-
-    WebKitCameraSrcPrivate* priv = WEBKIT_CAMERA_SRC_GET_PRIVATE(src);
-
-    gst_pad_link(pad, gst_element_get_static_pad(priv->dec, "sink"));
-    gst_element_link_many(priv->dec, priv->autoconv, priv->videoRate, priv->videoCaps, priv->flip, NULL);
-
-}
-
-#define DEFAULT_IP_CAMERA_PORT 8888
 static void webkit_camera_src_init(WebKitCameraSrc* src)
 {
     GRefPtr<GstPadTemplate> padTemplate = adoptGRef(gst_static_pad_template_get(&srcTemplate));
     WebKitCameraSrcPrivate* priv = WEBKIT_CAMERA_SRC_GET_PRIVATE(src);
     src->priv = priv;
 
-    GstCaps* caps = 0;
-    caps = gst_caps_from_string(VCAPS);
+    priv->rotationManager = new RotationManager(src);
 
-    LocalMediaServer::instance().add(src);
+    GstElement* source = gst_element_factory_make("camerasrc", 0);
+    if (source) {
+        g_object_set(source, "camera-id", 1, NULL);
+        g_object_set(source, "hflip", 1, NULL);
+    } else
+        source = gst_element_factory_make("v4l2src", 0);
 
-    priv->rotationManager = new RotationManager(src);
-    priv->src = gst_element_factory_make("tcpclientsrc", 0);
-    priv->demux = gst_element_factory_make("multipartdemux", 0);
-    priv->dec = gst_element_factory_make("jpegdec", 0);
-    priv->autoconv  = gst_element_factory_make("ffmpegcolorspace", "autoconv");
-    priv->flip = gst_element_factory_make("videoflip", 0);
-    priv->videoRate = gst_element_factory_make("videorate", 0);
-    priv->videoCaps = gst_element_factory_make("capsfilter", 0);
-    g_object_set(G_OBJECT(priv->videoCaps), "caps", caps, NULL);
-    gst_caps_unref(caps);
-    g_object_set(priv->src, "protocol", 0, NULL);
-    g_object_set(priv->src, "host", "127.0.0.1", NULL);
-    g_object_set(priv->src, "port", DEFAULT_IP_CAMERA_PORT, NULL);
-    g_object_set(priv->src, "do-timestamp", true, NULL);
+    GRefPtr<GstCaps> caps = adoptGRef(gst_caps_from_string(VIDEO_CAPS));
+    GstElement* capsFilter = gst_element_factory_make("capsfilter", 0);
+    g_object_set(G_OBJECT(capsFilter), "caps", caps.get(), NULL);
 
+    priv->flip = gst_element_factory_make("videoflip", 0);
     if (gst_element_factory_find("camerasrc"))
         g_object_set(priv->flip, "method", 1, NULL);
 
-    gst_bin_add_many(GST_BIN(src), priv->src, priv->demux, priv->dec, priv->flip, priv->videoRate, priv->videoCaps, priv->autoconv, NULL);
-    g_signal_connect(priv->demux, "pad-added", G_CALLBACK(newPadCallback), src);
+    gst_bin_add_many(GST_BIN(src), source, capsFilter, priv->flip, NULL);
 
     GRefPtr<GstPad> targetPad = adoptGRef(gst_element_get_static_pad(GST_ELEMENT(priv->flip), "src"));
-    priv->srcpad = gst_ghost_pad_new_from_template("src", targetPad.get(), padTemplate.get());
+    GstPad* ghostPad = gst_ghost_pad_new_from_template("src", targetPad.get(), padTemplate.get());
+    gst_pad_set_active(ghostPad, TRUE);
+    gst_element_add_pad(GST_ELEMENT(src), ghostPad);
 
-    gst_pad_set_active(priv->srcpad, TRUE);
-    gst_element_add_pad(GST_ELEMENT(src), priv->srcpad);
+    gst_element_link_many(source, capsFilter, priv->flip, NULL);
 
-    gst_element_link(priv->src, priv->demux);
     webKitCameraSrcStop(src, false);
 }
 
@@ -223,7 +187,6 @@ static void webKitCameraSrcFinalize(GObject* object)
     WebKitCameraSrc* src = WEBKIT_CAMERA_SRC(object);
     WebKitCameraSrcPrivate* priv = src->priv;
 
-    LocalMediaServer::instance().remove(src);
     delete priv->rotationManager;
     g_free(priv->uri);
 
@@ -331,47 +294,9 @@ static GstStateChangeReturn webKitCameraSrcChangeState(GstElement* element, GstS
         break;
     }
 
-    if (ret != GST_STATE_CHANGE_FAILURE)
-        LocalMediaServer::instance().stateChanged(src, transition);
-
     return ret;
 }
 
-/*
-// Defined but not used.
-static gboolean webKitCameraSrcQueryWithParent(GstPad* pad, GstObject* parent, GstQuery* query)
-{
-    WebKitCameraSrc* webkitSrc = WEBKIT_CAMERA_SRC(GST_ELEMENT(parent));
-    gboolean result = FALSE;
-
-    switch (GST_QUERY_TYPE(query)) {
-    case GST_QUERY_URI: {
-        gst_query_set_uri(query, webkitSrc->priv->uri);
-        result = TRUE;
-        break;
-    }
-    default: {
-        GRefPtr<GstPad> target = adoptGRef(gst_ghost_pad_get_target(GST_GHOST_PAD_CAST(pad)));
-
-        // Forward the query to the proxy target pad.
-        if (target)
-            result = gst_pad_query(target.get(), query);
-        break;
-    }
-    }
-
-    return result;
-}
-
-#ifndef GST_API_VERSION_1
-static gboolean webKitCameraSrcQuery(GstPad* pad, GstQuery* query)
-{
-    GRefPtr<GstElement> src = adoptGRef(gst_pad_get_parent_element(pad));
-    return webKitCameraSrcQueryWithParent(pad, GST_OBJECT(src.get()), query);
-}
-#endif
-*/
-
 // uri handler interface
 
 #ifdef GST_API_VERSION_1
index 146fd03..349f4bd 100644 (file)
@@ -45,13 +45,12 @@ MediaStreamManager::~MediaStreamManager()
 
 void MediaStreamManager::startLocalMediaStream(PassRefPtr<MediaStreamSourcesQueryClient> client)
 {
-    if (client.get()->video())
-        LocalMediaServer::instance().startStream();
+
 }
 
 void MediaStreamManager::stopLocalMediaStream()
 {
-    LocalMediaServer::instance().stopStream();
+
 }
 
 } // namespace WebCore