/*
 * Copyright (c) 2020, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */
#ifndef AOM_COMMON_STREAM_ITER_H_
#define AOM_COMMON_STREAM_ITER_H_

#include "aom/aom_image.h"
#include "common/tools_common.h"

#ifdef __cplusplus
extern "C" {
#endif

struct StreamIter;

// The input to each stream iterator can either be an AvxInputContext (when
// reading from a file or a pipe like STDIN) or another stream iterator.
union StreamInput {
  struct AvxInputContext *avx;
  struct StreamIter *stream;
};

typedef struct StreamIter {
  union StreamInput input;
  // For simplicity, all streams have two additional numbers associated
  // with them, e.g., for counting the number of frames returned and the
  // number of frames that should be skipped. Some iterators, like the copy
  // iterator, do not use either field.
  int current;
  int n;
  // Pointer to the function that performs the read. Returns whether a frame
  // is available. If a frame is returned, it is written into *raw.
  int (*reader)(struct StreamIter *iter, aom_image_t *raw);
} StreamIter;

// Iterator that simply copies the data from the AvxInputContext.
void copy_stream_iter_init(StreamIter *iter, struct AvxInputContext *input);

// Iterator that skips the first N frames. Takes another stream as input.
void skip_stream_iter_init(StreamIter *iter, StreamIter *input, int num_skip);

// Iterator that only returns every N-th frame. Takes another stream as input.
void step_stream_iter_init(StreamIter *iter, StreamIter *input, int step_size);

// Iterator that stops returning frames after the N-th. Takes another stream
// as input.
void limit_stream_iter_init(StreamIter *iter, StreamIter *input, int limit);

// Invokes the iterator's specialized read function to read data from the
// stream. Returns if a frame was read. If so, writes the data into *raw.
int read_stream_iter(StreamIter *iter, aom_image_t *raw);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_COMMON_STREAM_ITER_H_
