Mercurial > mplayer.hg
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; |