From: Peng Li Date: Thu, 31 May 2018 15:35:24 +0000 (+0800) Subject: add back frame X-Git-Url: http://47.100.26.94:8080/?a=commitdiff_plain;h=2db8339fb44e042501bcb157de6f0e019463c86d;hp=4130e6fc6c38e89a6555b60d9bef63d64840b3c9;p=yuv-player.git add back frame --- diff --git a/yuvPlayer.cpp b/yuvPlayer.cpp index fbd4536..87fb7dc 100644 --- a/yuvPlayer.cpp +++ b/yuvPlayer.cpp @@ -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(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); }