History

VC1: merge idct8x8, coeff adjustments and put_pixels.

Merging these functions allows merging some loops, which makes the results (particularly after SIMD optimizations) much faster. (cherry picked from commit f8bed30d8b176fa030f6737765338bb4a2bcabc9)

Ronald S. Bultje committed 15 years ago

Commit 6a786b11 parent 90ed2775 files · +170 −40Browse files

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

Unified · Split

libavcodec/ppc/vc1dsp_altivec.c+61−3
@@ -130,7 +130,8 @@ do { \ · 129 unmodified lines
130130
131131 /** Do inverse transform on 8x8 block
132132 */
133−static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])
133+static void vc1_inv_trans_8x8_altivec(DCTELEM block[64],
134+ int sign, int rangered)
134135 {
135136 vector signed short src0, src1, src2, src3, src4, src5, src6, src7;
136137 vector signed int s0, s1, s2, s3, s4, s5, s6, s7;
@@ -144,7 +145,9 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64]) · 7 unmodified lines
144145 const vector unsigned int vec_2 = vec_splat_u32(2);
145146 const vector signed int vec_1s = vec_splat_s32(1);
146147 const vector unsigned int vec_1 = vec_splat_u32(1);
147−
148+ const vector unsigned short rangered_shift = vec_splat_u16(1);
149+ const vector signed short signed_bias = vec_sl(vec_splat_u16(4),
150+ vec_splat_u16(4));
148151
149152 src0 = vec_ld( 0, block);
150153 src1 = vec_ld( 16, block);
@@ -214,6 +217,27 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64]) · 63 unmodified lines
214217 src6 = vec_pack(sE, s6);
215218 src7 = vec_pack(sF, s7);
216219
220+ if (rangered) {
221+ if (!sign) {
222+ vec_sub(src0, signed_bias);
223+ vec_sub(src1, signed_bias);
224+ vec_sub(src2, signed_bias);
225+ vec_sub(src3, signed_bias);
226+ vec_sub(src4, signed_bias);
227+ vec_sub(src5, signed_bias);
228+ vec_sub(src6, signed_bias);
229+ vec_sub(src7, signed_bias);
230+ }
231+ vec_sl(src0, rangered_shift);
232+ vec_sl(src1, rangered_shift);
233+ vec_sl(src2, rangered_shift);
234+ vec_sl(src3, rangered_shift);
235+ vec_sl(src4, rangered_shift);
236+ vec_sl(src5, rangered_shift);
237+ vec_sl(src6, rangered_shift);
238+ vec_sl(src7, rangered_shift);
239+ }
240+
217241 vec_st(src0, 0, block);
218242 vec_st(src1, 16, block);
219243 vec_st(src2, 32, block);
@@ -224,6 +248,36 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64]) · 4 unmodified lines
224248 vec_st(src7,112, block);
225249 }
226250
251+static void vc1_inv_trans_8x8_add_altivec(uint8_t *dest, int stride, DCTELEM *b)
252+{
253+ vc1_inv_trans_8x8_altivec(b, 0, 0);
254+ ff_add_pixels_clamped_c(b, dest, stride);
255+}
256+
257+static void vc1_inv_trans_8x8_put_signed_altivec(uint8_t *dest, int stride, DCTELEM *b)
258+{
259+ vc1_inv_trans_8x8_altivec(b, 1, 0);
260+ ff_put_signed_pixels_clamped_c(b, dest, stride);
261+}
262+
263+static void vc1_inv_trans_8x8_put_signed_rangered_altivec(uint8_t *dest, int stride, DCTELEM *b)
264+{
265+ vc1_inv_trans_8x8_altivec(b, 1, 1);
266+ ff_put_signed_pixels_clamped_c(b, dest, stride);
267+}
268+
269+static void vc1_inv_trans_8x8_put_altivec(uint8_t *dest, int stride, DCTELEM *b)
270+{
271+ vc1_inv_trans_8x8_altivec(b, 0, 0);
272+ ff_put_pixels_clamped_c(b, dest, stride);
273+}
274+
275+static void vc1_inv_trans_8x8_put_rangered_altivec(uint8_t *dest, int stride, DCTELEM *b)
276+{
277+ vc1_inv_trans_8x8_altivec(b, 0, 1);
278+ ff_put_pixels_clamped_c(b, dest, stride);
279+}
280+
227281 /** Do inverse transform on 8x4 part of block
228282 */
229283 static void vc1_inv_trans_8x4_altivec(uint8_t *dest, int stride, DCTELEM *block)
@@ -342,7 +396,11 @@ void ff_vc1dsp_init_altivec(VC1DSPContext* dsp) · 112 unmodified lines
342396 if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
343397 return;
344398
345− dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_altivec;
399+ dsp->vc1_inv_trans_8x8_add = vc1_inv_trans_8x8_add_altivec;
400+ dsp->vc1_inv_trans_8x8_put_signed[0] = vc1_inv_trans_8x8_put_signed_altivec;
401+ dsp->vc1_inv_trans_8x8_put_signed[1] = vc1_inv_trans_8x8_put_signed_rangered_altivec;
402+ dsp->vc1_inv_trans_8x8_put[0] = vc1_inv_trans_8x8_put_altivec;
403+ dsp->vc1_inv_trans_8x8_put[1] = vc1_inv_trans_8x8_put_rangered_altivec;
346404 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_altivec;
347405 dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = put_no_rnd_vc1_chroma_mc8_altivec;
348406 dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = avg_no_rnd_vc1_chroma_mc8_altivec;

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