Mercurial > mplayer.hg
annotate libmpeg2/motion_comp.c @ 37104:91b00a4407cd
demux_real: Improve buffer allocation for interleaved audio handling.
Allocate buffers where they are needed.
This avoids code duplication, allocating them when they are not
needed, and might avoid a crash if an audio stream is specified
via -aid that does not exist in the headers but does exist in the
file since then we might run the deinterleaving without having
the buffers allocated first (note: I have not tested this can
actually happen).
| author | reimar |
|---|---|
| date | Tue, 13 May 2014 21:06:38 +0000 |
| parents | 31287e75b5d8 |
| children |
| rev | line source |
|---|---|
| 1 | 1 /* |
| 2 * motion_comp.c | |
| 10303 | 3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> |
| 9852 | 4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> |
| 1 | 5 * |
| 6 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. | |
| 9852 | 7 * See http://libmpeg2.sourceforge.net/ for updates. |
| 1 | 8 * |
| 9 * mpeg2dec is free software; you can redistribute it and/or modify | |
| 10 * it under the terms of the GNU General Public License as published by | |
| 11 * the Free Software Foundation; either version 2 of the License, or | |
| 12 * (at your option) any later version. | |
| 13 * | |
| 14 * mpeg2dec is distributed in the hope that it will be useful, | |
| 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 * GNU General Public License for more details. | |
| 18 * | |
| 19 * You should have received a copy of the GNU General Public License | |
| 20 * along with this program; if not, write to the Free Software | |
| 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
14732
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13864
diff
changeset
|
22 * |
|
27571
fd18fa10de53
libmpeg-0.4.1.diff was renamed to libmpeg2_changes.diff.
diego
parents:
27522
diff
changeset
|
23 * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes. |
| 18783 | 24 * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ |
|
14732
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13864
diff
changeset
|
25 * $Id$ |
| 1 | 26 */ |
| 27 | |
| 28 #include "config.h" | |
| 29 | |
| 30 #include <inttypes.h> | |
| 31 | |
| 9852 | 32 #include "mpeg2.h" |
| 12932 | 33 #include "attributes.h" |
| 1 | 34 #include "mpeg2_internal.h" |
| 35 | |
| 9852 | 36 mpeg2_mc_t mpeg2_mc; |
| 1 | 37 |
| 9852 | 38 void mpeg2_mc_init (uint32_t accel) |
| 1 | 39 { |
| 28290 | 40 #if HAVE_MMX2 |
| 9852 | 41 if (accel & MPEG2_ACCEL_X86_MMXEXT) |
| 42 mpeg2_mc = mpeg2_mc_mmxext; | |
|
27522
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
43 else |
|
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
44 #endif |
| 28335 | 45 #if HAVE_AMD3DNOW |
|
27522
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
46 if (accel & MPEG2_ACCEL_X86_3DNOW) |
| 9852 | 47 mpeg2_mc = mpeg2_mc_3dnow; |
|
27522
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
48 else |
|
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
49 #endif |
| 28290 | 50 #if HAVE_MMX |
|
27522
1462a44ea6b9
Use preprocessor conditionals to disable CPU-extension-specific code. We cannot
diego
parents:
27361
diff
changeset
|
51 if (accel & MPEG2_ACCEL_X86_MMX) |
| 9852 | 52 mpeg2_mc = mpeg2_mc_mmx; |
| 53 else | |
| 54 #endif | |
| 28290 | 55 #if HAVE_ALTIVEC |
| 9852 | 56 if (accel & MPEG2_ACCEL_PPC_ALTIVEC) |
| 57 mpeg2_mc = mpeg2_mc_altivec; | |
| 58 else | |
| 59 #endif | |
| 28290 | 60 #if ARCH_ALPHA |
| 9852 | 61 if (accel & MPEG2_ACCEL_ALPHA) |
| 62 mpeg2_mc = mpeg2_mc_alpha; | |
| 63 else | |
| 1 | 64 #endif |
| 28290 | 65 #if HAVE_VIS |
| 12932 | 66 if (accel & MPEG2_ACCEL_SPARC_VIS) |
| 67 mpeg2_mc = mpeg2_mc_vis; | |
| 9852 | 68 else |
| 1 | 69 #endif |
| 28290 | 70 #if ARCH_ARM |
|
27361
7cf315c4707f
Fix ARM linking failure when IWMMXT support is disabled.
diego
parents:
26625
diff
changeset
|
71 if (accel & MPEG2_ACCEL_ARM) |
|
26282
79ab4ecba54a
Revert local changes that pointlessly add #ifdefs all over libmpeg2 to disable
diego
parents:
26046
diff
changeset
|
72 mpeg2_mc = mpeg2_mc_arm; |
|
79ab4ecba54a
Revert local changes that pointlessly add #ifdefs all over libmpeg2 to disable
diego
parents:
26046
diff
changeset
|
73 else |
|
23236
f0ddd02aec27
iWMMXt-accelerated DCT and motion compensation for ARM processors
gpoirier
parents:
21526
diff
changeset
|
74 #endif |
| 9852 | 75 mpeg2_mc = mpeg2_mc_c; |
| 1 | 76 } |
| 77 | |
| 78 #define avg2(a,b) ((a+b+1)>>1) | |
| 79 #define avg4(a,b,c,d) ((a+b+c+d+2)>>2) | |
| 80 | |
| 9852 | 81 #define predict_o(i) (ref[i]) |
| 1 | 82 #define predict_x(i) (avg2 (ref[i], ref[i+1])) |
| 83 #define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) | |
| 9852 | 84 #define predict_xy(i) (avg4 (ref[i], ref[i+1], \ |
| 85 (ref+stride)[i], (ref+stride)[i+1])) | |
| 1 | 86 |
| 87 #define put(predictor,i) dest[i] = predictor (i) | |
| 88 #define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) | |
| 89 | |
| 36 | 90 /* mc function template */ |
| 1 | 91 |
| 9852 | 92 #define MC_FUNC(op,xy) \ |
| 93 static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \ | |
| 94 const int stride, int height) \ | |
| 95 { \ | |
| 96 do { \ | |
| 97 op (predict_##xy, 0); \ | |
| 98 op (predict_##xy, 1); \ | |
| 99 op (predict_##xy, 2); \ | |
| 100 op (predict_##xy, 3); \ | |
| 101 op (predict_##xy, 4); \ | |
| 102 op (predict_##xy, 5); \ | |
| 103 op (predict_##xy, 6); \ | |
| 104 op (predict_##xy, 7); \ | |
| 105 op (predict_##xy, 8); \ | |
| 106 op (predict_##xy, 9); \ | |
| 107 op (predict_##xy, 10); \ | |
| 108 op (predict_##xy, 11); \ | |
| 109 op (predict_##xy, 12); \ | |
| 110 op (predict_##xy, 13); \ | |
| 111 op (predict_##xy, 14); \ | |
| 112 op (predict_##xy, 15); \ | |
| 113 ref += stride; \ | |
| 114 dest += stride; \ | |
| 115 } while (--height); \ | |
| 116 } \ | |
| 117 static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \ | |
| 118 const int stride, int height) \ | |
| 119 { \ | |
| 120 do { \ | |
| 121 op (predict_##xy, 0); \ | |
| 122 op (predict_##xy, 1); \ | |
| 123 op (predict_##xy, 2); \ | |
| 124 op (predict_##xy, 3); \ | |
| 125 op (predict_##xy, 4); \ | |
| 126 op (predict_##xy, 5); \ | |
| 127 op (predict_##xy, 6); \ | |
| 128 op (predict_##xy, 7); \ | |
| 129 ref += stride; \ | |
| 130 dest += stride; \ | |
| 131 } while (--height); \ | |
| 1 | 132 } |
| 133 | |
| 36 | 134 /* definitions of the actual mc functions */ |
| 1 | 135 |
| 9852 | 136 MC_FUNC (put,o) |
| 137 MC_FUNC (avg,o) | |
| 1 | 138 MC_FUNC (put,x) |
| 139 MC_FUNC (avg,x) | |
| 140 MC_FUNC (put,y) | |
| 141 MC_FUNC (avg,y) | |
| 142 MC_FUNC (put,xy) | |
| 143 MC_FUNC (avg,xy) | |
| 144 | |
| 9852 | 145 MPEG2_MC_EXTERN (c) |
