obligatory forgotten android fixup
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / src / Lzma86Enc.c
CommitLineData
9e052883 1/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder\r
22018-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
14int 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