obligatory forgotten android fixup
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / src / Lzma86Enc.c
1 /* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder\r
2 2018-07-04 : 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 int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,\r
15     int level, UInt32 dictSize, int filterMode)\r
16 {\r
17   size_t outSize2 = *destLen;\r
18   Byte *filteredStream;\r
19   BoolInt useFilter;\r
20   int mainResult = SZ_ERROR_OUTPUT_EOF;\r
21   CLzmaEncProps props;\r
22   LzmaEncProps_Init(&props);\r
23   props.level = level;\r
24   props.dictSize = dictSize;\r
25   \r
26   *destLen = 0;\r
27   if (outSize2 < LZMA86_HEADER_SIZE)\r
28     return SZ_ERROR_OUTPUT_EOF;\r
29 \r
30   {\r
31     int i;\r
32     UInt64 t = srcLen;\r
33     for (i = 0; i < 8; i++, t >>= 8)\r
34       dest[LZMA86_SIZE_OFFSET + i] = (Byte)t;\r
35   }\r
36 \r
37   filteredStream = 0;\r
38   useFilter = (filterMode != SZ_FILTER_NO);\r
39   if (useFilter)\r
40   {\r
41     if (srcLen != 0)\r
42     {\r
43       filteredStream = (Byte *)MyAlloc(srcLen);\r
44       if (filteredStream == 0)\r
45         return SZ_ERROR_MEM;\r
46       memcpy(filteredStream, src, srcLen);\r
47     }\r
48     {\r
49       UInt32 x86State;\r
50       x86_Convert_Init(x86State);\r
51       x86_Convert(filteredStream, srcLen, 0, &x86State, 1);\r
52     }\r
53   }\r
54 \r
55   {\r
56     size_t minSize = 0;\r
57     BoolInt bestIsFiltered = False;\r
58 \r
59     /* passes for SZ_FILTER_AUTO:\r
60         0 - BCJ + LZMA\r
61         1 - LZMA\r
62         2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better.\r
63     */\r
64     int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1;\r
65 \r
66     int i;\r
67     for (i = 0; i < numPasses; i++)\r
68     {\r
69       size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE;\r
70       size_t outPropsSize = 5;\r
71       SRes curRes;\r
72       BoolInt curModeIsFiltered = (numPasses > 1 && i == numPasses - 1);\r
73       if (curModeIsFiltered && !bestIsFiltered)\r
74         break;\r
75       if (useFilter && i == 0)\r
76         curModeIsFiltered = True;\r
77       \r
78       curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed,\r
79           curModeIsFiltered ? filteredStream : src, srcLen,\r
80           &props, dest + 1, &outPropsSize, 0,\r
81           NULL, &g_Alloc, &g_Alloc);\r
82       \r
83       if (curRes != SZ_ERROR_OUTPUT_EOF)\r
84       {\r
85         if (curRes != SZ_OK)\r
86         {\r
87           mainResult = curRes;\r
88           break;\r
89         }\r
90         if (outSizeProcessed <= minSize || mainResult != SZ_OK)\r
91         {\r
92           minSize = outSizeProcessed;\r
93           bestIsFiltered = curModeIsFiltered;\r
94           mainResult = SZ_OK;\r
95         }\r
96       }\r
97     }\r
98     dest[0] = (Byte)(bestIsFiltered ? 1 : 0);\r
99     *destLen = LZMA86_HEADER_SIZE + minSize;\r
100   }\r
101   if (useFilter)\r
102     MyFree(filteredStream);\r
103   return mainResult;\r
104 }\r