Advertisement
Guest User

Untitled

a guest
Sep 13th, 2017
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 35.59 KB | None | 0 0
  1. From dcd5ee0139678f8a72f2c4c608908b142fdd4df1 Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Tue, 24 May 2011 15:14:38 -0400
  4. Subject: [PATCH 1/2] Add IDCT functions for 10-bit H.264.
  5.  
  6. Ports the majority of IDCT functions for 10-bit H.264.
  7.  
  8. Parts are inspired from 8-bit IDCT code in Libav; other parts ported from x264 with relicensing permission from author.
  9. ---
  10. libavcodec/x86/Makefile            |    3 +-
  11.  libavcodec/x86/h264_idct_10bit.asm |  546 ++++++++++++++++++++++++++++++++++++
  12.  libavcodec/x86/h264dsp_mmx.c       |   59 ++++
  13.  3 files changed, 607 insertions(+), 1 deletions(-)
  14.  create mode 100644 libavcodec/x86/h264_idct_10bit.asm
  15.  
  16. diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile
  17. index ba664ab..38b736e 100644
  18. --- a/libavcodec/x86/Makefile
  19. +++ b/libavcodec/x86/Makefile
  20. @@ -12,8 +12,9 @@ YASM-OBJS-$(CONFIG_FFT)                += x86/fft_mmx.o                 \
  21.  MMX-OBJS-$(CONFIG_H264DSP)             += x86/h264dsp_mmx.o
  22.  YASM-OBJS-$(CONFIG_H264DSP)            += x86/h264_deblock.o            \
  23.                                            x86/h264_deblock_10bit.o      \
  24. -                                          x86/h264_weight.o             \
  25.                                            x86/h264_idct.o               \
  26. +                                          x86/h264_idct_10bit.o         \
  27. +                                          x86/h264_weight.o             \
  28.  
  29.  YASM-OBJS-$(CONFIG_H264PRED)           += x86/h264_intrapred.o
  30.  MMX-OBJS-$(CONFIG_H264PRED)            += x86/h264_intrapred_init.o
  31. diff --git a/libavcodec/x86/h264_idct_10bit.asm b/libavcodec/x86/h264_idct_10bit.asm
  32. new file mode 100644
  33. index 0000000..991f1a4
  34. --- /dev/null
  35. +++ b/libavcodec/x86/h264_idct_10bit.asm
  36. @@ -0,0 +1,546 @@
  37. +;*****************************************************************************
  38. +;* MMX/SSE2/AVX-optimized 10-bit H.264 iDCT code
  39. +;*****************************************************************************
  40. +;* Copyright (C) 2005-2011 x264 project
  41. +;*
  42. +;* Authors: Daniel Kang <daniel.d.kang@gmail.com>
  43. +;*
  44. +;* This file is part of Libav.
  45. +;*
  46. +;* Libav is free software; you can redistribute it and/or
  47. +;* modify it under the terms of the GNU Lesser General Public
  48. +;* License as published by the Free Software Foundation; either
  49. +;* version 2.1 of the License, or (at your option) any later version.
  50. +;*
  51. +;* Libav is distributed in the hope that it will be useful,
  52. +;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  53. +;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  54. +;* Lesser General Public License for more details.
  55. +;*
  56. +;* You should have received a copy of the GNU Lesser General Public
  57. +;* License along with Libav; if not, write to the Free Software
  58. +;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  59. +;******************************************************************************
  60. +
  61. +%include "x86inc.asm"
  62. +%include "x86util.asm"
  63. +
  64. +SECTION_RODATA
  65. +
  66. +pw_pixel_max: times 8 dw ((1 << 10)-1)
  67. +pd_32:        times 4 dd 32
  68. +scan8_mem: db 4+1*8, 5+1*8, 4+2*8, 5+2*8
  69. +           db 6+1*8, 7+1*8, 6+2*8, 7+2*8
  70. +           db 4+3*8, 5+3*8, 4+4*8, 5+4*8
  71. +           db 6+3*8, 7+3*8, 6+4*8, 7+4*8
  72. +           db 1+1*8, 2+1*8
  73. +           db 1+2*8, 2+2*8
  74. +           db 1+4*8, 2+4*8
  75. +           db 1+5*8, 2+5*8
  76. +
  77. +%ifdef PIC
  78. +%define scan8 r11
  79. +%else
  80. +%define scan8 scan8_mem
  81. +%endif
  82. +
  83. +SECTION .text
  84. +
  85. +;-----------------------------------------------------------------------------
  86. +; void h264_idct_add(pixel *dst, dctcoef *block, int stride)
  87. +;-----------------------------------------------------------------------------
  88. +%macro STORE_DIFFx2 6
  89. +    psrad       %1, 6
  90. +    psrad       %2, 6
  91. +    packssdw    %1, %2
  92. +    movq        %3, [%5]
  93. +    movhps      %3, [%5+%6]
  94. +    paddsw      %1, %3
  95. +    CLIPW       %1, %4, [pw_pixel_max]
  96. +    movq      [%5], %1
  97. +    movhps [%5+%6], %1
  98. +%endmacro
  99. +
  100. +;dst, in, stride
  101. +%macro IDCT4_ADD_10 3
  102. +    mova  m0, [%2+ 0]
  103. +    mova  m1, [%2+16]
  104. +    mova  m2, [%2+32]
  105. +    mova  m3, [%2+48]
  106. +    IDCT4_1D d,0,1,2,3,4,5
  107. +    TRANSPOSE4x4D 0,1,2,3,4
  108. +    paddd m0, [pd_32]
  109. +    IDCT4_1D d,0,1,2,3,4,5
  110. +    pxor  m5, m5
  111. +    STORE_DIFFx2 m0, m1, m4, m5, %1, %3
  112. +    lea   %1, [%1+%3*2]
  113. +    STORE_DIFFx2 m2, m3, m4, m5, %1, %3
  114. +%endmacro
  115. +
  116. +%macro IDCT_ADD_10 1
  117. +cglobal h264_idct_add_10_%1, 3,3
  118. +    IDCT4_ADD_10 r0, r1, r2
  119. +    RET
  120. +%endmacro
  121. +
  122. +INIT_XMM
  123. +IDCT_ADD_10 sse2
  124. +%ifdef HAVE_AVX
  125. +INIT_AVX
  126. +IDCT_ADD_10 avx
  127. +%endif
  128. +
  129. +;-----------------------------------------------------------------------------
  130. +; h264_idct_add16(pixel *dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
  131. +;-----------------------------------------------------------------------------
  132. +;;;;;;; NO FATE SAMPLES TRIGGER THIS
  133. +%macro ADD4x4IDCT 1
  134. +add4x4_idct_%1:
  135. +    add   r5, r0
  136. +    mova  m0, [r2+ 0]
  137. +    mova  m1, [r2+16]
  138. +    mova  m2, [r2+32]
  139. +    mova  m3, [r2+48]
  140. +    IDCT4_1D d,0,1,2,3,4,5
  141. +    TRANSPOSE4x4D 0,1,2,3,4
  142. +    paddd m0, [pd_32]
  143. +    IDCT4_1D d,0,1,2,3,4,5
  144. +    pxor  m5, m5
  145. +    STORE_DIFFx2 m0, m1, m4, m5, r5, r3
  146. +    lea   r5, [r5+r3*2]
  147. +    STORE_DIFFx2 m2, m3, m4, m5, r5, r3
  148. +    ret
  149. +%endmacro
  150. +
  151. +INIT_XMM
  152. +ALIGN 16
  153. +ADD4x4IDCT sse2
  154. +%ifdef HAVE_AVX
  155. +INIT_AVX
  156. +ALIGN 16
  157. +ADD4x4IDCT avx
  158. +%endif
  159. +
  160. +%macro ADD16_OP 3
  161. +    cmp          byte [r4+%3], 0
  162. +    jz .skipblock%2
  163. +    mov         r5d, dword [r1+%2*4]
  164. +    call add4x4_idct_%1
  165. +.skipblock%2:
  166. +%if %2<15
  167. +    add          r2, 64
  168. +%endif
  169. +%endmacro
  170. +
  171. +%macro IDCT_ADD16_10 1
  172. +cglobal h264_idct_add16_10_%1, 5,6
  173. +    ADD16_OP %1, 0, 4+1*8
  174. +    ADD16_OP %1, 1, 5+1*8
  175. +    ADD16_OP %1, 2, 4+2*8
  176. +    ADD16_OP %1, 3, 5+2*8
  177. +    ADD16_OP %1, 4, 6+1*8
  178. +    ADD16_OP %1, 5, 7+1*8
  179. +    ADD16_OP %1, 6, 6+2*8
  180. +    ADD16_OP %1, 7, 7+2*8
  181. +    ADD16_OP %1, 8, 4+3*8
  182. +    ADD16_OP %1, 9, 5+3*8
  183. +    ADD16_OP %1, 10, 4+4*8
  184. +    ADD16_OP %1, 11, 5+4*8
  185. +    ADD16_OP %1, 12, 6+3*8
  186. +    ADD16_OP %1, 13, 7+3*8
  187. +    ADD16_OP %1, 14, 6+4*8
  188. +    ADD16_OP %1, 15, 7+4*8
  189. +    RET
  190. +%endmacro
  191. +
  192. +INIT_XMM
  193. +IDCT_ADD16_10 sse2
  194. +%ifdef HAVE_AVX
  195. +INIT_AVX
  196. +IDCT_ADD16_10 avx
  197. +%endif
  198. +
  199. +;-----------------------------------------------------------------------------
  200. +; void h264_idct_dc_add(pixel *dst, dctcoef *block, int stride)
  201. +;-----------------------------------------------------------------------------
  202. +%macro IDCT_DC_ADD_OP_10 3
  203. +    mova      m1, [%1+0   ]
  204. +    mova      m2, [%1+%2  ]
  205. +    mova      m3, [%1+%2*2]
  206. +    mova      m4, [%1+%3  ]
  207. +    pxor      m5, m5
  208. +    paddw     m1, m0
  209. +    paddw     m2, m0
  210. +    paddw     m3, m0
  211. +    paddw     m4, m0
  212. +    CLIPW     m1, m5, m6
  213. +    CLIPW     m2, m5, m6
  214. +    CLIPW     m3, m5, m6
  215. +    CLIPW     m4, m5, m6
  216. +    mova [%1+0   ], m1
  217. +    mova [%1+%2  ], m2
  218. +    mova [%1+%2*2], m3
  219. +    mova [%1+%3  ], m4
  220. +%endmacro
  221. +
  222. +INIT_MMX
  223. +cglobal h264_idct_dc_add_10_mmx2,3,3
  224. +    movd      m0, dword [r1]
  225. +    paddd     m0, [pd_32]
  226. +    psrad     m0, 6
  227. +    lea       r1, [r2*3]
  228. +    pshufw    m0, m0, 0
  229. +    mova      m6, [pw_pixel_max]
  230. +    IDCT_DC_ADD_OP_10 r0, r2, r1
  231. +    RET
  232. +
  233. +;-----------------------------------------------------------------------------
  234. +; void h264_idct8_dc_add(pixel *dst, dctcoef *block, int stride)
  235. +;-----------------------------------------------------------------------------
  236. +%macro IDCT8_DC_ADD 1
  237. +cglobal h264_idct8_dc_add_10_%1,3,3,7
  238. +    mov      r1d, dword [r1]
  239. +    add       r1, 32
  240. +    sar       r1, 6
  241. +    movd      m0, r1d
  242. +    lea       r1, [r2*3]
  243. +    SPLATW    m0, m0, 0
  244. +    mova      m6, [pw_pixel_max]
  245. +    IDCT_DC_ADD_OP_10 r0, r2, r1
  246. +    lea       r0, [r0+r2*4]
  247. +    IDCT_DC_ADD_OP_10 r0, r2, r1
  248. +    RET
  249. +%endmacro
  250. +
  251. +INIT_XMM
  252. +IDCT8_DC_ADD sse2
  253. +%ifdef HAVE_AVX
  254. +INIT_AVX
  255. +IDCT8_DC_ADD avx
  256. +%endif
  257. +
  258. +;-----------------------------------------------------------------------------
  259. +; h264_idct_add16intra(pixel *dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
  260. +;-----------------------------------------------------------------------------
  261. +INIT_MMX
  262. +idct_dc_add_mmx2:
  263. +    add       r5, r0
  264. +    movd      m0, dword [r2]
  265. +    paddd     m0, [pd_32]
  266. +    psrad     m0, 6
  267. +    lea       r6, [r3*3]
  268. +    pshufw    m0, m0, 0
  269. +    mova      m6, [pw_pixel_max]
  270. +    IDCT_DC_ADD_OP_10 r5, r3, r6
  271. +    ret
  272. +
  273. +%macro AC 2
  274. +.ac%2
  275. +    call add4x4_idct_%1
  276. +    jmp .skipblock%2
  277. +%endmacro
  278. +
  279. +%macro ADD16_OP_INTRA 3
  280. +    mov         r5d, dword [r1+%2*4]
  281. +    cmp         byte [r4+%3], 0
  282. +    jnz .ac%2
  283. +    cmp         dword [r2], 0
  284. +    jz .skipblock%2
  285. +    call idct_dc_add_mmx2
  286. +.skipblock%2:
  287. +%if %2<15
  288. +    add          r2, 64
  289. +%endif
  290. +%endmacro
  291. +
  292. +%macro IDCT_ADD16INTRA_10 1
  293. +cglobal h264_idct_add16intra_10_%1,5,7
  294. +    ADD16_OP_INTRA %1, 0, 4+1*8
  295. +    ADD16_OP_INTRA %1, 1, 5+1*8
  296. +    ADD16_OP_INTRA %1, 2, 4+2*8
  297. +    ADD16_OP_INTRA %1, 3, 5+2*8
  298. +    ADD16_OP_INTRA %1, 4, 6+1*8
  299. +    ADD16_OP_INTRA %1, 5, 7+1*8
  300. +    ADD16_OP_INTRA %1, 6, 6+2*8
  301. +    ADD16_OP_INTRA %1, 7, 7+2*8
  302. +    ADD16_OP_INTRA %1, 8, 4+3*8
  303. +    ADD16_OP_INTRA %1, 9, 5+3*8
  304. +    ADD16_OP_INTRA %1, 10, 4+4*8
  305. +    ADD16_OP_INTRA %1, 11, 5+4*8
  306. +    ADD16_OP_INTRA %1, 12, 6+3*8
  307. +    ADD16_OP_INTRA %1, 13, 7+3*8
  308. +    ADD16_OP_INTRA %1, 14, 6+4*8
  309. +    ADD16_OP_INTRA %1, 15, 7+4*8
  310. +    RET
  311. +%assign i 0
  312. +%rep 16
  313. +    AC %1, i
  314. +%assign i i+1
  315. +%endrep
  316. +%endmacro
  317. +
  318. +INIT_XMM
  319. +IDCT_ADD16INTRA_10 sse2
  320. +%ifdef HAVE_AVX
  321. +INIT_AVX
  322. +IDCT_ADD16INTRA_10 avx
  323. +%endif
  324. +
  325. +;-----------------------------------------------------------------------------
  326. +; h264_idct_add8(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
  327. +;-----------------------------------------------------------------------------
  328. +%macro IDCT_ADD8 1
  329. +cglobal h264_idct_add8_10_%1,5,7
  330. +    mov          r5, 16
  331. +    add          r2, 1024
  332. +%ifdef PIC
  333. +    lea         r11, [scan8_mem]
  334. +%endif
  335. +%ifdef ARCH_X86_64
  336. +    mov         r10, r0
  337. +%endif
  338. +.nextblock:
  339. +    movzx        r6, byte [scan8+r5]
  340. +    movzx        r6, byte [r4+r6]
  341. +    or          r6d, dword [r2]
  342. +    test         r6, r6
  343. +    jz .skipblock
  344. +%ifdef ARCH_X86_64
  345. +    mov         r0d, dword [r1+r5*4]
  346. +    add          r0, [r10]
  347. +%else
  348. +    mov          r0, r0m
  349. +    mov          r0, [r0]
  350. +    add          r0, dword [r1+r5*4]
  351. +%endif
  352. +    IDCT4_ADD_10 r0, r2, r3
  353. +.skipblock:
  354. +    inc          r5
  355. +    add          r2, 64
  356. +    test         r5, 3
  357. +    jnz .nextblock
  358. +%ifdef ARCH_X86_64
  359. +    add         r10, gprsize
  360. +%else
  361. +    add        r0mp, gprsize
  362. +%endif
  363. +    test         r5, 4
  364. +    jnz .nextblock
  365. +    REP_RET
  366. +%endmacro ; IDCT_ADD8
  367. +
  368. +INIT_XMM
  369. +IDCT_ADD8 sse2
  370. +%ifdef HAVE_AVX
  371. +INIT_AVX
  372. +IDCT_ADD8 avx
  373. +%endif
  374. +
  375. +;-----------------------------------------------------------------------------
  376. +; void h264_idct8_add(pixel *dst, dctcoef *block, int stride)
  377. +;-----------------------------------------------------------------------------
  378. +%macro IDCT8_1D 2
  379. +    SWAP         0, 1
  380. +    psrad        m4, m5, 1
  381. +    psrad        m1, m0, 1
  382. +    paddd        m4, m5
  383. +    paddd        m1, m0
  384. +    paddd        m4, m7
  385. +    paddd        m1, m5
  386. +    psubd        m4, m0
  387. +    paddd        m1, m3
  388. +
  389. +    psubd        m0, m3
  390. +    psubd        m5, m3
  391. +    paddd        m0, m7
  392. +    psubd        m5, m7
  393. +    psrad        m3, 1
  394. +    psrad        m7, 1
  395. +    psubd        m0, m3
  396. +    psubd        m5, m7
  397. +
  398. +    SWAP         1, 7
  399. +    psrad        m1, m7, 2
  400. +    psrad        m3, m4, 2
  401. +    paddd        m3, m0
  402. +    psrad        m0, 2
  403. +    paddd        m1, m5
  404. +    psrad        m5, 2
  405. +    psubd        m0, m4
  406. +    psubd        m7, m5
  407. +
  408. +    SWAP         5, 6
  409. +    psrad        m4, m2, 1
  410. +    psrad        m6, m5, 1
  411. +    psubd        m4, m5
  412. +    paddd        m6, m2
  413. +
  414. +    mova         m2, %1
  415. +    mova         m5, %2
  416. +    SUMSUB_BA    d, 5, 2
  417. +    SUMSUB_BA    d, 6, 5
  418. +    SUMSUB_BA    d, 4, 2
  419. +    SUMSUB_BA    d, 7, 6
  420. +    SUMSUB_BA    d, 0, 4
  421. +    SUMSUB_BA    d, 3, 2
  422. +    SUMSUB_BA    d, 1, 5
  423. +    SWAP         7, 6, 4, 5, 2, 3, 1, 0 ; 70315246 -> 01234567
  424. +%endmacro
  425. +
  426. +%macro IDCT8_1D_FULL 1
  427. +    mova         m7, [%1+112*2]
  428. +    mova         m6, [%1+ 96*2]
  429. +    mova         m5, [%1+ 80*2]
  430. +    mova         m3, [%1+ 48*2]
  431. +    mova         m2, [%1+ 32*2]
  432. +    mova         m1, [%1+ 16*2]
  433. +    IDCT8_1D   [%1], [%1+ 64*2]
  434. +%endmacro
  435. +
  436. +; %1=int16_t *block, %2=int16_t *dstblock
  437. +%macro IDCT8_ADD_SSE_START 2
  438. +    IDCT8_1D_FULL %1
  439. +%ifdef ARCH_X86_64
  440. +    TRANSPOSE4x4D  0,1,2,3,8
  441. +    mova    [%2    ], m0
  442. +    TRANSPOSE4x4D  4,5,6,7,8
  443. +    mova    [%2+8*2], m4
  444. +%else
  445. +    mova         [%1], m7
  446. +    TRANSPOSE4x4D   0,1,2,3,7
  447. +    mova           m7, [%1]
  448. +    mova    [%2     ], m0
  449. +    mova    [%2+16*2], m1
  450. +    mova    [%2+32*2], m2
  451. +    mova    [%2+48*2], m3
  452. +    TRANSPOSE4x4D   4,5,6,7,3
  453. +    mova    [%2+ 8*2], m4
  454. +    mova    [%2+24*2], m5
  455. +    mova    [%2+40*2], m6
  456. +    mova    [%2+56*2], m7
  457. +%endif
  458. +%endmacro
  459. +
  460. +; %1=uint8_t *dst, %2=int16_t *block, %3=int stride
  461. +%macro IDCT8_ADD_SSE_END 3
  462. +%ifdef ARCH_X86_64
  463. +    IDCT8_1D   [%2], [%2+ 64*2]
  464. +
  465. +    pxor         m8, m8
  466. +    STORE_DIFFx2 m0, m1, m15, m8, %1, %3
  467. +    lea          %1, [%1+%3*2]
  468. +    STORE_DIFFx2 m2, m3, m15, m8, %1, %3
  469. +    lea          %1, [%1+%3*2]
  470. +    STORE_DIFFx2 m4, m5, m15, m8, %1, %3
  471. +    lea          %1, [%1+%3*2]
  472. +    STORE_DIFFx2 m6, m7, m15, m8, %1, %3
  473. +%else
  474. +    IDCT8_1D_FULL %2
  475. +    mova  [%2     ], m6
  476. +    mova  [%2+16*2], m7
  477. +
  478. +    pxor         m7, m7
  479. +    STORE_DIFFx2 m0, m1, m6, m7, %1, %3
  480. +    lea          %1, [%1+%3*2]
  481. +    STORE_DIFFx2 m2, m3, m6, m7, %1, %3
  482. +    mova         m0, [%2     ]
  483. +    mova         m1, [%2+16*2]
  484. +    lea          %1, [%1+%3*2]
  485. +    STORE_DIFFx2 m4, m5, m6, m7, %1, %3
  486. +    lea          %1, [%1+%3*2]
  487. +    STORE_DIFFx2 m0, m1, m6, m7, %1, %3
  488. +%endif ; ARCH_X86_64
  489. +%endmacro
  490. +
  491. +%macro IDCT8_ADD 1
  492. +cglobal h264_idct8_add_10_%1, 3,4,16
  493. +%ifndef UNIX64
  494. +    %assign pad 16-gprsize-(stack_offset&15)
  495. +    sub  rsp, pad
  496. +    call h264_idct8_add1_10_%1
  497. +    add  rsp, pad
  498. +    RET
  499. +%endif
  500. +
  501. +ALIGN 16
  502. +; TODO: does not need to use stack
  503. +h264_idct8_add1_10_%1:
  504. +%assign pad 256+16-gprsize
  505. +    sub          rsp, pad
  506. +
  507. +    add   dword [r1], 32
  508. +    IDCT8_ADD_SSE_START r1, rsp
  509. +%ifdef ARCH_X86_64
  510. +    SWAP 1,  9
  511. +    SWAP 2, 10
  512. +    SWAP 3, 11
  513. +    SWAP 5, 12
  514. +    SWAP 6, 13
  515. +    SWAP 7, 14
  516. +%endif
  517. +    IDCT8_ADD_SSE_START r1+16, rsp+128
  518. +    lea           r3, [r0+8]
  519. +%ifdef ARCH_X86_64
  520. +    PERMUTE 1,9, 2,10, 3,11, 5,1, 6,2, 7,3, 9,12, 10,13, 11,14, 12,5, 13,6, 14,7
  521. +%endif
  522. +    IDCT8_ADD_SSE_END r0, rsp, r2
  523. +%ifdef ARCH_X86_64
  524. +    SWAP 1,  9
  525. +    SWAP 2, 10
  526. +    SWAP 3, 11
  527. +    SWAP 5, 12
  528. +    SWAP 6, 13
  529. +    SWAP 7, 14
  530. +%endif
  531. +    IDCT8_ADD_SSE_END r3, rsp+16, r2
  532. +
  533. +    add          rsp, pad
  534. +    ret
  535. +%endmacro
  536. +
  537. +INIT_XMM
  538. +IDCT8_ADD sse2
  539. +%ifdef HAVE_AVX
  540. +INIT_AVX
  541. +IDCT8_ADD avx
  542. +%endif
  543. +
  544. +;-----------------------------------------------------------------------------
  545. +; h264_idct8_add4(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
  546. +;-----------------------------------------------------------------------------
  547. +;;;;;;; NO FATE SAMPLES TRIGGER THIS
  548. +%macro IDCT8_ADD4_OP 3
  549. +    cmp       byte [r4+%3], 0
  550. +    jz .skipblock%2
  551. +    mov      r0d, dword [r6+%2*4]
  552. +    add       r0, r5
  553. +    call h264_idct8_add1_10_%1
  554. +.skipblock%2:
  555. +%if %2<12
  556. +    add       r1, 256
  557. +%endif
  558. +%endmacro
  559. +
  560. +%macro IDCT8_ADD4 1
  561. +cglobal h264_idct8_add4_10_%1, 0,7,16
  562. +    %assign pad 16-gprsize-(stack_offset&15)
  563. +    SUB      rsp, pad
  564. +    mov       r5, r0mp
  565. +    mov       r6, r1mp
  566. +    mov       r1, r2mp
  567. +    mov      r2d, r3m
  568. +    movifnidn r4, r4mp
  569. +    IDCT8_ADD4_OP %1,  0, 4+1*8
  570. +    IDCT8_ADD4_OP %1,  4, 6+1*8
  571. +    IDCT8_ADD4_OP %1,  8, 4+3*8
  572. +    IDCT8_ADD4_OP %1, 12, 6+3*8
  573. +    ADD       rsp, pad
  574. +    RET
  575. +%endmacro ; IDCT8_ADD4
  576. +
  577. +INIT_XMM
  578. +IDCT8_ADD4 sse2
  579. +%ifdef HAVE_AVX
  580. +INIT_AVX
  581. +IDCT8_ADD4 avx
  582. +%endif
  583. diff --git a/libavcodec/x86/h264dsp_mmx.c b/libavcodec/x86/h264dsp_mmx.c
  584. index 1c07d14..d60fbd5 100644
  585. --- a/libavcodec/x86/h264dsp_mmx.c
  586. +++ b/libavcodec/x86/h264dsp_mmx.c
  587. @@ -27,6 +27,43 @@ DECLARE_ALIGNED(8, static const uint64_t, ff_pb_3_1  ) = 0x0103010301030103ULL;
  588.  
  589.  /***********************************/
  590.  /* IDCT */
  591. +#define IDCT_ADD_FUNC(NUM, DEPTH, OPT) \
  592. +void ff_h264_idct ## NUM ## _add_ ## DEPTH ## _ ## OPT (uint8_t *dst, int16_t *block, int stride);
  593. +
  594. +IDCT_ADD_FUNC(, 10, sse2)
  595. +IDCT_ADD_FUNC(_dc, 10, mmx2)
  596. +IDCT_ADD_FUNC(8_dc, 10, sse2)
  597. +IDCT_ADD_FUNC(8, 10, sse2)
  598. +#if HAVE_AVX
  599. +IDCT_ADD_FUNC(, 10, avx)
  600. +IDCT_ADD_FUNC(8_dc, 10, avx)
  601. +IDCT_ADD_FUNC(8, 10, avx)
  602. +#endif
  603. +
  604. +
  605. +#define IDCT_ADD_REP_FUNC(NUM, REP, DEPTH, OPT) \
  606. +void ff_h264_idct ## NUM ## _add ## REP ## _ ## DEPTH ## _ ## OPT \
  607. +                              (uint8_t *dst, const int *block_offset, \
  608. +                              DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  609. +
  610. +IDCT_ADD_REP_FUNC(8, 4, 10, sse2)
  611. +IDCT_ADD_REP_FUNC(8, 4, 10, avx)
  612. +IDCT_ADD_REP_FUNC(, 16, 10, sse2)
  613. +IDCT_ADD_REP_FUNC(, 16intra, 10, sse2)
  614. +#if HAVE_AVX
  615. +IDCT_ADD_REP_FUNC(, 16, 10, avx)
  616. +IDCT_ADD_REP_FUNC(, 16intra, 10, avx)
  617. +#endif
  618. +
  619. +
  620. +#define IDCT_ADD_REP_FUNC2(NUM, REP, DEPTH, OPT) \
  621. +void ff_h264_idct ## NUM ## _add ## REP ## _ ## DEPTH ## _ ## OPT \
  622. +                              (uint8_t **dst, const int *block_offset, \
  623. +                              DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  624. +IDCT_ADD_REP_FUNC2(, 8, 10, sse2)
  625. +#if HAVE_AVX
  626. +IDCT_ADD_REP_FUNC2(, 8, 10, avx)
  627. +#endif
  628.  
  629.  void ff_h264_idct_add_mmx     (uint8_t *dst, int16_t *block, int stride);
  630.  void ff_h264_idct8_add_mmx    (uint8_t *dst, int16_t *block, int stride);
  631. @@ -418,7 +455,17 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  632.              c->h264_v_loop_filter_luma_intra = ff_deblock_v_luma_intra_10_mmxext;
  633.              c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_10_mmxext;
  634.  #endif
  635. +            c->h264_idct_dc_add= ff_h264_idct_dc_add_10_mmx2;
  636.              if (mm_flags&AV_CPU_FLAG_SSE2) {
  637. +                c->h264_idct_add       = ff_h264_idct_add_10_sse2;
  638. +                c->h264_idct8_dc_add   = ff_h264_idct8_dc_add_10_sse2;
  639. +                c->h264_idct8_add      = ff_h264_idct8_add_10_sse2;
  640. +
  641. +                c->h264_idct_add16     = ff_h264_idct_add16_10_sse2;
  642. +                c->h264_idct8_add4     = ff_h264_idct8_add4_10_sse2;
  643. +                c->h264_idct_add8      = ff_h264_idct_add8_10_sse2;
  644. +                c->h264_idct_add16intra= ff_h264_idct_add16intra_10_sse2;
  645. +
  646.                  c->h264_v_loop_filter_chroma= ff_deblock_v_chroma_10_sse2;
  647.                  c->h264_v_loop_filter_chroma_intra= ff_deblock_v_chroma_intra_10_sse2;
  648.  #if HAVE_ALIGNED_STACK
  649. @@ -428,7 +475,18 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  650.                  c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_10_sse2;
  651.  #endif
  652.              }
  653. +#if HAVE_AVX
  654.              if (mm_flags&AV_CPU_FLAG_AVX) {
  655. +                c->h264_idct_dc_add    =
  656. +                c->h264_idct_add       = ff_h264_idct_add_10_avx;
  657. +                c->h264_idct8_add      = ff_h264_idct8_add_10_avx;
  658. +                c->h264_idct8_dc_add   = ff_h264_idct8_dc_add_10_avx;
  659. +
  660. +                c->h264_idct_add16     = ff_h264_idct_add16_10_avx;
  661. +                c->h264_idct8_add4     = ff_h264_idct8_add4_10_avx;
  662. +                c->h264_idct_add8      = ff_h264_idct_add8_10_avx;
  663. +                c->h264_idct_add16intra= ff_h264_idct_add16intra_10_avx;
  664. +
  665.                  c->h264_v_loop_filter_chroma= ff_deblock_v_chroma_10_avx;
  666.                  c->h264_v_loop_filter_chroma_intra= ff_deblock_v_chroma_intra_10_avx;
  667.  #if HAVE_ALIGNED_STACK
  668. @@ -438,6 +496,7 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  669.                  c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_10_avx;
  670.  #endif
  671.              }
  672. +#endif /* HAVE_AVX */
  673.          }
  674.      }
  675.  #endif
  676. --
  677. 1.7.5.1
  678.  
  679.  
  680. From 83a2181b21e99e7172d657c5c533eae3e3fb9203 Mon Sep 17 00:00:00 2001
  681. From: Daniel Kang <daniel.d.kang@gmail.com>
  682. Date: Tue, 24 May 2011 15:15:08 -0400
  683. Subject: [PATCH 2/2] Update 8-bit H.264 IDCT function names to reflect
  684.  bit-depth.
  685.  
  686. ---
  687. libavcodec/h264dsp.h         |    1 -
  688.  libavcodec/x86/h264_idct.asm |   38 +++++++++---------
  689.  libavcodec/x86/h264dsp_mmx.c |   90 ++++++++++++++++++------------------------
  690.  3 files changed, 57 insertions(+), 72 deletions(-)
  691.  
  692. diff --git a/libavcodec/h264dsp.h b/libavcodec/h264dsp.h
  693. index 87a1dd9..864c118 100644
  694. --- a/libavcodec/h264dsp.h
  695. +++ b/libavcodec/h264dsp.h
  696. @@ -66,7 +66,6 @@ typedef struct H264DSPContext{
  697.      void (*h264_idct_dc_add)(uint8_t *dst/*align 4*/, DCTELEM *block/*align 16*/, int stride);
  698.      void (*h264_idct8_dc_add)(uint8_t *dst/*align 8*/, DCTELEM *block/*align 16*/, int stride);
  699.  
  700. -    void (*h264_dct)(DCTELEM block[4][4]);
  701.      void (*h264_idct_add16)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]);
  702.      void (*h264_idct8_add4)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]);
  703.      void (*h264_idct_add8)(uint8_t **dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]);
  704. diff --git a/libavcodec/x86/h264_idct.asm b/libavcodec/x86/h264_idct.asm
  705. index ae70a30..f90f41c 100644
  706. --- a/libavcodec/x86/h264_idct.asm
  707. +++ b/libavcodec/x86/h264_idct.asm
  708. @@ -73,7 +73,7 @@ SECTION .text
  709.  
  710.  INIT_MMX
  711.  ; ff_h264_idct_add_mmx(uint8_t *dst, int16_t *block, int stride)
  712. -cglobal h264_idct_add_mmx, 3, 3, 0
  713. +cglobal h264_idct_add_8_mmx, 3, 3, 0
  714.      IDCT4_ADD    r0, r1, r2
  715.      RET
  716.  
  717. @@ -125,7 +125,7 @@ cglobal h264_idct_add_mmx, 3, 3, 0
  718.      SUMSUB_BA    w, 0, 4
  719.      SUMSUB_BA    w, 3, 2
  720.      SUMSUB_BA    w, 1, 5
  721. -    SWAP          7, 6, 4, 5, 2, 3, 1, 0 ; 70315246 -> 01234567
  722. +    SWAP         7, 6, 4, 5, 2, 3, 1, 0 ; 70315246 -> 01234567
  723.  %endmacro
  724.  
  725.  %macro IDCT8_1D_FULL 1
  726. @@ -177,7 +177,7 @@ cglobal h264_idct_add_mmx, 3, 3, 0
  727.  
  728.  INIT_MMX
  729.  ; ff_h264_idct8_add_mmx(uint8_t *dst, int16_t *block, int stride)
  730. -cglobal h264_idct8_add_mmx, 3, 4, 0
  731. +cglobal h264_idct8_add_8_mmx, 3, 4, 0
  732.      %assign pad 128+4-(stack_offset&7)
  733.      SUB         rsp, pad
  734.  
  735. @@ -237,7 +237,7 @@ cglobal h264_idct8_add_mmx, 3, 4, 0
  736.  
  737.  INIT_XMM
  738.  ; ff_h264_idct8_add_sse2(uint8_t *dst, int16_t *block, int stride)
  739. -cglobal h264_idct8_add_sse2, 3, 4, 10
  740. +cglobal h264_idct8_add_8_sse2, 3, 4, 10
  741.      IDCT8_ADD_SSE r0, r1, r2, r3
  742.      RET
  743.  
  744. @@ -261,7 +261,7 @@ cglobal h264_idct8_add_sse2, 3, 4, 10
  745.      packuswb     m1, m1
  746.  %endmacro
  747.  
  748. -%macro DC_ADD_MMX2_OP 3-4
  749. +%macro DC_ADD_MMX2_OP 4
  750.      %1           m2, [%2     ]
  751.      %1           m3, [%2+%3  ]
  752.      %1           m4, [%2+%3*2]
  753. @@ -282,13 +282,13 @@ cglobal h264_idct8_add_sse2, 3, 4, 10
  754.  
  755.  INIT_MMX
  756.  ; ff_h264_idct_dc_add_mmx2(uint8_t *dst, int16_t *block, int stride)
  757. -cglobal h264_idct_dc_add_mmx2, 3, 3, 0
  758. +cglobal h264_idct_dc_add_8_mmx2, 3, 3, 0
  759.      DC_ADD_MMX2_INIT r1, r2
  760.      DC_ADD_MMX2_OP movh, r0, r2, r1
  761.      RET
  762.  
  763.  ; ff_h264_idct8_dc_add_mmx2(uint8_t *dst, int16_t *block, int stride)
  764. -cglobal h264_idct8_dc_add_mmx2, 3, 3, 0
  765. +cglobal h264_idct8_dc_add_8_mmx2, 3, 3, 0
  766.      DC_ADD_MMX2_INIT r1, r2
  767.      DC_ADD_MMX2_OP mova, r0, r2, r1
  768.      lea          r0, [r0+r2*4]
  769. @@ -297,7 +297,7 @@ cglobal h264_idct8_dc_add_mmx2, 3, 3, 0
  770.  
  771.  ; ff_h264_idct_add16_mmx(uint8_t *dst, const int *block_offset,
  772.  ;             DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  773. -cglobal h264_idct_add16_mmx, 5, 7, 0
  774. +cglobal h264_idct_add16_8_mmx, 5, 7, 0
  775.      xor          r5, r5
  776.  %ifdef PIC
  777.      lea         r11, [scan8_mem]
  778. @@ -319,7 +319,7 @@ cglobal h264_idct_add16_mmx, 5, 7, 0
  779.  
  780.  ; ff_h264_idct8_add4_mmx(uint8_t *dst, const int *block_offset,
  781.  ;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  782. -cglobal h264_idct8_add4_mmx, 5, 7, 0
  783. +cglobal h264_idct8_add4_8_mmx, 5, 7, 0
  784.      %assign pad 128+4-(stack_offset&7)
  785.      SUB         rsp, pad
  786.  
  787. @@ -351,7 +351,7 @@ cglobal h264_idct8_add4_mmx, 5, 7, 0
  788.  
  789.  ; ff_h264_idct_add16_mmx2(uint8_t *dst, const int *block_offset,
  790.  ;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  791. -cglobal h264_idct_add16_mmx2, 5, 7, 0
  792. +cglobal h264_idct_add16_8_mmx2, 5, 7, 0
  793.      xor          r5, r5
  794.  %ifdef PIC
  795.      lea         r11, [scan8_mem]
  796. @@ -398,7 +398,7 @@ cglobal h264_idct_add16_mmx2, 5, 7, 0
  797.  
  798.  ; ff_h264_idct_add16intra_mmx(uint8_t *dst, const int *block_offset,
  799.  ;                             DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  800. -cglobal h264_idct_add16intra_mmx, 5, 7, 0
  801. +cglobal h264_idct_add16intra_8_mmx, 5, 7, 0
  802.      xor          r5, r5
  803.  %ifdef PIC
  804.      lea         r11, [scan8_mem]
  805. @@ -421,7 +421,7 @@ cglobal h264_idct_add16intra_mmx, 5, 7, 0
  806.  
  807.  ; ff_h264_idct_add16intra_mmx2(uint8_t *dst, const int *block_offset,
  808.  ;                              DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  809. -cglobal h264_idct_add16intra_mmx2, 5, 7, 0
  810. +cglobal h264_idct_add16intra_8_mmx2, 5, 7, 0
  811.      xor          r5, r5
  812.  %ifdef PIC
  813.      lea         r11, [scan8_mem]
  814. @@ -466,7 +466,7 @@ cglobal h264_idct_add16intra_mmx2, 5, 7, 0
  815.  
  816.  ; ff_h264_idct8_add4_mmx2(uint8_t *dst, const int *block_offset,
  817.  ;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  818. -cglobal h264_idct8_add4_mmx2, 5, 7, 0
  819. +cglobal h264_idct8_add4_8_mmx2, 5, 7, 0
  820.      %assign pad 128+4-(stack_offset&7)
  821.      SUB         rsp, pad
  822.  
  823. @@ -529,7 +529,7 @@ cglobal h264_idct8_add4_mmx2, 5, 7, 0
  824.  INIT_XMM
  825.  ; ff_h264_idct8_add4_sse2(uint8_t *dst, const int *block_offset,
  826.  ;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  827. -cglobal h264_idct8_add4_sse2, 5, 7, 10
  828. +cglobal h264_idct8_add4_8_sse2, 5, 7, 10
  829.      xor          r5, r5
  830.  %ifdef PIC
  831.      lea         r11, [scan8_mem]
  832. @@ -607,7 +607,7 @@ h264_idct_add8_mmx_plane:
  833.  
  834.  ; ff_h264_idct_add8_mmx(uint8_t **dest, const int *block_offset,
  835.  ;                       DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  836. -cglobal h264_idct_add8_mmx, 5, 7, 0
  837. +cglobal h264_idct_add8_8_mmx, 5, 7, 0
  838.      mov          r5, 16
  839.      add          r2, 512
  840.  %ifdef PIC
  841. @@ -668,7 +668,7 @@ h264_idct_add8_mmx2_plane
  842.  
  843.  ; ff_h264_idct_add8_mmx2(uint8_t **dest, const int *block_offset,
  844.  ;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  845. -cglobal h264_idct_add8_mmx2, 5, 7, 0
  846. +cglobal h264_idct_add8_8_mmx2, 5, 7, 0
  847.      mov          r5, 16
  848.      add          r2, 512
  849.  %ifdef ARCH_X86_64
  850. @@ -744,7 +744,7 @@ x264_add8x4_idct_sse2:
  851.  
  852.  ; ff_h264_idct_add16_sse2(uint8_t *dst, const int *block_offset,
  853.  ;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  854. -cglobal h264_idct_add16_sse2, 5, 5, 8
  855. +cglobal h264_idct_add16_8_sse2, 5, 5, 8
  856.  %ifdef ARCH_X86_64
  857.      mov        r10, r0
  858.  %endif
  859. @@ -791,7 +791,7 @@ cglobal h264_idct_add16_sse2, 5, 5, 8
  860.  
  861.  ; ff_h264_idct_add16intra_sse2(uint8_t *dst, const int *block_offset,
  862.  ;                              DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  863. -cglobal h264_idct_add16intra_sse2, 5, 7, 8
  864. +cglobal h264_idct_add16intra_8_sse2, 5, 7, 8
  865.  %ifdef ARCH_X86_64
  866.      mov        r10, r0
  867.  %endif
  868. @@ -840,7 +840,7 @@ cglobal h264_idct_add16intra_sse2, 5, 7, 8
  869.  
  870.  ; ff_h264_idct_add8_sse2(uint8_t **dest, const int *block_offset,
  871.  ;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
  872. -cglobal h264_idct_add8_sse2, 5, 7, 8
  873. +cglobal h264_idct_add8_8_sse2, 5, 7, 8
  874.      add          r2, 512
  875.  %ifdef ARCH_X86_64
  876.      mov         r10, r0
  877. diff --git a/libavcodec/x86/h264dsp_mmx.c b/libavcodec/x86/h264dsp_mmx.c
  878. index d60fbd5..1a31e41 100644
  879. --- a/libavcodec/x86/h264dsp_mmx.c
  880. +++ b/libavcodec/x86/h264dsp_mmx.c
  881. @@ -30,9 +30,14 @@ DECLARE_ALIGNED(8, static const uint64_t, ff_pb_3_1  ) = 0x0103010301030103ULL;
  882.  #define IDCT_ADD_FUNC(NUM, DEPTH, OPT) \
  883.  void ff_h264_idct ## NUM ## _add_ ## DEPTH ## _ ## OPT (uint8_t *dst, int16_t *block, int stride);
  884.  
  885. +IDCT_ADD_FUNC(, 8, mmx)
  886.  IDCT_ADD_FUNC(, 10, sse2)
  887. +IDCT_ADD_FUNC(_dc, 8, mmx2)
  888.  IDCT_ADD_FUNC(_dc, 10, mmx2)
  889. +IDCT_ADD_FUNC(8_dc, 8, mmx2)
  890.  IDCT_ADD_FUNC(8_dc, 10, sse2)
  891. +IDCT_ADD_FUNC(8, 8, mmx)
  892. +IDCT_ADD_FUNC(8, 8, sse2)
  893.  IDCT_ADD_FUNC(8, 10, sse2)
  894.  #if HAVE_AVX
  895.  IDCT_ADD_FUNC(, 10, avx)
  896. @@ -46,9 +51,18 @@ void ff_h264_idct ## NUM ## _add ## REP ## _ ## DEPTH ## _ ## OPT \
  897.                                (uint8_t *dst, const int *block_offset, \
  898.                                DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  899.  
  900. +IDCT_ADD_REP_FUNC(8, 4, 8, mmx)
  901. +IDCT_ADD_REP_FUNC(8, 4, 8, mmx2)
  902. +IDCT_ADD_REP_FUNC(8, 4, 8, sse2)
  903.  IDCT_ADD_REP_FUNC(8, 4, 10, sse2)
  904.  IDCT_ADD_REP_FUNC(8, 4, 10, avx)
  905. +IDCT_ADD_REP_FUNC(, 16, 8, mmx)
  906. +IDCT_ADD_REP_FUNC(, 16, 8, mmx2)
  907. +IDCT_ADD_REP_FUNC(, 16, 8, sse2)
  908.  IDCT_ADD_REP_FUNC(, 16, 10, sse2)
  909. +IDCT_ADD_REP_FUNC(, 16intra, 8, mmx)
  910. +IDCT_ADD_REP_FUNC(, 16intra, 8, mmx2)
  911. +IDCT_ADD_REP_FUNC(, 16intra, 8, sse2)
  912.  IDCT_ADD_REP_FUNC(, 16intra, 10, sse2)
  913.  #if HAVE_AVX
  914.  IDCT_ADD_REP_FUNC(, 16, 10, avx)
  915. @@ -60,42 +74,14 @@ IDCT_ADD_REP_FUNC(, 16intra, 10, avx)
  916.  void ff_h264_idct ## NUM ## _add ## REP ## _ ## DEPTH ## _ ## OPT \
  917.                                (uint8_t **dst, const int *block_offset, \
  918.                                DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  919. +IDCT_ADD_REP_FUNC2(, 8, 8, mmx)
  920. +IDCT_ADD_REP_FUNC2(, 8, 8, mmx2)
  921. +IDCT_ADD_REP_FUNC2(, 8, 8, sse2)
  922.  IDCT_ADD_REP_FUNC2(, 8, 10, sse2)
  923.  #if HAVE_AVX
  924.  IDCT_ADD_REP_FUNC2(, 8, 10, avx)
  925.  #endif
  926.  
  927. -void ff_h264_idct_add_mmx     (uint8_t *dst, int16_t *block, int stride);
  928. -void ff_h264_idct8_add_mmx    (uint8_t *dst, int16_t *block, int stride);
  929. -void ff_h264_idct8_add_sse2   (uint8_t *dst, int16_t *block, int stride);
  930. -void ff_h264_idct_dc_add_mmx2 (uint8_t *dst, int16_t *block, int stride);
  931. -void ff_h264_idct8_dc_add_mmx2(uint8_t *dst, int16_t *block, int stride);
  932. -
  933. -void ff_h264_idct_add16_mmx      (uint8_t *dst, const int *block_offset,
  934. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  935. -void ff_h264_idct8_add4_mmx      (uint8_t *dst, const int *block_offset,
  936. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  937. -void ff_h264_idct_add16_mmx2     (uint8_t *dst, const int *block_offset,
  938. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  939. -void ff_h264_idct_add16intra_mmx (uint8_t *dst, const int *block_offset,
  940. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  941. -void ff_h264_idct_add16intra_mmx2(uint8_t *dst, const int *block_offset,
  942. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  943. -void ff_h264_idct8_add4_mmx2     (uint8_t *dst, const int *block_offset,
  944. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  945. -void ff_h264_idct8_add4_sse2     (uint8_t *dst, const int *block_offset,
  946. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  947. -void ff_h264_idct_add8_mmx       (uint8_t **dest, const int *block_offset,
  948. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  949. -void ff_h264_idct_add8_mmx2      (uint8_t **dest, const int *block_offset,
  950. -                                  DCTELEM *block, int stride, const uint8_t nnzc[6*8]);
  951. -
  952. -void ff_h264_idct_add16_sse2     (uint8_t *dst, const int *block_offset, DCTELEM *block,
  953. -                                  int stride, const uint8_t nnzc[6*8]);
  954. -void ff_h264_idct_add16intra_sse2(uint8_t *dst, const int *block_offset, DCTELEM *block,
  955. -                                  int stride, const uint8_t nnzc[6*8]);
  956. -void ff_h264_idct_add8_sse2      (uint8_t **dest, const int *block_offset, DCTELEM *block,
  957. -                                  int stride, const uint8_t nnzc[6*8]);
  958.  void ff_h264_luma_dc_dequant_idct_mmx (DCTELEM *output, DCTELEM *input, int qmul);
  959.  void ff_h264_luma_dc_dequant_idct_sse2(DCTELEM *output, DCTELEM *input, int qmul);
  960.  
  961. @@ -350,24 +336,24 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  962.      }
  963.  #if HAVE_YASM
  964.      if (mm_flags & AV_CPU_FLAG_MMX) {
  965. -        c->h264_idct_dc_add=
  966. -        c->h264_idct_add= ff_h264_idct_add_mmx;
  967. -        c->h264_idct8_dc_add=
  968. -        c->h264_idct8_add= ff_h264_idct8_add_mmx;
  969. -
  970. -        c->h264_idct_add16     = ff_h264_idct_add16_mmx;
  971. -        c->h264_idct8_add4     = ff_h264_idct8_add4_mmx;
  972. -        c->h264_idct_add8      = ff_h264_idct_add8_mmx;
  973. -        c->h264_idct_add16intra= ff_h264_idct_add16intra_mmx;
  974. +        c->h264_idct_dc_add         =
  975. +        c->h264_idct_add            = ff_h264_idct_add_8_mmx;
  976. +        c->h264_idct8_dc_add        =
  977. +        c->h264_idct8_add           = ff_h264_idct8_add_8_mmx;
  978. +
  979. +        c->h264_idct_add16          = ff_h264_idct_add16_8_mmx;
  980. +        c->h264_idct8_add4          = ff_h264_idct8_add4_8_mmx;
  981. +        c->h264_idct_add8           = ff_h264_idct_add8_8_mmx;
  982. +        c->h264_idct_add16intra     = ff_h264_idct_add16intra_8_mmx;
  983.          c->h264_luma_dc_dequant_idct= ff_h264_luma_dc_dequant_idct_mmx;
  984.  
  985.          if (mm_flags & AV_CPU_FLAG_MMX2) {
  986. -            c->h264_idct_dc_add= ff_h264_idct_dc_add_mmx2;
  987. -            c->h264_idct8_dc_add= ff_h264_idct8_dc_add_mmx2;
  988. -            c->h264_idct_add16     = ff_h264_idct_add16_mmx2;
  989. -            c->h264_idct8_add4     = ff_h264_idct8_add4_mmx2;
  990. -            c->h264_idct_add8      = ff_h264_idct_add8_mmx2;
  991. -            c->h264_idct_add16intra= ff_h264_idct_add16intra_mmx2;
  992. +            c->h264_idct_dc_add    = ff_h264_idct_dc_add_8_mmx2;
  993. +            c->h264_idct8_dc_add   = ff_h264_idct8_dc_add_8_mmx2;
  994. +            c->h264_idct_add16     = ff_h264_idct_add16_8_mmx2;
  995. +            c->h264_idct8_add4     = ff_h264_idct8_add4_8_mmx2;
  996. +            c->h264_idct_add8      = ff_h264_idct_add8_8_mmx2;
  997. +            c->h264_idct_add16intra= ff_h264_idct_add16intra_8_mmx2;
  998.  
  999.              c->h264_v_loop_filter_chroma= ff_deblock_v_chroma_8_mmxext;
  1000.              c->h264_h_loop_filter_chroma= ff_deblock_h_chroma_8_mmxext;
  1001. @@ -398,8 +384,12 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  1002.              c->biweight_h264_pixels_tab[7]= ff_h264_biweight_4x2_mmx2;
  1003.  
  1004.              if (mm_flags&AV_CPU_FLAG_SSE2) {
  1005. -                c->h264_idct8_add = ff_h264_idct8_add_sse2;
  1006. -                c->h264_idct8_add4= ff_h264_idct8_add4_sse2;
  1007. +                c->h264_idct8_add           = ff_h264_idct8_add_8_sse2;
  1008. +
  1009. +                c->h264_idct_add16          = ff_h264_idct_add16_8_sse2;
  1010. +                c->h264_idct8_add4          = ff_h264_idct8_add4_8_sse2;
  1011. +                c->h264_idct_add8           = ff_h264_idct_add8_8_sse2;
  1012. +                c->h264_idct_add16intra     = ff_h264_idct_add16intra_8_sse2;
  1013.                  c->h264_luma_dc_dequant_idct= ff_h264_luma_dc_dequant_idct_sse2;
  1014.  
  1015.                  c->weight_h264_pixels_tab[0]= ff_h264_weight_16x16_sse2;
  1016. @@ -420,10 +410,6 @@ void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth)
  1017.                  c->h264_v_loop_filter_luma_intra = ff_deblock_v_luma_intra_8_sse2;
  1018.                  c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_8_sse2;
  1019.  #endif
  1020. -
  1021. -                c->h264_idct_add16 = ff_h264_idct_add16_sse2;
  1022. -                c->h264_idct_add8  = ff_h264_idct_add8_sse2;
  1023. -                c->h264_idct_add16intra = ff_h264_idct_add16intra_sse2;
  1024.              }
  1025.              if (mm_flags&AV_CPU_FLAG_SSSE3) {
  1026.                  c->biweight_h264_pixels_tab[0]= ff_h264_biweight_16x16_ssse3;
  1027. --
  1028. 1.7.5.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement