Skip to content

Instantly share code, notes, and snippets.

@mkosler
Created February 20, 2017 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkosler/60e56a9d62e66e6a9fa1e6e82cf95447 to your computer and use it in GitHub Desktop.
Save mkosler/60e56a9d62e66e6a9fa1e6e82cf95447 to your computer and use it in GitHub Desktop.
#include <cstdlib>
#include <iostream>
#include <SDL.h>
#include <theoraplayer\TheoraPlayer.h>
int main(int argc, char *argv[])
{
if (SDL_Init(SDL_INIT_VIDEO)) {
std::cerr << "Failed to initialize SDL: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}
auto manager = new TheoraVideoManager();
auto clip = manager->createVideoClip("[[[ FILEPATH HERE ]]]", TH_RGB, 16);
auto window = SDL_CreateWindow("SDLTheoraPlayer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
clip->getWidth(), clip->getHeight(), 0);
if (window == nullptr) {
std::cerr << "Failed to create window: " << SDL_GetError() << std::endl;
delete manager;
SDL_Quit();
return EXIT_FAILURE;
}
auto renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == nullptr) {
std::cerr << "Failed to create renderer: " << SDL_GetError() << std::endl;
delete manager;
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_FAILURE;
}
auto texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, clip->getWidth(),
clip->getHeight());
if (texture == nullptr) {
std::cerr << "Failed to create texture: " << SDL_GetError() << std::endl;
delete manager;
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_FAILURE;
}
auto quit = false;
SDL_Event e;
Uint32 now = SDL_GetTicks(), last = 0;
while (!quit) {
last = now;
now = SDL_GetTicks();
const float dt = (float)(now - last) / 1000.0f;
manager->update(dt);
SDL_PollEvent(&e);
switch (e.type) {
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
if (e.key.keysym.sym == SDLK_ESCAPE) quit = true;
break;
}
auto frame = clip->getNextFrame();
if (frame != nullptr) {
void *pixels;
int pitch;
SDL_LockTexture(texture, nullptr, &pixels, &pitch);
memcpy(pixels, frame->getBuffer(), sizeof(Uint8) * pitch * frame->getHeight());
SDL_UnlockTexture(texture);
clip->popFrame();
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
SDL_RenderPresent(renderer);
}
delete manager;
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment