Mercurial > mplayer.hg
comparison vidix/drivers/nvidia_vid.c @ 16389:fa804efbfaf6
equalizer fixes: changing one attribute reset the others,
brightness control for NV03/NV04
author | reimar |
---|---|
date | Sun, 04 Sep 2005 21:00:07 +0000 |
parents | 73afe41bb7c3 |
children | 288a27e39393 |
comparison
equal
deleted
inserted
replaced
16388:9bce6b40def2 | 16389:fa804efbfaf6 |
---|---|
65 // since no useful information whatsoever is passed | 65 // since no useful information whatsoever is passed |
66 // to the equalizer functions we need this | 66 // to the equalizer functions we need this |
67 static struct { | 67 static struct { |
68 uint32_t lum; // luminance (brightness + contrast) | 68 uint32_t lum; // luminance (brightness + contrast) |
69 uint32_t chrom; // chrominance (saturation + hue) | 69 uint32_t chrom; // chrominance (saturation + hue) |
70 uint8_t red_off; // for NV03/NV04 | |
71 uint8_t green_off; | |
72 uint8_t blue_off; | |
70 vidix_video_eq_t vals; | 73 vidix_video_eq_t vals; |
71 } eq; | 74 } eq; |
72 | 75 |
73 struct nvidia_cards { | 76 struct nvidia_cards { |
74 unsigned short chip_id; | 77 unsigned short chip_id; |
635 yscale = ((info->height - 1) << 11) / (info->d_height - 1); | 638 yscale = ((info->height - 1) << 11) / (info->d_height - 1); |
636 xscale = ((info->width - 1) << 11) / (info->d_width - 1); | 639 xscale = ((info->width - 1) << 11) / (info->d_width - 1); |
637 VID_WR32 (info->chip.PVIDEO, 0x200, (yscale << 16) | xscale); | 640 VID_WR32 (info->chip.PVIDEO, 0x200, (yscale << 16) | xscale); |
638 | 641 |
639 /* NV_PVIDEO_RED_CSC_OFFSET */ | 642 /* NV_PVIDEO_RED_CSC_OFFSET */ |
640 VID_WR32 (info->chip.PVIDEO, 0x280, 0x69); | 643 VID_WR32 (info->chip.PVIDEO, 0x280, eq.red_off); |
641 /* NV_PVIDEO_GREEN_CSC_OFFSET */ | 644 /* NV_PVIDEO_GREEN_CSC_OFFSET */ |
642 VID_WR32 (info->chip.PVIDEO, 0x284, 0x3e); | 645 VID_WR32 (info->chip.PVIDEO, 0x284, eq.green_off); |
643 /* NV_PVIDEO_BLUE_CSC_OFFSET */ | 646 /* NV_PVIDEO_BLUE_CSC_OFFSET */ |
644 VID_WR32 (info->chip.PVIDEO, 0x288, 0x89); | 647 VID_WR32 (info->chip.PVIDEO, 0x288, eq.blue_off); |
645 /* NV_PVIDEO_CSC_ADJUST */ | 648 /* NV_PVIDEO_CSC_ADJUST */ |
646 VID_WR32 (info->chip.PVIDEO, 0x28C, 0x00000); /* No colour correction! */ | 649 VID_WR32 (info->chip.PVIDEO, 0x28C, 0x00000); /* No colour correction! */ |
647 | 650 |
648 /* NV_PVIDEO_CONTROL_Y (BLUR_ON, LINE_HALF) */ | 651 /* NV_PVIDEO_CONTROL_Y (BLUR_ON, LINE_HALF) */ |
649 VID_WR32 (info->chip.PVIDEO, 0x204, 0x001); | 652 VID_WR32 (info->chip.PVIDEO, 0x204, 0x001); |
765 info->use_colorkey = 0; | 768 info->use_colorkey = 0; |
766 | 769 |
767 eq.lum = 0x00001000; | 770 eq.lum = 0x00001000; |
768 eq.chrom = 0x00001000; | 771 eq.chrom = 0x00001000; |
769 memset(&eq.vals, 0, sizeof(vidix_video_eq_t)); | 772 memset(&eq.vals, 0, sizeof(vidix_video_eq_t)); |
770 eq.vals.cap = VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST | | 773 eq.vals.cap = VEQ_CAP_BRIGHTNESS; |
771 VEQ_CAP_SATURATION | VEQ_CAP_HUE; | 774 if (info->chip.arch > NV_ARCH_04) |
775 eq.vals.cap |= VEQ_CAP_CONTRAST | VEQ_CAP_SATURATION | VEQ_CAP_HUE; | |
776 eq.red_off = 0x69; | |
777 eq.green_off = 0x3e; | |
778 eq.blue_off = 0x89; | |
772 return 0; | 779 return 0; |
773 } | 780 } |
774 | 781 |
775 void vixDestroy(void){ | 782 void vixDestroy(void){ |
776 unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000); | 783 unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000); |
885 } | 892 } |
886 | 893 |
887 int vixPlaybackSetEq(const vidix_video_eq_t *eq_parm) { | 894 int vixPlaybackSetEq(const vidix_video_eq_t *eq_parm) { |
888 double angle; | 895 double angle; |
889 int16_t chrom_cos, chrom_sin; | 896 int16_t chrom_cos, chrom_sin; |
890 vidix_video_eq_t new_eq; | |
891 vixPlaybackGetEq(&new_eq); | |
892 if (eq_parm->cap & VEQ_CAP_BRIGHTNESS) | 897 if (eq_parm->cap & VEQ_CAP_BRIGHTNESS) |
893 new_eq.brightness = eq_parm->brightness; | 898 eq.vals.brightness = eq_parm->brightness; |
894 if (eq_parm->cap & VEQ_CAP_CONTRAST) | 899 if (eq_parm->cap & VEQ_CAP_CONTRAST) |
895 new_eq.contrast = eq_parm->contrast; | 900 eq.vals.contrast = eq_parm->contrast; |
896 if (eq_parm->cap & VEQ_CAP_SATURATION) | 901 if (eq_parm->cap & VEQ_CAP_SATURATION) |
897 new_eq.saturation = eq_parm->saturation; | 902 eq.vals.saturation = eq_parm->saturation; |
898 if (eq_parm->cap & VEQ_CAP_HUE) | 903 if (eq_parm->cap & VEQ_CAP_HUE) |
899 new_eq.hue = eq_parm->hue; | 904 eq.vals.hue = eq_parm->hue; |
900 eq.lum = (((new_eq.brightness * 512 + 500) / 1000) << 16) | | 905 eq.lum = (((eq.vals.brightness * 512 + 500) / 1000) << 16) | |
901 ((((new_eq.contrast + 1000) * 8191 + 1000) / 2000) & 0xffff); | 906 ((((eq.vals.contrast + 1000) * 8191 + 1000) / 2000) & 0xffff); |
902 angle = (double)new_eq.hue / 1000.0 * 3.1415927; | 907 angle = (double)eq.vals.hue / 1000.0 * 3.1415927; |
903 chrom_cos = ((new_eq.saturation + 1000) * 8191 * cos(angle) + 1000) / 2000; | 908 chrom_cos = ((eq.vals.saturation + 1000) * 8191 * cos(angle) + 1000) / 2000; |
904 chrom_sin = ((new_eq.saturation + 1000) * 8191 * sin(angle) + 1000) / 2000; | 909 chrom_sin = ((eq.vals.saturation + 1000) * 8191 * sin(angle) + 1000) / 2000; |
905 eq.chrom = chrom_sin << 16 | chrom_cos; | 910 eq.chrom = chrom_sin << 16 | chrom_cos; |
911 eq.red_off = 0x69 - eq.vals.brightness * 62 / 1000; | |
912 eq.green_off = 0x3e + eq.vals.brightness * 62 / 1000; | |
913 eq.blue_off = 0x89 - eq.vals.brightness * 62 / 1000; | |
906 return 0; | 914 return 0; |
907 } | 915 } |
908 | 916 |
909 int vixPlaybackGetEq(vidix_video_eq_t *eq_parm) { | 917 int vixPlaybackGetEq(vidix_video_eq_t *eq_parm) { |
910 memcpy(eq_parm, &eq.vals, sizeof(vidix_video_eq_t)); | 918 memcpy(eq_parm, &eq.vals, sizeof(vidix_video_eq_t)); |