add CHD support.
[pcsx_rearmed.git] / deps / lzma-16.04 / C / Lzma86Enc.c
CommitLineData
ce188d4d 1/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder\r
22016-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
16int 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