MT#56447 move janus_feeds to janus_room

Feed IDs are not global IDs. Keep them per room.

Change-Id: If3c8e9c3cca4caac144d87d5c984c90396af2b62
pull/1675/head
Richard Fuchs 3 years ago
parent 5b9d624fae
commit 41cf4fe7b6

@ -32,6 +32,7 @@ struct janus_room {
uint64_t handle_id; // controlling handle which created the room
GHashTable *publishers; // handle ID -> feed ID
GHashTable *subscribers; // handle ID -> subscribed feed ID
GHashTable *feeds; // feed ID -> handle ID
};
@ -40,7 +41,6 @@ static GHashTable *janus_tokens; // auth tokens, currently mostly unused
static GHashTable *janus_sessions; // session ID -> session. holds a session reference
static GHashTable *janus_handles; // handle ID -> handle
static GHashTable *janus_rooms; // room ID -> room
static GHashTable *janus_feeds; // feed ID -> handle ID
static void __janus_session_free(void *p) {
@ -185,6 +185,7 @@ static const char *janus_videoroom_create(struct janus_session *session, struct
// XXX optimise for 64-bit archs
room->publishers = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free);
room->subscribers = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free);
room->feeds = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free);
uint64_t room_id = 0;
if (json_reader_read_member(reader, "room")) {
@ -293,6 +294,7 @@ static const char *janus_videoroom_destroy(struct janus_session *session,
g_free(room->call_id.s);
g_hash_table_destroy(room->publishers);
g_hash_table_destroy(room->subscribers);
g_hash_table_destroy(room->feeds);
g_slice_free1(sizeof(*room), room);
//XXX notify?
@ -404,12 +406,13 @@ static void janus_publishers_list(JsonBuilder *builder, struct call *call, struc
}
// global janus_lock is held
static const char *janus_videoroom_join_sub(struct janus_handle *handle, struct janus_room *room, int *retcode,
uint64_t feed_id, struct call *call, GQueue *srcs)
{
// does the feed actually exist? get the feed handle
*retcode = 512;
uint64_t *feed_handle = g_hash_table_lookup(janus_feeds, &feed_id);
uint64_t *feed_handle = g_hash_table_lookup(room->feeds, &feed_id);
if (!feed_handle)
return "No such feed exists";
if (!g_hash_table_lookup(room->publishers, feed_handle))
@ -509,13 +512,13 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan
feed_id = janus_random();
if (!feed_id)
continue;
if (g_hash_table_lookup(janus_feeds, &feed_id))
if (g_hash_table_lookup(room->feeds, &feed_id))
continue;
break;
}
// feed ID points to the handle
g_hash_table_insert(janus_feeds, uint64_dup(feed_id), uint64_dup(handle->id));
g_hash_table_insert(room->feeds, uint64_dup(feed_id), uint64_dup(handle->id));
// handle ID points to the feed
g_hash_table_insert(room->publishers, uint64_dup(handle->id), uint64_dup(feed_id));
}
@ -968,7 +971,7 @@ static const char *janus_videoroom_start(struct websocket_message *wm, struct ja
return "Not a subscriber";
*retcode = 512;
uint64_t *feed_handle = g_hash_table_lookup(janus_feeds, feed_id);
uint64_t *feed_handle = g_hash_table_lookup(room->feeds, feed_id);
if (!feed_handle)
return "No such feed exists";
@ -1959,7 +1962,6 @@ void janus_init(void) {
janus_sessions = g_hash_table_new(g_int64_hash, g_int64_equal);
janus_handles = g_hash_table_new(g_int64_hash, g_int64_equal);
janus_rooms = g_hash_table_new(g_int64_hash, g_int64_equal);
janus_feeds = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free);
// XXX timer thread to clean up orphaned sessions
}
void janus_free(void) {
@ -1968,5 +1970,4 @@ void janus_free(void) {
g_hash_table_destroy(janus_sessions);
g_hash_table_destroy(janus_handles);
g_hash_table_destroy(janus_rooms);
g_hash_table_destroy(janus_feeds);
}

Loading…
Cancel
Save