Make sure we do not apply mirror on self view when a static image is supposed to appear.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@11 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
This commit is contained in:
aymeric 2008-09-06 14:29:58 +00:00
parent b74dfb5983
commit 03f20adb5a
2 changed files with 48 additions and 13 deletions

View file

@ -61,7 +61,9 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Ws2_32.lib Winmm.lib ortp.lib mediastreamer2.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="&quot;$(IntDir)/&quot;;&quot;..\..\..\oRTP\build\win32native\debug&quot;"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
@ -135,7 +137,9 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Ws2_32.lib Winmm.lib ortp.lib mediastreamer2.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="&quot;$(IntDir)/&quot;;&quot;..\..\..\oRTP\build\win32native\release&quot;"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"

View file

@ -523,6 +523,7 @@ typedef struct VideoOut
mblk_t *local_msg;
MSPicture tmp_local_pic;
mblk_t *tmp_local_msg;
mblk_t *previous_selfview;
int corner;
struct SwsContext *sws1;
struct SwsContext *sws2;
@ -595,6 +596,7 @@ static void video_out_init(MSFilter *f){
def_size.height=MS_VIDEO_SIZE_CIF_H;
obj->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]);