projects
/
yuv-player.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
7de7c3d
)
Fix some key event issue
author
Peng Li
<seudut@gmail.com>
Thu, 31 May 2018 12:13:10 +0000
(20:13 +0800)
committer
Peng Li
<seudut@gmail.com>
Thu, 31 May 2018 12:13:10 +0000
(20:13 +0800)
yuvPlayer.cpp
patch
|
blob
|
history
diff --git
a/yuvPlayer.cpp
b/yuvPlayer.cpp
index
322975e
..
fbd4536
100644
(file)
--- a/
yuvPlayer.cpp
+++ b/
yuvPlayer.cpp
@@
-1,5
+1,8
@@
#include<iostream>
#include<fstream>
#include<iostream>
#include<fstream>
+#include<thread>
+#include<sstream>
+#include<iomanip>
#include "SDL2/SDL.h"
using namespace std;
#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
*
* 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:
*/
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:
~YuvPlayer();
private:
@@
-29,14
+37,17
@@
private:
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture;
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)
: width(w)
, height(h)
+, title(t)
{
SDL_Init(SDL_INIT_VIDEO);
{
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;
}
if (window == nullptr){
cout << "create error: " << SDL_GetError() << endl;
}
@@
-46,11
+57,13
@@
YuvPlayer::YuvPlayer(int w, int h)
YuvPlayer::~YuvPlayer()
{
YuvPlayer::~YuvPlayer()
{
+ SDL_DestroyTexture(texture);
+ SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
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);
{
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;
}
if (!in.is_open()) {
cout << "failed to open " << file << endl;
}
+ cout << "fps " << fps << endl;
SDL_Event event;
bool quit = false;
SDL_Event event;
bool quit = false;
+ bool isPlaying = true;
+ int interval = 1000 / fps;
+
while(!quit) {
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;
switch(event.type){
case SDL_QUIT:
quit = true;
@@
-73,8
+96,13
@@
void YuvPlayer::play(string file)
quit = true;
break;
case SDLK_RIGHT:
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;
break;
default:
break;
@@
-88,8
+116,15
@@
void YuvPlayer::play(string file)
bool YuvPlayer::readFrame(ifstream& in, uint8_t *raw, size_t size)
{
bool YuvPlayer::readFrame(ifstream& in, uint8_t *raw, size_t size)
{
- in.read(reinterpret_cast<char *>(raw), size);
- return true;
+ 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());
+ }
+ return ret;
}
void YuvPlayer::updateRenderer(uint8_t *raw)
}
void YuvPlayer::updateRenderer(uint8_t *raw)
@@
-100,9
+135,9
@@
void YuvPlayer::updateRenderer(uint8_t *raw)
SDL_RenderPresent(renderer);
}
SDL_RenderPresent(renderer);
}
-int main()
+int main(
int argc, char* argv[]
)
{
string fname = "out.yuv";
YuvPlayer player(1280, 720);
{
string fname = "out.yuv";
YuvPlayer player(1280, 720);
- player.play(fname);
+ player.play(fname
, 25
);
}
}