annotate libvo/fastmemcpy.h @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents 3f0d00abc073
children 3baf6a2283da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23385
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
1 /*
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
2 * This file is part of MPlayer.
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
3 *
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
4 * MPlayer is free software; you can redistribute it and/or
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
5 * modify it under the terms of the GNU Lesser General Public
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
6 * License as published by the Free Software Foundation; either
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
7 * version 2.1 of the License, or (at your option) any later version.
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
8 *
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
12 * Lesser General Public License for more details.
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
13 *
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
14 * You should have received a copy of the GNU Lesser General Public
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
15 * License along with MPlayer; if not, write to the Free Software
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
17 */
499d246cd549 Add LGPL license header.
diego
parents: 22003
diff changeset
18
23689
3f0d00abc073 Do not use leading underscores in multiple inclusion guards, they are reserved.
diego
parents: 23686
diff changeset
19 #ifndef FASTMEMCPY_H
3f0d00abc073 Do not use leading underscores in multiple inclusion guards, they are reserved.
diego
parents: 23686
diff changeset
20 #define FASTMEMCPY_H
644
88eb1a3f7bfb Changed code, should be faster on Athlon/K6 but slower on PIII with SSE, more portable.
atmosfear
parents: 581
diff changeset
21
13787
e047e70a9767 Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents: 12663
diff changeset
22 #include "config.h"
22003
6fd6bf6269f3 fastmemcpy.h always has to include inttypes.h on systems that need it.
diego
parents: 22000
diff changeset
23 #include <inttypes.h>
800
dc6cdb87229a USE_FASTMEMCPY bug fixed.
pontscho
parents: 698
diff changeset
24
1131
30e6a115a088 cosmetic changes and sse/sse included
al3x
parents: 800
diff changeset
25 #ifdef USE_FASTMEMCPY
30e6a115a088 cosmetic changes and sse/sse included
al3x
parents: 800
diff changeset
26 #if defined(HAVE_MMX) || defined(HAVE_MMX2) || defined(HAVE_3DNOW) \
30e6a115a088 cosmetic changes and sse/sse included
al3x
parents: 800
diff changeset
27 /* || defined(HAVE_SSE) || defined(HAVE_SSE2) */
644
88eb1a3f7bfb Changed code, should be faster on Athlon/K6 but slower on PIII with SSE, more portable.
atmosfear
parents: 581
diff changeset
28 #include <stddef.h>
477
a1ceb65cf6ab add 3dnow support
pontscho
parents: 409
diff changeset
29
698
f0fbf1a9bf31 Moving fast_memcpy to separate file (Size optimization)
nickols_k
parents: 685
diff changeset
30 extern void * fast_memcpy(void * to, const void * from, size_t len);
4681
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
31 extern void * mem2agpcpy(void * to, const void * from, size_t len);
513
aec3cad1e41a replace "movsl..." to small_memcpy
pontscho
parents: 478
diff changeset
32
4681
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
33 #else /* HAVE_MMX/MMX2/3DNOW/SSE/SSE2 */
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
34 #define mem2agpcpy(a,b,c) memcpy(a,b,c)
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23385
diff changeset
35 #define fast_memcpy(a,b,c) memcpy(a,b,c)
478
9df257e7ef78 sorry, for the #endif
pontscho
parents: 477
diff changeset
36 #endif
4681
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
37
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
38 #else /* USE_FASTMEMCPY */
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
39 #define mem2agpcpy(a,b,c) memcpy(a,b,c)
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23385
diff changeset
40 #define fast_memcpy(a,b,c) memcpy(a,b,c)
4681
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
41 #endif
4708
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
42
17095
rathann
parents: 15069
diff changeset
43 static inline void * mem2agpcpy_pic(void * dst, const void * src, int bytesPerLine, int height, int dstStride, int srcStride)
4708
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
44 {
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
45 int i;
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
46 void *retval=dst;
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
47
15069
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
48 if(dstStride == srcStride)
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
49 {
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
50 if (srcStride < 0) {
22000
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
51 src = (uint8_t*)src + (height-1)*srcStride;
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
52 dst = (uint8_t*)dst + (height-1)*dstStride;
15069
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
53 srcStride = -srcStride;
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
54 }
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
55
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
56 mem2agpcpy(dst, src, srcStride*height);
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
57 }
4708
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
58 else
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
59 {
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
60 for(i=0; i<height; i++)
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
61 {
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
62 mem2agpcpy(dst, src, bytesPerLine);
22000
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
63 src = (uint8_t*)src + srcStride;
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
64 dst = (uint8_t*)dst + dstStride;
4708
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
65 }
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
66 }
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
67
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
68 return retval;
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
69 }
000ca7a19331 mem2agpcpy_pic()
michael
parents: 4681
diff changeset
70
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
71 #define memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 0)
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
72 #define my_memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 1)
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
73
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
74 /**
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
75 * \param limit2width always skip data between end of line and start of next
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
76 * instead of copying the full block when strides are the same
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
77 */
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
78 static inline void * memcpy_pic2(void * dst, const void * src,
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
79 int bytesPerLine, int height,
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
80 int dstStride, int srcStride, int limit2width)
5504
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
81 {
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
82 int i;
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
83 void *retval=dst;
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
84
23666
5c3c7efd9b75 Get rid of my_memcpy_pic code duplication in many filters.
reimar
parents: 23457
diff changeset
85 if(!limit2width && dstStride == srcStride)
15069
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
86 {
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
87 if (srcStride < 0) {
22000
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
88 src = (uint8_t*)src + (height-1)*srcStride;
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
89 dst = (uint8_t*)dst + (height-1)*dstStride;
15069
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
90 srcStride = -srcStride;
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
91 }
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
92
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23385
diff changeset
93 fast_memcpy(dst, src, srcStride*height);
15069
3f5daa60e049 support for negative strides (fixes -vf spp,flip crash)
henry
parents: 13787
diff changeset
94 }
5504
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
95 else
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
96 {
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
97 for(i=0; i<height; i++)
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
98 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23385
diff changeset
99 fast_memcpy(dst, src, bytesPerLine);
22000
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
100 src = (uint8_t*)src + srcStride;
f7c209352770 get rid of void pointer arithmetic, as spotted by ICC
gpoirier
parents: 17095
diff changeset
101 dst = (uint8_t*)dst + dstStride;
5504
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
102 }
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
103 }
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
104
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
105 return retval;
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
106 }
23ba417cf64b memcpy_pic() added (copy image plane with src/dst stride)
arpi
parents: 4708
diff changeset
107
4681
8db59073127e mem2agpcpy()
michael
parents: 1131
diff changeset
108 #endif