[Android/AMC] clear looper
authorJaeyun <jy1210.jung@samsung.com>
Thu, 1 Apr 2021 02:51:16 +0000 (11:51 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Tue, 6 Apr 2021 04:11:57 +0000 (13:11 +0900)
Clear looper when media steam is finished.

Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
ext/nnstreamer/android_source/gstamcsrc.c
ext/nnstreamer/android_source/gstamcsrc_looper.cc
ext/nnstreamer/android_source/gstamcsrc_looper.h

index 573764a..fa04522 100644 (file)
@@ -640,17 +640,22 @@ static void
 feed_frame_buf (GstAMCSrc * self, guint8 * buf, gint idx, gsize real_size,
     gsize buf_size)
 {
-  GstAMCSrcPrivate *priv = GST_AMC_SRC_GET_PRIVATE (self);
-  GstElement *element = GST_ELEMENT (self);
+  GstAMCSrcPrivate *priv;
+  GstElement *element;
   GstBuffer *buffer;
   GstMemory *mem;
   GstDataQueueItem *item;
   GstClockTime duration = GST_CLOCK_TIME_NONE;
   GstClockTime current_ts = GST_CLOCK_TIME_NONE;
   GstClock *clock;
-
   GstWrappedBuf *wrapped_buf;
 
+  g_return_if_fail (self != NULL);
+  g_return_if_fail (buf != NULL);
+
+  priv = GST_AMC_SRC_GET_PRIVATE (self);
+  element = GST_ELEMENT (self);
+
   if ((clock = gst_element_get_clock (element))) {
     current_ts =
         gst_clock_get_time (clock) - gst_element_get_base_time (element);
@@ -794,6 +799,21 @@ check_codec_buf (GstAMCSrc * self)
 }
 
 /**
+ * @brief Close looper
+ */
+static void
+looper_close (GstAMCSrc * self)
+{
+  GstAMCSrcPrivate *priv = GST_AMC_SRC_GET_PRIVATE (self);
+
+  if (priv->looper) {
+    Looper_set_handle (priv->looper, NULL);
+    Looper_delete (priv->looper);
+    priv->looper = NULL;
+  }
+}
+
+/**
  * @brief looper internal function to handle each command
  */
 static void
@@ -815,6 +835,7 @@ looper_handle (gint cmd, void *data)
         priv->sawInputEOS = TRUE;
         priv->sawOutputEOS = TRUE;
 
+        looper_close (self);
         LOGI ("Finished");
         break;
       case MSG_CODEC_SEEK:
@@ -972,6 +993,7 @@ gst_amc_src_finalize (GObject * object)
   AMediaExtractor_delete (priv->ex);
 
   g_clear_pointer (&priv->outbound_queue, gst_object_unref);
+  looper_close (self);
 
   g_mutex_clear (&priv->mutex);
   G_OBJECT_CLASS (parent_class)->finalize (object);
index 6f7dacb..0868f1f 100644 (file)
@@ -56,6 +56,16 @@ Looper::Looper ()
 }
 
 /**
+ * @brief Looper desctructor
+ */
+Looper::~Looper ()
+{
+  flush_msg ();
+  pthread_mutex_destroy (&mutex);
+  pthread_cond_destroy (&cond);
+}
+
+/**
  * @brief Creates a looper thread
  */
 void
@@ -103,15 +113,7 @@ Looper::add_msg (looper_message *new_msg, bool flush)
 
   /** Flush old pending messages */
   if (flush) {
-    msg = head;
-    while (msg) {
-      head = msg->next;
-      delete msg;
-      msg = head;
-    }
-
-    head = NULL;
-    num_msg = 0;
+    flush_msg ();
   }
 
   /** Append new message */
@@ -130,12 +132,32 @@ Looper::add_msg (looper_message *new_msg, bool flush)
 }
 
 /**
+ * @brief Flush all messages.
+ */
+void
+Looper::flush_msg (void)
+{
+  looper_message *msg;
+
+  msg = head;
+  while (msg) {
+    head = msg->next;
+    delete msg;
+    msg = head;
+  }
+
+  head = NULL;
+  num_msg = 0;
+}
+
+/**
  * @brief looper's entry function
  */
 void *
 Looper::entry (void *data)
 {
-  ((Looper *)data)->loop ();
+  if (data)
+    ((Looper *) data)->loop ();
   return NULL;
 }
 
@@ -195,12 +217,23 @@ Looper_new (void)
 }
 
 /**
+ * @brief C-wrapper for Looper destructor
+ */
+void
+Looper_delete (void *looper)
+{
+  if (looper)
+    delete ((Looper *) looper);
+}
+
+/**
  * @brief C-wrapper for Looper post function
  */
 void
 Looper_post (void *looper, gint cmd, void *data, gboolean flush)
 {
-  ((Looper *)looper)->post (cmd, data, flush);
+  if (looper)
+    ((Looper *) looper)->post (cmd, data, flush);
 }
 
 /**
@@ -209,7 +242,8 @@ Looper_post (void *looper, gint cmd, void *data, gboolean flush)
 void
 Looper_set_handle (void *looper, void (*handle) (gint, void *))
 {
-  ((Looper *)looper)->handle = handle;
+  if (looper)
+    ((Looper *) looper)->handle = handle;
 }
 
 /**
@@ -218,5 +252,6 @@ Looper_set_handle (void *looper, void (*handle) (gint, void *))
 void
 Looper_exit (void *looper)
 {
-  ((Looper *)looper)->exit ();
+  if (looper)
+    ((Looper *) looper)->exit ();
 }
index 34c0b26..052b9e2 100644 (file)
@@ -47,16 +47,18 @@ struct looper_message {
 class Looper {
   public:
     Looper ();
+    ~Looper ();
 
     void loop (void);
     void start (void);
     void exit (void);
     void post (gint cmd, void *data, bool flush);
-    void add_msg (looper_message *new_msg, bool flush);
     void (*handle) (gint cmd, void *data);  /**< should be implemented */
 
   private:
     static void *entry (void *data);
+    void add_msg (looper_message *new_msg, bool flush);
+    void flush_msg (void);
 
     pthread_t thread;
     pthread_mutex_t mutex;
@@ -75,6 +77,7 @@ extern "C"
 {
 #endif
   void *Looper_new (void);
+  void Looper_delete (void *looper);
   void Looper_exit (void *looper);
   void Looper_post (void *looper, gint cmd, void *data, gboolean flush);
   void Looper_set_handle (void *looper, void (*handle) (gint, void*));