comparison libvo/vo_directfb.c @ 5258:c9ccddcbdd81

ixes bug in draw_slice and also fixes compilance to new requirements for preinit/control. by jiri svoboda
author atmos4
date Fri, 22 Mar 2002 03:22:34 +0000
parents c663455448e8
children 1972c3475d93
comparison
equal deleted inserted replaced
5257:1823c7dff423 5258:c9ccddcbdd81
126 extern char *fb_dev_name; 126 extern char *fb_dev_name;
127 #else 127 #else
128 char *fb_dev_name; 128 char *fb_dev_name;
129 #endif 129 #endif
130 130
131 static int preinitdone=0;
132
133 static void (*draw_alpha_p)(int w, int h, unsigned char *src, 131 static void (*draw_alpha_p)(int w, int h, unsigned char *src,
134 unsigned char *srca, int stride, unsigned char *dst, 132 unsigned char *srca, int stride, unsigned char *dst,
135 int dstride); 133 int dstride);
136 134
137 static uint32_t in_width; 135 static uint32_t in_width;
149 int overx,overy; 147 int overx,overy;
150 } modes [4]; 148 } modes [4];
151 static unsigned int best_bpp=5; 149 static unsigned int best_bpp=5;
152 // videolayer stuff 150 // videolayer stuff
153 static int videolayeractive=0; 151 static int videolayeractive=0;
152 static int videolayerpresent=0;
154 //some info about videolayer - filled on preinit 153 //some info about videolayer - filled on preinit
155 struct vlayer_t { 154 struct vlayer_t {
156 int iv12; 155 int iv12;
157 int i420; 156 int i420;
158 int yuy2; 157 int yuy2;
168 #define DIRECTRENDER 167 #define DIRECTRENDER
169 #ifdef DIRECTRENDER 168 #ifdef DIRECTRENDER
170 static int dr_enabled=0; 169 static int dr_enabled=0;
171 static int framelocked=0; 170 static int framelocked=0;
172 #endif 171 #endif
173 172 // primary & frame stuff
173 static int frameallocated=0;
174 static int primaryallocated=0;
174 175
175 DFBEnumerationResult enum_modes_callback( unsigned int width,unsigned int height,unsigned int bpp, void *data) 176 DFBEnumerationResult enum_modes_callback( unsigned int width,unsigned int height,unsigned int bpp, void *data)
176 { 177 {
177 int overx=0,overy=0; 178 int overx=0,overy=0;
178 unsigned int index=bpp/8-1; 179 unsigned int index=bpp/8-1;
272 * (Initialize) 273 * (Initialize)
273 */ 274 */
274 275
275 if (verbose) printf("DirectFB: Preinit entered\n"); 276 if (verbose) printf("DirectFB: Preinit entered\n");
276 277
277 if (preinitdone) return 0;
278
279 DFBCHECK (DirectFBInit (NULL,NULL)); 278 DFBCHECK (DirectFBInit (NULL,NULL));
280 279
281 if ((directfb_major_version >= 0) && 280 if ((directfb_major_version >= 0) &&
282 (directfb_minor_version >= 9) && 281 (directfb_minor_version >= 9) &&
283 (directfb_micro_version >= 7)) 282 (directfb_micro_version >= 7))
404 403
405 404
406 // is there a working yuv ? if no we will not use videolayer 405 // is there a working yuv ? if no we will not use videolayer
407 if ((videolayercaps.iv12==0)&&(videolayercaps.i420==0)&&(videolayercaps.yuy2==0)&&(videolayercaps.uyvy==0)) { 406 if ((videolayercaps.iv12==0)&&(videolayercaps.i420==0)&&(videolayercaps.yuy2==0)&&(videolayercaps.uyvy==0)) {
408 // videolayer doesn't work with yuv so release it 407 // videolayer doesn't work with yuv so release it
409 videolayeractive=0; 408 videolayerpresent=0;
410 videolayer->SetOpacity(videolayer,0); 409 videolayer->SetOpacity(videolayer,0);
411 videolayer->Release(videolayer); 410 videolayer->Release(videolayer);
412 } else { 411 } else {
413 videolayeractive=1; 412 videolayerpresent=1;
414 }; 413 };
415 } 414 }
416 415
417 // just look at RGB things for main layer 416 // just look at RGB things for main layer
418 modes[0].valid=0; 417 modes[0].valid=0;
419 modes[1].valid=0; 418 modes[1].valid=0;
420 modes[2].valid=0; 419 modes[2].valid=0;
421 modes[3].valid=0; 420 modes[3].valid=0;
422 DFBCHECK (dfb->EnumVideoModes(dfb,enum_modes_callback,NULL)); 421 DFBCHECK (dfb->EnumVideoModes(dfb,enum_modes_callback,NULL));
423 preinitdone=1; 422
423 /*
424 * (Get keyboard)
425 */
426 DFBCHECK (dfb->GetInputDevice (dfb, DIDID_KEYBOARD, &keyboard));
427
428 /*
429 * Create an input buffer for the keyboard.
430 */
431 #ifdef HAVE_DIRECTFB099
432 DFBCHECK (keyboard->CreateEventBuffer (keyboard, &buffer));
433 #else
434 DFBCHECK (keyboard->CreateInputBuffer (keyboard, &buffer));
435 #endif
436 // just to start with clean ...
437 buffer->Reset(buffer);
424 return 0; 438 return 0;
425 439
426 } 440 }
427 441
428 442
439 453
440 int vm = fullscreen & 0x02; 454 int vm = fullscreen & 0x02;
441 int zoom = fullscreen & 0x04; 455 int zoom = fullscreen & 0x04;
442 456
443 if (verbose) printf("DirectFB: Config entered [%ix%i]\n",width,height); 457 if (verbose) printf("DirectFB: Config entered [%ix%i]\n",width,height);
458 if (verbose) printf("DirectFB: With requested format: %s\n",vo_format_name(format));
444 459
445 fs = fullscreen & 0x01; 460 fs = fullscreen & 0x01;
446 flip = fullscreen & 0x08; 461 flip = fullscreen & 0x08;
447 462
448 pixel_format=format; 463 pixel_format=format;
469 if (vm) { 484 if (vm) {
470 // need better algorithm just hack 485 // need better algorithm just hack
471 if (modes[source_pixel_size-1].valid) dfb->SetVideoMode(dfb,modes[source_pixel_size-1].width,modes[source_pixel_size-1].height,source_pixel_size); 486 if (modes[source_pixel_size-1].valid) dfb->SetVideoMode(dfb,modes[source_pixel_size-1].width,modes[source_pixel_size-1].height,source_pixel_size);
472 } 487 }
473 488
474 489 // release primary if it is already allocated
475 if (videolayeractive) { 490 if (primaryallocated) {
476 videolayeractive=0; // will be enabled on succes later 491 if (verbose ) printf("DirectFB: Release primary\n");
492 primary->Release (primary);
493 primaryallocated=0;
494 };
495
496 videolayeractive=0; // will be enabled on succes later
497
498 if (videolayerpresent) {
477 499
478 // try to set proper w a h values matching image size 500 // try to set proper w a h values matching image size
479 dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; 501 dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT;
480 dlc.width = in_width; 502 dlc.width = in_width;
481 dlc.height = in_height; 503 dlc.height = in_height;
518 dlc.pixelformat=DSPF_YV12; 540 dlc.pixelformat=DSPF_YV12;
519 break; 541 break;
520 #endif 542 #endif
521 }; 543 };
522 // shouldn't happen - if it reaches here -> bug 544 // shouldn't happen - if it reaches here -> bug
523 dsc.pixelformat = DSPF_RGB24; break; 545
524 546 case IMGFMT_RGB32: dlc.pixelformat = DSPF_ARGB; break;
525 case IMGFMT_RGB32: dsc.pixelformat = DSPF_ARGB; break; 547 case IMGFMT_BGR32: dlc.pixelformat = DSPF_ARGB; break;
526 case IMGFMT_BGR32: dsc.pixelformat = DSPF_ARGB; break; 548 case IMGFMT_RGB24: dlc.pixelformat = DSPF_RGB24; break;
527 case IMGFMT_RGB24: dsc.pixelformat = DSPF_RGB24; break; 549 case IMGFMT_BGR24: dlc.pixelformat = DSPF_RGB24; break;
528 case IMGFMT_BGR24: dsc.pixelformat = DSPF_RGB24; break; 550 case IMGFMT_RGB16: dlc.pixelformat = DSPF_RGB16; break;
529 case IMGFMT_RGB16: dsc.pixelformat = DSPF_RGB16; break; 551 case IMGFMT_BGR16: dlc.pixelformat = DSPF_RGB16; break;
530 case IMGFMT_BGR16: dsc.pixelformat = DSPF_RGB16; break; 552 case IMGFMT_RGB15: dlc.pixelformat = DSPF_RGB15; break;
531 case IMGFMT_RGB15: dsc.pixelformat = DSPF_RGB15; break; 553 case IMGFMT_BGR15: dlc.pixelformat = DSPF_RGB15; break;
532 case IMGFMT_BGR15: dsc.pixelformat = DSPF_RGB15; break; 554 default: dlc.pixelformat = DSPF_RGB24; break;
533 default: dsc.pixelformat = DSPF_RGB24; break;
534 } 555 }
535 556
536 if (verbose) switch (dlc.pixelformat) { 557 if (verbose) switch (dlc.pixelformat) {
537 case DSPF_ARGB: printf("DirectFB: layer format ARGB\n"); 558 case DSPF_ARGB: printf("DirectFB: layer format ARGB\n");
538 break; 559 break;
562 if (verbose) printf("DirectFB: SetConfiguration for layer OK\n"); 583 if (verbose) printf("DirectFB: SetConfiguration for layer OK\n");
563 ret = videolayer->GetSurface( videolayer, &primary ); 584 ret = videolayer->GetSurface( videolayer, &primary );
564 if (!ret){ 585 if (!ret){
565 videolayeractive=1; 586 videolayeractive=1;
566 if (verbose) printf("DirectFB: Get surface for layer OK\n"); 587 if (verbose) printf("DirectFB: Get surface for layer OK\n");
567 }; 588 primaryallocated=1;
568 }; 589 } else {
590 videolayeractive=0;
591 if (videolayer) videolayer->SetOpacity(videolayer,0);
592 };
593 } else {
594 videolayeractive=0;
595 if (videolayer) videolayer->SetOpacity(videolayer,0);
596 };
569 597
570 } 598 }
571 599
572 // for flipping we will use BitBlt not integrated directfb flip 600 // for flipping we will use BitBlt not integrated directfb flip
573 dsc.flags = DSDESC_CAPS | DSDESC_PIXELFORMAT; 601 dsc.flags = DSDESC_CAPS | DSDESC_PIXELFORMAT;
585 default: dsc.pixelformat = DSPF_RGB24; source_pixel_size=2; break; //YUV formats 613 default: dsc.pixelformat = DSPF_RGB24; source_pixel_size=2; break; //YUV formats
586 }; 614 };
587 615
588 if (!videolayeractive) { 616 if (!videolayeractive) {
589 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary )); 617 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
590 618 if (verbose) printf("DirectFB: Get primary surface OK\n");
619 primaryallocated=1;
591 } 620 }
592 621
593 DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height)); 622 DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
594 623
595 DFBCHECK (primary->GetPixelFormat (primary, &frame_format)); 624 DFBCHECK (primary->GetPixelFormat (primary, &frame_format));
596 625
597 // temporary buffer buffer 626 // temporary frame buffer
598 dsc.flags = DSDESC_CAPS | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH; 627 dsc.flags = DSDESC_CAPS | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH;
599 628
600 dsc.width = in_width; 629 dsc.width = in_width;
601 dsc.height = in_height; 630 dsc.height = in_height;
602 631
626 }; 655 };
627 #else 656 #else
628 memcpyBitBlt = 0; 657 memcpyBitBlt = 0;
629 #endif 658 #endif
630 659
660 // release frame if it is already allocated
661 if (frameallocated) {
662 if (verbose ) printf("DirectFB: Release frame\n");
663 frame->Release (frame);
664 frameallocated=0;
665 };
666
667
631 // prevent from memcpy from videomemory to videomemory 668 // prevent from memcpy from videomemory to videomemory
632 /* if (memcpyBitBlt) { 669 /* if (memcpyBitBlt) {
633 dsc.caps = DSCAPS_SYSTEMONLY; 670 dsc.caps = DSCAPS_SYSTEMONLY;
634 } else { 671 } else {
635 dsc.caps = DSCAPS_VIDEOONLY; 672 dsc.caps = DSCAPS_VIDEOONLY;
637 ret = dfb->CreateSurface( dfb, &dsc, &frame); 674 ret = dfb->CreateSurface( dfb, &dsc, &frame);
638 if (ret) { 675 if (ret) {
639 if (verbose) printf ("DirectFB: Trying do create buffer in system memory (2)\n");*/ 676 if (verbose) printf ("DirectFB: Trying do create buffer in system memory (2)\n");*/
640 dsc.caps = DSCAPS_SYSTEMONLY; 677 dsc.caps = DSCAPS_SYSTEMONLY;
641 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &frame)); 678 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &frame));
679 frameallocated=1;
642 // } 680 // }
643 681
644 DFBCHECK (frame->GetPixelFormat (frame, &frame_format)); 682 DFBCHECK (frame->GetPixelFormat (frame, &frame_format));
645 683
646 switch (frame_format) { 684 switch (frame_format) {
680 printf("Screensize is smaller than video size !\n"); 718 printf("Screensize is smaller than video size !\n");
681 // return 1; // doesn't matter we will rescale 719 // return 1; // doesn't matter we will rescale
682 } 720 }
683 721
684 722
685
686 /*
687 * (Get keyboard)
688 */
689 DFBCHECK (dfb->GetInputDevice (dfb, DIDID_KEYBOARD, &keyboard));
690
691 /*
692 * Create an input buffer for the keyboard.
693 */
694 #ifdef HAVE_DIRECTFB099
695 DFBCHECK (keyboard->CreateEventBuffer (keyboard, &buffer));
696 #else
697 DFBCHECK (keyboard->CreateInputBuffer (keyboard, &buffer));
698 #endif
699 723
700 // yuv2rgb transform init 724 // yuv2rgb transform init
701 725
702 if (((format == IMGFMT_YV12) || (format == IMGFMT_YUY2)) && (!videolayeractive)){ yuv2rgb_init(frame_pixel_size * 8,MODE_RGB);}; 726 if (((format == IMGFMT_YV12) || (format == IMGFMT_YUY2)) && (!videolayeractive)){ yuv2rgb_init(frame_pixel_size * 8,MODE_RGB);};
703 727
783 case IMGFMT_RGB16: 807 case IMGFMT_RGB16:
784 case IMGFMT_BGR16: 808 case IMGFMT_BGR16:
785 case IMGFMT_RGB15: 809 case IMGFMT_RGB15:
786 case IMGFMT_BGR15: if (modes[1].valid) return ret|0x2; 810 case IMGFMT_BGR15: if (modes[1].valid) return ret|0x2;
787 break; 811 break;
788 case IMGFMT_YUY2: if (videolayeractive) { 812 case IMGFMT_YUY2: if (videolayerpresent) {
789 if (videolayercaps.yuy2) { 813 if (videolayercaps.yuy2) {
790 return ret|0x2; 814 return ret|0x2|0x1;
791 } else { 815 } else {
792 return ret|0x1; 816 return ret|0x1;
793 }; 817 };
794 }; 818 };
795 break; 819 break;
796 case IMGFMT_YV12: if ((videolayeractive) && 820 case IMGFMT_YV12: if ((videolayerpresent) &&
797 (videolayercaps.i420 || videolayercaps.iv12)) 821 (videolayercaps.i420 || videolayercaps.iv12))
798 return ret|0x2; else return ret|0x1; 822 return ret|0x2|0x1; else return ret|0x1;
799 break; 823 break;
800 // YV12 should work in all cases 824 // YV12 should work in all cases
801 } 825 }
802 826
803 return 0; 827 return 0;
1033 break; 1057 break;
1034 1058
1035 #ifdef HAVE_DIRECTFB099 1059 #ifdef HAVE_DIRECTFB099
1036 case DSPF_YV12: 1060 case DSPF_YV12:
1037 switch (pixel_format) { 1061 switch (pixel_format) {
1038 case IMGFMT_YV12: { 1062 case IMGFMT_YV12: {
1063 void *d,*s;
1039 int i; 1064 int i;
1040 dst += x; 1065 d = dst + pitch*y + x;
1041 for (i=y;i<(y+h);i++) { 1066 s = src[0];
1042 memcpy(dst+i*pitch,src[0]+i*stride[0],w); 1067 for (i=0;i<h;i++) {
1068 memcpy(d,s,w);
1069 d+=pitch;
1070 s+=stride[0];
1043 } 1071 }
1044 dst += pitch*in_height - (x)/2; 1072 d = dst + pitch*in_height + pitch*y/4 + x/2;
1045 for (i=y/2;i<(y+h)/2;i++) { 1073 s = src[2];
1046 memcpy(dst+i*pitch/2,src[2]+i*stride[2],w/2); 1074 for (i=0;i<h/2;i++) {
1075 memcpy(d,s,w/2);
1076 d+=pitch/2;
1077 s+=stride[2];
1047 } 1078 }
1048 dst += pitch*in_height/4; 1079 d = dst + pitch*in_height + pitch*in_height/4 + pitch*y/4 + x/2;
1049 for (i=y/2;i<(y+h)/2;i++) { 1080 s = src[1];
1050 memcpy(dst+i*pitch/2,src[1]+i*stride[1],w/2); 1081 for (i=0;i<h/2;i++) {
1082 memcpy(d,s,w/2);
1083 d+=pitch/2;
1084 s+=stride[1];
1051 } 1085 }
1052 }; 1086 };
1053 break; 1087 break;
1054 /* case IMGFMT_YUY2: { 1088 /* case IMGFMT_YUY2: {
1055 int i; 1089 int i;
1064 break; 1098 break;
1065 1099
1066 case DSPF_I420: 1100 case DSPF_I420:
1067 switch (pixel_format) { 1101 switch (pixel_format) {
1068 case IMGFMT_YV12: { 1102 case IMGFMT_YV12: {
1103 void *d,*s;
1069 int i; 1104 int i;
1070 dst += x; 1105 d = dst + pitch*y + x;
1071 for (i=y;i<(y+h);i++) { 1106 s = src[0];
1072 memcpy(dst+i*pitch,src[0]+i*stride[0],w); 1107 for (i=0;i<h;i++) {
1108 memcpy(d,s,w);
1109 d+=pitch;
1110 s+=stride[0];
1073 } 1111 }
1074 dst += pitch*in_height - (x)/2; 1112 d = dst + pitch*in_height + pitch*y/4 + x/2;
1075 for (i=y/2;i<(y+h)/2;i++) { 1113 s = src[1];
1076 memcpy(dst+i*pitch/2,src[1]+i*stride[1],w/2); 1114 for (i=0;i<h/2;i++) {
1115 memcpy(d,s,w/2);
1116 d+=pitch/2;
1117 s+=stride[1];
1077 } 1118 }
1078 dst += pitch*in_height/4; 1119 d = dst + pitch*in_height + pitch*in_height/4 + pitch*y/4 + x/2;
1079 for (i=y/2;i<(y+h)/2;i++) { 1120 s = src[2];
1080 memcpy(dst+i*pitch/2,src[2]+i*stride[2],w/2); 1121 for (i=0;i<h/2;i++) {
1122 memcpy(d,s,w/2);
1123 d+=pitch/2;
1124 s+=stride[2];
1081 } 1125 }
1082 }; 1126 };
1083 break; 1127 break;
1084 /* case IMGFMT_YUY2: { 1128 /* case IMGFMT_YUY2: {
1085 int i; 1129 int i;
1086 for (i=y;i<(y+h);i++) { 1130 for (i=y;i<(y+h);i++) {
1087 yuy2toyv12(src[0]+i*stride[0],dst+i*pitch+x*frame_pixel_size,dst+pitch*(in_height+in_height/4+i/2)+x*frame_pixel_size/2,dst+pitch*(in_height+i/2)+x*frame_pixel_size/2,w,h,pitch,pitch/2,pitch/2); 1131 yuy2toyv12(src[0]+i*stride[0],dst+i*pitch+x*frame_pixel_size,dst+pitch*(in_height+in_height/4+i/2)+x*frame_pixel_size/2,dst+pitch*(in_height+i/2)+x*frame_pixel_size/2,w,h,pitch,pitch/2,pitch/2);
1231 */ 1275 */
1232 if (verbose ) printf("DirectFB: Release buffer\n"); 1276 if (verbose ) printf("DirectFB: Release buffer\n");
1233 buffer->Release (buffer); 1277 buffer->Release (buffer);
1234 if (verbose ) printf("DirectFB: Release keyboard\n"); 1278 if (verbose ) printf("DirectFB: Release keyboard\n");
1235 keyboard->Release (keyboard); 1279 keyboard->Release (keyboard);
1236 if (verbose ) printf("DirectFB: Release frame\n"); 1280 if (frameallocated) {
1237 frame->Release (frame); 1281 if (verbose ) printf("DirectFB: Release frame\n");
1238 1282 frame->Release (frame);
1283 frameallocated=0;
1284 };
1285
1239 // we will not release dfb and layer because there could be a new film 1286 // we will not release dfb and layer because there could be a new film
1240 1287
1241 if (verbose ) printf("DirectFB: Release primary\n"); 1288 if (verbose ) printf("DirectFB: Release primary\n");
1242 primary->Release (primary); 1289 primary->Release (primary);
1243 // switch off BES 1290 // switch off BES
1247 if (verbose&&videolayer ) printf("DirectFB: Release videolayer\n"); 1294 if (verbose&&videolayer ) printf("DirectFB: Release videolayer\n");
1248 if (videolayer) videolayer->Release(videolayer); 1295 if (videolayer) videolayer->Release(videolayer);
1249 1296
1250 if (verbose ) printf("DirectFB: Release DirectFB library\n"); 1297 if (verbose ) printf("DirectFB: Release DirectFB library\n");
1251 dfb->Release (dfb); 1298 dfb->Release (dfb);
1252 preinitdone=0;
1253 #endif 1299 #endif
1254 1300
1255 if (verbose ) printf("DirectFB: Uninit done.\n"); 1301 if (verbose ) printf("DirectFB: Uninit done.\n");
1256 } 1302 }
1257 1303
1336 1382
1337 #ifdef DIRECTRENDER 1383 #ifdef DIRECTRENDER
1338 static uint32_t get_image(mp_image_t *mpi){ 1384 static uint32_t get_image(mp_image_t *mpi){
1339 int err; 1385 int err;
1340 void *dst; 1386 void *dst;
1341 uint8_t *s;
1342 int pitch; 1387 int pitch;
1343 int i;
1344 1388
1345 // printf("DirectFB: get_image() called\n"); 1389 // printf("DirectFB: get_image() called\n");
1346 1390
1347 // now we are always in system memory (in this version - mybe will change in future) 1391 // now we are always in system memory (in this version - mybe will change in future)
1348 // if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram 1392 // if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram