add back frame
authorPeng Li <seudut@gmail.com>
Thu, 31 May 2018 15:35:24 +0000 (23:35 +0800)
committerPeng Li <seudut@gmail.com>
Thu, 31 May 2018 15:35:24 +0000 (23:35 +0800)
yuvPlayer.cpp

index fbd4536..87fb7dc 100644 (file)
@@ -26,6 +26,7 @@ class YuvPlayer
 public:
     YuvPlayer(int width, int height, const string& title = "YUV Player");
     void play(string fname, int fps = -1);
+    void drawGrid();
     ~YuvPlayer();
 
 private:
@@ -37,8 +38,21 @@ private:
     SDL_Window *window;
     SDL_Renderer *renderer;
     SDL_Texture *texture;
-    long frameCnt = 0;
+    unsigned int frameCnt = 0;
     string title;
+    ifstream::pos_type last_pos;
+};
+
+
+class ImageOperation {
+public:
+    ImageOperation(uint8_t *r, int width, int height);
+
+
+private:
+    int width;
+    int height;
+    uint8_t *raw;
 };
 
 YuvPlayer::YuvPlayer(int w, int h, const string& t)
@@ -71,7 +85,7 @@ void YuvPlayer::play(string file, int fps)
     if (!in.is_open()) {
         cout << "failed to open " << file << endl;
     }
-    cout << "fps " << fps << endl;
+
 
     SDL_Event event;
     bool quit = false;
@@ -96,14 +110,24 @@ void YuvPlayer::play(string file, int fps)
                         quit = true;
                         break;
                     case SDLK_RIGHT:
-                        cout << "Right click" << endl;
                         if(readFrame(in, raw, frame_size)){
                             updateRenderer(raw);
                         }
                         break;
+                    case SDLK_LEFT:
+                        frameCnt = frameCnt >= 2 ? frameCnt - 2 : 0;
+                        in.seekg(frameCnt * frame_size);
+                        if(readFrame(in, raw, frame_size)){
+                            updateRenderer(raw);
+                        }
+
+                        break;
                     case SDLK_p:
                         isPlaying = !isPlaying;
                         break;
+                    case SDLK_g:
+                        drawGrid();
+                        break;
                     default:
                         break;
                 }
@@ -114,21 +138,45 @@ void YuvPlayer::play(string file, int fps)
     free(raw);
 }
 
+void YuvPlayer::drawGrid()
+{
+//    cout << "drawGrid" << endl;
+//    SDL_RenderClear(renderer);
+//                    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
+//
+//    if(SDL_RenderDrawLine(renderer, 10, 10, 200, 200) == -1){
+//        cout << "draw line error" << endl;
+//    }
+//    SDL_RenderCopy(renderer, texture, nullptr, nullptr);
+//    SDL_RenderPresent(renderer);
+
+//    SDL_UpdateTexture(texture, nullptr, raw, width * SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_IYUV));
+    SDL_RenderClear(renderer);
+    SDL_RenderCopy(renderer, texture, nullptr, nullptr);
+    SDL_RenderPresent(renderer);
+}
+
+
 bool YuvPlayer::readFrame(ifstream& in, uint8_t *raw, size_t size)
 {
+    last_pos = in.tellg();
     bool ret = (bool) in.read(reinterpret_cast<char *>(raw), size);
     if (ret){
         frameCnt++;
         stringstream ss;
         ss << this->title << " [" << setw(4) << to_string(frameCnt) << "]";
-        cout << "read frame " << frameCnt << endl;
         SDL_SetWindowTitle(window, ss.str().c_str());
+    }else {
+        cout << "read error" << endl;
     }
     return ret;
 }
 
 void YuvPlayer::updateRenderer(uint8_t *raw)
 {    
+    if (frameCnt == 10){
+        memset(raw, 0x00, 1280 * 720);
+    }
     SDL_UpdateTexture(texture, nullptr, raw, width * SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_IYUV));
     SDL_RenderClear(renderer);
     SDL_RenderCopy(renderer, texture, nullptr, nullptr);
@@ -139,5 +187,6 @@ int main(int argc, char* argv[])
 {
     string fname = "out.yuv";
     YuvPlayer player(1280, 720);
-    player.play(fname, 25);
+    //player.play(fname, 25);
+    player.play(fname);
 }