# IReaders

`IReader`s interface with the frame source and create `FrameStruct`s.

Based on the config yaml the Sensor Stream Server will create an `IReader` to pull data and create `FrameStructs`.

If you want to [add a new sensor interface](/how-to-extend-sensor-stream-pipe/add-new-frame-source.md), you will need to make an implementation of the `IReader` interface that can pull data from the hardware and create a `FrameStruct`.

### [IReader Interface](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/ireader.h)

```
#pragma once

#include "../structs/frame_struct.hpp"

class IReader {

public:
  virtual ~IReader() {}

  virtual std::vector<std::shared_ptr<FrameStruct>> GetCurrentFrame() = 0;

  virtual std::vector<unsigned int> GetType() = 0;

  virtual bool HasNextFrame() = 0;

  virtual void NextFrame() = 0;

  virtual void Reset() = 0;

  virtual void GoToFrame(unsigned int frame_id) = 0;

  virtual unsigned int GetCurrentFrameId() = 0;

  virtual unsigned int GetFps() = 0;
};
```

## How IReader is interacted with by Sensor Stream Server

* Sensor Stream Server is what uses the IReader
* When Sensor Stream Server is started it reads the config.yaml to understand reader\_type
  * frames
    * which can then be MultiImageReader or ImageReader based on the parameter "path"
  * video
  * kinect
    * takes in parameters to build new ExtendedAzureConfig
  * iphone
* **It then creates an IReader using the parameters**
* **It then asks for "GetType()" which the IReader will respond with and array of types**
  * 0 - color
  * 1- depth
  * 2 - ir
  * 3 - confidence (iphone)
  * IReader knows how to respond based on the parameters it was passed when built
* That will create IEncoders for each type
* **It then asks for "GetFps()"**
  * IReader knows how to respond based on the parameters it was passed when built
* **It then calls "GetCurrentFrame()" which gets provides a frame struct**
  * This is then encoded by the associated encoders
* **It then calls HasNextFrame() and then NextFrame(), otherwise it calls Reset()**

### Available IReader Implementations

* [ImageReader](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/image_reader.cc)
* [MultiImageReader](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/multi_image_reader.cc)
* [VideoFileReader](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/video_file_reader.cc)
* [KinectReader](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/kinect_reader.cc)
* [IPhoneReader](https://github.com/moetsi/Sensor-Stream-Pipe/blob/master/readers/iphone_reader.mm)
* OAK-D (coming soon!)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sensor-stream-pipe.moetsi.com/frame-interface/how-to-grab-a-frame.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
