Add new APIs to set/unset decoded ready callback of the node
[platform/core/api/mediastreamer.git] / src / media_streamer.c
index dbb28cb..60e3c66 100644 (file)
@@ -938,17 +938,87 @@ int media_streamer_unset_interrupted_cb(media_streamer_h streamer)
        return MEDIA_STREAMER_ERROR_NONE;
 }
 
+int media_streamer_node_set_decoded_ready_cb(media_streamer_node_h node, media_streamer_node_decoded_ready_cb callback, void *user_data)
+{
+       media_streamer_node_s *ms_node = (media_streamer_node_s *) node;
+
+       ms_debug_fenter();
+
+       ms_retvm_if(ms_node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL");
+       ms_retvm_if(callback == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "callback is NULL");
+
+       if (ms_node->type == MEDIA_STREAMER_NODE_TYPE_WEBRTC) {
+               media_streamer_webrtc_callbacks_s **_callbacks = (media_streamer_webrtc_callbacks_s **)&(ms_node->callbacks_structure);
+
+               if (!*_callbacks) {
+                       *_callbacks = (media_streamer_webrtc_callbacks_s *) calloc(1, sizeof(media_streamer_webrtc_callbacks_s));
+                       ms_retvm_if(*_callbacks == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error allocation memory");
+               }
+               (*_callbacks)->decoded_ready_cb.callback = callback;
+               (*_callbacks)->decoded_ready_cb.user_data = user_data;
+       } else {
+               /* It can be accepted other types in the future. */
+               ms_error("Not supported node type[%d]", ms_node->type);
+               return MEDIA_STREAMER_ERROR_INVALID_PARAMETER;
+       }
+
+       ms_debug_fleave();
+
+       return MEDIA_STREAMER_ERROR_NONE;
+}
+
+int media_streamer_node_unset_decoded_ready_cb(media_streamer_node_h node)
+{
+       media_streamer_node_s *ms_node = (media_streamer_node_s *) node;
+
+       ms_debug_fenter();
+
+       ms_retvm_if(ms_node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL");
+
+       if (ms_node->type == MEDIA_STREAMER_NODE_TYPE_WEBRTC) {
+               media_streamer_webrtc_callbacks_s **_callbacks = (media_streamer_webrtc_callbacks_s **)&(ms_node->callbacks_structure);
+
+               ms_retvm_if(*_callbacks == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "callbacks is NULL");
+               ms_retvm_if((*_callbacks)->decoded_ready_cb.callback == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER,
+                                                                                                               "decoded_ready_cb.callback is NULL");
+
+               (*_callbacks)->decoded_ready_cb.callback = NULL;
+               (*_callbacks)->decoded_ready_cb.user_data = NULL;
+
+               if (!(*_callbacks)->message_cb.callback) {
+                       free(ms_node->callbacks_structure);
+                       ms_node->callbacks_structure = NULL;
+               }
+       } else {
+               /* It can be accepted other types in the future. */
+               ms_error("Not supported node type[%d]", ms_node->type);
+               return MEDIA_STREAMER_ERROR_INVALID_PARAMETER;
+       }
+
+       ms_debug_fleave();
+
+       return MEDIA_STREAMER_ERROR_NONE;
+}
+
 int media_streamer_webrtc_node_set_message_cb(media_streamer_node_h webrtc, media_streamer_webrtc_message_cb callback, void *user_data)
 {
        media_streamer_node_s *ms_node = (media_streamer_node_s *) webrtc;
+       media_streamer_webrtc_callbacks_s **_callbacks;
 
        ms_retvm_if(ms_node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL");
+       ms_retvm_if(callback == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "callback is NULL");
        ms_retvm_if(ms_node->type != MEDIA_STREAMER_NODE_TYPE_WEBRTC, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is not for WebRTC");
 
        ms_debug_fenter();
 
-       ms_node->user_cb.callback = callback;
-       ms_node->user_cb.user_data = user_data;
+       _callbacks = (media_streamer_webrtc_callbacks_s **)&(ms_node->callbacks_structure);
+       if (!*_callbacks) {
+               *_callbacks = (media_streamer_webrtc_callbacks_s *) calloc(1, sizeof(media_streamer_webrtc_callbacks_s));
+               ms_retvm_if(*_callbacks == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error allocation memory");
+       }
+
+       (*_callbacks)->message_cb.callback = callback;
+       (*_callbacks)->message_cb.user_data = user_data;
 
        ms_debug_fleave();
 
@@ -958,16 +1028,27 @@ int media_streamer_webrtc_node_set_message_cb(media_streamer_node_h webrtc, medi
 int media_streamer_webrtc_node_unset_message_cb(media_streamer_node_h webrtc)
 {
        media_streamer_node_s *ms_node = (media_streamer_node_s *) webrtc;
+       media_streamer_webrtc_callbacks_s **_callbacks;
+
+       ms_debug_fenter();
 
        ms_retvm_if(ms_node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL");
        ms_retvm_if(ms_node->type != MEDIA_STREAMER_NODE_TYPE_WEBRTC, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is not for WebRTC");
 
-       ms_debug_fenter();
+       _callbacks = (media_streamer_webrtc_callbacks_s **)&(ms_node->callbacks_structure);
+
+       ms_retvm_if(*_callbacks == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "callbacks is NULL");
+       ms_retvm_if((*_callbacks)->message_cb.callback == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "message_cb.callback is NULL");
 
-       ms_node->user_cb.callback = NULL;
-       ms_node->user_cb.user_data = NULL;
+       (*_callbacks)->message_cb.callback = NULL;
+       (*_callbacks)->message_cb.user_data = NULL;
+
+       if (!(*_callbacks)->decoded_ready_cb.callback) {
+               free(ms_node->callbacks_structure);
+               ms_node->callbacks_structure = NULL;
+       }
 
        ms_debug_fleave();
 
        return MEDIA_STREAMER_ERROR_NONE;
-}
\ No newline at end of file
+}