OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 | 11 |
12 /**************************************************************************** | 12 /**************************************************************************** |
13 * | 13 * |
14 * Module Title : scale.c | 14 * Module Title : scale.c |
15 * | 15 * |
16 * Description : Image scaling functions. | 16 * Description : Image scaling functions. |
17 * | 17 * |
18 ***************************************************************************/ | 18 ***************************************************************************/ |
19 | 19 |
20 /**************************************************************************** | 20 /**************************************************************************** |
21 * Header Files | 21 * Header Files |
22 ****************************************************************************/ | 22 ****************************************************************************/ |
23 #include "./vpx_rtcd.h" | 23 #include "./vpx_scale_rtcd.h" |
24 #include "vpx_mem/vpx_mem.h" | 24 #include "vpx_mem/vpx_mem.h" |
25 #include "vpx_scale/yv12config.h" | 25 #include "vpx_scale/yv12config.h" |
26 #include "vpx_scale/scale_mode.h" | |
27 | 26 |
28 typedef struct { | 27 typedef struct { |
29 int expanded_frame_width; | 28 int expanded_frame_width; |
30 int expanded_frame_height; | 29 int expanded_frame_height; |
31 | 30 |
32 int HScale; | 31 int HScale; |
33 int HRatio; | 32 int HRatio; |
34 int VScale; | 33 int VScale; |
35 int VRatio; | 34 int VRatio; |
36 | 35 |
37 YV12_BUFFER_CONFIG *src_yuv_config; | 36 YV12_BUFFER_CONFIG *src_yuv_config; |
38 YV12_BUFFER_CONFIG *dst_yuv_config; | 37 YV12_BUFFER_CONFIG *dst_yuv_config; |
39 | 38 |
40 } SCALE_VARS; | 39 } SCALE_VARS; |
41 | 40 |
42 /**************************************************************************** | 41 /**************************************************************************** |
43 * | 42 * |
44 * ROUTINE : horizontal_line_copy | |
45 * | |
46 * INPUTS : None | |
47 * | |
48 * | |
49 * OUTPUTS : None. | |
50 * | |
51 * RETURNS : None | |
52 * | |
53 * FUNCTION : 1 to 1 scaling up for a horizontal line of pixles | |
54 * | |
55 * SPECIAL NOTES : None. | |
56 * | |
57 * ERRORS : None. | |
58 * | |
59 ****************************************************************************/ | |
60 static | |
61 void horizontal_line_copy( | |
62 const unsigned char *source, | |
63 unsigned int source_width, | |
64 unsigned char *dest, | |
65 unsigned int dest_width | |
66 ) { | |
67 (void) dest_width; | |
68 | |
69 duck_memcpy(dest, source, source_width); | |
70 } | |
71 /**************************************************************************** | |
72 * | |
73 * ROUTINE : null_scale | |
74 * | |
75 * INPUTS : None | |
76 * | |
77 * | |
78 * OUTPUTS : None. | |
79 * | |
80 * RETURNS : None | |
81 * | |
82 * FUNCTION : 1 to 1 scaling up for a vertical band | |
83 * | |
84 * SPECIAL NOTES : None. | |
85 * | |
86 * ERRORS : None. | |
87 * | |
88 ****************************************************************************/ | |
89 static | |
90 void null_scale( | |
91 unsigned char *dest, | |
92 unsigned int dest_pitch, | |
93 unsigned int dest_width | |
94 ) { | |
95 (void) dest; | |
96 (void) dest_pitch; | |
97 (void) dest_width; | |
98 | |
99 return; | |
100 } | |
101 | |
102 /**************************************************************************** | |
103 * | |
104 * ROUTINE : scale1d_2t1_i | 43 * ROUTINE : scale1d_2t1_i |
105 * | 44 * |
106 * INPUTS : const unsigned char *source : Pointer to data to be scaled. | 45 * INPUTS : const unsigned char *source : Pointer to data to be scaled. |
107 * int source_step : Number of pixels to step on i
n source. | 46 * int source_step : Number of pixels to step on i
n source. |
108 * unsigned int source_scale : Scale for source (UNUSED). | 47 * unsigned int source_scale : Scale for source (UNUSED). |
109 * unsigned int source_length : Length of source (UNUSED). | 48 * unsigned int source_length : Length of source (UNUSED). |
110 * unsigned char *dest : Pointer to output data array. | 49 * unsigned char *dest : Pointer to output data array. |
111 * int dest_step : Number of pixels to step on i
n destination. | 50 * int dest_step : Number of pixels to step on i
n destination. |
112 * unsigned int dest_scale : Scale for destination (UNUSED
). | 51 * unsigned int dest_scale : Scale for destination (UNUSED
). |
113 * unsigned int dest_length : Length of destination. | 52 * unsigned int dest_length : Length of destination. |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced); | 521 temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced); |
583 | 522 |
584 if (dw / 2 < (int)dst->uv_width) | 523 if (dw / 2 < (int)dst->uv_width) |
585 for (i = 0; i < dst->uv_height; i++) | 524 for (i = 0; i < dst->uv_height; i++) |
586 duck_memset(dst->v_buffer + i * dst->uv_stride + dw / 2 - 1, dst->v_buffer
[i * dst->uv_stride + dw / 2 - 2], dst->uv_width - dw / 2 + 1); | 525 duck_memset(dst->v_buffer + i * dst->uv_stride + dw / 2 - 1, dst->v_buffer
[i * dst->uv_stride + dw / 2 - 2], dst->uv_width - dw / 2 + 1); |
587 | 526 |
588 if (dh / 2 < (int) dst->uv_height) | 527 if (dh / 2 < (int) dst->uv_height) |
589 for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++) | 528 for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++) |
590 duck_memcpy(dst->v_buffer + i * dst->uv_stride, dst->v_buffer + (dh / 2 -
2)*dst->uv_stride, dst->uv_width); | 529 duck_memcpy(dst->v_buffer + i * dst->uv_stride, dst->v_buffer + (dh / 2 -
2)*dst->uv_stride, dst->uv_width); |
591 } | 530 } |
592 /**************************************************************************** | |
593 * | |
594 * ROUTINE : any_ratio_2d_scale | |
595 * | |
596 * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instance
(NOT USED). | |
597 * const unsigned char *source : Pointer to source image. | |
598 * unsigned int source_pitch : Stride of source image. | |
599 * unsigned int source_width : Width of source image. | |
600 * unsigned int source_height : Height of source image (NOT U
SED). | |
601 * unsigned char *dest : Pointer to destination image. | |
602 * unsigned int dest_pitch : Stride of destination image. | |
603 * unsigned int dest_width : Width of destination image. | |
604 * unsigned int dest_height : Height of destination image. | |
605 * | |
606 * OUTPUTS : None. | |
607 * | |
608 * RETURNS : int: 1 if image scaled, 0 if image could not be scaled. | |
609 * | |
610 * FUNCTION : Scale the image with changing apect ratio. | |
611 * | |
612 * SPECIAL NOTES : This scaling is a bi-linear scaling. Need to re-work the | |
613 * whole function for new scaling algorithm. | |
614 * | |
615 ****************************************************************************/ | |
616 static | |
617 int any_ratio_2d_scale | |
618 ( | |
619 SCALE_VARS *si, | |
620 const unsigned char *source, | |
621 int source_pitch, | |
622 unsigned int source_width, | |
623 unsigned int source_height, | |
624 unsigned char *dest, | |
625 unsigned int dest_pitch, | |
626 unsigned int dest_width, | |
627 unsigned int dest_height | |
628 ) { | |
629 unsigned int i, k; | |
630 unsigned int src_band_height = 0; | |
631 unsigned int dest_band_height = 0; | |
632 | |
633 /* suggested scale factors */ | |
634 int hs = si->HScale; | |
635 int hr = si->HRatio; | |
636 int vs = si->VScale; | |
637 int vr = si->VRatio; | |
638 | |
639 /* assume the ratios are scalable instead of should be centered */ | |
640 int ratio_scalable = 1; | |
641 | |
642 const unsigned char *source_base = ((source_pitch >= 0) ? source : (source + (
(source_height - 1) * source_pitch))); | |
643 const unsigned char *line_src; | |
644 | |
645 void (*horiz_line_scale)(const unsigned char *, unsigned int, unsigned char *,
unsigned int) = NULL; | |
646 void (*vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NULL; | |
647 void (*last_vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NU
LL; | |
648 | |
649 (void) si; | |
650 | |
651 /* find out the ratio for each direction */ | |
652 switch (hr * 30 / hs) { | |
653 case 24: | |
654 /* 4-5 Scale in Width direction */ | |
655 horiz_line_scale = vp8_horizontal_line_4_5_scale; | |
656 break; | |
657 case 22: | |
658 /* 3-4 Scale in Width direction */ | |
659 horiz_line_scale = vp8_horizontal_line_3_4_scale; | |
660 break; | |
661 | |
662 case 20: | |
663 /* 4-5 Scale in Width direction */ | |
664 horiz_line_scale = vp8_horizontal_line_2_3_scale; | |
665 break; | |
666 case 18: | |
667 /* 3-5 Scale in Width direction */ | |
668 horiz_line_scale = vp8_horizontal_line_3_5_scale; | |
669 break; | |
670 case 15: | |
671 /* 1-2 Scale in Width direction */ | |
672 horiz_line_scale = vp8_horizontal_line_1_2_scale; | |
673 break; | |
674 case 30: | |
675 /* no scale in Width direction */ | |
676 horiz_line_scale = horizontal_line_copy; | |
677 break; | |
678 default: | |
679 /* The ratio is not acceptable now */ | |
680 /* throw("The ratio is not acceptable for now!"); */ | |
681 ratio_scalable = 0; | |
682 break; | |
683 } | |
684 | |
685 switch (vr * 30 / vs) { | |
686 case 24: | |
687 /* 4-5 Scale in vertical direction */ | |
688 vert_band_scale = vp8_vertical_band_4_5_scale; | |
689 last_vert_band_scale = vp8_last_vertical_band_4_5_scale; | |
690 src_band_height = 4; | |
691 dest_band_height = 5; | |
692 break; | |
693 case 22: | |
694 /* 3-4 Scale in vertical direction */ | |
695 vert_band_scale = vp8_vertical_band_3_4_scale; | |
696 last_vert_band_scale = vp8_last_vertical_band_3_4_scale; | |
697 src_band_height = 3; | |
698 dest_band_height = 4; | |
699 break; | |
700 case 20: | |
701 /* 2-3 Scale in vertical direction */ | |
702 vert_band_scale = vp8_vertical_band_2_3_scale; | |
703 last_vert_band_scale = vp8_last_vertical_band_2_3_scale; | |
704 src_band_height = 2; | |
705 dest_band_height = 3; | |
706 break; | |
707 case 18: | |
708 /* 3-5 Scale in vertical direction */ | |
709 vert_band_scale = vp8_vertical_band_3_5_scale; | |
710 last_vert_band_scale = vp8_last_vertical_band_3_5_scale; | |
711 src_band_height = 3; | |
712 dest_band_height = 5; | |
713 break; | |
714 case 15: | |
715 /* 1-2 Scale in vertical direction */ | |
716 vert_band_scale = vp8_vertical_band_1_2_scale; | |
717 last_vert_band_scale = vp8_last_vertical_band_1_2_scale; | |
718 src_band_height = 1; | |
719 dest_band_height = 2; | |
720 break; | |
721 case 30: | |
722 /* no scale in Width direction */ | |
723 vert_band_scale = null_scale; | |
724 last_vert_band_scale = null_scale; | |
725 src_band_height = 4; | |
726 dest_band_height = 4; | |
727 break; | |
728 default: | |
729 /* The ratio is not acceptable now */ | |
730 /* throw("The ratio is not acceptable for now!"); */ | |
731 ratio_scalable = 0; | |
732 break; | |
733 } | |
734 | |
735 if (ratio_scalable == 0) | |
736 return ratio_scalable; | |
737 | |
738 horiz_line_scale(source, source_width, dest, dest_width); | |
739 | |
740 /* except last band */ | |
741 for (k = 0; k < (dest_height + dest_band_height - 1) / dest_band_height - 1; k
++) { | |
742 /* scale one band horizontally */ | |
743 for (i = 1; i < src_band_height; i++) { | |
744 /* Trap case where we could read off the base of the source buffer */ | |
745 line_src = source + i * source_pitch; | |
746 | |
747 if (line_src < source_base) | |
748 line_src = source_base; | |
749 | |
750 horiz_line_scale(line_src, source_width, | |
751 dest + i * dest_pitch, dest_width); | |
752 } | |
753 | |
754 /* first line of next band */ | |
755 /* Trap case where we could read off the base of the source buffer */ | |
756 line_src = source + src_band_height * source_pitch; | |
757 | |
758 if (line_src < source_base) | |
759 line_src = source_base; | |
760 | |
761 horiz_line_scale(line_src, source_width, | |
762 dest + dest_band_height * dest_pitch, | |
763 dest_width); | |
764 | |
765 /* Vertical scaling is in place */ | |
766 vert_band_scale(dest, dest_pitch, dest_width); | |
767 | |
768 /* Next band... */ | |
769 source += src_band_height * source_pitch; | |
770 dest += dest_band_height * dest_pitch; | |
771 } | |
772 | |
773 /* scale one band horizontally */ | |
774 for (i = 1; i < src_band_height; i++) { | |
775 /* Trap case where we could read off the base of the source buffer */ | |
776 line_src = source + i * source_pitch; | |
777 | |
778 if (line_src < source_base) | |
779 line_src = source_base; | |
780 | |
781 horiz_line_scale(line_src, source_width, | |
782 dest + i * dest_pitch, | |
783 dest_width); | |
784 } | |
785 | |
786 /* Vertical scaling is in place */ | |
787 last_vert_band_scale(dest, dest_pitch, dest_width); | |
788 | |
789 return ratio_scalable; | |
790 } | |
791 | |
792 /**************************************************************************** | |
793 * | |
794 * ROUTINE : any_ratio_frame_scale | |
795 * | |
796 * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instanc
e (NOT USED). | |
797 * unsigned char *frame_buffer : Pointer to source im
age. | |
798 * int YOffset : Offset from start of buffer to
Y samples. | |
799 * int UVOffset : Offset from start of buffer to
UV samples. | |
800 * | |
801 * OUTPUTS : None. | |
802 * | |
803 * RETURNS : int: 1 if image scaled, 0 if image could not be scaled. | |
804 * | |
805 * FUNCTION : Scale the image with changing apect ratio. | |
806 * | |
807 * SPECIAL NOTES : None. | |
808 * | |
809 ****************************************************************************/ | |
810 static | |
811 int any_ratio_frame_scale(SCALE_VARS *scale_vars, int YOffset, int UVOffset) { | |
812 int i; | |
813 int ew; | |
814 int eh; | |
815 | |
816 /* suggested scale factors */ | |
817 int hs = scale_vars->HScale; | |
818 int hr = scale_vars->HRatio; | |
819 int vs = scale_vars->VScale; | |
820 int vr = scale_vars->VRatio; | |
821 | |
822 int ratio_scalable = 1; | |
823 | |
824 int sw = (scale_vars->expanded_frame_width * hr + hs - 1) / hs; | |
825 int sh = (scale_vars->expanded_frame_height * vr + vs - 1) / vs; | |
826 int dw = scale_vars->expanded_frame_width; | |
827 int dh = scale_vars->expanded_frame_height; | |
828 YV12_BUFFER_CONFIG *src_yuv_config = scale_vars->src_yuv_config; | |
829 YV12_BUFFER_CONFIG *dst_yuv_config = scale_vars->dst_yuv_config; | |
830 | |
831 if (hr == 3) | |
832 ew = (sw + 2) / 3 * 3 * hs / hr; | |
833 else | |
834 ew = (sw + 7) / 8 * 8 * hs / hr; | |
835 | |
836 if (vr == 3) | |
837 eh = (sh + 2) / 3 * 3 * vs / vr; | |
838 else | |
839 eh = (sh + 7) / 8 * 8 * vs / vr; | |
840 | |
841 ratio_scalable = any_ratio_2d_scale(scale_vars, | |
842 (const unsigned char *)src_yuv_config->y_b
uffer, | |
843 src_yuv_config->y_stride, sw, sh, | |
844 (unsigned char *) dst_yuv_config->y_buffer
+ YOffset, | |
845 dst_yuv_config->y_stride, dw, dh); | |
846 | |
847 for (i = 0; i < eh; i++) | |
848 duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_strid
e + dw, 0, ew - dw); | |
849 | |
850 for (i = dh; i < eh; i++) | |
851 duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_strid
e, 0, ew); | |
852 | |
853 if (ratio_scalable == 0) | |
854 return ratio_scalable; | |
855 | |
856 sw = (sw + 1) >> 1; | |
857 sh = (sh + 1) >> 1; | |
858 dw = (dw + 1) >> 1; | |
859 dh = (dh + 1) >> 1; | |
860 | |
861 any_ratio_2d_scale(scale_vars, | |
862 (const unsigned char *)src_yuv_config->u_buffer, | |
863 src_yuv_config->y_stride / 2, sw, sh, | |
864 (unsigned char *)dst_yuv_config->u_buffer + UVOffset, | |
865 dst_yuv_config->uv_stride, dw, dh); | |
866 | |
867 any_ratio_2d_scale(scale_vars, | |
868 (const unsigned char *)src_yuv_config->v_buffer, | |
869 src_yuv_config->y_stride / 2, sw, sh, | |
870 (unsigned char *)dst_yuv_config->v_buffer + UVOffset, | |
871 dst_yuv_config->uv_stride, dw, dh); | |
872 | |
873 return ratio_scalable; | |
874 } | |
875 | |
876 /**************************************************************************** | |
877 * | |
878 * ROUTINE : center_image | |
879 * | |
880 * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instanc
e. | |
881 * | |
882 * OUTPUTS : None. | |
883 * | |
884 * RETURNS : void | |
885 * | |
886 * FUNCTION : Centers the image without scaling in the output buffer. | |
887 * | |
888 * SPECIAL NOTES : None. | |
889 * | |
890 ****************************************************************************/ | |
891 static void | |
892 center_image(YV12_BUFFER_CONFIG *src_yuv_config, YV12_BUFFER_CONFIG *dst_yuv_con
fig) { | |
893 int i; | |
894 int row_offset, col_offset; | |
895 unsigned char *src_data_pointer; | |
896 unsigned char *dst_data_pointer; | |
897 | |
898 /* center values */ | |
899 row_offset = (dst_yuv_config->y_height - src_yuv_config->y_height) / 2; | |
900 col_offset = (dst_yuv_config->y_width - src_yuv_config->y_width) / 2; | |
901 | |
902 /* Y's */ | |
903 src_data_pointer = src_yuv_config->y_buffer; | |
904 dst_data_pointer = (unsigned char *)dst_yuv_config->y_buffer + (row_offset * d
st_yuv_config->y_stride) + col_offset; | |
905 | |
906 for (i = 0; i < src_yuv_config->y_height; i++) { | |
907 duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->y_width); | |
908 dst_data_pointer += dst_yuv_config->y_stride; | |
909 src_data_pointer += src_yuv_config->y_stride; | |
910 } | |
911 | |
912 row_offset /= 2; | |
913 col_offset /= 2; | |
914 | |
915 /* U's */ | |
916 src_data_pointer = src_yuv_config->u_buffer; | |
917 dst_data_pointer = (unsigned char *)dst_yuv_config->u_buffer + (row_offset * d
st_yuv_config->uv_stride) + col_offset; | |
918 | |
919 for (i = 0; i < src_yuv_config->uv_height; i++) { | |
920 duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width); | |
921 dst_data_pointer += dst_yuv_config->uv_stride; | |
922 src_data_pointer += src_yuv_config->uv_stride; | |
923 } | |
924 | |
925 /* V's */ | |
926 src_data_pointer = src_yuv_config->v_buffer; | |
927 dst_data_pointer = (unsigned char *)dst_yuv_config->v_buffer + (row_offset * d
st_yuv_config->uv_stride) + col_offset; | |
928 | |
929 for (i = 0; i < src_yuv_config->uv_height; i++) { | |
930 duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width); | |
931 dst_data_pointer += dst_yuv_config->uv_stride; | |
932 src_data_pointer += src_yuv_config->uv_stride; | |
933 } | |
934 } | |
935 | |
936 /**************************************************************************** | |
937 * | |
938 * ROUTINE : scale_or_center | |
939 * | |
940 * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instanc
e. | |
941 * | |
942 * | |
943 * | |
944 * OUTPUTS : None. | |
945 * | |
946 * RETURNS : void | |
947 * | |
948 * FUNCTION : Decides to scale or center image in scale buffer for blit | |
949 * | |
950 * SPECIAL NOTES : None. | |
951 * | |
952 ****************************************************************************/ | |
953 void | |
954 vp8_yv12_scale_or_center | |
955 ( | |
956 YV12_BUFFER_CONFIG *src_yuv_config, | |
957 YV12_BUFFER_CONFIG *dst_yuv_config, | |
958 int expanded_frame_width, | |
959 int expanded_frame_height, | |
960 int scaling_mode, | |
961 int HScale, | |
962 int HRatio, | |
963 int VScale, | |
964 int VRatio | |
965 ) { | |
966 /*if ( ppi->post_processing_level ) | |
967 update_umvborder ( ppi, frame_buffer );*/ | |
968 | |
969 | |
970 switch (scaling_mode) { | |
971 case SCALE_TO_FIT: | |
972 case MAINTAIN_ASPECT_RATIO: { | |
973 SCALE_VARS scale_vars; | |
974 /* center values */ | |
975 #if 1 | |
976 int row = (dst_yuv_config->y_height - expanded_frame_height) / 2; | |
977 int col = (dst_yuv_config->y_width - expanded_frame_width) / 2; | |
978 /*int YOffset = row * dst_yuv_config->y_width + col; | |
979 int UVOffset = (row>>1) * dst_yuv_config->uv_width + (col>>1);*/ | |
980 int YOffset = row * dst_yuv_config->y_stride + col; | |
981 int UVOffset = (row >> 1) * dst_yuv_config->uv_stride + (col >> 1); | |
982 #else | |
983 int row = (src_yuv_config->y_height - expanded_frame_height) / 2; | |
984 int col = (src_yuv_config->y_width - expanded_frame_width) / 2; | |
985 int YOffset = row * src_yuv_config->y_width + col; | |
986 int UVOffset = (row >> 1) * src_yuv_config->uv_width + (col >> 1); | |
987 #endif | |
988 | |
989 scale_vars.dst_yuv_config = dst_yuv_config; | |
990 scale_vars.src_yuv_config = src_yuv_config; | |
991 scale_vars.HScale = HScale; | |
992 scale_vars.HRatio = HRatio; | |
993 scale_vars.VScale = VScale; | |
994 scale_vars.VRatio = VRatio; | |
995 scale_vars.expanded_frame_width = expanded_frame_width; | |
996 scale_vars.expanded_frame_height = expanded_frame_height; | |
997 | |
998 /* perform center and scale */ | |
999 any_ratio_frame_scale(&scale_vars, YOffset, UVOffset); | |
1000 | |
1001 break; | |
1002 } | |
1003 case CENTER: | |
1004 center_image(src_yuv_config, dst_yuv_config); | |
1005 break; | |
1006 | |
1007 default: | |
1008 break; | |
1009 } | |
1010 } | |
OLD | NEW |