]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: more conf vid WIP
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 28 Jan 2015 05:49:11 +0000 (23:49 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:55 +0000 (12:46 -0500)
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_video.c

index cb88e52b37f6272d3b198582a31a432b2c022b54..e3113983bce8826ff20b58d3f404bb21d75cf404 100644 (file)
@@ -3330,9 +3330,9 @@ static video_mixer_t *create_video_mixer(const char *layout_name)
        video_mixer->max_layers = MAX_LAYERS;
        video_mixer->total_layers = 0;
        video_mixer->current_layers = 0;
-       video_mixer->height = height;
-       video_mixer->width = width;
-       video_mixer->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, height, 0);
+       video_mixer->height = height * rows;
+       video_mixer->width = width * cols;
+       video_mixer->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, video_mixer->width, video_mixer->height, 0);
        video_mixer->packet = switch_core_alloc(video_mixer->pool, SWITCH_RECOMMENDED_BUFFER_SIZE);
        video_mixer->packetlen = SWITCH_RECOMMENDED_BUFFER_SIZE;
        switch_thread_cond_create(&video_mixer->cond, video_mixer->pool);
@@ -3347,8 +3347,8 @@ static video_mixer_t *create_video_mixer(const char *layout_name)
                        mcu_layer_t *layer = NULL;
                        layer = &video_mixer->layers[video_mixer->total_layers];
 
-                       layer->w = (int)(width / rows);
-                       layer->h = (int)(height / cols);
+                       layer->w = (int)width;//(int)(width / rows);
+                       layer->h = (int)height;//(int)(height / cols);
                        layer->x = j * layer->w;
                        layer->y = i * layer->h;
 
@@ -3401,7 +3401,37 @@ skip:
        return video_mixer;
 }
 
+// simple implementation to patch a small img to a big IMG at position x,y
+void patch(switch_image_t *IMG, switch_image_t *img, int x, int y)
+{
+       int i, j, k;
+       int W = IMG->d_w;
+       int H = IMG->d_h;
+       int w = img->d_w;
+       int h = img->d_h;
+
+       switch_assert(img->fmt = SWITCH_IMG_FMT_I420);
+       switch_assert(IMG->fmt = SWITCH_IMG_FMT_I420);
+
+       for (i = y; i < (y + h) && i < H; i++) {
+               for (j = x; j < (x + w) && j < W; j++) {
+                       IMG->planes[0][i * IMG->stride[0] + j] = img->planes[0][(i - y) * img->stride[0] + (j - x)];
+               }
+       }
+
+       for (i = y; i < (y + h) && i < H; i+=4) {
+               for (j = x; j < (x + w) && j < W; j+=4) {
+                       for (k = 1; k <= 2; k++) {
+                               IMG->planes[k][i/2 * IMG->stride[k] + j/2]         = img->planes[k][(i-y)/2 * img->stride[k] + (j-x)/2];
+                               IMG->planes[k][i/2 * IMG->stride[k] + j/2 + 1]     = img->planes[k][(i-y)/2 * img->stride[k] + (j-x)/2 + 1];
+                               IMG->planes[k][(i+2)/2 * IMG->stride[k] + j/2]     = img->planes[k][(i+2-y)/2 * img->stride[k] + (j-x)/2];
+                               IMG->planes[k][(i+2)/2 * IMG->stride[k] + j/2 + 1] = img->planes[k][(i+2-y)/2 * img->stride[k] + (j-x)/2 + 1];
+                       }
+               }
+       }
+}
 
+#if 0
 void patch(switch_image_t *IMG, switch_image_t *img, int x, int y)
 {
        int i, j, k;
@@ -3427,6 +3457,7 @@ void patch(switch_image_t *IMG, switch_image_t *img, int x, int y)
                }
        }
 }
+#endif
 
 static void scale_and_patch(video_mixer_t *video_mixer, switch_image_t *img, mcu_layer_t *layer)
 {
@@ -3462,7 +3493,7 @@ static void scale_and_patch(video_mixer_t *video_mixer, switch_image_t *img, mcu
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ret: %d\n", ret);
                } else {
                        switch_mutex_lock(video_mixer->mutex);
-                       printf("SCALE and PATCH at %dx%d to %dx%d\n", width, height, layer->x, layer->y);
+                       printf("SCALE and PATCH at %dx%d to %dx%d at %dx%d\n", width, height, layer->w, layer->h, layer->x, layer->y);
                        patch(video_mixer->img, layer->scaled_img, layer->x, layer->y);
                        switch_mutex_unlock(video_mixer->mutex);
                }
@@ -3510,8 +3541,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                                int i;
 
                                remaining += switch_queue_size(imember->video_queue);
-                               printf("yay pop img layer %d\n", imember->video_layer_id);
-
+                               
                                if (imember->video_layer_id > -1) {
                                        layer = &conference->video_mixer->layers[imember->video_layer_id];
                                }
@@ -3532,12 +3562,16 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                                }
                                
                                if (layer) {
+                                       printf("yay pop img layer %d w:%d h:%d x:%d y:%d\n", imember->video_layer_id, layer->w, layer->h, layer->x, layer->y);
+
                                        if (!layer->scaled_img) {
                                                layer->scaled_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, layer->w, layer->h, 0);
                                                switch_assert(layer->scaled_img);
                                        }
                                        
                                        scale_and_patch(conference->video_mixer, img, layer);
+                               } else {
+                                       printf("fuck no layer\n");
                                }
 
                                switch_img_free(&img);
index 0996f467c1b48a0ce601e26277af9ee5dab7546e..7695d748d92de94f43b05d9976989da6bde200ee 100644 (file)
@@ -75,7 +75,7 @@ SWITCH_DECLARE(void) switch_img_free(switch_image_t **img)
 
 SWITCH_DECLARE(void) switch_img_copy(switch_image_t *img, switch_image_t **new_img)
 {
-       int i, j, k = 1;
+       int i;
 
        switch_assert(img);
        switch_assert(new_img);
@@ -91,16 +91,12 @@ SWITCH_DECLARE(void) switch_img_copy(switch_image_t *img, switch_image_t **new_i
        if (*new_img == NULL) {
                *new_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, img->d_w, img->d_h, 1);
        }
-
+       
        switch_assert(*new_img);
 
        for (i = 0; i < 3; i++) {
-               if (!img->planes[i] || !img->stride[i]) break;
-               if (i > 0) k = 2;
-
-               for (j = 0; j < (*new_img)->h; j++) {
-                       memcpy((*new_img)->planes[i] + (*new_img)->stride[i] * j / k, img->planes[i] + img->stride[i] * j / k, img->d_w);
-               }
+               (*new_img)->stride[i] = img->stride[i];
+               (*new_img)->planes[i] = img->planes[i];
        }
 }