/*
 *  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 <stdlib.h>

#include <memory>
#include <string>

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

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
