add CHD support.
[pcsx_rearmed.git] / deps / lzma-16.04 / C / Lzma86Enc.c
1 /* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder\r
2 2016-05-16 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Precomp.h"\r
5 \r
6 #include <string.h>\r
7 \r
8 #include "Lzma86.h"\r
9 \r
10 #include "Alloc.h"\r
11 #include "Bra.h"\r
12 #include "LzmaEnc.h"\r
13 \r
14 #define SZE_OUT_OVERFLOW SZE_DATA_ERROR\r
15 \r
16 int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,\r
17     int level, UInt32 dictSize, int filterMode)\r
18 {\r
19   size_t outSize2 = *destLen;\r
20   Byte *filteredStream;\r
21   Bool useFilter;\r
22   int mainResult = SZ_ERROR_OUTPUT_EOF;\r
23   CLzmaEncProps props;\r
24   LzmaEncProps_Init(&props);\r
25   props.level = level;\r
26   props.dictSize = dictSize;\r
27   \r
28   *destLen = 0;\r
29   if (outSize2 < LZMA86_HEADER_SIZE)\r
30     return SZ_ERROR_OUTPUT_EOF;\r
31 \r
32   {\r
33     int i;\r
34     UInt64 t = srcLen;\r
35     for (i = 0; i < 8; i++, t >>= 8)\r
36       dest[LZMA86_SIZE_OFFSET + i] = (Byte)t;\r
37   }\r
38 \r
39   filteredStream = 0;\r
40   useFilter = (filterMode != SZ_FILTER_NO);\r
41   if (useFilter)\r
42   {\r
43     if (srcLen != 0)\r
44     {\r
45       filteredStream = (Byte *)MyAlloc(srcLen);\r
46       if (filteredStream == 0)\r
47         return SZ_ERROR_MEM;\r
48       memcpy(filteredStream, src, srcLen);\r
49     }\r
50     {\r
51       UInt32 x86State;\r
52       x86_Convert_Init(x86State);\r
53       x86_Convert(filteredStream, srcLen, 0, &x86State, 1);\r
54     }\r
55   }\r
56 \r
57   {\r
58     size_t minSize = 0;\r
59     Bool bestIsFiltered = False;\r
60 \r
61     /* passes for SZ_FILTER_AUTO:\r
62         0 - BCJ + LZMA\r
63         1 - LZMA\r
64         2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better.\r
65     */\r
66     int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1;\r
67 \r
68     int i;\r
69     for (i = 0; i < numPasses; i++)\r
70     {\r
71       size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE;\r
72       size_t outPropsSize = 5;\r
73       SRes curRes;\r
74       Bool curModeIsFiltered = (numPasses > 1 && i == numPasses - 1);\r
75       if (curModeIsFiltered && !bestIsFiltered)\r
76         break;\r
77       if (useFilter && i == 0)\r
78         curModeIsFiltered = True;\r
79       \r
80       curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed,\r
81           curModeIsFiltered ? filteredStream : src, srcLen,\r
82           &props, dest + 1, &outPropsSize, 0,\r
83           NULL, &g_Alloc, &g_Alloc);\r
84       \r
85       if (curRes != SZ_ERROR_OUTPUT_EOF)\r
86       {\r
87         if (curRes != SZ_OK)\r
88         {\r
89           mainResult = curRes;\r
90           break;\r
91         }\r
92         if (outSizeProcessed <= minSize || mainResult != SZ_OK)\r
93         {\r
94           minSize = outSizeProcessed;\r
95           bestIsFiltered = curModeIsFiltered;\r
96           mainResult = SZ_OK;\r
97         }\r
98       }\r
99     }\r
100     dest[0] = (Byte)(bestIsFiltered ? 1 : 0);\r
101     *destLen = LZMA86_HEADER_SIZE + minSize;\r
102   }\r
103   if (useFilter)\r
104     MyFree(filteredStream);\r
105   return mainResult;\r
106 }\r