]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7500: fix image copy
authorSeven Du <dujinfang@gmail.com>
Wed, 28 Jan 2015 01:58:05 +0000 (09:58 +0800)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:55 +0000 (12:46 -0500)
src/switch_core_video.c

index 91f00417c4fc1a615d00251a83eb808e73e32cce..b524b4676a5579ca098be54c8e93dd162efd7618 100644 (file)
@@ -77,10 +77,10 @@ SWITCH_DECLARE(void) switch_img_copy(switch_image_t *img, switch_image_t **new_i
 {
        switch_assert(img);
        switch_assert(new_img);
+       int i, j, k = 1;
 
        if (!img->fmt == SWITCH_IMG_FMT_I420) return;
 
-
        if (*new_img != NULL) {
                if (img->d_w != (*new_img)->d_w || img->d_h != (*new_img)->d_w) {
                        switch_img_free(new_img);
@@ -88,11 +88,19 @@ 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, 0);
+               *new_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, img->d_w, img->d_h, 1);
        }
 
        switch_assert(*new_img);
-       memcpy((*new_img)->img_data, img->img_data, (img->d_w * img->d_h * 3) / 2);
+
+       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);
+               }
+       }
 }
 
 /* For Emacs: