blob: af98a2a71907d3b006f15420f1b46d72d554d4ea [file] [log] [blame]
/*
* 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_