content: """
  Used to compress video in: https://github.com/ArrowLuo/CLIP4Clip
  Author: ArrowLuo
  """
  import os
  import argparse
  import ffmpeg
  import subprocess
  import time
  import multiprocessing
  from multiprocessing import Pool
  import shutil
  try:
      from psutil import cpu_count
  except:
      from multiprocessing import cpu_count
  # multiprocessing.freeze_support()
  
  def compress(paras):
      input_video_path, output_video_path = paras
      try:
          command = ['ffmpeg',
                     '-y',  # (optional) overwrite output file if it exists
                     '-i', input_video_path,
                     '-filter:v',
                     'scale=\'if(gt(a,1),trunc(oh*a/2)*2,224)\':\'if(gt(a,1),224,trunc(ow*a/2)*2)\'',  # scale to 224
                     '-map', '0:v',
                     '-r', '3',  # frames per second
                     output_video_path,
                     ]
          ffmpeg = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
          out, err = ffmpeg.communicate()
          retcode = ffmpeg.poll()
          # print something above for debug
      except Exception as e:
          raise e
  
  def prepare_input_output_pairs(input_root, output_root):
      input_video_path_list = []
      output_video_path_list = []
      for root, dirs, files in os.walk(input_root):
          for file_name in files:
              input_video_path = os.path.join(root, file_name)
              output_video_path = os.path.join(output_root, file_name)
              if os.path.exists(output_video_path) and os.path.getsize(output_video_path) > 0:
                  pass
              else:
                  input_video_path_list.append(input_video_path)
                  output_video_path_list.append(output_video_path)
      return input_video_path_list, output_video_path_list
  
  if __name__ == "__main__":
      parser = argparse.ArgumentParser(description='Compress video for speed-up')
      parser.add_argument('--input_root', type=str, help='input root')
      parser.add_argument('--output_root', type=str, help='output root')
      args = parser.parse_args()
  
      input_root = args.input_root
      output_root = args.output_root
  
      assert input_root != output_root
  
      if not os.path.exists(output_root):
          os.makedirs(output_root, exist_ok=True)
  
      input_video_path_list, output_video_path_list = prepare_input_output_pairs(input_root, output_root)
  
      print("Total video need to process: {}".format(len(input_video_path_list)))
      num_works = cpu_count()
      print("Begin with {}-core logical processor.".format(num_works))
  
      pool = Pool(num_works)
      data_dict_list = pool.map(compress,
                                [(input_video_path, output_video_path) for
                                 input_video_path, output_video_path in
                                 zip(input_video_path_list, output_video_path_list)])
      pool.close()
      pool.join()
  
      print("Compress finished, wait for checking files...")
      for input_video_path, output_video_path in zip(input_video_path_list, output_video_path_list):
          if os.path.exists(input_video_path):
              if os.path.exists(output_video_path) is False or os.path.getsize(output_video_path) < 1.:
                  shutil.copyfile(input_video_path, output_video_path)
                  print("Copy and replace file: {}".format(output_video_path))