Clear looper when media steam is finished.
Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
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);
}
/**
+ * @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
priv->sawInputEOS = TRUE;
priv->sawOutputEOS = TRUE;
+ looper_close (self);
LOGI ("Finished");
break;
case MSG_CODEC_SEEK:
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);
}
/**
+ * @brief Looper desctructor
+ */
+Looper::~Looper ()
+{
+ flush_msg ();
+ pthread_mutex_destroy (&mutex);
+ pthread_cond_destroy (&cond);
+}
+
+/**
* @brief Creates a looper thread
*/
void
/** 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 */
}
/**
+ * @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;
}
}
/**
+ * @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);
}
/**
void
Looper_set_handle (void *looper, void (*handle) (gint, void *))
{
- ((Looper *)looper)->handle = handle;
+ if (looper)
+ ((Looper *) looper)->handle = handle;
}
/**
void
Looper_exit (void *looper)
{
- ((Looper *)looper)->exit ();
+ if (looper)
+ ((Looper *) looper)->exit ();
}
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;
{
#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*));