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

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
740740 return mask;
741741 }
742742
743−// out: p1 = clip((p2 + ((p0 + q0 + 1) >> 1)) >> 1, p1-tc0, p1+tc0)
744−static inline void h264_deblock_q1(register vector unsigned char p0,
743+// out: newp1 = clip((p2 + ((p0 + q0 + 1) >> 1)) >> 1, p1-tc0, p1+tc0)
744+static inline vector unsigned char h264_deblock_q1(register vector unsigned char p0,
745745 register vector unsigned char p1,
746746 register vector unsigned char p2,
747747 register vector unsigned char q0,
@@ -753,6 +753,7 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 5 unmodified lines
753753 register vector unsigned char ones;
754754 register vector unsigned char max;
755755 register vector unsigned char min;
756+ register vector unsigned char newp1;
756757
757758 temp = vec_xor(average, p2);
758759 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
761762 uncliped = vec_subs(average, temp); /*(p2+((p0+q0+1)>>1))>>1 */
762763 max = vec_adds(p1, tc0);
763764 min = vec_subs(p1, tc0);
764− p1 = vec_max(min, uncliped);
765− p1 = vec_min(max, p1);
765+ newp1 = vec_max(min, uncliped);
766+ newp1 = vec_min(max, newp1);
767+ return newp1;
766768 }
767769
768770 #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
804806 register vector unsigned char mask; \
805807 register vector unsigned char p1mask; \
806808 register vector unsigned char q1mask; \
807− register vector unsigned char tc0vec; \
809+ register vector char tc0vec; \
808810 register vector unsigned char finaltc0; \
809811 register vector unsigned char tc0masked; \
812+ register vector unsigned char newp1; \
813+ register vector unsigned char newq1; \
810814 \
811815 temp[0] = alpha; \
812816 temp[1] = beta; \
@@ -819,24 +823,26 @@ static inline void h264_deblock_q1(register vector unsigned char p0, · 6 unmodified lines
819823 tc0vec = vec_ld(0, temp); \
820824 tc0vec = vec_mergeh(tc0vec, tc0vec); \
821825 tc0vec = vec_mergeh(tc0vec, tc0vec); \
822− mask = vec_and(mask, vec_cmpgt(tc0vec, vec_splat_u8(-1))); /* if tc0[i] >= 0 */ \
823− finaltc0 = vec_and(tc0vec, mask); /*tc = tc0[i]*/ \
826+ mask = vec_and(mask, vec_cmpgt(tc0vec, vec_splat_s8(-1))); /* if tc0[i] >= 0 */ \
827+ finaltc0 = vec_and((vector unsigned char)tc0vec, mask); /* tc = tc0 */ \
824828 \
825829 p1mask = diff_lt_altivec(p2, p0, betavec); \
826830 p1mask = vec_and(p1mask, mask); /* if( |p2 - p0| < beta) */ \
827831 tc0masked = vec_and(p1mask, tc0vec); \
828832 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); \
830834 /*end if*/ \
831835 \
832836 q1mask = diff_lt_altivec(q2, q0, betavec); \
833837 q1mask = vec_and(q1mask, mask); /* if ( |q2 - q0| < beta ) */\
834838 tc0masked = vec_and(q1mask, tc0vec); \
835839 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); \
837841 /*end if*/ \
838842 \
839843 h264_deblock_p0_q0(p0, p1, q0, q1, finaltc0); \
844+ p1 = newp1; \
845+ q1 = newq1; \
840846 }
841847
842848 static 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