YuvPlayer(int width, int height, const string& title = "YUV Player");
void play(string fname, int fps = -1);
void toggleGrid();
+ void toggleYumaOnly();
~YuvPlayer();
private:
string title;
ifstream::pos_type last_pos;
bool isShowingGrid = false;
+ bool isLumOnly = false;
uint8_t *raw;
};
SDL_Quit();
}
+// https://wiki.videolan.org/YUV/, YCrCb
+// I420, YUV420p, YYYY YYYY UU VV
+static void lumaOnly(uint8_t *raw, int w, int h)
+{
+ memset(raw + w * h, 128, w * h / 2); // UV 128
+ //memset(raw + w * h, 0, w * h / 2); // UV 128
+ //memset(raw + w * h, 0, w * h / 2); // UV 0, G only
+ //memset(raw + w * h, 255, w * h / 2); // UV 0, R only
+ //memset(raw + w * h, 128, w * h / 4); // U 128
+ //for (int i = 0; i < w * h; i++){
+ // raw[i] = raw[i] / 2; // Y to 1/2
+ //}
+}
+
void YuvPlayer::play(string file, int fps)
{
size_t frame_size = width * height * 3 / 2;
case SDLK_g:
toggleGrid();
break;
+ case SDLK_y:
+ toggleYumaOnly();
default:
break;
}
}
free(raw);
}
+void YuvPlayer::toggleYumaOnly()
+{
+ isLumOnly = !isLumOnly;
+ updateRenderer(this->raw);
+}
void YuvPlayer::toggleGrid()
{
void YuvPlayer::updateRenderer(uint8_t *raw)
{
+ if (isLumOnly){
+ lumaOnly(raw, width, height);
+ }
SDL_UpdateTexture(texture, nullptr, raw, width * SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_IYUV));
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
int main(int argc, char* argv[])
{
- string fname = "out.yuv";
+// string fname(argv[1] ? argv[1] : "out.yuv");
+// size_t width = atoi(argv[2] ? argv[2] : "1280");
+// size_t height = atoi(argv[3] ? argv[3] : "720");
+//
+// int fps = atoi(argv[4] ? argv[4] : "20");
+// cout << fname << "\n" << width << "\n" << height << "\n" << fps << "\n" << endl;
+//
YuvPlayer player(1280, 720);
- player.play(fname, 25);
+ player.play("out.yuv", 25);
//player.play(fname);
}