spu: don't leave garbage in capture buffers
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / include / MtCoder.h
1 /* MtCoder.h -- Multi-thread Coder\r
2 2018-07-04 : Igor Pavlov : Public domain */\r
3 \r
4 #ifndef __MT_CODER_H\r
5 #define __MT_CODER_H\r
6 \r
7 #include "MtDec.h"\r
8 \r
9 EXTERN_C_BEGIN\r
10 \r
11 /*\r
12   if (    defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream\r
13   if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream\r
14 */\r
15 /* #define MTCODER__USE_WRITE_THREAD */\r
16 \r
17 #ifndef _7ZIP_ST\r
18   #define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1)\r
19   #define MTCODER__THREADS_MAX 64\r
20   #define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3)\r
21 #else\r
22   #define MTCODER__THREADS_MAX 1\r
23   #define MTCODER__BLOCKS_MAX 1\r
24 #endif\r
25 \r
26 \r
27 #ifndef _7ZIP_ST\r
28 \r
29 \r
30 typedef struct\r
31 {\r
32   ICompressProgress vt;\r
33   CMtProgress *mtProgress;\r
34   UInt64 inSize;\r
35   UInt64 outSize;\r
36 } CMtProgressThunk;\r
37 \r
38 void MtProgressThunk_CreateVTable(CMtProgressThunk *p);\r
39     \r
40 #define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; }\r
41 \r
42 \r
43 struct _CMtCoder;\r
44 \r
45 \r
46 typedef struct\r
47 {\r
48   struct _CMtCoder *mtCoder;\r
49   unsigned index;\r
50   int stop;\r
51   Byte *inBuf;\r
52 \r
53   CAutoResetEvent startEvent;\r
54   CThread thread;\r
55 } CMtCoderThread;\r
56 \r
57 \r
58 typedef struct\r
59 {\r
60   SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex,\r
61       const Byte *src, size_t srcSize, int finished);\r
62   SRes (*Write)(void *p, unsigned outBufIndex);\r
63 } IMtCoderCallback2;\r
64 \r
65 \r
66 typedef struct\r
67 {\r
68   SRes res;\r
69   unsigned bufIndex;\r
70   BoolInt finished;\r
71 } CMtCoderBlock;\r
72 \r
73 \r
74 typedef struct _CMtCoder\r
75 {\r
76   /* input variables */\r
77   \r
78   size_t blockSize;        /* size of input block */\r
79   unsigned numThreadsMax;\r
80   UInt64 expectedDataSize;\r
81 \r
82   ISeqInStream *inStream;\r
83   const Byte *inData;\r
84   size_t inDataSize;\r
85 \r
86   ICompressProgress *progress;\r
87   ISzAllocPtr allocBig;\r
88 \r
89   IMtCoderCallback2 *mtCallback;\r
90   void *mtCallbackObject;\r
91 \r
92   \r
93   /* internal variables */\r
94   \r
95   size_t allocatedBufsSize;\r
96 \r
97   CAutoResetEvent readEvent;\r
98   CSemaphore blocksSemaphore;\r
99 \r
100   BoolInt stopReading;\r
101   SRes readRes;\r
102 \r
103   #ifdef MTCODER__USE_WRITE_THREAD\r
104     CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX];\r
105   #else\r
106     CAutoResetEvent finishedEvent;\r
107     SRes writeRes;\r
108     unsigned writeIndex;\r
109     Byte ReadyBlocks[MTCODER__BLOCKS_MAX];\r
110     LONG numFinishedThreads;\r
111   #endif\r
112 \r
113   unsigned numStartedThreadsLimit;\r
114   unsigned numStartedThreads;\r
115 \r
116   unsigned numBlocksMax;\r
117   unsigned blockIndex;\r
118   UInt64 readProcessed;\r
119 \r
120   CCriticalSection cs;\r
121 \r
122   unsigned freeBlockHead;\r
123   unsigned freeBlockList[MTCODER__BLOCKS_MAX];\r
124 \r
125   CMtProgress mtProgress;\r
126   CMtCoderBlock blocks[MTCODER__BLOCKS_MAX];\r
127   CMtCoderThread threads[MTCODER__THREADS_MAX];\r
128 } CMtCoder;\r
129 \r
130 \r
131 void MtCoder_Construct(CMtCoder *p);\r
132 void MtCoder_Destruct(CMtCoder *p);\r
133 SRes MtCoder_Code(CMtCoder *p);\r
134 \r
135 \r
136 #endif\r
137 \r
138 \r
139 EXTERN_C_END\r
140 \r
141 #endif\r