Jtt1078Decoder.java 1.5 KB
package com.genersoft.iot.vmp.jtt1078.server;

import com.genersoft.iot.vmp.jtt1078.util.ByteHolder;
import com.genersoft.iot.vmp.jtt1078.util.Packet;

public class Jtt1078Decoder {

    // 加大缓冲区,防止高清视频流溢出
    ByteHolder buffer = new ByteHolder(4096 * 20);
    private static final int HEADER_MAGIC = 0x30316364;

    public void write(byte[] block) {
        buffer.write(block);
    }

    public void write(byte[] block, int startIndex, int length) {
        byte[] buff = new byte[length];
        System.arraycopy(block, startIndex, buff, 0, length);
        write(buff);
    }

    public Packet decode() {
        // 1. 搜寻包头 (关键改造)
        while (this.buffer.size() >= 4) {
            if ((buffer.getInt(0) & 0x7fffffff) == HEADER_MAGIC) {
                break;
            }
            // 丢弃无效字节
            byte[] trash = new byte[1];
            buffer.read(trash);
        }

        if (this.buffer.size() < 30) return null;

        int lengthOffset = 28;
        int dataType = (this.buffer.get(15) >> 4) & 0x0f;

        if (dataType == 0x04) lengthOffset = 28 - 8 - 2 - 2;
        else if (dataType == 0x03) lengthOffset = 28 - 4;

        int bodyLength = this.buffer.getShort(lengthOffset);
        int packetLength = bodyLength + lengthOffset + 2;

        if (this.buffer.size() < packetLength) return null;

        byte[] block = new byte[packetLength];
        this.buffer.sliceInto(block, packetLength);
        return Packet.create(block);
    }
}