Skip to content

Commit 8bf5e72

Browse files
author
Evgeniy Sidenko
committed
optimizations
1 parent 6ac2c9b commit 8bf5e72

11 files changed

Lines changed: 67 additions & 27 deletions

File tree

src/main/java/openize/heic/decoder/Cabac.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ final IntraPredMode read_rem_intra_luma_pred_mode()
458458
{
459459
// FL: cMax: 31
460460
// bin 1-5+: bypass
461-
return IntraPredMode.values()[decodeFixedLengthBypass(5)];
461+
return IntraPredMode.get(decodeFixedLengthBypass(5));
462462
}
463463

464464
final byte read_intra_chroma_pred_mode()
@@ -1175,10 +1175,9 @@ else if ((sps.sps_scc_ext != null && sps.sps_scc_ext.sps_palette_predictor_initi
11751175

11761176
private void initializationOfContextVariables(int SliceQpY, int initType)
11771177
{
1178-
final CabacType[] cabacTypes = CabacType.values();
1178+
final CabacType[] cabacTypes = CabacType.getValues();
11791179
for (int cabacType = 0; cabacType < 40; cabacType++)
11801180
{
1181-
11821181
byte[] init_value = getinit_valueByType(cabacTypes[cabacType], initType);
11831182
contextTable[cabacType] = new ContextVariable[init_value.length];
11841183

src/main/java/openize/heic/decoder/CabacType.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,14 @@ public enum CabacType
5353
palette_transpose_flag,
5454
cu_qp_delta_abs,
5555
cu_chroma_qp_offset_flag,
56-
cu_chroma_qp_offset_idx,
56+
cu_chroma_qp_offset_idx;
57+
58+
public static CabacType[] getValues()
59+
{
60+
return _values;
61+
}
62+
63+
private static final CabacType[] _values = CabacType.values();
5764
}
5865

5966

src/main/java/openize/heic/decoder/HeicPicture.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,6 @@ else if (yPb - 1 < ((yPb >> (sps.getCtbLog2SizeY() & 0xFF)) << (sps.getCtbLog2Si
314314

315315
if (candIntraPredModeB == candIntraPredModeA)
316316
{
317-
final IntraPredMode[] intraPredModes = IntraPredMode.values();
318317
if (candIntraPredModeA.ordinal() < 2)
319318
{
320319
candModeList[0] = IntraPredMode.INTRA_PLANAR;
@@ -324,8 +323,8 @@ else if (yPb - 1 < ((yPb >> (sps.getCtbLog2SizeY() & 0xFF)) << (sps.getCtbLog2Si
324323
else
325324
{
326325
candModeList[0] = candIntraPredModeA;
327-
candModeList[1] = intraPredModes[(2 + ((candIntraPredModeA.ordinal() + 29) % 32))];
328-
candModeList[2] = intraPredModes[(2 + (((candIntraPredModeA.ordinal() - 2) + 1) % 32))];
326+
candModeList[1] = IntraPredMode.get((2 + ((candIntraPredModeA.ordinal() + 29) % 32)));
327+
candModeList[2] = IntraPredMode.get((2 + (((candIntraPredModeA.ordinal() - 2) + 1) % 32)));
329328
}
330329
}
331330
else
@@ -389,7 +388,7 @@ final IntraPredMode setIntraPredModeY(int xPb, int yPb, int pbSize, IntraPredMod
389388
if (intMode >= candModeList[i].ordinal())
390389
intMode++;
391390
}
392-
mode = IntraPredMode.values()[intMode];
391+
mode = IntraPredMode.get(intMode);
393392
}
394393

395394
for (int i = xPb; i < xPb + pbSize; i++)

src/main/java/openize/heic/decoder/ImageFrameType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public enum ImageFrameType /*: uint*/
7474

7575
public static ImageFrameType codeToType(long code)
7676
{
77-
for (ImageFrameType type : ImageFrameType.values())
77+
for (ImageFrameType type : _values)
7878
{
7979
if (type.code == code)
8080
{
@@ -89,4 +89,6 @@ public long getCode()
8989
{
9090
return code;
9191
}
92+
93+
private static final ImageFrameType[] _values = ImageFrameType.values();
9294
}

src/main/java/openize/heic/decoder/IntraPredMode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,11 @@ static IntraPredMode[][] createArray2D(int count1, int count2)
7070
}
7171
return array;
7272
}
73+
74+
public static IntraPredMode get(int id)
75+
{
76+
return _values[id];
77+
}
78+
79+
private static final IntraPredMode[] _values = IntraPredMode.values();
7380
}

src/main/java/openize/heic/decoder/NalUnitType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public enum NalUnitType
156156

157157
public static NalUnitType codeToType(long unitCode)
158158
{
159-
for (NalUnitType type : NalUnitType.values())
159+
for (NalUnitType type : _values)
160160
{
161161
if (type.unitCode == unitCode)
162162
{
@@ -178,4 +178,6 @@ public String toString()
178178
{
179179
return name() + "(" + unitCode + ")";
180180
}
181+
182+
private static final NalUnitType[] _values = NalUnitType.values();
181183
}

src/main/java/openize/heic/decoder/SliceType.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ enum SliceType /*: byte*/
1616
{
1717
B, /* = 0 */
1818
P, /* = 1 */
19-
I, /* = 2 */
20-
}
19+
I; /* = 2 */
2120

21+
public static SliceType get(long code)
22+
{
23+
switch ((int)code)
24+
{
25+
case 0:
26+
return B;
27+
case 1:
28+
return P;
29+
case 2:
30+
return I;
31+
default:
32+
throw new IllegalArgumentException(String.valueOf(code));
33+
}
34+
}
35+
}

src/main/java/openize/heic/decoder/YuvConverter.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ public YuvConverter(HeicImageFrame picture)
6161
public final byte[][][] getRgbaByteArray()
6262
{
6363
/*UInt32*/
64-
long width = picture.hvcConfig.getSPS().pic_width_in_luma_samples;
64+
int width = (int) (picture.hvcConfig.getSPS().pic_width_in_luma_samples & 0xFFFFFFFFL);
6565
/*UInt32*/
66-
long height = picture.hvcConfig.getSPS().pic_height_in_luma_samples;
66+
int height = (int) (picture.hvcConfig.getSPS().pic_height_in_luma_samples & 0xFFFFFFFFL);
6767

68-
byte[][][] pixels = new byte[(int) (width & 0xFFFFFFFFL)][(int) (height & 0xFFFFFFFFL)][4];
68+
byte[][][] pixels = new byte[width][height][4];
6969

7070
if (picture.rawPixels == null)
7171
return pixels;
@@ -82,10 +82,16 @@ public final byte[][][] getRgbaByteArray()
8282
// conversion to 8 bit
8383
double BitKoefY = 256.0 / (1 << (picture.hvcConfig.getSPS().getBitDepthY() & 0xFF));
8484
double BitKoefC = 256.0 / (1 << (picture.hvcConfig.getSPS().getBitDepthC() & 0xFF));
85-
86-
for (int row = 0; row < (height & 0xFFFFFFFFL); row++)
85+
final boolean isNotChroma = (picture.hvcConfig.getSPS()
86+
.getChromaArrayType() & 0xFFFFFFFFL) == 0;
87+
final int configSpsSubWidthC = picture.hvcConfig.getSPS()
88+
.getSubWidthC() & 0xFF;
89+
final int configSpsSubHeightC = picture.hvcConfig.getSPS()
90+
.getSubHeightC() & 0xFF;
91+
92+
for (int row = 0; row < height; row++)
8793
{
88-
for (int col = 0; col < (width & 0xFFFFFFFFL); col++)
94+
for (int col = 0; col < width; col++)
8995
{
9096
Y = picture.rawPixels[0][col][row] & 0xFFFF;
9197

@@ -94,16 +100,16 @@ public final byte[][][] getRgbaByteArray()
94100
Y = tvRangeCoeffLuma * (Y - lumaOffset);
95101
}
96102

97-
if ((picture.hvcConfig.getSPS().getChromaArrayType() & 0xFFFFFFFFL) == 0)
103+
if (isNotChroma)
98104
{
99105
R = Y;
100106
G = Y;
101107
B = Y;
102108
}
103109
else
104110
{
105-
Cb = (picture.rawPixels[1][col / (picture.hvcConfig.getSPS().getSubWidthC() & 0xFF)][row / (picture.hvcConfig.getSPS().getSubHeightC() & 0xFF)] & 0xFFFF) - chromaHalfRange;
106-
Cr = (picture.rawPixels[2][col / (picture.hvcConfig.getSPS().getSubWidthC() & 0xFF)][row / (picture.hvcConfig.getSPS().getSubHeightC() & 0xFF)] & 0xFFFF) - chromaHalfRange;
111+
Cb = (picture.rawPixels[1][col / configSpsSubWidthC][row / configSpsSubHeightC] & 0xFFFF) - chromaHalfRange;
112+
Cr = (picture.rawPixels[2][col / configSpsSubWidthC][row / configSpsSubHeightC] & 0xFFFF) - chromaHalfRange;
107113

108114
if (!fullRangeFlag)
109115
{
@@ -191,12 +197,14 @@ private void defineCoefficients(vui_parameters vui_parameters)
191197
double zB = 1 - (p.xB + p.yB);
192198
double zW = 1 - (p.xW + p.yW);
193199

194-
double denom = p.yW * (p.xR * (p.yG * zB - p.yB * zG) + p.xG * (p.yB * zR - p.yR * zB) + p.xB * (p.yR * zG - p.yG * zR));
200+
final double tmpGmB_BmG = p.yG * zB - p.yB * zG;
201+
final double tmpRmG_GmR = p.yR * zG - p.yG * zR;
202+
double denom = p.yW * (p.xR * tmpGmB_BmG + p.xG * (p.yB * zR - p.yR * zB) + p.xB * tmpRmG_GmR);
195203

196204
try
197205
{
198-
kr = (p.yR * (p.xW * (p.yG * zB - p.yB * zG) + p.yW * (p.xB * zG - p.xG * zB) + zW * (p.xG * p.yB - p.xB * p.yG))) / denom;
199-
kb = (p.yB * (p.xW * (p.yR * zG - p.yG * zR) + p.yW * (p.xG * zR - p.xR * zG) + zW * (p.xR * p.yG - p.xG * p.yR))) / denom;
206+
kr = (p.yR * (p.xW * tmpGmB_BmG + p.yW * (p.xB * zG - p.xG * zB) + zW * (p.xG * p.yB - p.xB * p.yG))) / denom;
207+
kb = (p.yB * (p.xW * tmpRmG_GmR + p.yW * (p.xG * zR - p.xR * zG) + zW * (p.xR * p.yG - p.xG * p.yR))) / denom;
200208
}
201209
catch (java.lang.RuntimeException e)
202210
{

src/main/java/openize/heic/decoder/coding_unit.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ else if ((sps.getChromaArrayType() & 0xFFFFFFFFL) != 0)
175175

176176
if ((sps.getChromaArrayType() & 0xFFFFFFFFL) == 2)
177177
{
178-
IntraPredModeC = IntraPredMode.values()[(IntraPredModeChroma422Map[IntraPredModeC.ordinal()] & 0xFF)];
178+
IntraPredModeC = IntraPredMode.get((IntraPredModeChroma422Map[IntraPredModeC.ordinal()] & 0xFF));
179179
}
180180

181181
picture.setIntraPredModeC(x0, y0, 1 << log2CbSize, IntraPredModeC);

src/main/java/openize/heic/decoder/slice_segment_header.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public slice_segment_header(
110110
for (int i = 0; i < (pps.num_extra_slice_header_bits & 0xFF); i++)
111111
slice_reserved_flag[i] = stream.readFlag();
112112

113-
slice_type = SliceType.values()[(int) stream.readUev()];
113+
slice_type = SliceType.get(stream.readUev());
114114

115115
if (slice_type != SliceType.I)
116116
{

0 commit comments

Comments
 (0)