9 * ffmpeg -i big_buck_bunny_720p_10mb.mp4 -c:v rawvideo -pix_fmt yuv420p out.yuv
11 * Play YUV with ffplay
12 * ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 -i ./out.yuv
19 YuvPlayer(int width, int height);
20 void play(string fname);
24 bool readFrame(ifstream& in, uint8_t *raw, size_t size);
25 void updateRenderer(uint8_t *raw);
30 SDL_Renderer *renderer;
34 YuvPlayer::YuvPlayer(int w, int h)
38 SDL_Init(SDL_INIT_VIDEO);
39 window = SDL_CreateWindow("YUV Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN);
40 if (window == nullptr){
41 cout << "create error: " << SDL_GetError() << endl;
43 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
44 texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, width, height);
47 YuvPlayer::~YuvPlayer()
49 SDL_DestroyWindow(window);
53 void YuvPlayer::play(string file)
55 size_t frame_size = width * height * 3 / 2;
56 uint8_t *raw = (uint8_t *) malloc(sizeof(uint8_t) * frame_size);
57 ifstream in (file, ios::binary);
59 cout << "failed to open " << file << endl;
65 SDL_WaitEvent(&event);
71 switch(event.key.keysym.sym){
76 readFrame(in, raw, frame_size);
89 bool YuvPlayer::readFrame(ifstream& in, uint8_t *raw, size_t size)
91 in.read(reinterpret_cast<char *>(raw), size);
95 void YuvPlayer::updateRenderer(uint8_t *raw)
97 SDL_UpdateTexture(texture, nullptr, raw, width * SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_IYUV));
98 SDL_RenderClear(renderer);
99 SDL_RenderCopy(renderer, texture, nullptr, nullptr);
100 SDL_RenderPresent(renderer);
105 string fname = "out.yuv";
106 YuvPlayer player(1280, 720);