for (i = AV_IDX_AUDIO; i < AV_IDX_MAX; i++) {
if (!(source->media_types & (i == AV_IDX_AUDIO ? MEDIA_TYPE_AUDIO : MEDIA_TYPE_VIDEO)))
continue;
- if (source->av[i].mline == -1) {
- source->av[i].mline = transceiver->mline;
- LOG_DEBUG("source[%s, id:%u, mline:%d for %s]",
- (gchar *)key, source->id, source->av[i].mline, i == AV_IDX_AUDIO ? "AUDIO" : "VIDEO");
- return;
- }
+ if (source->av[i].transceiver)
+ continue;
+
+ source->av[i].transceiver = gst_object_ref(transceiver);
+ LOG_DEBUG("source[%s, id:%u, transceiver:%p for %s]",
+ (gchar *)key, source->id, source->av[i].transceiver, i == AV_IDX_AUDIO ? "AUDIO" : "VIDEO");
+ return;
}
}
}
for (i = AV_IDX_AUDIO; i < AV_IDX_MAX; i++) {
if (!(source->media_types & (i == AV_IDX_AUDIO ? MEDIA_TYPE_AUDIO : MEDIA_TYPE_VIDEO)))
continue;
- if (source->av[i].mline == -1)
+ if (!(transceiver = source->av[i].transceiver))
continue;
- g_signal_emit_by_name(G_OBJECT(webrtc->gst.webrtcbin), "get-transceiver", source->av[i].mline, &transceiver);
- if (!transceiver) {
- LOG_ERROR("transceiver of mline[%u] is NULL", source->av[i].mline);
- continue;
- }
-
ini_source = _ini_get_source_by_type(&webrtc->ini, source->type);
if (ini_source == NULL)
ini_source = &(webrtc->ini.media_source);
RET_IF(source == NULL, "source is NULL");
- LOG_DEBUG("[%s, id:%u, media_types:0x%x, [AUDIO]mline:%d, [VIDEO]mline:%d] is removed",
- GST_ELEMENT_NAME(source->bin), source->id, source->media_types, source->av[AV_IDX_AUDIO].mline, source->av[AV_IDX_VIDEO].mline);
+ LOG_DEBUG("[%s, id:%u, media_types:0x%x, [AUDIO]transceiver:%p, [VIDEO]transceiver:%p] is removed",
+ GST_ELEMENT_NAME(source->bin), source->id, source->media_types,
+ source->av[AV_IDX_AUDIO].transceiver, source->av[AV_IDX_VIDEO].transceiver);
gst_element_foreach_src_pad(GST_ELEMENT(source->bin), __foreach_src_pad_cb, source);
gst_element_set_state(source->av[i].render.pipeline, GST_STATE_NULL);
SAFE_GST_OBJECT_UNREF(source->av[i].render.pipeline);
}
+
+ if (source->av[i].transceiver)
+ gst_object_unref(source->av[i].transceiver);
}
gst_bin_remove(GST_BIN(gst_element_get_parent(source->bin)), GST_ELEMENT(source->bin));
int _set_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e direction)
{
- int ret = WEBRTC_ERROR_INVALID_OPERATION;
webrtc_gst_slot_s *source;
GstWebRTCRTPTransceiver *trans;
- GArray *transceivers;
- int mline;
- guint i;
RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
RET_VAL_IF(direction > WEBRTC_TRANSCEIVER_DIRECTION_SENDRECV, WEBRTC_ERROR_INVALID_PARAMETER, "invalid direction");
RET_VAL_IF((source = _get_slot_by_id(webrtc->gst.source_slots, source_id)) == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
if (media_type == WEBRTC_MEDIA_TYPE_AUDIO && source->media_types & MEDIA_TYPE_AUDIO) {
- mline = source->av[AV_IDX_AUDIO].mline;
+ trans = source->av[AV_IDX_AUDIO].transceiver;
} else if (media_type == WEBRTC_MEDIA_TYPE_VIDEO && source->media_types & MEDIA_TYPE_VIDEO) {
- mline = source->av[AV_IDX_VIDEO].mline;
+ trans = source->av[AV_IDX_VIDEO].transceiver;
} else {
LOG_ERROR("invalid media_type[%d] for source[media_types:0x%x, id:%u]", media_type, source->media_types, source_id);
return WEBRTC_ERROR_INVALID_PARAMETER;
}
- g_signal_emit_by_name(webrtc->gst.webrtcbin, "get-transceivers", &transceivers);
- for (i = 0; i < transceivers->len; i++) {
- trans = g_array_index(transceivers, GstWebRTCRTPTransceiver *, i);
- if ((int)trans->mline == mline) {
- trans->direction = __direction_info[direction].gst;
- LOG_DEBUG("Set direction to transceiver[%p, index:%d, mline:%u, direction:%s]",
- trans, i, trans->mline, __direction_info[direction].str);
- ret = WEBRTC_ERROR_NONE;
- goto end;
- }
- }
-
- LOG_ERROR("could not find a transceiver with mline[%d]", mline);
+ RET_VAL_IF(trans == NULL, WEBRTC_ERROR_INVALID_OPERATION, "transceiver of source[media_type:%d, id:%u] is NULL", media_type, source_id);
-end:
- g_array_unref(transceivers);
+ trans->direction = __direction_info[direction].gst;
+ LOG_DEBUG("Set direction to transceiver[%p, mline:%u, direction:%s]", trans, trans->mline, __direction_info[direction].str);
- return ret;
+ return WEBRTC_ERROR_NONE;
}
int _get_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e *direction)
{
- int ret = WEBRTC_ERROR_INVALID_OPERATION;
+ int ret;
webrtc_gst_slot_s *source;
GstWebRTCRTPTransceiver *trans;
- GArray *transceivers;
- int mline;
- guint i;
RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
RET_VAL_IF(direction == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "direction is NULL");
RET_VAL_IF((source = _get_slot_by_id(webrtc->gst.source_slots, source_id)) == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
if (media_type == WEBRTC_MEDIA_TYPE_AUDIO && source->media_types & MEDIA_TYPE_AUDIO) {
- mline = source->av[AV_IDX_AUDIO].mline;
+ trans = source->av[AV_IDX_AUDIO].transceiver;
} else if (media_type == WEBRTC_MEDIA_TYPE_VIDEO && source->media_types & MEDIA_TYPE_VIDEO) {
- mline = source->av[AV_IDX_VIDEO].mline;
+ trans = source->av[AV_IDX_VIDEO].transceiver;
} else {
LOG_ERROR("invalid media_type[%d] for source[media_types:0x%x, id:%u]", media_type, source->media_types, source_id);
return WEBRTC_ERROR_INVALID_PARAMETER;
}
- g_signal_emit_by_name(webrtc->gst.webrtcbin, "get-transceivers", &transceivers);
- for (i = 0; i < transceivers->len; i++) {
- trans = g_array_index(transceivers, GstWebRTCRTPTransceiver *, i);
- if ((int)trans->mline == mline) {
- ret = __convert_direction(trans->direction, direction);
- if (ret == WEBRTC_ERROR_NONE)
- LOG_DEBUG("found transceiver[%p, index:%d, mline:%u, mid:%s, direction:%s]",
- trans, i, trans->mline, trans->mid, __direction_info[*direction].str);
- goto end;
- }
- }
+ RET_VAL_IF(trans == NULL, WEBRTC_ERROR_INVALID_OPERATION, "transceiver of source[media_type:%d, id:%u] is NULL", media_type, source_id);
- LOG_ERROR("could not find a transceiver with mline[%d]", mline);
-
-end:
- g_array_unref(transceivers);
+ ret = __convert_direction(trans->direction, direction);
+ if (ret == WEBRTC_ERROR_NONE)
+ LOG_DEBUG("transceiver[%p, mline:%u, mid:%s, direction:%s]", trans, trans->mline, trans->mid, __direction_info[*direction].str);
return ret;
}