def METHOD_NAME(self, x, padding_mask):
    def get_feat_extract_output_lengths(input_lengths: torch.LongTensor):
        """
        Computes the output length of the convolutional layers
        """
        def _conv_out_length(input_length, kernel_size, stride):
            return torch.floor((input_length - kernel_size) / stride + 1)
        for i in range(len(self.feature_enc_layers)):
            input_lengths = _conv_out_length(
                input_lengths,
                self.feature_enc_layers[i][1],
                self.feature_enc_layers[i][2],
            )
        return input_lengths.to(torch.long)
    if padding_mask is not None:
        input_lengths = (1 - padding_mask.long()).sum(-1)
        # apply conv formula to get real output_lengths
        output_lengths = get_feat_extract_output_lengths(input_lengths)
        if padding_mask.any():
            padding_mask = torch.zeros(x.shape[:2], dtype=x.dtype, device=x.device)
            # these two operations makes sure that all values
            # before the output lengths indices are attended to
            padding_mask[
                (
                    torch.arange(padding_mask.shape[0], device=padding_mask.device),
                    output_lengths - 1,
                )
            ] = 1
            padding_mask = (
                1 - padding_mask.flip([-1]).cumsum(-1).flip([-1])
            ).bool()
        else:
            padding_mask = torch.zeros(
                x.shape[:2], dtype=torch.bool, device=x.device
            )
    return padding_mask