DvbParser.java 源代码
package com.mbridge.msdk.playercommon.exoplayer2.text.dvb;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Region;
import android.util.Log;
import android.util.SparseArray;
import androidx.core.view.ViewCompat;
import com.mbridge.msdk.playercommon.exoplayer2.text.Cue;
import com.mbridge.msdk.playercommon.exoplayer2.util.ParsableBitArray;
import com.mbridge.msdk.playercommon.exoplayer2.util.Util;
import com.umeng.analytics.pro.bx;
import com.x8zs.morgoo.droidplugin.hook.handle.PluginCallback;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
final class DvbParser {
private static final int DATA_TYPE_24_TABLE_DATA = 32;
private static final int DATA_TYPE_28_TABLE_DATA = 33;
private static final int DATA_TYPE_2BP_CODE_STRING = 16;
private static final int DATA_TYPE_48_TABLE_DATA = 34;
private static final int DATA_TYPE_4BP_CODE_STRING = 17;
private static final int DATA_TYPE_8BP_CODE_STRING = 18;
private static final int DATA_TYPE_END_LINE = 240;
private static final int OBJECT_CODING_PIXELS = 0;
private static final int OBJECT_CODING_STRING = 1;
private static final int PAGE_STATE_NORMAL = 0;
private static final int REGION_DEPTH_4_BIT = 2;
private static final int REGION_DEPTH_8_BIT = 3;
private static final int SEGMENT_TYPE_CLUT_DEFINITION = 18;
private static final int SEGMENT_TYPE_DISPLAY_DEFINITION = 20;
private static final int SEGMENT_TYPE_OBJECT_DATA = 19;
private static final int SEGMENT_TYPE_PAGE_COMPOSITION = 16;
private static final int SEGMENT_TYPE_REGION_COMPOSITION = 17;
private static final String TAG = "DvbParser";
private static final byte[] defaultMap2To4 = {0, 7, 8, bx.f20591m};
private static final byte[] defaultMap2To8 = {0, 119, -120, -1};
private static final byte[] defaultMap4To8 = {0, 17, 34, 51, 68, 85, 102, 119, -120, -103, -86, -69, -52, -35, -18, -1};
private Bitmap bitmap;
private final Canvas canvas;
private final ClutDefinition defaultClutDefinition;
private final DisplayDefinition defaultDisplayDefinition;
private final Paint defaultPaint;
private final Paint fillRegionPaint;
private final SubtitleService subtitleService;
public static final class ClutDefinition {
public final int[] clutEntries2Bit;
public final int[] clutEntries4Bit;
public final int[] clutEntries8Bit;
public final int id;
public ClutDefinition(int i6, int[] iArr, int[] iArr2, int[] iArr3) {
this.id = i6;
this.clutEntries2Bit = iArr;
this.clutEntries4Bit = iArr2;
this.clutEntries8Bit = iArr3;
}
}
public static final class DisplayDefinition {
public final int height;
public final int horizontalPositionMaximum;
public final int horizontalPositionMinimum;
public final int verticalPositionMaximum;
public final int verticalPositionMinimum;
public final int width;
public DisplayDefinition(int i6, int i7, int i8, int i9, int i10, int i11) {
this.width = i6;
this.height = i7;
this.horizontalPositionMinimum = i8;
this.horizontalPositionMaximum = i9;
this.verticalPositionMinimum = i10;
this.verticalPositionMaximum = i11;
}
}
public static final class ObjectData {
public final byte[] bottomFieldData;
public final int id;
public final boolean nonModifyingColorFlag;
public final byte[] topFieldData;
public ObjectData(int i6, boolean z6, byte[] bArr, byte[] bArr2) {
this.id = i6;
this.nonModifyingColorFlag = z6;
this.topFieldData = bArr;
this.bottomFieldData = bArr2;
}
}
public static final class PageComposition {
public final SparseArray<PageRegion> regions;
public final int state;
public final int timeOutSecs;
public final int version;
public PageComposition(int i6, int i7, int i8, SparseArray<PageRegion> sparseArray) {
this.timeOutSecs = i6;
this.version = i7;
this.state = i8;
this.regions = sparseArray;
}
}
public static final class PageRegion {
public final int horizontalAddress;
public final int verticalAddress;
public PageRegion(int i6, int i7) {
this.horizontalAddress = i6;
this.verticalAddress = i7;
}
}
public static final class RegionComposition {
public final int clutId;
public final int depth;
public final boolean fillFlag;
public final int height;
public final int id;
public final int levelOfCompatibility;
public final int pixelCode2Bit;
public final int pixelCode4Bit;
public final int pixelCode8Bit;
public final SparseArray<RegionObject> regionObjects;
public final int width;
public RegionComposition(int i6, boolean z6, int i7, int i8, int i9, int i10, int i11, int i12, int i13, int i14, SparseArray<RegionObject> sparseArray) {
this.id = i6;
this.fillFlag = z6;
this.width = i7;
this.height = i8;
this.levelOfCompatibility = i9;
this.depth = i10;
this.clutId = i11;
this.pixelCode8Bit = i12;
this.pixelCode4Bit = i13;
this.pixelCode2Bit = i14;
this.regionObjects = sparseArray;
}
public final void mergeFrom(RegionComposition regionComposition) {
if (regionComposition == null) {
return;
}
SparseArray<RegionObject> sparseArray = regionComposition.regionObjects;
for (int i6 = 0; i6 < sparseArray.size(); i6++) {
this.regionObjects.put(sparseArray.keyAt(i6), sparseArray.valueAt(i6));
}
}
}
public static final class RegionObject {
public final int backgroundPixelCode;
public final int foregroundPixelCode;
public final int horizontalPosition;
public final int provider;
public final int type;
public final int verticalPosition;
public RegionObject(int i6, int i7, int i8, int i9, int i10, int i11) {
this.type = i6;
this.provider = i7;
this.horizontalPosition = i8;
this.verticalPosition = i9;
this.foregroundPixelCode = i10;
this.backgroundPixelCode = i11;
}
}
public static final class SubtitleService {
public final int ancillaryPageId;
public DisplayDefinition displayDefinition;
public PageComposition pageComposition;
public final int subtitlePageId;
public final SparseArray<RegionComposition> regions = new SparseArray<>();
public final SparseArray<ClutDefinition> cluts = new SparseArray<>();
public final SparseArray<ObjectData> objects = new SparseArray<>();
public final SparseArray<ClutDefinition> ancillaryCluts = new SparseArray<>();
public final SparseArray<ObjectData> ancillaryObjects = new SparseArray<>();
public SubtitleService(int i6, int i7) {
this.subtitlePageId = i6;
this.ancillaryPageId = i7;
}
public final void reset() {
this.regions.clear();
this.cluts.clear();
this.objects.clear();
this.ancillaryCluts.clear();
this.ancillaryObjects.clear();
this.displayDefinition = null;
this.pageComposition = null;
}
}
public DvbParser(int i6, int i7) {
Paint paint = new Paint();
this.defaultPaint = paint;
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
paint.setPathEffect(null);
Paint paint2 = new Paint();
this.fillRegionPaint = paint2;
paint2.setStyle(Paint.Style.FILL);
paint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
paint2.setPathEffect(null);
this.canvas = new Canvas();
this.defaultDisplayDefinition = new DisplayDefinition(719, 575, 0, 719, 0, 575);
this.defaultClutDefinition = new ClutDefinition(0, generateDefault2BitClutEntries(), generateDefault4BitClutEntries(), generateDefault8BitClutEntries());
this.subtitleService = new SubtitleService(i6, i7);
}
private static byte[] buildClutMapTable(int i6, int i7, ParsableBitArray parsableBitArray) {
byte[] bArr = new byte[i6];
for (int i8 = 0; i8 < i6; i8++) {
bArr[i8] = (byte) parsableBitArray.readBits(i7);
}
return bArr;
}
private static int[] generateDefault2BitClutEntries() {
return new int[]{0, -1, ViewCompat.MEASURED_STATE_MASK, -8421505};
}
private static int[] generateDefault4BitClutEntries() {
int i6;
int i7;
int i8;
int i9;
int i10;
int[] iArr = new int[16];
iArr[0] = 0;
for (int i11 = 1; i11 < 16; i11++) {
if (i11 < 8) {
if ((i11 & 1) != 0) {
i8 = 255;
} else {
i8 = 0;
}
if ((i11 & 2) != 0) {
i9 = 255;
} else {
i9 = 0;
}
if ((i11 & 4) != 0) {
i10 = 255;
} else {
i10 = 0;
}
iArr[i11] = getColor(255, i8, i9, i10);
} else {
int i12 = 127;
if ((i11 & 1) != 0) {
i6 = 127;
} else {
i6 = 0;
}
if ((i11 & 2) != 0) {
i7 = 127;
} else {
i7 = 0;
}
if ((i11 & 4) == 0) {
i12 = 0;
}
iArr[i11] = getColor(255, i6, i7, i12);
}
}
return iArr;
}
private static int[] generateDefault8BitClutEntries() {
int i6;
int i7;
int i8;
int i9;
int i10;
int i11;
int i12;
int i13;
int i14;
int i15;
int i16;
int i17;
int i18;
int i19;
int i20;
int i21;
int i22;
int i23;
int[] iArr = new int[256];
iArr[0] = 0;
for (int i24 = 0; i24 < 256; i24++) {
int i25 = 255;
if (i24 < 8) {
if ((i24 & 1) != 0) {
i22 = 255;
} else {
i22 = 0;
}
if ((i24 & 2) != 0) {
i23 = 255;
} else {
i23 = 0;
}
if ((i24 & 4) == 0) {
i25 = 0;
}
iArr[i24] = getColor(63, i22, i23, i25);
} else {
int i26 = i24 & PluginCallback.DUMP_ACTIVITY;
int i27 = 170;
int i28 = 85;
if (i26 != 0) {
if (i26 != 8) {
int i29 = 43;
if (i26 != 128) {
if (i26 == 136) {
if ((i24 & 1) != 0) {
i18 = 43;
} else {
i18 = 0;
}
if ((i24 & 16) != 0) {
i19 = 85;
} else {
i19 = 0;
}
int i30 = i18 + i19;
if ((i24 & 2) != 0) {
i20 = 43;
} else {
i20 = 0;
}
if ((i24 & 32) != 0) {
i21 = 85;
} else {
i21 = 0;
}
int i31 = i20 + i21;
if ((i24 & 4) == 0) {
i29 = 0;
}
if ((i24 & 64) == 0) {
i28 = 0;
}
iArr[i24] = getColor(255, i30, i31, i29 + i28);
}
} else {
if ((i24 & 1) != 0) {
i14 = 43;
} else {
i14 = 0;
}
int i32 = i14 + 127;
if ((i24 & 16) != 0) {
i15 = 85;
} else {
i15 = 0;
}
int i33 = i32 + i15;
if ((i24 & 2) != 0) {
i16 = 43;
} else {
i16 = 0;
}
int i34 = i16 + 127;
if ((i24 & 32) != 0) {
i17 = 85;
} else {
i17 = 0;
}
int i35 = i34 + i17;
if ((i24 & 4) == 0) {
i29 = 0;
}
int i36 = i29 + 127;
if ((i24 & 64) == 0) {
i28 = 0;
}
iArr[i24] = getColor(255, i33, i35, i36 + i28);
}
} else {
if ((i24 & 1) != 0) {
i10 = 85;
} else {
i10 = 0;
}
if ((i24 & 16) != 0) {
i11 = 170;
} else {
i11 = 0;
}
int i37 = i10 + i11;
if ((i24 & 2) != 0) {
i12 = 85;
} else {
i12 = 0;
}
if ((i24 & 32) != 0) {
i13 = 170;
} else {
i13 = 0;
}
int i38 = i12 + i13;
if ((i24 & 4) == 0) {
i28 = 0;
}
if ((i24 & 64) == 0) {
i27 = 0;
}
iArr[i24] = getColor(127, i37, i38, i28 + i27);
}
} else {
if ((i24 & 1) != 0) {
i6 = 85;
} else {
i6 = 0;
}
if ((i24 & 16) != 0) {
i7 = 170;
} else {
i7 = 0;
}
int i39 = i6 + i7;
if ((i24 & 2) != 0) {
i8 = 85;
} else {
i8 = 0;
}
if ((i24 & 32) != 0) {
i9 = 170;
} else {
i9 = 0;
}
int i40 = i8 + i9;
if ((i24 & 4) == 0) {
i28 = 0;
}
if ((i24 & 64) == 0) {
i27 = 0;
}
iArr[i24] = getColor(255, i39, i40, i28 + i27);
}
}
}
return iArr;
}
private static int getColor(int i6, int i7, int i8, int i9) {
return (i6 << 24) | (i7 << 16) | (i8 << 8) | i9;
}
private static int paint2BitPixelCodeString(ParsableBitArray parsableBitArray, int[] iArr, byte[] bArr, int i6, int i7, Paint paint, Canvas canvas) {
boolean z6;
int i8;
int readBits;
int readBits2;
int i9 = i6;
boolean z7 = false;
while (true) {
int readBits3 = parsableBitArray.readBits(2);
if (readBits3 != 0) {
z6 = z7;
} else {
if (parsableBitArray.readBit()) {
readBits = parsableBitArray.readBits(3) + 3;
readBits2 = parsableBitArray.readBits(2);
} else if (parsableBitArray.readBit()) {
z6 = z7;
readBits3 = 0;
} else {
int readBits4 = parsableBitArray.readBits(2);
if (readBits4 != 0) {
if (readBits4 != 1) {
if (readBits4 != 2) {
if (readBits4 != 3) {
z6 = z7;
readBits3 = 0;
} else {
readBits = parsableBitArray.readBits(8) + 29;
readBits2 = parsableBitArray.readBits(2);
}
} else {
readBits = parsableBitArray.readBits(4) + 12;
readBits2 = parsableBitArray.readBits(2);
}
} else {
z6 = z7;
readBits3 = 0;
i8 = 2;
if (i8 != 0 && paint != null) {
if (bArr != null) {
readBits3 = bArr[readBits3];
}
paint.setColor(iArr[readBits3]);
canvas.drawRect(i9, i7, i9 + i8, i7 + 1, paint);
}
i9 += i8;
if (!z6) {
return i9;
}
z7 = z6;
}
} else {
readBits3 = 0;
z6 = true;
}
i8 = 0;
if (i8 != 0) {
if (bArr != null) {
}
paint.setColor(iArr[readBits3]);
canvas.drawRect(i9, i7, i9 + i8, i7 + 1, paint);
}
i9 += i8;
if (!z6) {
}
}
z6 = z7;
i8 = readBits;
readBits3 = readBits2;
if (i8 != 0) {
}
i9 += i8;
if (!z6) {
}
}
i8 = 1;
if (i8 != 0) {
}
i9 += i8;
if (!z6) {
}
}
}
private static int paint4BitPixelCodeString(ParsableBitArray parsableBitArray, int[] iArr, byte[] bArr, int i6, int i7, Paint paint, Canvas canvas) {
boolean z6;
int i8;
int readBits;
int readBits2;
int i9 = i6;
boolean z7 = false;
while (true) {
int readBits3 = parsableBitArray.readBits(4);
if (readBits3 != 0) {
z6 = z7;
} else {
if (!parsableBitArray.readBit()) {
int readBits4 = parsableBitArray.readBits(3);
if (readBits4 != 0) {
z6 = z7;
i8 = readBits4 + 2;
readBits3 = 0;
} else {
readBits3 = 0;
z6 = true;
i8 = 0;
}
} else {
if (!parsableBitArray.readBit()) {
readBits = parsableBitArray.readBits(2) + 4;
readBits2 = parsableBitArray.readBits(4);
} else {
int readBits5 = parsableBitArray.readBits(2);
if (readBits5 != 0) {
if (readBits5 != 1) {
if (readBits5 != 2) {
if (readBits5 != 3) {
z6 = z7;
readBits3 = 0;
i8 = 0;
} else {
readBits = parsableBitArray.readBits(8) + 25;
readBits2 = parsableBitArray.readBits(4);
}
} else {
readBits = parsableBitArray.readBits(4) + 9;
readBits2 = parsableBitArray.readBits(4);
}
} else {
z6 = z7;
readBits3 = 0;
i8 = 2;
}
} else {
z6 = z7;
readBits3 = 0;
}
}
z6 = z7;
i8 = readBits;
readBits3 = readBits2;
}
if (i8 != 0 && paint != null) {
if (bArr != null) {
readBits3 = bArr[readBits3];
}
paint.setColor(iArr[readBits3]);
canvas.drawRect(i9, i7, i9 + i8, i7 + 1, paint);
}
i9 += i8;
if (!z6) {
return i9;
}
z7 = z6;
}
i8 = 1;
if (i8 != 0) {
if (bArr != null) {
}
paint.setColor(iArr[readBits3]);
canvas.drawRect(i9, i7, i9 + i8, i7 + 1, paint);
}
i9 += i8;
if (!z6) {
}
}
}
private static int paint8BitPixelCodeString(ParsableBitArray parsableBitArray, int[] iArr, byte[] bArr, int i6, int i7, Paint paint, Canvas canvas) {
boolean z6;
int readBits;
int i8 = i6;
boolean z7 = false;
while (true) {
int readBits2 = parsableBitArray.readBits(8);
if (readBits2 != 0) {
z6 = z7;
readBits = 1;
} else if (!parsableBitArray.readBit()) {
int readBits3 = parsableBitArray.readBits(7);
if (readBits3 != 0) {
z6 = z7;
readBits = readBits3;
readBits2 = 0;
} else {
readBits2 = 0;
z6 = true;
readBits = 0;
}
} else {
z6 = z7;
readBits = parsableBitArray.readBits(7);
readBits2 = parsableBitArray.readBits(8);
}
if (readBits != 0 && paint != null) {
if (bArr != null) {
readBits2 = bArr[readBits2];
}
paint.setColor(iArr[readBits2]);
canvas.drawRect(i8, i7, i8 + readBits, i7 + 1, paint);
}
i8 += readBits;
if (z6) {
return i8;
}
z7 = z6;
}
}
private static void paintPixelDataSubBlock(byte[] bArr, int[] iArr, int i6, int i7, int i8, Paint paint, Canvas canvas) {
byte[] bArr2;
byte[] bArr3;
byte[] bArr4;
ParsableBitArray parsableBitArray = new ParsableBitArray(bArr);
int i9 = i7;
int i10 = i8;
byte[] bArr5 = null;
byte[] bArr6 = null;
while (parsableBitArray.bitsLeft() != 0) {
int readBits = parsableBitArray.readBits(8);
if (readBits != 240) {
switch (readBits) {
case 16:
if (i6 == 3) {
if (bArr5 == null) {
bArr3 = defaultMap2To8;
} else {
bArr3 = bArr5;
}
} else if (i6 == 2) {
if (bArr6 == null) {
bArr3 = defaultMap2To4;
} else {
bArr3 = bArr6;
}
} else {
bArr2 = null;
i9 = paint2BitPixelCodeString(parsableBitArray, iArr, bArr2, i9, i10, paint, canvas);
parsableBitArray.byteAlign();
break;
}
bArr2 = bArr3;
i9 = paint2BitPixelCodeString(parsableBitArray, iArr, bArr2, i9, i10, paint, canvas);
parsableBitArray.byteAlign();
case 17:
if (i6 == 3) {
bArr4 = defaultMap4To8;
} else {
bArr4 = null;
}
i9 = paint4BitPixelCodeString(parsableBitArray, iArr, bArr4, i9, i10, paint, canvas);
parsableBitArray.byteAlign();
break;
case 18:
i9 = paint8BitPixelCodeString(parsableBitArray, iArr, null, i9, i10, paint, canvas);
break;
default:
switch (readBits) {
case 32:
bArr6 = buildClutMapTable(4, 4, parsableBitArray);
break;
case 33:
bArr5 = buildClutMapTable(4, 8, parsableBitArray);
break;
case 34:
bArr5 = buildClutMapTable(16, 8, parsableBitArray);
break;
}
}
} else {
i10 += 2;
i9 = i7;
}
}
}
private static void paintPixelDataSubBlocks(ObjectData objectData, ClutDefinition clutDefinition, int i6, int i7, int i8, Paint paint, Canvas canvas) {
int[] iArr;
if (i6 == 3) {
iArr = clutDefinition.clutEntries8Bit;
} else if (i6 == 2) {
iArr = clutDefinition.clutEntries4Bit;
} else {
iArr = clutDefinition.clutEntries2Bit;
}
int[] iArr2 = iArr;
paintPixelDataSubBlock(objectData.topFieldData, iArr2, i6, i7, i8, paint, canvas);
paintPixelDataSubBlock(objectData.bottomFieldData, iArr2, i6, i7, i8 + 1, paint, canvas);
}
private static ClutDefinition parseClutDefinition(ParsableBitArray parsableBitArray, int i6) {
int[] iArr;
int readBits;
int i7;
int readBits2;
int i8;
int i9;
int i10 = 8;
int readBits3 = parsableBitArray.readBits(8);
parsableBitArray.skipBits(8);
int i11 = 2;
int i12 = i6 - 2;
int[] generateDefault2BitClutEntries = generateDefault2BitClutEntries();
int[] generateDefault4BitClutEntries = generateDefault4BitClutEntries();
int[] generateDefault8BitClutEntries = generateDefault8BitClutEntries();
while (i12 > 0) {
int readBits4 = parsableBitArray.readBits(i10);
int readBits5 = parsableBitArray.readBits(i10);
int i13 = i12 - 2;
if ((readBits5 & 128) != 0) {
iArr = generateDefault2BitClutEntries;
} else if ((readBits5 & 64) != 0) {
iArr = generateDefault4BitClutEntries;
} else {
iArr = generateDefault8BitClutEntries;
}
if ((readBits5 & 1) != 0) {
i8 = parsableBitArray.readBits(i10);
i9 = parsableBitArray.readBits(i10);
readBits = parsableBitArray.readBits(i10);
readBits2 = parsableBitArray.readBits(i10);
i7 = i13 - 4;
} else {
int readBits6 = parsableBitArray.readBits(6) << i11;
int readBits7 = parsableBitArray.readBits(4) << 4;
readBits = parsableBitArray.readBits(4) << 4;
i7 = i13 - 2;
readBits2 = parsableBitArray.readBits(i11) << 6;
i8 = readBits6;
i9 = readBits7;
}
if (i8 == 0) {
i9 = 0;
readBits = 0;
readBits2 = 255;
}
double d6 = i8;
double d7 = i9 - 128;
double d8 = readBits - 128;
iArr[readBits4] = getColor((byte) (255 - (readBits2 & 255)), Util.constrainValue((int) (d6 + (1.402d * d7)), 0, 255), Util.constrainValue((int) ((d6 - (0.34414d * d8)) - (d7 * 0.71414d)), 0, 255), Util.constrainValue((int) (d6 + (d8 * 1.772d)), 0, 255));
i12 = i7;
readBits3 = readBits3;
i10 = 8;
i11 = 2;
}
return new ClutDefinition(readBits3, generateDefault2BitClutEntries, generateDefault4BitClutEntries, generateDefault8BitClutEntries);
}
private static DisplayDefinition parseDisplayDefinition(ParsableBitArray parsableBitArray) {
int i6;
int i7;
int i8;
int i9;
parsableBitArray.skipBits(4);
boolean readBit = parsableBitArray.readBit();
parsableBitArray.skipBits(3);
int readBits = parsableBitArray.readBits(16);
int readBits2 = parsableBitArray.readBits(16);
if (readBit) {
int readBits3 = parsableBitArray.readBits(16);
int readBits4 = parsableBitArray.readBits(16);
int readBits5 = parsableBitArray.readBits(16);
i7 = parsableBitArray.readBits(16);
i6 = readBits4;
i9 = readBits5;
i8 = readBits3;
} else {
i6 = readBits;
i7 = readBits2;
i8 = 0;
i9 = 0;
}
return new DisplayDefinition(readBits, readBits2, i8, i6, i9, i7);
}
private static ObjectData parseObjectData(ParsableBitArray parsableBitArray) {
byte[] bArr;
int readBits = parsableBitArray.readBits(16);
parsableBitArray.skipBits(4);
int readBits2 = parsableBitArray.readBits(2);
boolean readBit = parsableBitArray.readBit();
parsableBitArray.skipBits(1);
byte[] bArr2 = null;
if (readBits2 == 1) {
parsableBitArray.skipBits(parsableBitArray.readBits(8) * 16);
} else if (readBits2 == 0) {
int readBits3 = parsableBitArray.readBits(16);
int readBits4 = parsableBitArray.readBits(16);
if (readBits3 > 0) {
bArr2 = new byte[readBits3];
parsableBitArray.readBytes(bArr2, 0, readBits3);
}
if (readBits4 > 0) {
bArr = new byte[readBits4];
parsableBitArray.readBytes(bArr, 0, readBits4);
return new ObjectData(readBits, readBit, bArr2, bArr);
}
}
bArr = bArr2;
return new ObjectData(readBits, readBit, bArr2, bArr);
}
private static PageComposition parsePageComposition(ParsableBitArray parsableBitArray, int i6) {
int readBits = parsableBitArray.readBits(8);
int readBits2 = parsableBitArray.readBits(4);
int readBits3 = parsableBitArray.readBits(2);
parsableBitArray.skipBits(2);
int i7 = i6 - 2;
SparseArray sparseArray = new SparseArray();
while (i7 > 0) {
int readBits4 = parsableBitArray.readBits(8);
parsableBitArray.skipBits(8);
i7 -= 6;
sparseArray.put(readBits4, new PageRegion(parsableBitArray.readBits(16), parsableBitArray.readBits(16)));
}
return new PageComposition(readBits, readBits2, readBits3, sparseArray);
}
private static RegionComposition parseRegionComposition(ParsableBitArray parsableBitArray, int i6) {
int readBits;
int readBits2;
int readBits3 = parsableBitArray.readBits(8);
parsableBitArray.skipBits(4);
boolean readBit = parsableBitArray.readBit();
parsableBitArray.skipBits(3);
int i7 = 16;
int readBits4 = parsableBitArray.readBits(16);
int readBits5 = parsableBitArray.readBits(16);
int readBits6 = parsableBitArray.readBits(3);
int readBits7 = parsableBitArray.readBits(3);
int i8 = 2;
parsableBitArray.skipBits(2);
int readBits8 = parsableBitArray.readBits(8);
int readBits9 = parsableBitArray.readBits(8);
int readBits10 = parsableBitArray.readBits(4);
int readBits11 = parsableBitArray.readBits(2);
parsableBitArray.skipBits(2);
int i9 = i6 - 10;
SparseArray sparseArray = new SparseArray();
while (i9 > 0) {
int readBits12 = parsableBitArray.readBits(i7);
int readBits13 = parsableBitArray.readBits(i8);
int readBits14 = parsableBitArray.readBits(i8);
int readBits15 = parsableBitArray.readBits(12);
int i10 = readBits11;
parsableBitArray.skipBits(4);
int readBits16 = parsableBitArray.readBits(12);
i9 -= 6;
if (readBits13 != 1 && readBits13 != 2) {
readBits = 0;
readBits2 = 0;
} else {
i9 -= 2;
readBits = parsableBitArray.readBits(8);
readBits2 = parsableBitArray.readBits(8);
}
sparseArray.put(readBits12, new RegionObject(readBits13, readBits14, readBits15, readBits16, readBits, readBits2));
readBits11 = i10;
i8 = 2;
i7 = 16;
}
return new RegionComposition(readBits3, readBit, readBits4, readBits5, readBits6, readBits7, readBits8, readBits9, readBits10, readBits11, sparseArray);
}
private static void parseSubtitlingSegment(ParsableBitArray parsableBitArray, SubtitleService subtitleService) {
int readBits = parsableBitArray.readBits(8);
int readBits2 = parsableBitArray.readBits(16);
int readBits3 = parsableBitArray.readBits(16);
int bytePosition = parsableBitArray.getBytePosition() + readBits3;
if (readBits3 * 8 > parsableBitArray.bitsLeft()) {
Log.w(TAG, "Data field length exceeds limit");
parsableBitArray.skipBits(parsableBitArray.bitsLeft());
return;
}
switch (readBits) {
case 16:
if (readBits2 == subtitleService.subtitlePageId) {
PageComposition pageComposition = subtitleService.pageComposition;
PageComposition parsePageComposition = parsePageComposition(parsableBitArray, readBits3);
if (parsePageComposition.state != 0) {
subtitleService.pageComposition = parsePageComposition;
subtitleService.regions.clear();
subtitleService.cluts.clear();
subtitleService.objects.clear();
break;
} else if (pageComposition != null && pageComposition.version != parsePageComposition.version) {
subtitleService.pageComposition = parsePageComposition;
break;
}
}
break;
case 17:
PageComposition pageComposition2 = subtitleService.pageComposition;
if (readBits2 == subtitleService.subtitlePageId && pageComposition2 != null) {
RegionComposition parseRegionComposition = parseRegionComposition(parsableBitArray, readBits3);
if (pageComposition2.state == 0) {
parseRegionComposition.mergeFrom(subtitleService.regions.get(parseRegionComposition.id));
}
subtitleService.regions.put(parseRegionComposition.id, parseRegionComposition);
break;
}
break;
case 18:
if (readBits2 == subtitleService.subtitlePageId) {
ClutDefinition parseClutDefinition = parseClutDefinition(parsableBitArray, readBits3);
subtitleService.cluts.put(parseClutDefinition.id, parseClutDefinition);
break;
} else if (readBits2 == subtitleService.ancillaryPageId) {
ClutDefinition parseClutDefinition2 = parseClutDefinition(parsableBitArray, readBits3);
subtitleService.ancillaryCluts.put(parseClutDefinition2.id, parseClutDefinition2);
break;
}
break;
case 19:
if (readBits2 == subtitleService.subtitlePageId) {
ObjectData parseObjectData = parseObjectData(parsableBitArray);
subtitleService.objects.put(parseObjectData.id, parseObjectData);
break;
} else if (readBits2 == subtitleService.ancillaryPageId) {
ObjectData parseObjectData2 = parseObjectData(parsableBitArray);
subtitleService.ancillaryObjects.put(parseObjectData2.id, parseObjectData2);
break;
}
break;
case 20:
if (readBits2 == subtitleService.subtitlePageId) {
subtitleService.displayDefinition = parseDisplayDefinition(parsableBitArray);
break;
}
break;
}
parsableBitArray.skipBytes(bytePosition - parsableBitArray.getBytePosition());
}
public final List<Cue> decode(byte[] bArr, int i6) {
int i7;
ObjectData objectData;
int i8;
SparseArray<RegionObject> sparseArray;
Paint paint;
ParsableBitArray parsableBitArray = new ParsableBitArray(bArr, i6);
while (parsableBitArray.bitsLeft() >= 48 && parsableBitArray.readBits(8) == 15) {
parseSubtitlingSegment(parsableBitArray, this.subtitleService);
}
SubtitleService subtitleService = this.subtitleService;
if (subtitleService.pageComposition == null) {
return Collections.emptyList();
}
DisplayDefinition displayDefinition = subtitleService.displayDefinition;
if (displayDefinition == null) {
displayDefinition = this.defaultDisplayDefinition;
}
Bitmap bitmap = this.bitmap;
if (bitmap == null || displayDefinition.width + 1 != bitmap.getWidth() || displayDefinition.height + 1 != this.bitmap.getHeight()) {
Bitmap createBitmap = Bitmap.createBitmap(displayDefinition.width + 1, displayDefinition.height + 1, Bitmap.Config.ARGB_8888);
this.bitmap = createBitmap;
this.canvas.setBitmap(createBitmap);
}
ArrayList arrayList = new ArrayList();
SparseArray<PageRegion> sparseArray2 = this.subtitleService.pageComposition.regions;
for (int i9 = 0; i9 < sparseArray2.size(); i9++) {
PageRegion valueAt = sparseArray2.valueAt(i9);
RegionComposition regionComposition = this.subtitleService.regions.get(sparseArray2.keyAt(i9));
int i10 = valueAt.horizontalAddress + displayDefinition.horizontalPositionMinimum;
int i11 = valueAt.verticalAddress + displayDefinition.verticalPositionMinimum;
float f6 = i10;
float f7 = i11;
this.canvas.clipRect(f6, f7, Math.min(regionComposition.width + i10, displayDefinition.horizontalPositionMaximum), Math.min(regionComposition.height + i11, displayDefinition.verticalPositionMaximum), Region.Op.REPLACE);
ClutDefinition clutDefinition = this.subtitleService.cluts.get(regionComposition.clutId);
if (clutDefinition == null && (clutDefinition = this.subtitleService.ancillaryCluts.get(regionComposition.clutId)) == null) {
clutDefinition = this.defaultClutDefinition;
}
SparseArray<RegionObject> sparseArray3 = regionComposition.regionObjects;
int i12 = 0;
while (i12 < sparseArray3.size()) {
int keyAt = sparseArray3.keyAt(i12);
RegionObject valueAt2 = sparseArray3.valueAt(i12);
ObjectData objectData2 = this.subtitleService.objects.get(keyAt);
if (objectData2 == null) {
objectData = this.subtitleService.ancillaryObjects.get(keyAt);
} else {
objectData = objectData2;
}
if (objectData != null) {
if (objectData.nonModifyingColorFlag) {
paint = null;
} else {
paint = this.defaultPaint;
}
i8 = i12;
sparseArray = sparseArray3;
paintPixelDataSubBlocks(objectData, clutDefinition, regionComposition.depth, valueAt2.horizontalPosition + i10, i11 + valueAt2.verticalPosition, paint, this.canvas);
} else {
i8 = i12;
sparseArray = sparseArray3;
}
i12 = i8 + 1;
sparseArray3 = sparseArray;
}
if (regionComposition.fillFlag) {
int i13 = regionComposition.depth;
if (i13 == 3) {
i7 = clutDefinition.clutEntries8Bit[regionComposition.pixelCode8Bit];
} else if (i13 == 2) {
i7 = clutDefinition.clutEntries4Bit[regionComposition.pixelCode4Bit];
} else {
i7 = clutDefinition.clutEntries2Bit[regionComposition.pixelCode2Bit];
}
this.fillRegionPaint.setColor(i7);
this.canvas.drawRect(f6, f7, regionComposition.width + i10, regionComposition.height + i11, this.fillRegionPaint);
}
Bitmap createBitmap2 = Bitmap.createBitmap(this.bitmap, i10, i11, regionComposition.width, regionComposition.height);
int i14 = displayDefinition.width;
int i15 = displayDefinition.height;
arrayList.add(new Cue(createBitmap2, f6 / i14, 0, f7 / i15, 0, regionComposition.width / i14, regionComposition.height / i15));
this.canvas.drawColor(0, PorterDuff.Mode.CLEAR);
}
return arrayList;
}
public final void reset() {
this.subtitleService.reset();
}
}