package com.genersoft.iot.vmp.gb28181.session; 
 | 
  
 | 
import com.genersoft.iot.vmp.utils.ConfigConst; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.Random; 
 | 
import java.util.Set; 
 | 
  
 | 
public class SsrcConfig { 
 | 
  
 | 
    /** 
 | 
     * zlm流媒体服务器Id 
 | 
     */ 
 | 
    private String mediaServerId; 
 | 
  
 | 
    private String ssrcPrefix; 
 | 
    /** 
 | 
     * zlm流媒体服务器已用会话句柄 
 | 
     */ 
 | 
    private List<String> isUsed; 
 | 
    /** 
 | 
     * zlm流媒体服务器可用会话句柄 
 | 
     */ 
 | 
    private List<String> notUsed; 
 | 
  
 | 
    public SsrcConfig() { 
 | 
    } 
 | 
  
 | 
    public SsrcConfig(String mediaServerId, Set<String> usedSet, String sipDomain) { 
 | 
        this.mediaServerId = mediaServerId; 
 | 
        this.isUsed = new ArrayList<>(); 
 | 
        this.ssrcPrefix = sipDomain.substring(3, 8); 
 | 
        this.notUsed = new ArrayList<>(); 
 | 
        for (int i = 1; i < ConfigConst.MAX_STRTEAM_COUNT; i++) { 
 | 
            String ssrc; 
 | 
            if (i < 10) { 
 | 
                ssrc = "000" + i; 
 | 
            } else if (i < 100) { 
 | 
                ssrc = "00" + i; 
 | 
            } else if (i < 1000) { 
 | 
                ssrc = "0" + i; 
 | 
            } else { 
 | 
                ssrc = String.valueOf(i); 
 | 
            } 
 | 
            if (null == usedSet || !usedSet.contains(ssrc)) { 
 | 
                this.notUsed.add(ssrc); 
 | 
            } else { 
 | 
                this.isUsed.add(ssrc); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获取视频预览的SSRC值,第一位固定为0 
 | 
     * @return ssrc 
 | 
     */ 
 | 
    public String getPlaySsrc() { 
 | 
        return "0" + getSsrcPrefix() + getSN(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取录像回放的SSRC值,第一位固定为1 
 | 
     * 
 | 
     */ 
 | 
    public String getPlayBackSsrc() { 
 | 
        return "1" + getSsrcPrefix() + getSN(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 释放ssrc,主要用完的ssrc一定要释放,否则会耗尽 
 | 
     * @param ssrc 需要重置的ssrc 
 | 
     */ 
 | 
    public void releaseSsrc(String ssrc) { 
 | 
        if (ssrc == null) { 
 | 
            return; 
 | 
        } 
 | 
        String sn = ssrc.substring(6); 
 | 
        try { 
 | 
            isUsed.remove(sn); 
 | 
            notUsed.add(sn); 
 | 
        }catch (NullPointerException e){ 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取后四位数SN,随机数 
 | 
     * 
 | 
     */ 
 | 
    private String getSN() { 
 | 
        String sn = null; 
 | 
        int index = 0; 
 | 
        if (notUsed.size() == 0) { 
 | 
            throw new RuntimeException("ssrc已经用完"); 
 | 
        } else if (notUsed.size() == 1) { 
 | 
            sn = notUsed.get(0); 
 | 
        } else { 
 | 
            index = new Random().nextInt(notUsed.size() - 1); 
 | 
            sn = notUsed.get(index); 
 | 
        } 
 | 
        notUsed.remove(index); 
 | 
        isUsed.add(sn); 
 | 
        return sn; 
 | 
    } 
 | 
  
 | 
    public String getSsrcPrefix() { 
 | 
        return ssrcPrefix; 
 | 
    } 
 | 
  
 | 
    public String getMediaServerId() { 
 | 
        return mediaServerId; 
 | 
    } 
 | 
  
 | 
    public void setMediaServerId(String mediaServerId) { 
 | 
        this.mediaServerId = mediaServerId; 
 | 
    } 
 | 
  
 | 
    public void setSsrcPrefix(String ssrcPrefix) { 
 | 
        this.ssrcPrefix = ssrcPrefix; 
 | 
    } 
 | 
  
 | 
    public List<String> getIsUsed() { 
 | 
        return isUsed; 
 | 
    } 
 | 
  
 | 
    public void setIsUsed(List<String> isUsed) { 
 | 
        this.isUsed = isUsed; 
 | 
    } 
 | 
  
 | 
    public List<String> getNotUsed() { 
 | 
        return notUsed; 
 | 
    } 
 | 
  
 | 
    public void setNotUsed(List<String> notUsed) { 
 | 
        this.notUsed = notUsed; 
 | 
    } 
 | 
  
 | 
    public boolean checkSsrc(String ssrcInResponse) { 
 | 
        return !isUsed.contains(ssrcInResponse); 
 | 
    } 
 | 
} 
 |