getHvcInfo_() {
    const TsParser = shaka.util.TsParser;
    const videoInfo = {
      height: null,
      width: null,
      codec: null,
      frameRate: null,
    };
    const videoNalus = this.getVideoNalus();
    if (!videoNalus.length) {
      return videoInfo;
    }
    const spsNalu = videoNalus.find((nalu) => {
      return nalu.type == TsParser.H265_NALU_TYPE_SPS_;
    });
    if (!spsNalu) {
      return videoInfo;
    }

    const gb = new shaka.util.ExpGolomb(
        spsNalu.fullData, /* convertEbsp2rbsp= */ true);

    // remove NALu Header
    gb.readUnsignedByte();
    gb.readUnsignedByte();

    // SPS
    gb.readBits(4); // video_parameter_set_id
    const maxSubLayersMinus1 = gb.readBits(3);
    gb.readBoolean(); // temporal_id_nesting_flag

    // profile_tier_level begin
    const generalProfileSpace = gb.readBits(2);
    const generalTierFlag = gb.readBits(1);
    const generalProfileIdc = gb.readBits(5);
    const generalProfileCompatibilityFlags = gb.readBits(32);
    const generalConstraintIndicatorFlags1 = gb.readUnsignedByte();
    const generalConstraintIndicatorFlags2 = gb.readUnsignedByte();
    const generalConstraintIndicatorFlags3 = gb.readUnsignedByte();
    const generalConstraintIndicatorFlags4 = gb.readUnsignedByte();
    const generalConstraintIndicatorFlags5 = gb.readUnsignedByte();
    const generalConstraintIndicatorFlags6 = gb.readUnsignedByte();
    const generalLevelIdc = gb.readUnsignedByte();
    const subLayerProfilePresentFlag = [];
    const subLayerLevelPresentFlag = [];
    for (let i = 0; i < maxSubLayersMinus1; i++) {
      subLayerProfilePresentFlag.push(gb.readBoolean());
      subLayerLevelPresentFlag.push(gb.readBoolean());
    }
    if (maxSubLayersMinus1 > 0) {
      for (let i = maxSubLayersMinus1; i < 8; i++) {
        gb.readBits(2);
      }
    }
    for (let i = 0; i < maxSubLayersMinus1; i++) {
      if (subLayerProfilePresentFlag[i]) {
        gb.readBits(88);
      }
      if (subLayerLevelPresentFlag[i]) {
        gb.readUnsignedByte();
      }
    }
    // profile_tier_level end

    gb.readUnsignedExpGolomb(); // seq_parameter_set_id
    const chromaFormatIdc = gb.readUnsignedExpGolomb();
    if (chromaFormatIdc == 3) {
      gb.readBits(1); // separate_colour_plane_flag
    }
    const picWidthInLumaSamples = gb.readUnsignedExpGolomb();
    const picHeightInLumaSamples = gb.readUnsignedExpGolomb();
    let leftOffset = 0;
    let rightOffset = 0;
    let topOffset = 0;
    let bottomOffset = 0;
    const conformanceWindowFlag = gb.readBoolean();
    if (conformanceWindowFlag) {
      leftOffset += gb.readUnsignedExpGolomb();
      rightOffset += gb.readUnsignedExpGolomb();
      topOffset += gb.readUnsignedExpGolomb();
      bottomOffset += gb.readUnsignedExpGolomb();
    }

    const subWc = chromaFormatIdc === 1 || chromaFormatIdc === 2 ? 2 : 1;
    const subHc = chromaFormatIdc === 1 ? 2 : 1;
    videoInfo.width =
        String(picWidthInLumaSamples - (leftOffset + rightOffset) * subWc);
    videoInfo.height =
        String(picHeightInLumaSamples - (topOffset + bottomOffset) * subHc);

    const reverseBits = (integer) => {
      let result = 0;
      for (let i = 0; i < 32; i++) {
        result |= ((integer >> i) & 1) << (31 - i);
      }
      return result >>> 0;
    };

    const profileSpace = ['', 'A', 'B', 'C'][generalProfileSpace];
    const profileCompatibility = reverseBits(generalProfileCompatibilityFlags);
    const tierFlag = generalTierFlag == 1 ? 'H' : 'L';

    let codec = 'hvc1';
    codec += '.' + profileSpace + generalProfileIdc;
    codec += '.' + profileCompatibility.toString(16).toUpperCase();
    codec += '.' + tierFlag + generalLevelIdc;
    if (generalConstraintIndicatorFlags6) {
      codec += '.' +
          generalConstraintIndicatorFlags6.toString(16).toUpperCase();
    }
    if (generalConstraintIndicatorFlags5) {
      codec += '.' +
          generalConstraintIndicatorFlags5.toString(16).toUpperCase();
    }
    if (generalConstraintIndicatorFlags4) {
      codec += '.' +
          generalConstraintIndicatorFlags4.toString(16).toUpperCase();
    }
    if (generalConstraintIndicatorFlags3) {
      codec += '.' +
          generalConstraintIndicatorFlags3.toString(16).toUpperCase();
    }
    if (generalConstraintIndicatorFlags2) {
      codec += '.' +
          generalConstraintIndicatorFlags2.toString(16).toUpperCase();
    }
    if (generalConstraintIndicatorFlags1) {
      codec += '.' +
          generalConstraintIndicatorFlags1.toString(16).toUpperCase();
    }
    videoInfo.codec = codec;
    videoInfo.frameRate = this.getFrameRate_();

    return videoInfo;
  }
Return the video information for HVC

@return {{height: ?string, width: ?string, codec: ?string,
          frameRate: ?string}}
@private