From 89c02eada9766f0f6c2b264641f016a8256990e0 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Wed, 28 Jan 2015 09:58:05 +0800 Subject: [PATCH] FS-7500: fix image copy --- src/switch_core_video.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/switch_core_video.c b/src/switch_core_video.c index 91f00417c4..b524b4676a 100644 --- a/src/switch_core_video.c +++ b/src/switch_core_video.c @@ -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: