summaryrefslogtreecommitdiff
path: root/src/player.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.cc')
-rw-r--r--src/player.cc75
1 files changed, 45 insertions, 30 deletions
diff --git a/src/player.cc b/src/player.cc
index 8556ce6..f98b9a0 100644
--- a/src/player.cc
+++ b/src/player.cc
@@ -39,6 +39,10 @@
/*
* $Log$
+ * Revision 1.31 2005/07/26 16:16:56 deva
+ *
+ * Added fullscreen functionality.
+ *
* Revision 1.30 2005/07/25 16:18:34 deva
* *** empty log message ***
*
@@ -80,6 +84,9 @@
#include <time.h>
+// For sleep
+#include <unistd.h>
+
Player::Player(Info *ginfo,
int w, int h,
volatile int *grunning,
@@ -104,8 +111,7 @@ Player::Player(Info *ginfo,
initSDL();
- doresize = false;
- dopause = false;
+ bypass = false;
}
Player::~Player()
@@ -137,10 +143,12 @@ void Player::initSDL()
return;
}
- screen = SDL_SetVideoMode(720,//width,
- 576,//height,
+ screen = SDL_SetVideoMode(width,
+ height,
0, // 0 bpp means 'use current display depth'
- SDL_HWSURFACE | SDL_ANYFORMAT | SDL_HWACCEL);
+ SDL_HWSURFACE |
+ SDL_ANYFORMAT |
+ SDL_HWACCEL );
if(!screen) {
info->error("Unable to set %dx%d video: %s.",
@@ -150,8 +158,8 @@ void Player::initSDL()
return;
}
- overlay = SDL_CreateYUVOverlay(720,//width,
- 576,//height,
+ overlay = SDL_CreateYUVOverlay(720,
+ 576,
SDL_YUY2_OVERLAY, // Match for the libdv decoder output
screen);
if(!overlay) {
@@ -160,13 +168,19 @@ void Player::initSDL()
printf("failed!\n");
return;
}
+
+ // Setup the displayarea.
+ rect.x = 0;
+ rect.y = 0;
+ rect.w = width;
+ rect.h = height;
+
printf("done!\n");
}
void Player::player()
{
SDL_Event event;
- SDL_Rect rect;
Frame *frame;
int pitches[3];
@@ -174,12 +188,6 @@ void Player::player()
struct timespec ts;
if(!noErrors) return; // FIXME: Gracefully exit...
-
- // Setup the displayarea.
- rect.x = 0;
- rect.y = 0;
- rect.w = width;
- rect.h = height;
bool first = true;
dv_decoder_t *decoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE);
@@ -190,15 +198,7 @@ void Player::player()
sem_wait(&play_sem);
sem_post(&play_sem);
- if(doresize) {
- width = new_width;
- height = new_height;
- reinitSDL();
- doresize = false;
- dopause = false;
- }
-
- if(dopause) continue;
+ if(bypass) continue;
if(!SDL_WaitEvent(&event)) break; // FIXME: Gracefully exit...
@@ -283,16 +283,31 @@ void Player::stop()
sem_wait(&play_sem);
}
+// FIXME: Worst case genario: the loop takes more than 1 second
+// to stop displaying => crash, due to deinitialization
+// of SDL, while calling it.!
void Player::resize(int w, int h)
{
- new_width = w;
- new_height = h;
- doresize = true;
-}
+ printf("Resizing to: %d x %d\n", w, h);
-void Player::pause()
-{
- dopause = true;
+ // Tell loop to stop
+ bypass = true;
+
+ // Wait to ensure the current frame is done being displayed
+ sleep(1);
+
+ // Deinitialize SDL
+ deinitSDL();
+
+ // Set new size
+ width = w;
+ height = h;
+
+ // Initialize SDL
+ initSDL();
+
+ // Tell loop to go on.
+ bypass = false;
}
#endif /* USE_GUI */