You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					59 lines
				
				1023 B
			
		
		
			
		
	
	
					59 lines
				
				1023 B
			| 
											6 years ago
										 | #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
 | ||
|  | 
 |