PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
libmpeg_core.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright (c) 2006-2007 Eugene Plotnikov <e-plotnikov@operamail.com>
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9# Based on refernce software of MSSG
10*/
11
12#include <stdlib.h>
13#include <stdint.h>
14#include <stdio.h>
15#include <string.h>
16#include <kernel.h>
17#include <ee_regs.h>
18#include <dma_tags.h>
19
20#include "libmpeg.h"
21#include "libmpeg_internal.h"
22
23#define READ_ONCE(x) (*(const volatile typeof(x) *)(&x))
24#define WRITE_ONCE(x, val) (*(volatile typeof(x) *)(&x) = (val))
25
27{
28 u32 source;
29 u32 dest;
30 u32 blocks;
31};
32
34{
35 u32 d4_chcr;
36 u32 d4_madr;
37 u32 d4_qwc;
38
39 u32 d3_chcr;
40 u32 d3_madr;
41 u32 d3_qwc;
42
43 u32 ipu_ctrl;
44 u32 ipu_bp;
45};
46
47static qword_t s_DMAPack[17] __attribute__((aligned(64)));
48static int (*s_SetDMA_func)(void *);
49static void *s_SetDMA_arg;
50static struct IPUState s_IPUState;
51static int *s_pEOF;
52static int s_Sema;
53static struct CSCParam s_CSCParam;
54static int s_CSCID;
55static u8 s_CSCFlag;
56static u32 s_BitsBuffered;
57static u32 s_LocalBits;
58
59static u32 s_QmIntra[16] __attribute__((aligned(16))) = {
60 0x13101008,
61 0x16161310,
62 0x16161616,
63 0x1B1A181A,
64 0x1A1A1B1B,
65 0x1B1B1A1A,
66 0x1D1D1D1B,
67 0x1D222222,
68 0x1B1B1D1D,
69 0x20201D1D,
70 0x26252222,
71 0x22232325,
72 0x28262623,
73 0x30302828,
74 0x38382E2E,
75 0x5345453A,
76};
77
78static u32 s_QmNonIntra[16] __attribute__((aligned(16))) = {
79 0x10101010,
80 0x10101010,
81 0x10101010,
82 0x10101010,
83 0x10101010,
84 0x10101010,
85 0x10101010,
86 0x10101010,
87 0x10101010,
88 0x10101010,
89 0x10101010,
90 0x10101010,
91 0x10101010,
92 0x10101010,
93 0x10101010,
94 0x10101010,
95};
96
97
98extern s32 _mpeg_dmac_handler(s32 channel, void *arg, void *addr);
99
100#define RGBA32_BLOCK_SIZE (16 * 16 * 4)
101
102#define IPU_CMD_BUSY (1ull << 63)
103
104#define IPU_CTRL_BUSY (1 << 31)
105#define IPU_CTRL_RST (1 << 30)
106#define IPU_CTRL_MP1 (1 << 23)
107#define IPU_CTRL_ECD (1 << 14)
108
109// clang-format off
110#define IPU_COMMAND_BCLR 0x00000000
111#define IPU_COMMAND_IDEC 0x10000000
112#define IPU_COMMAND_BDEC 0x20000000
113#define IPU_COMMAND_VDEC 0x30000000
114#define IPU_COMMAND_VDEC_MBAI 0x00000000
115#define IPU_COMMAND_VDEC_MBTYPE 0x04000000
116#define IPU_COMMAND_VDEC_MCODE 0x08000000
117#define IPU_COMMAND_VDEC_DMV 0x0C000000
118#define IPU_COMMAND_FDEC 0x40000000
119#define IPU_COMMAND_SETIQ 0x50000000
120#define IPU_COMMAND_SETVQ 0x60000000
121#define IPU_COMMAND_CSC 0x70000000
122#define IPU_COMMAND_PACK 0x80000000
123#define IPU_COMMAND_SETTH 0x90000000
124// clang-format on
125
126void _MPEG_Initialize(_MPEGContext *mc, int (*data_cb)(void *), void *cb_user, int *eof_flag)
127{
128 (void)mc;
129 ee_sema_t sema;
130
131 *R_EE_IPU_CTRL = IPU_CTRL_RST;
132 while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY)
133 ;
134 *R_EE_IPU_CMD = IPU_COMMAND_BCLR;
135 while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY)
136 ;
137 *R_EE_IPU_CTRL |= IPU_CTRL_MP1;
138 *R_EE_D3_QWC = 0;
139 *R_EE_D4_QWC = 0;
140 s_SetDMA_func = data_cb;
141 s_SetDMA_arg = cb_user;
142 s_pEOF = eof_flag;
143 *s_pEOF = 0;
144
145 memset(&sema, 0, sizeof(sema));
146 sema.init_count = 0;
147 sema.max_count = 1;
148 sema.option = 0;
149 s_Sema = CreateSema(&sema);
150 s_CSCID = AddDmacHandler2(3, _mpeg_dmac_handler, 0, &s_CSCParam);
151 s_BitsBuffered = 0;
152 s_LocalBits = 0;
153}
154
155void _MPEG_Destroy(void)
156{
157 while (READ_ONCE(s_CSCFlag) != 0)
158 ;
159 RemoveDmacHandler(3, s_CSCID);
160 DeleteSema(s_Sema);
161}
162
163void _ipu_suspend(void)
164{
165 int oldintr;
166 u32 enabler;
167
168 /* Stop ch 4 */
169 oldintr = DIntr();
170 enabler = *R_EE_D_ENABLER;
171
172 *R_EE_D_ENABLEW = enabler | 0x10000;
173 EE_SYNCL();
174
175 *R_EE_D4_CHCR &= ~0x100;
176 s_IPUState.d4_chcr = *R_EE_D4_CHCR;
177 s_IPUState.d4_madr = *R_EE_D4_MADR;
178 s_IPUState.d4_qwc = *R_EE_D4_QWC;
179
180 *R_EE_D_ENABLEW = enabler;
181 if (oldintr) {
182 EIntr();
183 }
184
185 /* Wait for IPU output fifo to drain */
186 while (*R_EE_IPU_CTRL & 0xf0)
187 ;
188
189 /* Stop ch 3 */
190 oldintr = DIntr();
191 enabler = *R_EE_D_ENABLER;
192
193 *R_EE_D_ENABLEW = enabler | 0x10000;
194 EE_SYNCL();
195
196 *R_EE_D3_CHCR &= ~0x100;
197 s_IPUState.d3_chcr = *R_EE_D3_CHCR;
198 s_IPUState.d3_madr = *R_EE_D3_MADR;
199 s_IPUState.d3_qwc = *R_EE_D3_QWC;
200 s_IPUState.ipu_ctrl = *R_EE_IPU_CTRL;
201 s_IPUState.ipu_bp = *R_EE_IPU_BP;
202
203 *R_EE_D_ENABLEW = enabler;
204 if (oldintr) {
205 EIntr();
206 }
207}
208
209void _MPEG_Suspend(void)
210{
211 while (READ_ONCE(s_CSCFlag) != 0)
212 ;
213
214 _ipu_suspend();
215}
216
217void _ipu_resume(void)
218{
219 if (s_IPUState.d3_qwc != 0) {
220 *R_EE_D3_MADR = s_IPUState.d3_madr;
221 *R_EE_D3_QWC = s_IPUState.d3_qwc;
222 *R_EE_D3_CHCR = s_IPUState.d3_chcr | 0x100;
223 }
224 u32 qw_to_reinsert = (s_IPUState.ipu_bp >> 16 & 3) + (s_IPUState.ipu_bp >> 8 & 0xf);
225 u32 actual_qwc = s_IPUState.d4_qwc + qw_to_reinsert;
226 if (actual_qwc != 0) {
227 *R_EE_IPU_CMD = IPU_COMMAND_BCLR | (s_IPUState.ipu_bp & 0x7f);
228 while (*R_EE_IPU_CMD & IPU_CMD_BUSY)
229 ;
230 *R_EE_IPU_CTRL = s_IPUState.ipu_ctrl;
231 *R_EE_D4_MADR = s_IPUState.d4_madr - (qw_to_reinsert * 16);
232 *R_EE_D4_QWC = actual_qwc;
233 *R_EE_D4_CHCR = s_IPUState.d4_chcr | 0x100;
234 }
235}
236
237void _MPEG_Resume(void)
238{
239 _ipu_resume();
240}
241
242s32 _mpeg_dmac_handler(s32 channel, void *arg, void *addr)
243{
244 (void)channel;
245 (void)addr;
246
247 struct CSCParam *cp = arg;
248
249 if (cp->blocks == 0) {
250 iDisableDmac(3);
251 iSignalSema(s_Sema);
252 WRITE_ONCE(s_CSCFlag, 0);
253 return -1;
254 }
255
256 u32 mbc = cp->blocks;
257 if (mbc > 0x3ff) {
258 mbc = 0x3ff;
259 }
260 *R_EE_D3_MADR = cp->dest;
261 *R_EE_D4_MADR = cp->source;
262 cp->source += mbc * sizeof(_MPEGMacroBlock8);
263 cp->dest += mbc * RGBA32_BLOCK_SIZE;
264 cp->blocks = cp->blocks - mbc;
265 *R_EE_D3_QWC = (mbc * sizeof(_MPEGMacroBlock8)) >> 4;
266 *R_EE_D4_QWC = (mbc * RGBA32_BLOCK_SIZE) >> 4;
267 *R_EE_D4_CHCR = 0x101;
268 *R_EE_IPU_CMD = IPU_COMMAND_CSC | mbc;
269 *R_EE_D3_CHCR = 0x100;
270
271 ExitHandler();
272 return -1;
273}
274
275int _MPEG_CSCImage(void *source, void *dest, int mbcount)
276{
277 _ipu_suspend();
278 *R_EE_IPU_CMD = IPU_COMMAND_BCLR;
279 *R_EE_D_STAT = 8; // ack ch3
280 int mbc = mbcount;
281 if (mbc > 0x3ff) {
282 mbc = 0x3ff;
283 }
284
285 *R_EE_D3_MADR = (u32)dest;
286 *R_EE_D4_MADR = (u32)source;
287
288 s_CSCParam.source = (u32)source + mbc * sizeof(_MPEGMacroBlock8);
289 s_CSCParam.dest = (u32)dest + mbc * RGBA32_BLOCK_SIZE;
290 s_CSCParam.blocks = mbcount - mbc;
291
292 *R_EE_D4_QWC = (mbc * sizeof(_MPEGMacroBlock8)) >> 4;
293 *R_EE_D3_QWC = (mbc * RGBA32_BLOCK_SIZE) >> 4;
294 EnableDmac(3);
295 *R_EE_D4_CHCR = 0x101;
296 *R_EE_IPU_CMD = IPU_COMMAND_CSC | mbc;
297 *R_EE_D3_CHCR = 0x100;
298
299 WRITE_ONCE(s_CSCFlag, 1);
300 WaitSema(s_Sema);
301 _ipu_resume();
302 return mbc;
303}
304
305static int _ipu_bits_in_fifo()
306{
307 u32 bp_reg;
308 u32 bp, ifc, fp;
309
310 bp_reg = *R_EE_IPU_BP;
311 bp = bp_reg & 0x7f;
312 ifc = (bp_reg >> 8) & 0xf;
313 fp = (bp_reg >> 16) & 0x3;
314
315 return (ifc << 7) + (fp << 7) - bp;
316}
317
318static int _ipu_needs_bits()
319{
320 return _ipu_bits_in_fifo() < 32;
321}
322
323static int _req_data()
324{
325 if (*R_EE_D4_QWC == 0) {
326 if (s_SetDMA_func(s_SetDMA_arg) == 0) {
327 s_BitsBuffered = 32;
328 s_LocalBits = _MPEG_CODE_SEQ_END;
329 *s_pEOF = 1;
330 return 1;
331 }
332 }
333
334 return 0;
335}
336
337void _ipu_sync(void)
338{
339 u32 ctrl = *R_EE_IPU_CTRL;
340 int i = 0;
341
342 while ((ctrl & IPU_CTRL_ECD) == 0) {
343 if (_ipu_needs_bits()) {
344 if (_req_data()) {
345 return;
346 }
347 }
348
349 // Are we stuck? try throwing more data at the problem
350 if (i > 500) {
351 if (_req_data()) {
352 return;
353 }
354 }
355
356 if ((ctrl & IPU_CTRL_BUSY) == 0) {
357 return;
358 }
359
360 ctrl = *R_EE_IPU_CTRL;
361 i++;
362 }
363}
364
365u32 _ipu_sync_data(void)
366{
367 u32 ctrl = *R_EE_IPU_CTRL;
368 u64 cmd = *R_EE_IPU_CMD;
369 int i = 0;
370
371 while ((ctrl & IPU_CTRL_ECD) == 0) {
372 if (_ipu_needs_bits()) {
373 if (_req_data()) {
374 return _MPEG_CODE_SEQ_END;
375 }
376 }
377
378 // Are we stuck? try throwing more data at the problem
379 if (i > 500) {
380 if (_req_data()) {
381 return _MPEG_CODE_SEQ_END;
382 }
383 }
384
385 if ((cmd & IPU_CMD_BUSY) == 0) {
386 return cmd;
387 }
388
389 cmd = *R_EE_IPU_CMD;
390 ctrl = *R_EE_IPU_CTRL;
391 i++;
392 }
393
394 return cmd;
395}
396
397unsigned int _ipu_get_bits(unsigned int bits)
398{
399 u32 ret;
400
401 _ipu_sync();
402 if (s_BitsBuffered < bits) {
403 *R_EE_IPU_CMD = IPU_COMMAND_FDEC;
404 s_LocalBits = _ipu_sync_data();
405 s_BitsBuffered = 32;
406 }
407 *R_EE_IPU_CMD = IPU_COMMAND_FDEC | bits;
408 s_BitsBuffered = s_BitsBuffered - bits;
409 ret = s_LocalBits >> ((32 - bits) & 0x1f);
410 s_LocalBits = s_LocalBits << (bits & 0x1f);
411
412 return ret;
413}
414
415
416unsigned int _MPEG_GetBits(unsigned int bits)
417{
418 return _ipu_get_bits(bits);
419}
420
421unsigned int _ipu_show_bits(unsigned int bits)
422{
423 if (s_BitsBuffered < bits) {
424 _ipu_sync();
425 *R_EE_IPU_CMD = IPU_COMMAND_FDEC;
426 s_LocalBits = _ipu_sync_data();
427 s_BitsBuffered = 32;
428 }
429
430 return s_LocalBits >> ((32 - bits) & 0x1f);
431}
432
433unsigned int _MPEG_ShowBits(unsigned int bits)
434{
435 return _ipu_show_bits(bits);
436}
437
438void _ipu_align_bits(void)
439{
440 _ipu_sync();
441 u32 var3 = -(*R_EE_IPU_BP & 7) & 7;
442 if (var3 != 0) {
443 _MPEG_GetBits(var3);
444 }
445}
446
447void _MPEG_AlignBits(void)
448{
449 _ipu_align_bits();
450}
451
452unsigned int _MPEG_NextStartCode(void)
453{
454 _MPEG_AlignBits();
455 while (_MPEG_ShowBits(24) != 1) {
456 _MPEG_GetBits(8);
457 }
458
459 return _MPEG_ShowBits(32);
460}
461
462void _MPEG_SetDefQM(int arg0)
463{
464 (void)arg0;
465 qword_t *q;
466 int i;
467
468 _ipu_suspend();
469 *R_EE_IPU_CMD = IPU_COMMAND_BCLR;
470 while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY)
471 ;
472
473 q = (qword_t *)s_QmIntra;
474 for (i = 0; i < 4; i++) {
475 __asm__ volatile(
476 "lq $2, 0(%0) \n"
477 "sq $2, 0(%1) \n"
478 :
479 : "d"(&q[i]), "d"(A_EE_IPU_in_FIFO)
480 : "2");
481 }
482
483 *R_EE_IPU_CMD = IPU_COMMAND_SETIQ;
484 while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY)
485 ;
486
487 q = (qword_t *)s_QmNonIntra;
488 for (i = 0; i < 4; i++) {
489 __asm__ volatile(
490 "lq $2, 0(%0) \n"
491 "sq $2, 0(%1) \n"
492 :
493 : "d"(&q[i]), "d"(A_EE_IPU_in_FIFO)
494 : "2");
495 }
496
497 *R_EE_IPU_CMD = IPU_COMMAND_SETIQ | 0x08000000;
498 while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY)
499 ;
500
501 _ipu_resume();
502}
503
504void _MPEG_SetQM(int iqm)
505{
506 _ipu_sync();
507 *R_EE_IPU_CMD = IPU_COMMAND_SETIQ | iqm << 27;
508 s_BitsBuffered = 0;
509}
510
511int _MPEG_GetMBAI(void)
512{
513 u32 mbai = 0, ret;
514 _ipu_sync();
515 while (1) {
516 *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MBAI;
517 ret = _ipu_sync_data() & 0xffff;
518
519 if (ret == 0) {
520 return 0;
521 }
522
523 // Stuffing
524 if (ret == 0x22) {
525 }
526
527 // MB escape
528 if (ret == 0x23) {
529 mbai += 0x21;
530 }
531
532 if (ret < 0x22) {
533 mbai += ret;
534 break;
535 }
536 }
537
538 s_BitsBuffered = 32;
539 s_LocalBits = *R_EE_IPU_TOP;
540 return mbai;
541}
542
543int _MPEG_GetMBType(void)
544{
545 _ipu_sync();
546 *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MBTYPE;
547 u32 ret = _ipu_sync_data();
548 if (ret != 0) {
549 ret &= 0xffff;
550 s_BitsBuffered = 32;
551 s_LocalBits = *R_EE_IPU_TOP;
552 }
553 return ret;
554}
555
556int _MPEG_GetMotionCode(void)
557{
558 short mcode;
559 u32 ret;
560
561 _ipu_sync();
562 *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MCODE;
563 ret = _ipu_sync_data();
564
565 if (ret == 0) {
566 return -32768;
567 }
568
569 s_BitsBuffered = 32;
570 s_LocalBits = *R_EE_IPU_TOP;
571
572 mcode = (short)ret;
573
574 return mcode;
575}
576int _MPEG_GetDMVector(void)
577{
578 u32 ret;
579
580 _ipu_sync();
581 *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_DMV;
582 ret = _ipu_sync_data() & 0xffff;
583 s_BitsBuffered = 32;
584 s_LocalBits = *R_EE_IPU_TOP;
585 return ret;
586}
587
588void _MPEG_SetIDCP(void)
589{
590 unsigned int var1 = _MPEG_GetBits(2);
591 *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x30000) | var1 << 0x10;
592}
593
594void _MPEG_SetQSTIVFAS(void)
595{
596 unsigned int qst = _MPEG_GetBits(1);
597 unsigned int ivf = _MPEG_GetBits(1);
598 unsigned int as = _MPEG_GetBits(1);
599 *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x700000) | qst << 22 | ivf << 21 | as << 20;
600}
601
602void _MPEG_SetPCT(unsigned int arg0)
603{
604 _ipu_sync();
605 *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x07000000) | arg0 << 0x18;
606}
607
608void _MPEG_BDEC(int mbi, int dcr, int dt, int qsc, void *spaddr)
609{
610 *R_EE_D3_MADR = ((u32)spaddr & ~0xf0000000) | 0x80000000;
611 *R_EE_D3_QWC = 0x30;
612 *R_EE_D3_CHCR = 0x100;
613 _ipu_sync();
614 *R_EE_IPU_CMD = IPU_COMMAND_BDEC | mbi << 27 | dcr << 26 | dt << 25 | qsc << 16;
615}
616
617int _MPEG_WaitBDEC(void)
618{
619 int oldintr;
620
621 while (1) {
622 _ipu_sync();
623 if ((*s_pEOF != 0)) {
624 break;
625 }
626
627 if (*R_EE_IPU_CTRL & IPU_CTRL_ECD) {
628 break;
629 }
630
631 if (*R_EE_D3_QWC == 0) {
632 s_BitsBuffered = 32;
633 s_LocalBits = *R_EE_IPU_TOP;
634 return 1;
635 }
636 }
637
638 _ipu_suspend();
639 *R_EE_IPU_CTRL = IPU_CTRL_RST;
640 _ipu_resume();
641
642 oldintr = DIntr();
643 *R_EE_D_ENABLEW = *R_EE_D_ENABLER | 0x10000;
644 *R_EE_D3_CHCR = 0;
645 *R_EE_D_ENABLEW = *R_EE_D_ENABLER & ~0x10000;
646 if (oldintr) {
647 EIntr();
648 }
649 *R_EE_D3_QWC = 0;
650 s_BitsBuffered = 0;
651 s_LocalBits = 0;
652 return 0;
653}
654
655void _MPEG_dma_ref_image(_MPEGMacroBlock8 *mb, _MPEGMotion *motions, s64 n_motions, int width)
656{
657 const u32 mbwidth = width * sizeof(*mb);
658 qword_t *q;
659 int i;
660
661 if (n_motions <= 0) {
662 return;
663 }
664
665 while (*R_EE_D9_CHCR & 0x100)
666 ;
667
668 *R_EE_D9_QWC = 0;
669 *R_EE_D9_SADR = (u32)mb & 0xFFFFFFF;
670 *R_EE_D9_TADR = (u32)s_DMAPack;
671
672 q = UNCACHED_SEG(s_DMAPack);
673 for (i = 0; i < n_motions; i++) {
674 DMATAG_REF(q, 0x30, (u32)motions[i].m_pSrc, 0, 0, 0);
675 q++;
676 DMATAG_REF(q, 0x30, (u32)motions[i].m_pSrc + mbwidth, 0, 0, 0);
677 q++;
678
679 motions[i].m_pSrc = (unsigned char *)mb;
680 mb += 4;
681 }
682
683 DMATAG_REFE(q, 0, 0, 0, 0, 0);
684 motions[i].MC_Luma = NULL;
685
686 EE_SYNCL();
687 *R_EE_D9_CHCR = 0x105;
688}
689
690/*
691// TODO: verify delay slots
692void _MPEG_do_mc(_MPEGMotion *arg0)
693{
694 int var0 = 16; // addiu $v0, $zero, 16
695 u8 *arg1 = arg0->m_pSrc; // lw $a1, 0($a0)
696 // addiu $sp, $sp, -16
697 u16 *arg2 = (u16 *)arg0->m_pDstY; // lw $a2, 4($a0)
698 int arg3 = arg0->m_X; // lw $a3, 12($a0)
699 int tmp0 = arg0->m_Y; // lw $t0, 16($a0)
700 int tmp1 = arg0->m_H; // lw $t1, 20($a0)
701 int tmp2 = arg0->m_fInt; // lw $t2, 24($a0)
702 int tmp4 = arg0->m_Field; // lw $t4, 28($a0)
703 // lw $t5, 32($a0) <-- MC_Luma
704 tmp0 -= tmp4; // subu $t0, $t0, $t4
705 tmp4 <<= 4; // sll $t4, $t4, 4
706 arg1 += tmp4; // addu $a1, $a1, $t4
707 int var1 = var0 - tmp0; // subu $v1, $v0, $t0
708 int tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2
709 var1 >>= tmp2; // srlv $v1, $v1, $t2
710 int ta = tmp0 << 4; // sll $at, $t0, 4
711 // sw $ra, 0($sp)
712 arg1 += ta; // addu $a1, $a1, $at
713 ta = tmp1 - var1; // subu $at, $t1, $v1
714 arg0->MC_Luma(arg1, arg2, arg3, tmp3, var1, ta); // jalr $t5
715 arg1 = arg0->m_pSrc; // lw $a1, 0($a0)
716 arg2 = (u16 *)arg0->m_pDstCbCr; // lw $a2, 8($a0)
717 // lw $t5, 36($a0) <-- MC_Chroma
718 arg1 += 256; // addiu $a1, $a1, 256
719 tmp4 >>= 1; // srl $t4, $t4, 1
720 arg3 >>= 1; // srl $a3, $a3, 1
721 tmp0 >>= 1; // srl $t0, $t0, 1
722 tmp1 >>= 1; // srl $t1, $t1, 1
723 // lw $ra, 0($sp)
724 tmp0 >>= tmp2; // srlv $t0, $t0, $t2
725 arg1 += tmp4; // addu $a1, $a1, $t4
726 var0 = 8; // addiu $v0, $zero, 8
727 tmp0 <<= tmp2; // sllv $t0, $t0, $t2
728 var1 = var0 - tmp0; // subu $v1, $v0, $t0
729 tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2
730 var1 >>= tmp2; // srlv $v1, $v1, $t2
731 ta = tmp0 << 3; // sll $at, $t0, 3
732 arg1 += ta; // addu $a1, $a1, $at
733 ta = tmp1 - var1; // subu $at, $t1, $v1
734 arg0->MC_Chroma(arg1, arg2, arg3, tmp3, var1, ta); // jr $t5
735 // addiu $sp, $sp, 16
736}
737*/
#define DMATAG_REF(Q, QWC, ADDR, SPR, W2, W3)
Definition dma_tags.h:93
#define DMATAG_REFE(Q, QWC, ADDR, SPR, W2, W3)
Definition dma_tags.h:105
#define R_EE_D9_CHCR
Definition ee_regs.h:438
#define R_EE_D9_SADR
Definition ee_regs.h:446
#define R_EE_D_ENABLER
Definition ee_regs.h:560
#define R_EE_IPU_CMD
Definition ee_regs.h:238
#define R_EE_D4_MADR
Definition ee_regs.h:404
#define R_EE_D3_QWC
Definition ee_regs.h:400
#define R_EE_D3_MADR
Definition ee_regs.h:398
#define R_EE_D4_CHCR
Definition ee_regs.h:402
#define R_EE_IPU_TOP
Definition ee_regs.h:244
#define R_EE_D3_CHCR
Definition ee_regs.h:396
#define R_EE_IPU_CTRL
Definition ee_regs.h:240
#define R_EE_D4_QWC
Definition ee_regs.h:406
#define R_EE_D9_TADR
Definition ee_regs.h:444
#define R_EE_D_ENABLEW
Definition ee_regs.h:562
#define R_EE_D9_QWC
Definition ee_regs.h:442
#define R_EE_D_STAT
Definition ee_regs.h:450
#define R_EE_IPU_BP
Definition ee_regs.h:242
typedef __attribute__
Definition tlbfunc.c:60