}
}
+static void patch_fnode(conference_obj_t *conference, conference_file_node_t *fnode, switch_frame_t *write_frame)
+{
+ if (fnode && fnode->layer_id > -1) {
+ mcu_layer_t *layer = &conference->canvas->layers[fnode->layer_id];
+
+ if (switch_core_file_read_video(&fnode->fh, write_frame, SVR_FLUSH) == SWITCH_STATUS_SUCCESS) {
+ switch_img_free(&layer->cur_img);
+ layer->cur_img = write_frame->img;
+ layer->tagged = 1;
+ }
+ }
+}
+
static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj)
{
conference_obj_t *conference = (conference_obj_t *) obj;
switch_mutex_unlock(conference->member_mutex);
- if (conference->fnode &&
- conference->fnode->layer_id > -1) {
- mcu_layer_t *layer = &conference->canvas->layers[conference->fnode->layer_id];
-
- if (switch_core_file_read_video(&conference->fnode->fh, &write_frame, SVR_FLUSH) == SWITCH_STATUS_SUCCESS) {
- switch_img_free(&layer->cur_img);
- layer->cur_img = write_frame.img;
- layer->tagged = 1;
- }
- }
+ if (conference->async_fnode && conference->async_fnode->layer_id > -1) {
+ patch_fnode(conference, conference->async_fnode, &write_frame);
+ }
+ if (conference->fnode && conference->fnode->layer_id > -1) {
+ patch_fnode(conference, conference->fnode, &write_frame);
+ }
+
if (!conference->playing_video_file) {
for (i = 0; i < conference->canvas->total_layers; i++) {
mcu_layer_t *layer = &conference->canvas->layers[i];
if (switch_core_file_has_video(&fnode->fh)) {
int full_screen = 0;
-
+
if (fnode->fh.params) {
full_screen = switch_true(switch_event_get_header(fnode->fh.params, "full-screen"));
}
if (conference->async_fnode && conference->async_fnode->done) {
switch_memory_pool_t *pool;
+
+ if (conference->canvas && conference->async_fnode->layer_id > -1 ) {
+ canvas_del_fnode_layer(conference, conference->async_fnode);
+ }
+
conference_file_close(conference, conference->async_fnode);
pool = conference->async_fnode->pool;
conference->async_fnode = NULL;
static void canvas_set_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode, int idx)
{
mcu_layer_t *layer = NULL;
+ mcu_layer_t *xlayer = NULL;
switch_mutex_lock(conference->canvas->mutex);
if (conference->canvas->layout_floor_id > -1) {
idx = conference->canvas->layout_floor_id;
- } else {
+ xlayer = &conference->canvas->layers[idx];
+
+ if (xlayer->fnode) {
+ idx = -1;
+ }
+ }
+
+ if (idx < 0) {
for (i = 0; i < conference->canvas->total_layers; i++) {
- mcu_layer_t *xlayer = &conference->canvas->layers[i];
+ xlayer = &conference->canvas->layers[i];
- if (xlayer->geometry.res_id || xlayer->member_id) {
+ if (xlayer->fnode || xlayer->geometry.res_id || xlayer->member_id) {
continue;
}