From: Jaeyun Date: Thu, 1 Apr 2021 02:51:16 +0000 (+0900) Subject: [Android/AMC] clear looper X-Git-Tag: submit/tizen/20210406.094012~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ef9da90c19a6eac4d011b6d0686acac361078b5;p=platform%2Fupstream%2Fnnstreamer.git [Android/AMC] clear looper Clear looper when media steam is finished. Signed-off-by: Jaeyun --- diff --git a/ext/nnstreamer/android_source/gstamcsrc.c b/ext/nnstreamer/android_source/gstamcsrc.c index 573764a..fa04522 100644 --- a/ext/nnstreamer/android_source/gstamcsrc.c +++ b/ext/nnstreamer/android_source/gstamcsrc.c @@ -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); diff --git a/ext/nnstreamer/android_source/gstamcsrc_looper.cc b/ext/nnstreamer/android_source/gstamcsrc_looper.cc index 6f7dacb..0868f1f 100644 --- a/ext/nnstreamer/android_source/gstamcsrc_looper.cc +++ b/ext/nnstreamer/android_source/gstamcsrc_looper.cc @@ -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 (); } diff --git a/ext/nnstreamer/android_source/gstamcsrc_looper.h b/ext/nnstreamer/android_source/gstamcsrc_looper.h index 34c0b26..052b9e2 100644 --- a/ext/nnstreamer/android_source/gstamcsrc_looper.h +++ b/ext/nnstreamer/android_source/gstamcsrc_looper.h @@ -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*));