fairuse
Messages postés6Date d'inscriptionjeudi 25 mars 2004StatutMembreDernière intervention27 mars 2004
-
25 mars 2004 à 21:00
cs_dadou16
Messages postés1Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention19 mai 2004
-
19 mai 2004 à 17:44
Bonjour,
je développe un logiciel de backup de DVD appelé FairUse (http://fairuse.free.fr) en licence GPL. Je dispose de 2 algos pour le redimensionnement : un redimensionnement bilinéaire en MMX et un bicubique écrit en VC++, et donc très lent.
Je l'ai réécrit en ASM simple, mais ca n'apporte pas grand chose au niveau vitesse. J'aimerais le réécrire en MMX, mais le pb c'est qu'il y a une multiplication entre un int et un char. Du coup je ne sais pas comment faire puisque cette opération n'est pas possible en MMX ?
Merci,
fu
P.S. : si quelqu'un a envie de participer au projet et réécrivant/optimisant cette routine, ca m'intéresse bcp :)
fairuse
Messages postés6Date d'inscriptionjeudi 25 mars 2004StatutMembreDernière intervention27 mars 2004 26 mars 2004 à 22:58
La fonction _Filter génère un filtre de redimensionnement pour le redimensionnement horizontal, et un filtre pour le redimensionnement vertical. Ca donne deux tableaux stockés dans _ResizeX et _ResizeY. Le redimensionnement horizontal et le vertical sont faits séparément, en deux temps dans ResizePlane::Resize(), c'est la partie "original FU resizer".
Ensuite, pour chaque axe on parcourt le filtre correspondant et on calcule la valeur de chaque point. Ca c'est ce que font les fonctions que j'ai posté ci-dessus.
En regardant les sources de AviSynth je me suis rendu compte qu'il fonctionne sur le même principe, et j'ai trouvé la routine ci-dessous qui à mon avis ressemble fortement à ce qu'il faut pour FU. Mais... dans le calcul du filtre fait dans _Filter() il y a un coefficient de 65536, tandis que dans AviSynth le coefficient est de 16384 (donc 2 bits de moins) et dans le code MMX on retrouve une ligne qui je pense "compense" ca en revenant sur 16 bits, mais pour l'instant je n'arrive pas à reproduire ce comportement en C++ (ca me fausse les couleurs).
pslld mm3, 2 ; Shift up from 14 bits fraction to 16 bit fraction
Pour revenir à FU, il est intéressant de noter que bien que filter soit déclaré en int *filter, en réalité les valeurs ne dépassent jamais le coefficient 65536 (ou 16384 pour AviSynth).
Extrait de AviSynth :
for (int y=0; y<vi.height; ++y)
{
int* cur_luma = pattern_luma+2;
int* cur_chroma = pattern_chroma+2;
int x = vi.width / 2;
__asm {
mov edi, this
mov ecx, [edi].original_width
mov edx, [edi].tempY
mov ebx, [edi].tempUV
mov esi, srcp
mov eax, -1
// deinterleave current line
align 16
deintloop:
inc eax
movd mm1, [esi] ;mm1 = 0000VYUY
movq mm2, mm1
punpcklbw mm2, mm0 ;mm2 = 0V0Y0U0Y
pand mm1, mm7 ;mm1 = 00000Y0Y
movd [edx+eax*4], mm1
psrld mm2, 16 ;mm2 = 000V000U
add esi, 4
movq [ebx+eax*8], mm2
sub ecx, 2
jnz deintloop
// use this as source from now on
mov eax, cur_luma
mov ebx, cur_chroma
mov edx, dstp
align 16
xloopYUV:
mov esi, [eax] ;esi=&tempY[ofs0]
movq mm1, mm0
mov edi, [eax+4] ;edi=&tempY[ofs1]
movq mm3, mm0
mov ecx, fir_filter_size_luma
add eax, 8 ;cur_luma++
align 16
aloopY:
// Identifiers:
// Ya, Yb: Y values in srcp[ofs0]
// Ym, Yn: Y values in srcp[ofs1]
movd mm2, [esi] ;mm2 = 0| 0|Yb|Ya
add esi, 4
punpckldq mm2, [edi] ;mm2 = Yn|Ym|Yb|Ya
;[eax] = COn|COm|COb|COa
add edi, 4
pmaddwd mm2, [eax] ;mm2 = Y1|Y0 (DWORDs)
add eax, 8 ;cur_luma++
dec ecx
paddd mm1, mm2 ;accumulate
jnz aloopY
Chrishka
Messages postés21Date d'inscriptiondimanche 17 août 2003StatutMembreDernière intervention27 mars 2004 27 mars 2004 à 11:54
Ca serait possible de faire de filter un unsigned short* plutot qu'un int* ? Ca ferait gagner une conversion de type, et si ça ne dépasse jamais 65535 ça devrait pas poser de problèmes
cs_dadou16
Messages postés1Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention19 mai 2004 19 mai 2004 à 17:44
j'effectue un PFE sur le traitement d'image et j'ai besoin de quelque petit programme comme FFT ,filtrage,binarisation, seuillage..en assembleur et surtout en utilisant MMX alos au secours...