Changeset 975:33ed4562bf65 in mediastreamer2
- Timestamp:
- May 18, 2010 2:25:47 PM (3 years ago)
- Branch:
- default
- Files:
-
- 5 edited
-
include/mediastreamer2/msinterfaces.h (modified) (1 diff)
-
src/drawdib-display.c (modified) (9 diffs)
-
src/videoout.c (modified) (1 diff)
-
src/videostream.c (modified) (3 diffs)
-
tests/videodisplay.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
include/mediastreamer2/msinterfaces.h
r973 r975 30 30 31 31 /**position of the local view */ 32 #define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_ CORNER\32 #define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE \ 33 33 MS_FILTER_METHOD(MSFilterVideoDisplayInterface,1,int) 34 34 -
src/drawdib-display.c
r970 r975 27 27 #include "ffmpeg-priv.h" 28 28 29 #define SCALE_FACTOR 0.16f29 #define SCALE_FACTOR 4.0f 30 30 #define SELVIEW_POS_INACTIVE -100.0 31 31 #include <Vfw.h> … … 128 128 Yuv2RgbCtx mainview; 129 129 Yuv2RgbCtx locview; 130 int corner; 130 int sv_corner; 131 float sv_scalefactor; 131 132 bool_t need_repaint; 132 133 bool_t autofit; … … 220 221 yuv2rgb_init(&obj->mainview); 221 222 yuv2rgb_init(&obj->locview); 222 obj->corner=0; /* bottom right*/ 223 obj->sv_corner=0; /* bottom right*/ 224 obj->sv_scalefactor=SCALE_FACTOR; 223 225 obj->need_repaint=FALSE; 224 226 obj->autofit=TRUE; … … 283 285 #define LOCAL_POS_OFFSET 10 284 286 285 static void compute_layout(MSVideoSize wsize, MSVideoSize vsize, MSVideoSize orig_psize, MSRect *mainrect, MSRect *localrect, int localrect_pos ){287 static void compute_layout(MSVideoSize wsize, MSVideoSize vsize, MSVideoSize orig_psize, MSRect *mainrect, MSRect *localrect, int localrect_pos, float scalefactor){ 286 288 MSVideoSize psize; 287 289 288 290 center_with_ratio(wsize,vsize,mainrect); 289 291 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); 292 294 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 } 295 385 } 296 386 /* … … 368 458 HGDIOBJ old_object=NULL; 369 459 bool_t repainted=FALSE; 370 int corner=obj->corner; 460 int corner=obj->sv_corner; 461 float scalefactor=obj->sv_scalefactor; 371 462 372 463 GetClientRect(obj->window,&rect); … … 400 491 401 492 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); 403 494 vsize.width=mainrect.w; 404 495 vsize.height=mainrect.h; … … 496 587 static int set_corner(MSFilter *f, void *data){ 497 588 DDDisplay *obj=(DDDisplay*)f->data; 498 obj-> corner=*(int*)data;589 obj->sv_corner=*(int*)data; 499 590 obj->need_repaint=TRUE; 500 591 return 0; … … 513 604 } 514 605 606 static 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 } 515 615 516 616 static MSFilterMethod methods[]={ … … 521 621 { MS_VIDEO_DISPLAY_ENABLE_AUTOFIT , enable_autofit }, 522 622 { 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 }, 524 625 { 0 ,NULL} 525 626 }; -
src/videoout.c
r973 r975 1802 1802 { MS_VIDEO_OUT_GET_BACKGROUND_COLOR , video_out_get_background_color}, 1803 1803 /* 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 }, 1805 1805 { MS_VIDEO_DISPLAY_ENABLE_AUTOFIT , video_out_auto_fit }, 1806 1806 { MS_VIDEO_DISPLAY_ENABLE_MIRRORING , video_out_enable_mirroring }, -
src/videostream.c
r964 r975 185 185 stream->corner=val ? 0 : -1; 186 186 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); 188 188 } 189 189 } … … 297 297 ms_filter_call_method(stream->output,MS_VIDEO_DISPLAY_ENABLE_AUTOFIT,&tmp); 298 298 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); 300 300 301 301 if (pt->recv_fmtp!=NULL) … … 400 400 ms_filter_call_method(stream->output,MS_FILTER_SET_VIDEO_SIZE,&disp_size); 401 401 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); 403 403 /* and then connect all */ 404 404 -
tests/videodisplay.c
r963 r975 77 77 { 78 78 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); 80 80 } 81 81 if (n==600) 82 82 { 83 83 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); 85 85 } 86 86 if (n==700) 87 87 { 88 88 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); 90 90 } 91 91 if (n==800) 92 92 { 93 93 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); 95 95 } 96 96 if (n==900)
Note: See TracChangeset
for help on using the changeset viewer.
