Coverage Report

Created: 2025-06-13 06:34

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