docs: def stream_compute_ecc_hash(ecc_manager, hasher, file, max_block_size, header_size, resilience_rates):
      '''Generate a stream of hash/ecc blocks, of variable encoding rate and size, given a file.'''
      curpos = file.tell() # init the reading cursor at the beginning of the file
      # Find the total size to know when to stop
      #size = os.fstat(file.fileno()).st_size # old way of doing it, doesn't work with StringIO objects
      file.seek(0, os.SEEK_END) # alternative way of finding the total size: go to the end of the file
      size = file.tell()
      file.seek(0, curpos) # place the reading cursor back at the beginning of the file
      # Main encoding loop
      while curpos < size: # Continue encoding while we do not reach the end of the file
          # Calculating the encoding rate
          if curpos < header_size: # if we are still reading the file's header, we use a constant rate
              rate = resilience_rates[0]
          else: # else we use a progressive rate for the rest of the file the we calculate on-the-fly depending on our current reading cursor position in the file
              rate = feature_scaling(curpos, header_size, size, resilience_rates[1], resilience_rates[2]) # find the rate for the current stream of data (interpolate between stage 2 and stage 3 rates depending on the cursor position in the file)
  
          # Compute the ecc parameters given the calculated rate
          ecc_params = compute_ecc_params(max_block_size, rate, hasher)
          #ecc_manager = ECCMan(max_block_size, ecc_params["message_size"]) # not necessary to create an ecc manager anymore, as it is very costly. Now we can specify a value for k on the fly (tables for all possible values of k are pre-generated in the reed-solomon libraries)
  
          # Compute the ecc and hash for the current message block
          mes = file.read(ecc_params["message_size"])
          hash = hasher.hash(mes)
          ecc = ecc_manager.encode(mes, k=ecc_params["message_size"])
          #print("mes %i (%i) - ecc %i (%i) - hash %i (%i)" % (len(mes), message_size, len(ecc), ecc_params["ecc_size"], len(hash), ecc_params["hash_size"])) # DEBUGLINE
  
          # Return the result
          yield [hash, ecc, ecc_params]
          # Prepare for next iteration
          curpos = file.tell()