History

part 2/2 of fixing Altivec-accelerated H264 luma inloop filter

In h264_deblock_q1, the result of the deblock needs to be kept to be used in future deblocks, so return this value now. Also change the sign of tc0 vector: It is really a signed value, so treat it as such until after the >=0 check; then, at that point, after being masked, it can be treated as unsigned. Patch by Graham Booker % gbooker A tamu P edu% Originally committed as revision 9349 to svn://svn.ffmpeg.org/ffmpeg/trunk

Graham Booker committed 19 years ago

Commit 22fa38f1 parent 963eca21 file · +15 −9Browse files

Showing the changes to libavcodec/ppc (1 of 1 file). Show all

Unified · Split

libavcodec/ppc/h264_altivec.c+15−9
@@ -740,8 +740,8 @@ static inline vector unsigned char h264_deblock_mask ( register vector unsigned · 739 unmodified lines
740 return mask;740 return mask;
741}741}
742 742
743// out: p1 = clip((p2 + ((p0 + q0 + 1) >> 1)) >> 1, p1-tc0, p1+tc0)743// out: newp1 = clip((p2 + ((p0 + q0 + 1) >> 1)) >> 1, p1-tc0, p1+tc0)
744static inline void h264_deblock_q1(register vector unsigned char p0,744static inline vector unsigned char h264_deblock_q1(register vector unsigned char p0,
745 register vector unsigned char p1,745 register vector unsigned char p1,
746 register vector unsigned char p2,746 register vector unsigned char p2,
747 register vector unsigned char q0,747 register vector unsigned char q0,
@@ -753,6 +753,7 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 5 unmodified lines
753 register vector unsigned char ones;753 register vector unsigned char ones;
754 register vector unsigned char max;754 register vector unsigned char max;
755 register vector unsigned char min;755 register vector unsigned char min;
756 register vector unsigned char newp1;
756 757
757 temp = vec_xor(average, p2);758 temp = vec_xor(average, p2);
758 average = vec_avg(average, p2); /*avg(p2, avg(p0, q0)) */759 average = vec_avg(average, p2); /*avg(p2, avg(p0, q0)) */
@@ -761,8 +762,9 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 2 unmodified lines
761 uncliped = vec_subs(average, temp); /*(p2+((p0+q0+1)>>1))>>1 */762 uncliped = vec_subs(average, temp); /*(p2+((p0+q0+1)>>1))>>1 */
762 max = vec_adds(p1, tc0);763 max = vec_adds(p1, tc0);
763 min = vec_subs(p1, tc0);764 min = vec_subs(p1, tc0);
764 p1 = vec_max(min, uncliped);765 newp1 = vec_max(min, uncliped);
765 p1 = vec_min(max, p1);766 newp1 = vec_min(max, newp1);
767 return newp1;
766}768}
767 769
768#define h264_deblock_p0_q0(p0, p1, q0, q1, tc0masked) { \770#define h264_deblock_p0_q0(p0, p1, q0, q1, tc0masked) { \
@@ -804,9 +806,11 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 35 unmodified lines
804 register vector unsigned char mask; \806 register vector unsigned char mask; \
805 register vector unsigned char p1mask; \807 register vector unsigned char p1mask; \
806 register vector unsigned char q1mask; \808 register vector unsigned char q1mask; \
807 register vector unsigned char tc0vec; \809 register vector char tc0vec; \
808 register vector unsigned char finaltc0; \810 register vector unsigned char finaltc0; \
809 register vector unsigned char tc0masked; \811 register vector unsigned char tc0masked; \
812 register vector unsigned char newp1; \
813 register vector unsigned char newq1; \
810 \814 \
811 temp[0] = alpha; \815 temp[0] = alpha; \
812 temp[1] = beta; \816 temp[1] = beta; \
@@ -819,24 +823,26 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 6 unmodified lines
819 tc0vec = vec_ld(0, temp); \823 tc0vec = vec_ld(0, temp); \
820 tc0vec = vec_mergeh(tc0vec, tc0vec); \824 tc0vec = vec_mergeh(tc0vec, tc0vec); \
821 tc0vec = vec_mergeh(tc0vec, tc0vec); \825 tc0vec = vec_mergeh(tc0vec, tc0vec); \
822 mask = vec_and(mask, vec_cmpgt(tc0vec, vec_splat_u8(-1))); /* if tc0[i] >= 0 */ \826 mask = vec_and(mask, vec_cmpgt(tc0vec, vec_splat_s8(-1))); /* if tc0[i] >= 0 */ \
823 finaltc0 = vec_and(tc0vec, mask); /*tc = tc0[i]*/ \827 finaltc0 = vec_and((vector unsigned char)tc0vec, mask); /* tc = tc0 */ \
824 \828 \
825 p1mask = diff_lt_altivec(p2, p0, betavec); \829 p1mask = diff_lt_altivec(p2, p0, betavec); \
826 p1mask = vec_and(p1mask, mask); /* if( |p2 - p0| < beta) */ \830 p1mask = vec_and(p1mask, mask); /* if( |p2 - p0| < beta) */ \
827 tc0masked = vec_and(p1mask, tc0vec); \831 tc0masked = vec_and(p1mask, tc0vec); \
828 finaltc0 = vec_sub(finaltc0, p1mask); /* tc++ */ \832 finaltc0 = vec_sub(finaltc0, p1mask); /* tc++ */ \
829 h264_deblock_q1(p0, p1, p2, q0, tc0masked); \833 newp1 = h264_deblock_q1(p0, p1, p2, q0, tc0masked); \
830 /*end if*/ \834 /*end if*/ \
831 \835 \
832 q1mask = diff_lt_altivec(q2, q0, betavec); \836 q1mask = diff_lt_altivec(q2, q0, betavec); \
833 q1mask = vec_and(q1mask, mask); /* if ( |q2 - q0| < beta ) */\837 q1mask = vec_and(q1mask, mask); /* if ( |q2 - q0| < beta ) */\
834 tc0masked = vec_and(q1mask, tc0vec); \838 tc0masked = vec_and(q1mask, tc0vec); \
835 finaltc0 = vec_sub(finaltc0, q1mask); /* tc++ */ \839 finaltc0 = vec_sub(finaltc0, q1mask); /* tc++ */ \
836 h264_deblock_q1(p0, q1, q2, q0, tc0masked); \840 newq1 = h264_deblock_q1(p0, q1, q2, q0, tc0masked); \
837 /*end if*/ \841 /*end if*/ \
838 \842 \
839 h264_deblock_p0_q0(p0, p1, q0, q1, finaltc0); \843 h264_deblock_p0_q0(p0, p1, q0, q1, finaltc0); \
844 p1 = newp1; \
845 q1 = newq1; \
840}846}
841 847
842static void h264_v_loop_filter_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {848static void h264_v_loop_filter_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t