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.
		
		
		
		
		
			
		
			
				
					
					
						
							58 lines
						
					
					
						
							1023 B
						
					
					
				
			
		
		
	
	
							58 lines
						
					
					
						
							1023 B
						
					
					
				| #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
 | |
| 
 | |
| 
 |