|  | /* | 
|  | * Copyright (c) 2021, Alliance for Open Media. All rights reserved | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 3-Clause Clear License | 
|  | * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear | 
|  | * License was not distributed with this source code in the LICENSE file, you | 
|  | * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  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 | 
|  | * aomedia.org/license/patent-license/. | 
|  | */ | 
|  | #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_ |