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
130 130
131/** Do inverse transform on 8x8 block131/** Do inverse transform on 8x8 block
132*/132*/
133static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])133static void vc1_inv_trans_8x8_altivec(DCTELEM block[64],
134 int sign, int rangered)
134{135{
135 vector signed short src0, src1, src2, src3, src4, src5, src6, src7;136 vector signed short src0, src1, src2, src3, src4, src5, src6, src7;
136 vector signed int s0, s1, s2, s3, s4, s5, s6, s7;137 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
144 const vector unsigned int vec_2 = vec_splat_u32(2);145 const vector unsigned int vec_2 = vec_splat_u32(2);
145 const vector signed int vec_1s = vec_splat_s32(1);146 const vector signed int vec_1s = vec_splat_s32(1);
146 const vector unsigned int vec_1 = vec_splat_u32(1);147 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));
148 151
149 src0 = vec_ld( 0, block);152 src0 = vec_ld( 0, block);
150 src1 = vec_ld( 16, block);153 src1 = vec_ld( 16, block);
@@ -214,6 +217,27 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64]) · 63 unmodified lines
214 src6 = vec_pack(sE, s6);217 src6 = vec_pack(sE, s6);
215 src7 = vec_pack(sF, s7);218 src7 = vec_pack(sF, s7);
216 219
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
217 vec_st(src0, 0, block);241 vec_st(src0, 0, block);
218 vec_st(src1, 16, block);242 vec_st(src1, 16, block);
219 vec_st(src2, 32, block);243 vec_st(src2, 32, block);
@@ -224,6 +248,36 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64]) · 4 unmodified lines
224 vec_st(src7,112, block);248 vec_st(src7,112, block);
225}249}
226 250
251static 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
257static 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
263static 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
269static 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
275static 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
227/** Do inverse transform on 8x4 part of block281/** Do inverse transform on 8x4 part of block
228*/282*/
229static void vc1_inv_trans_8x4_altivec(uint8_t *dest, int stride, DCTELEM *block)283static 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
342 if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))396 if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
343 return;397 return;
344 398
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;
346 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_altivec;404 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_altivec;
347 dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = put_no_rnd_vc1_chroma_mc8_altivec;405 dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = put_no_rnd_vc1_chroma_mc8_altivec;
348 dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = avg_no_rnd_vc1_chroma_mc8_altivec;406 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