diff --git a/linphone/mediastreamer2/build/win32native/videodisplay.vcproj b/linphone/mediastreamer2/build/win32native/videodisplay.vcproj
index 8e764601d..5784ff317 100755
--- a/linphone/mediastreamer2/build/win32native/videodisplay.vcproj
+++ b/linphone/mediastreamer2/build/win32native/videodisplay.vcproj
@@ -61,7 +61,9 @@
/>
local_msg=NULL;
obj->tmp_local_msg=NULL;
+ obj->previous_selfview=NULL;
obj->corner=0;
obj->sws1=NULL;
obj->sws2=NULL;
@@ -648,6 +650,12 @@ static void video_out_preprocess(MSFilter *f){
freemsg(obj->local_msg);
obj->local_msg=NULL;
}
+ if (obj->previous_selfview!=NULL)
+ {
+ freemsg(obj->previous_selfview);
+ obj->previous_selfview=NULL;
+ }
+
if (obj->tmp_local_msg!=NULL) {
freemsg(obj->tmp_local_msg);
obj->tmp_local_msg=NULL;
@@ -700,10 +708,16 @@ static void video_out_process(MSFilter *f){
freemsg(obj->local_msg);
obj->local_msg=NULL;
}
+ if (obj->previous_selfview!=NULL)
+ {
+ freemsg(obj->previous_selfview);
+ obj->previous_selfview=NULL;
+ }
}
else
{
MSPicture src;
+ static mblk_t *previous_selfview = NULL;
if (yuv_buf_init_from_mblk(&src,inm)==0){
if (obj->sws2==NULL){
@@ -721,20 +735,37 @@ static void video_out_process(MSFilter *f){
obj->local_msg=yuv_buf_alloc(&obj->local_pic,
obj->local_pic.w,obj->local_pic.h);
}
- if (sws_scale(obj->sws2,src.planes,src.strides, 0,
- src.h, obj->tmp_local_pic.planes, obj->tmp_local_pic.strides)<0){
- ms_error("Error in sws_scale().");
- }
- mirror(obj->local_pic.planes[0],obj->tmp_local_pic.planes[0],
- obj->local_pic.strides[0],obj->tmp_local_pic.strides[0],
- obj->local_pic.w,obj->local_pic.h);
- mirror(obj->local_pic.planes[1],obj->tmp_local_pic.planes[1],
- obj->local_pic.strides[1],obj->tmp_local_pic.strides[1],
- obj->local_pic.w>>1,obj->local_pic.h>>1);
- mirror(obj->local_pic.planes[2],obj->tmp_local_pic.planes[2],
- obj->local_pic.strides[2],obj->tmp_local_pic.strides[2],
- obj->local_pic.w>>1,obj->local_pic.h>>1);
+ if (previous_selfview==NULL
+ || (msgdsize(inm)!=msgdsize(previous_selfview))
+ || memcmp(inm->b_rptr, previous_selfview->b_rptr, msgdsize(inm))!=0)
+ {
+ if (sws_scale(obj->sws2,src.planes,src.strides, 0,
+ src.h, obj->tmp_local_pic.planes, obj->tmp_local_pic.strides)<0){
+ ms_error("Error in sws_scale().");
+ }
+
+ mirror(obj->local_pic.planes[0],obj->tmp_local_pic.planes[0],
+ obj->local_pic.strides[0],obj->tmp_local_pic.strides[0],
+ obj->local_pic.w,obj->local_pic.h);
+ mirror(obj->local_pic.planes[1],obj->tmp_local_pic.planes[1],
+ obj->local_pic.strides[1],obj->tmp_local_pic.strides[1],
+ obj->local_pic.w>>1,obj->local_pic.h>>1);
+ mirror(obj->local_pic.planes[2],obj->tmp_local_pic.planes[2],
+ obj->local_pic.strides[2],obj->tmp_local_pic.strides[2],
+ obj->local_pic.w>>1,obj->local_pic.h>>1);
+ }
+ else
+ {
+ if (sws_scale(obj->sws2,src.planes,src.strides, 0,
+ src.h, obj->local_pic.planes, obj->local_pic.strides)<0){
+ ms_error("Error in sws_scale().");
+ }
+ }
+
+ if (previous_selfview!=NULL)
+ freemsg(previous_selfview);
+ previous_selfview = dupb(inm);
}
}
ms_queue_flush(f->inputs[1]);