#ifndef FRAMEREADER_HPP
#define FRAMEREADER_HPP

#include <unistd.h>
#include <vector>
#include <map>
#include <thread>
#include <mutex>
#include <list>
#include <condition_variable>

#include "channel.hpp"

// independent of QT, needs ffmpeg
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}


class FrameReader {
public:
  FrameReader(const char *fn);
  uint8_t *get(int idx);
  AVFrame *toRGB(AVFrame *);
  void waitForReady() {
    while (!joined) usleep(10*1000);
  }
  int getRGBSize() { return width*height*3; }
  void loaderThread();
  void cacherThread();
private:
  AVFormatContext *pFormatCtx = NULL;
  AVCodecContext *pCodecCtx = NULL;

	struct SwsContext *sws_ctx = NULL;

	int width = 1164;
	int height = 874;

  std::vector<AVPacket *> pkts;

  std::thread *t;
  bool joined = false;

  std::map<int, uint8_t *> cache;
  std::mutex mcache;

  void GOPCache(int idx);
  channel<int> to_cache;

  bool valid = true;
  char url[0x400];
};

#endif

