Changeset 975:33ed4562bf65 in mediastreamer2


Ignore:
Timestamp:
May 18, 2010 2:25:47 PM (3 years ago)
Author:
Aymeric Moizard <jack@…>
Branch:
default
Message:

add support for 9 modes for selfview ranging from -1 to 7

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • include/mediastreamer2/msinterfaces.h

    r973 r975  
    3030 
    3131/**position of the local view */ 
    32 #define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER \ 
     32#define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE \ 
    3333        MS_FILTER_METHOD(MSFilterVideoDisplayInterface,1,int) 
    3434 
  • src/drawdib-display.c

    r970 r975  
    2727#include "ffmpeg-priv.h" 
    2828 
    29 #define SCALE_FACTOR 0.16f 
     29#define SCALE_FACTOR 4.0f 
    3030#define SELVIEW_POS_INACTIVE -100.0 
    3131#include <Vfw.h> 
     
    128128        Yuv2RgbCtx mainview; 
    129129        Yuv2RgbCtx locview; 
    130         int corner; 
     130        int sv_corner; 
     131        float sv_scalefactor; 
    131132        bool_t need_repaint; 
    132133        bool_t autofit; 
     
    220221        yuv2rgb_init(&obj->mainview); 
    221222        yuv2rgb_init(&obj->locview); 
    222         obj->corner=0; /* bottom right*/ 
     223        obj->sv_corner=0; /* bottom right*/ 
     224        obj->sv_scalefactor=SCALE_FACTOR; 
    223225        obj->need_repaint=FALSE; 
    224226        obj->autofit=TRUE; 
     
    283285#define LOCAL_POS_OFFSET 10 
    284286 
    285 static void compute_layout(MSVideoSize wsize, MSVideoSize vsize, MSVideoSize orig_psize, MSRect *mainrect, MSRect *localrect, int localrect_pos){ 
     287static void compute_layout(MSVideoSize wsize, MSVideoSize vsize, MSVideoSize orig_psize, MSRect *mainrect, MSRect *localrect, int localrect_pos, float scalefactor){ 
    286288        MSVideoSize psize; 
    287289 
    288290        center_with_ratio(wsize,vsize,mainrect); 
    289291        if (localrect_pos!=-1){ 
    290                 psize.width=(int)(wsize.width*SCALE_FACTOR); 
    291                 psize.height=(int)(wsize.height*SCALE_FACTOR); 
     292                psize.width=(int)(wsize.width/scalefactor); 
     293                psize.height=(int)(wsize.height/scalefactor); 
    292294                center_with_ratio(psize,orig_psize,localrect); 
    293                 localrect->x=wsize.width-localrect->w-LOCAL_POS_OFFSET; 
    294                 localrect->y=wsize.height-localrect->h-LOCAL_POS_OFFSET; 
     295                if ((wsize.height - mainrect->h < mainrect->h/scalefactor && wsize.width - mainrect->w < mainrect->w/scalefactor) || localrect_pos<=3) 
     296                { 
     297                        int x_sv; 
     298                        int y_sv; 
     299                        if (localrect_pos%4==1) 
     300                        { 
     301                                /* top left corner */ 
     302                                x_sv = LOCAL_POS_OFFSET; 
     303                                y_sv = LOCAL_POS_OFFSET; 
     304                        } 
     305                        else if (localrect_pos%4==2) 
     306                        { 
     307                                /* top right corner */ 
     308                                x_sv = (wsize.width-localrect->w-LOCAL_POS_OFFSET); 
     309                                y_sv = LOCAL_POS_OFFSET; 
     310                        } 
     311                        else if (localrect_pos%4==3) 
     312                        { 
     313                                /* bottom left corner */ 
     314                                x_sv = LOCAL_POS_OFFSET; 
     315                                y_sv = (wsize.height-localrect->h-LOCAL_POS_OFFSET); 
     316                        } 
     317                        else /* corner = 0: default */ 
     318                        { 
     319                                /* bottom right corner */ 
     320                                x_sv = (wsize.width-localrect->w-LOCAL_POS_OFFSET); 
     321                                y_sv = (wsize.height-localrect->h-LOCAL_POS_OFFSET); 
     322                        } 
     323                        localrect->x=x_sv; //wsize.width-localrect->w-LOCAL_POS_OFFSET; 
     324                        localrect->y=y_sv; //wsize.height-localrect->h-LOCAL_POS_OFFSET; 
     325                } 
     326                else 
     327                { 
     328                        int x_sv; 
     329                        int y_sv; 
     330 
     331                        if (wsize.width - mainrect->w < mainrect->w/scalefactor) 
     332                        { 
     333                                // recalculate so we have a selfview taking as 
     334                                // much available space as possible 
     335                                psize.width=wsize.width; 
     336                                psize.height=wsize.height-mainrect->h; 
     337                                center_with_ratio(psize,orig_psize,localrect); 
     338 
     339                                if (localrect_pos%4==1 || localrect_pos%4==2) 
     340                                { 
     341                                        //Self View on Top 
     342                                        x_sv = (wsize.width-localrect->w)/2; 
     343                                        y_sv = LOCAL_POS_OFFSET; 
     344 
     345                                        mainrect->y = wsize.height-mainrect->h-LOCAL_POS_OFFSET; 
     346                                } 
     347                                else 
     348                                { 
     349                                        //Self View on Bottom 
     350                                        x_sv = (wsize.width-localrect->w)/2; 
     351                                        y_sv = (wsize.height-localrect->h-LOCAL_POS_OFFSET); 
     352 
     353                                        mainrect->y = LOCAL_POS_OFFSET; 
     354                                } 
     355                        } 
     356                        else 
     357                        { 
     358                                // recalculate so we have a selfview taking as 
     359                                // much available space as possible 
     360                                psize.width=wsize.width-mainrect->w; 
     361                                psize.height=wsize.height; 
     362                                center_with_ratio(psize,orig_psize,localrect); 
     363 
     364                                if (localrect_pos%4==1 || localrect_pos%4==3) 
     365                                { 
     366                                        //Self View on left 
     367                                        x_sv = LOCAL_POS_OFFSET; 
     368                                        y_sv = (wsize.height-localrect->h)/2; 
     369 
     370                                        mainrect->x = wsize.width-mainrect->w-LOCAL_POS_OFFSET; 
     371                                } 
     372                                else 
     373                                { 
     374                                        //Self View on right 
     375                                        x_sv = (wsize.width-localrect->w-LOCAL_POS_OFFSET); 
     376                                        y_sv = (wsize.height-localrect->h)/2; 
     377 
     378                                        mainrect->x = LOCAL_POS_OFFSET; 
     379                                } 
     380                        } 
     381 
     382                        localrect->x=x_sv; //wsize.width-localrect->w-LOCAL_POS_OFFSET; 
     383                        localrect->y=y_sv; //wsize.height-localrect->h-LOCAL_POS_OFFSET; 
     384                } 
    295385        } 
    296386/* 
     
    368458        HGDIOBJ old_object=NULL; 
    369459        bool_t repainted=FALSE; 
    370         int corner=obj->corner; 
     460        int corner=obj->sv_corner; 
     461        float scalefactor=obj->sv_scalefactor; 
    371462 
    372463        GetClientRect(obj->window,&rect); 
     
    400491 
    401492        if (main_im!=NULL || local_im!=NULL || obj->need_repaint){ 
    402                 compute_layout(wsize,obj->vsize,obj->lsize,&mainrect,&localrect,corner); 
     493                compute_layout(wsize,obj->vsize,obj->lsize,&mainrect,&localrect,corner, scalefactor); 
    403494                vsize.width=mainrect.w; 
    404495                vsize.height=mainrect.h; 
     
    496587static int set_corner(MSFilter *f, void *data){ 
    497588        DDDisplay *obj=(DDDisplay*)f->data; 
    498         obj->corner=*(int*)data; 
     589        obj->sv_corner=*(int*)data; 
    499590        obj->need_repaint=TRUE; 
    500591        return 0; 
     
    513604} 
    514605 
     606static int set_scalefactor(MSFilter *f,void *arg){ 
     607        DDDisplay *obj=(DDDisplay*)f->data; 
     608        ms_filter_lock(f); 
     609        obj->sv_scalefactor = *(float*)arg; 
     610        if (obj->sv_scalefactor<0.5f) 
     611                obj->sv_scalefactor = 0.5f; 
     612        ms_filter_unlock(f); 
     613        return 0; 
     614} 
    515615 
    516616static MSFilterMethod methods[]={ 
     
    521621        {       MS_VIDEO_DISPLAY_ENABLE_AUTOFIT         ,       enable_autofit  }, 
    522622        {       MS_VIDEO_DISPLAY_ENABLE_MIRRORING       ,       enable_mirroring}, 
    523         {       MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER  , set_corner }, 
     623        {       MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE    , set_corner }, 
     624        {       MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_SCALEFACTOR     , set_scalefactor }, 
    524625        {       0       ,NULL} 
    525626}; 
  • src/videoout.c

    r973 r975  
    18021802        {       MS_VIDEO_OUT_GET_BACKGROUND_COLOR    ,  video_out_get_background_color}, 
    18031803/* methods for compatibility with the MSVideoDisplay interface*/ 
    1804         {       MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER , video_out_set_corner }, 
     1804        {       MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE , video_out_set_corner }, 
    18051805        {       MS_VIDEO_DISPLAY_ENABLE_AUTOFIT                 , video_out_auto_fit }, 
    18061806        {       MS_VIDEO_DISPLAY_ENABLE_MIRRORING               , video_out_enable_mirroring }, 
  • src/videostream.c

    r964 r975  
    185185        stream->corner=val ? 0 : -1; 
    186186        if (out){ 
    187                 ms_filter_call_method(out,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&stream->corner); 
     187                ms_filter_call_method(out,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&stream->corner); 
    188188        } 
    189189} 
     
    297297        ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_ENABLE_AUTOFIT,&tmp); 
    298298        ms_filter_call_method(stream->output,MS_FILTER_SET_PIX_FMT,&format); 
    299         ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&stream->corner); 
     299        ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&stream->corner); 
    300300 
    301301        if (pt->recv_fmtp!=NULL) 
     
    400400        ms_filter_call_method(stream->output,MS_FILTER_SET_VIDEO_SIZE,&disp_size); 
    401401        ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_ENABLE_MIRRORING,&mirroring); 
    402         ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&corner); 
     402        ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner); 
    403403        /* and then connect all */ 
    404404 
  • tests/videodisplay.c

    r963 r975  
    7777                          { 
    7878                            int corner=1; 
    79                             ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&corner); 
     79                            ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner); 
    8080                          } 
    8181                        if (n==600) 
    8282                          { 
    8383                            int corner=2; 
    84                             ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&corner); 
     84                            ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner); 
    8585                          } 
    8686                        if (n==700) 
    8787                          { 
    8888                            int corner=3; 
    89                             ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&corner); 
     89                            ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner); 
    9090                          } 
    9191                        if (n==800) 
    9292                          { 
    9393                            int corner=-1; 
    94                             ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_CORNER,&corner); 
     94                            ms_filter_call_method(vs->output,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner); 
    9595                          } 
    9696                        if (n==900) 
Note: See TracChangeset for help on using the changeset viewer.