comparison libvo/vo_vesa.c @ 2869:107d9e9e5bd1

New video output technique Linux Video Overlay: -vo vesa:lvo:drv_name (for example -vo vesa:lvo:/dev/radeon_vid or -vo vesa:lvo:/dev/mga_vid) Note: You don't need to have graphics screen before loading xxx_vid driver vo_vesa will switch to graphics mode before using of xxx_vid driver. So you can traditional start it from text-mode.
author nick
date Tue, 13 Nov 2001 17:13:33 +0000
parents 8e3875816f6d
children a70c0054e5fe
comparison
equal deleted inserted replaced
2868:4a1802c5bbee 2869:107d9e9e5bd1
93 /* multibuffering */ 93 /* multibuffering */
94 uint8_t* video_base; /* should be never changed */ 94 uint8_t* video_base; /* should be never changed */
95 uint32_t multi_buff[MAX_BUFFERS]; /* contains offsets of buffers */ 95 uint32_t multi_buff[MAX_BUFFERS]; /* contains offsets of buffers */
96 uint8_t multi_size=0; /* total number of buffers */ 96 uint8_t multi_size=0; /* total number of buffers */
97 uint8_t multi_idx=0; /* active buffer */ 97 uint8_t multi_idx=0; /* active buffer */
98
99 /* Linux Video Overlay */
100 static const char *lvo_name = NULL;
98 101
99 #define HAS_DGA() (win.idx == -1) 102 #define HAS_DGA() (win.idx == -1)
100 #define MOVIE_MODE (MODE_ATTR_COLOR | MODE_ATTR_GRAPHICS) 103 #define MOVIE_MODE (MODE_ATTR_COLOR | MODE_ATTR_GRAPHICS)
101 #define FRAME_MODE (MODE_WIN_RELOCATABLE | MODE_WIN_WRITEABLE) 104 #define FRAME_MODE (MODE_WIN_RELOCATABLE | MODE_WIN_WRITEABLE)
102 105
125 #define PRINT_VBE_ERR(name,err) { printf("vo_vesa: %s returns: %s\n",name,vbeErrToStr(err)); fflush(stdout); } 128 #define PRINT_VBE_ERR(name,err) { printf("vo_vesa: %s returns: %s\n",name,vbeErrToStr(err)); fflush(stdout); }
126 129
127 static void vesa_term( void ) 130 static void vesa_term( void )
128 { 131 {
129 int err; 132 int err;
133 if(lvo_name) vlvo_term();
130 if((err=vbeRestoreState(init_state)) != VBE_OK) PRINT_VBE_ERR("vbeRestoreState",err); 134 if((err=vbeRestoreState(init_state)) != VBE_OK) PRINT_VBE_ERR("vbeRestoreState",err);
131 if((err=vbeSetMode(init_mode,NULL)) != VBE_OK) PRINT_VBE_ERR("vbeSetMode",err); 135 if((err=vbeSetMode(init_mode,NULL)) != VBE_OK) PRINT_VBE_ERR("vbeSetMode",err);
132 if(HAS_DGA()) vbeUnmapVideoBuffer((unsigned long)win.ptr,win.high); 136 if(HAS_DGA()) vbeUnmapVideoBuffer((unsigned long)win.ptr,win.high);
133 if(dga_buffer && !HAS_DGA()) free(dga_buffer); 137 if(dga_buffer && !HAS_DGA()) free(dga_buffer);
134 vbeDestroy(); 138 vbeDestroy();
238 /* is called for yuv only */ 242 /* is called for yuv only */
239 static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) 243 static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
240 { 244 {
241 if(verbose > 2) 245 if(verbose > 2)
242 printf("vo_vesa: draw_slice was called: w=%u h=%u x=%u y=%u\n",w,h,x,y); 246 printf("vo_vesa: draw_slice was called: w=%u h=%u x=%u y=%u\n",w,h,x,y);
247 if(lvo_name) return vlvo_draw_slice(image,stride,w,h,x,y);
248 else
243 if(vesa_zoom) 249 if(vesa_zoom)
244 { 250 {
245 uint8_t *dst[3]= {dga_buffer, NULL, NULL}; 251 uint8_t *dst[3]= {dga_buffer, NULL, NULL};
246 int dst_stride; 252 int dst_stride;
247 if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE(); 253 if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE();
305 static void draw_osd(void) 311 static void draw_osd(void)
306 { 312 {
307 uint32_t w,h; 313 uint32_t w,h;
308 if(verbose > 2) 314 if(verbose > 2)
309 printf("vo_vesa: draw_osd was called\n"); 315 printf("vo_vesa: draw_osd was called\n");
310 w = HAS_DGA()?video_mode_info.XResolution:image_width; 316 if(lvo_name) vlvo_draw_osd();
311 h = HAS_DGA()?video_mode_info.YResolution:image_height; 317 else
312 if(dga_buffer) vo_draw_text(w,h,draw_alpha_fnc); 318 {
319 w = HAS_DGA()?video_mode_info.XResolution:image_width;
320 h = HAS_DGA()?video_mode_info.YResolution:image_height;
321 if(dga_buffer) vo_draw_text(w,h,draw_alpha_fnc);
322 }
313 } 323 }
314 324
315 static void flip_page(void) 325 static void flip_page(void)
316 { 326 {
317 if(verbose > 2) 327 if(verbose > 2)
318 printf("vo_vesa: flip_page was called\n"); 328 printf("vo_vesa: flip_page was called\n");
329 if(lvo_name) vlvo_flip_page();
330 else
319 if(flip_trigger) 331 if(flip_trigger)
320 { 332 {
321 if(!HAS_DGA()) __vbeCopyData(dga_buffer); 333 if(!HAS_DGA()) __vbeCopyData(dga_buffer);
322 flip_trigger = 0; 334 flip_trigger = 0;
323 } 335 }
324 if(vo_doublebuffering && multi_size > 1) 336 if(vo_doublebuffering && multi_size > 1 && !lvo_name)
325 { 337 {
326 int err; 338 int err;
327 if((err=vbeSetDisplayStart(multi_buff[multi_idx],1)) != VBE_OK) 339 if((err=vbeSetDisplayStart(multi_buff[multi_idx],1)) != VBE_OK)
328 { 340 {
329 vesa_term(); 341 vesa_term();
350 static uint32_t draw_frame(uint8_t *src[]) 362 static uint32_t draw_frame(uint8_t *src[])
351 { 363 {
352 uint8_t *data = src[0]; 364 uint8_t *data = src[0];
353 if(verbose > 2) 365 if(verbose > 2)
354 printf("vo_vesa: draw_frame was called\n"); 366 printf("vo_vesa: draw_frame was called\n");
367 if(lvo_name) return vlvo_draw_frame(src);
368 else
355 if(rgb2rgb_fnc) 369 if(rgb2rgb_fnc)
356 { 370 {
357 if(HAS_DGA()) 371 if(HAS_DGA())
358 { 372 {
359 size_t i, psize, ssize, dsize; 373 size_t i, psize, ssize, dsize;
377 data = dga_buffer; 391 data = dga_buffer;
378 } 392 }
379 if(verbose > 2) 393 if(verbose > 2)
380 printf("vo_vesa: rgb2rgb_fnc was called\n"); 394 printf("vo_vesa: rgb2rgb_fnc was called\n");
381 } 395 }
382 if(!rgb2rgb_fnc || !HAS_DGA()) __vbeCopyData(data); 396 if((!rgb2rgb_fnc || !HAS_DGA()) && !lvo_name) __vbeCopyData(data);
383 return 0; 397 return 0;
384 } 398 }
385 399
386 static uint32_t query_format(uint32_t format) 400 static uint32_t query_format(uint32_t format)
387 { 401 {
485 uint32_t flags; 499 uint32_t flags;
486 flags = 0; 500 flags = 0;
487 if(strcmp(sd,"nodga") == 0) { flags |= SUBDEV_NODGA; flags &= ~(SUBDEV_FORCEDGA); } 501 if(strcmp(sd,"nodga") == 0) { flags |= SUBDEV_NODGA; flags &= ~(SUBDEV_FORCEDGA); }
488 else 502 else
489 if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; } 503 if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; }
504 else
505 if(memcmp(sd,"lvo:",4) == 0) lvo_name = &sd[4]; /* lvo_name will be valid within init() */
490 else if(verbose) printf("vo_vesa: Unknown subcommand: %s\n", sd); 506 else if(verbose) printf("vo_vesa: Unknown subcommand: %s\n", sd);
491 return flags; 507 return flags;
492 } 508 }
493 509
494 /* fullscreen: 510 /* fullscreen:
682 image_height = video_mode_info.YResolution; 698 image_height = video_mode_info.YResolution;
683 vesa_zoom = 1; 699 vesa_zoom = 1;
684 } 700 }
685 scale_xinc=(width << 16) / image_width - 2; /* needed for proper rounding */ 701 scale_xinc=(width << 16) / image_width - 2; /* needed for proper rounding */
686 scale_yinc=(height << 16) / image_height + 2; 702 scale_yinc=(height << 16) / image_height + 2;
687 SwScale_Init(); 703 if(!lvo_name) SwScale_Init();
688 if(verbose) printf("vo_vesa: Using SCALE\n"); 704 if(verbose) printf("vo_vesa: Using SCALE\n");
689 } 705 }
690 else 706 else
691 { 707 {
692 printf("vo_vesa: Can't apply zooming to non YV12 formats\n"); 708 printf("vo_vesa: Can't apply zooming to non YV12 formats\n");
693 return -1; 709 return -1;
694 } 710 }
695 } 711 }
696 if(format != IMGFMT_YV12 && image_bpp != video_mode_info.BitsPerPixel) 712 if(format != IMGFMT_YV12 && image_bpp != video_mode_info.BitsPerPixel && !lvo_name)
697 { 713 {
698 if(image_bpp == 24 && video_mode_info.BitsPerPixel == 32) rgb2rgb_fnc = rgb24to32; 714 if(image_bpp == 24 && video_mode_info.BitsPerPixel == 32) rgb2rgb_fnc = rgb24to32;
699 else 715 else
700 if(image_bpp == 32 && video_mode_info.BitsPerPixel == 24) rgb2rgb_fnc = rgb32to24; 716 if(image_bpp == 32 && video_mode_info.BitsPerPixel == 24) rgb2rgb_fnc = rgb32to24;
701 else 717 else
787 cpy_blk_fnc = __vbeCopyBlockFast; 803 cpy_blk_fnc = __vbeCopyBlockFast;
788 } 804 }
789 else 805 else
790 { 806 {
791 cpy_blk_fnc = __vbeCopyBlock; 807 cpy_blk_fnc = __vbeCopyBlock;
792 if(yuv_fmt || rgb2rgb_fnc) 808 if((yuv_fmt || rgb2rgb_fnc) && !lvo_name)
793 { 809 {
794 if(!(dga_buffer = memalign(64,video_mode_info.XResolution*video_mode_info.YResolution*video_mode_info.BitsPerPixel))) 810 if(!(dga_buffer = memalign(64,video_mode_info.XResolution*video_mode_info.YResolution*video_mode_info.BitsPerPixel)))
795 { 811 {
796 printf("vo_vesa: Can't allocate temporary buffer\n"); 812 printf("vo_vesa: Can't allocate temporary buffer\n");
797 return -1; 813 return -1;
814 if(verbose) 830 if(verbose)
815 { 831 {
816 printf("vo_vesa: Graphics mode was activated\n"); 832 printf("vo_vesa: Graphics mode was activated\n");
817 fflush(stdout); 833 fflush(stdout);
818 } 834 }
835 if(lvo_name)
836 {
837 if(vlvo_init(lvo_name,width,height,x_offset,y_offset,image_width,image_height,format,video_mode_info.BitsPerPixel) != 0)
838 {
839 printf("vo_vesa: Can't initialize Linux Video Overlay\n");
840 vesa_term();
841 return -1;
842 }
843 else printf("vo_vesa: Using video overlay: %s\n",lvo_name);
844 }
819 } 845 }
820 else 846 else
821 { 847 {
822 printf("vo_vesa: Can't find mode for: %ux%u@%u\n",width,height,bpp); 848 printf("vo_vesa: Can't find mode for: %ux%u@%u\n",width,height,bpp);
823 return -1; 849 return -1;