From 4130e6fc6c38e89a6555b60d9bef63d64840b3c9 Mon Sep 17 00:00:00 2001 From: Peng Li Date: Thu, 31 May 2018 20:13:10 +0800 Subject: [PATCH] Fix some key event issue --- yuvPlayer.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/yuvPlayer.cpp b/yuvPlayer.cpp index 322975e..fbd4536 100644 --- a/yuvPlayer.cpp +++ b/yuvPlayer.cpp @@ -1,5 +1,8 @@ #include #include +#include +#include +#include #include "SDL2/SDL.h" using namespace std; @@ -11,13 +14,18 @@ using namespace std; * Play YUV with ffplay * ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 -i ./out.yuv * + * Usage: + * 1. press 'P' to pause or play as the given framerate + * 2. press 'q' to quit + * 3. press RIGHT to next frame, LEFT to previous frame + * 4. color space transform */ class YuvPlayer { public: - YuvPlayer(int width, int height); - void play(string fname); + YuvPlayer(int width, int height, const string& title = "YUV Player"); + void play(string fname, int fps = -1); ~YuvPlayer(); private: @@ -29,14 +37,17 @@ private: SDL_Window *window; SDL_Renderer *renderer; SDL_Texture *texture; + long frameCnt = 0; + string title; }; -YuvPlayer::YuvPlayer(int w, int h) +YuvPlayer::YuvPlayer(int w, int h, const string& t) : width(w) , height(h) +, title(t) { SDL_Init(SDL_INIT_VIDEO); - window = SDL_CreateWindow("YUV Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN); + window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN); if (window == nullptr){ cout << "create error: " << SDL_GetError() << endl; } @@ -46,11 +57,13 @@ YuvPlayer::YuvPlayer(int w, int h) YuvPlayer::~YuvPlayer() { + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); } -void YuvPlayer::play(string file) +void YuvPlayer::play(string file, int fps) { size_t frame_size = width * height * 3 / 2; uint8_t *raw = (uint8_t *) malloc(sizeof(uint8_t) * frame_size); @@ -58,11 +71,21 @@ void YuvPlayer::play(string file) if (!in.is_open()) { cout << "failed to open " << file << endl; } + cout << "fps " << fps << endl; SDL_Event event; bool quit = false; + bool isPlaying = true; + int interval = 1000 / fps; + while(!quit) { - SDL_WaitEvent(&event); + interval = isPlaying ? 1000 / fps : -1; + SDL_WaitEventTimeout(&event, interval); + if(fps > 0 && isPlaying){ + if(readFrame(in, raw, frame_size)){ + updateRenderer(raw); + } + } switch(event.type){ case SDL_QUIT: quit = true; @@ -73,8 +96,13 @@ void YuvPlayer::play(string file) quit = true; break; case SDLK_RIGHT: - readFrame(in, raw, frame_size); - updateRenderer(raw); + cout << "Right click" << endl; + if(readFrame(in, raw, frame_size)){ + updateRenderer(raw); + } + break; + case SDLK_p: + isPlaying = !isPlaying; break; default: break; @@ -88,8 +116,15 @@ void YuvPlayer::play(string file) bool YuvPlayer::readFrame(ifstream& in, uint8_t *raw, size_t size) { - in.read(reinterpret_cast(raw), size); - return true; + bool ret = (bool) in.read(reinterpret_cast(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()); + } + return ret; } void YuvPlayer::updateRenderer(uint8_t *raw) @@ -100,9 +135,9 @@ void YuvPlayer::updateRenderer(uint8_t *raw) SDL_RenderPresent(renderer); } -int main() +int main(int argc, char* argv[]) { string fname = "out.yuv"; YuvPlayer player(1280, 720); - player.play(fname); + player.play(fname, 25); } -- 2.11.0