/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>
#include <cstdint>
#include <memory>
#include <string>

#include "common_types.h"  // NOLINT(build/include)
#include "common_video/libyuv/include/webrtc_libyuv.h"
#include "rtc_tools/frame_editing/frame_editing_lib.h"

namespace webrtc {

int EditFrames(const std::string& in_path,
               int width,
               int height,
               int first_frame_to_process,
               int interval,
               int last_frame_to_process,
               const std::string& out_path) {
  if (last_frame_to_process < first_frame_to_process) {
    fprintf(stderr, "The set of frames to cut is empty! (l < f)\n");
    return -10;
  }

  FILE* in_fid = fopen(in_path.c_str(), "rb");
  if (!in_fid) {
    fprintf(stderr, "Could not read input file: %s.\n", in_path.c_str());
    return -11;
  }

  // Frame size of I420.
  size_t frame_length = CalcBufferSize(VideoType::kI420, width, height);

  std::unique_ptr<uint8_t[]> temp_buffer(new uint8_t[frame_length]);

  FILE* out_fid = fopen(out_path.c_str(), "wb");

  if (!out_fid) {
    fprintf(stderr, "Could not open output file: %s.\n", out_path.c_str());
    fclose(in_fid);
    return -12;
  }

  int num_frames_read = 0;
  int num_frames_read_between = 0;
  size_t num_bytes_read;

  while ((num_bytes_read = fread(temp_buffer.get(), 1, frame_length, in_fid)) ==
         frame_length) {
    num_frames_read++;
    if ((num_frames_read < first_frame_to_process) ||
        (last_frame_to_process < num_frames_read)) {
      fwrite(temp_buffer.get(), 1, frame_length, out_fid);
    } else {
      num_frames_read_between++;
      if (interval <= 0) {
        if (interval == -1) {
          // Remove all frames.
        } else {
          if (((num_frames_read_between - 1) % interval) == 0) {
            // Keep only every |interval| frame.
            fwrite(temp_buffer.get(), 1, frame_length, out_fid);
          }
        }
      } else if (interval > 0) {
        for (int i = 1; i <= interval; ++i) {
          fwrite(temp_buffer.get(), 1, frame_length, out_fid);
        }
      }
    }
  }
  if (num_bytes_read > 0 && num_bytes_read < frame_length) {
    printf("Frame to small! Last frame truncated.\n");
  }
  fclose(in_fid);
  fclose(out_fid);

  printf("Done editing!\n");
  return 0;
}
}  // namespace webrtc
