Automatic fallback to software renderer, SDL displays in YUY2 always

git-svn-id: svn://code.dyne.org/veejay/trunk@368 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
Niels Elburg
2005-07-17 15:21:31 +00:00
parent b2fc9b6c3f
commit f016f45ec5
3 changed files with 160 additions and 160 deletions

View File

@@ -1807,8 +1807,10 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags)
if (!vj_sdl_init(info->sdl[0], info->bes_width, info->bes_height, "Veejay",1,
info->settings->full_screen[0]))
{
veejay_msg(VEEJAY_MSG_ERROR, "Error initializing SDL");
return -1;
}
break;
#endif
#ifdef HAVE_DIRECTFB

View File

@@ -16,6 +16,11 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
*/
/*
* Output in YUY2 always
* Seems that YUV 4:2:0 (YV12) overlays have problems with multiple SDL video window
*/
#include <config.h>
#ifdef HAVE_SDL
#include <veejay/vj-sdl.h>
@@ -34,15 +39,11 @@ vj_sdl *vj_sdl_allocate(int width, int height, int fmt)
vj_sdl *vjsdl = (vj_sdl *) malloc(sizeof(vj_sdl));
if (!vjsdl)
return NULL;
vjsdl->use_yuv_direct = 0;
vjsdl->use_yuv_hwaccel = 0;
vjsdl->show_cursor = 0;
vjsdl->flags[0] = 0;
vjsdl->flags[1] = 0;
vjsdl->mouse_motion = 0;
vjsdl->use_keyboard = 1;
if(fmt == FMT_420)
vjsdl->pix_format = SDL_YV12_OVERLAY;
else
vjsdl->pix_format = SDL_YUY2_OVERLAY;
vjsdl->pix_format = SDL_YUY2_OVERLAY; // have best quality by default
vjsdl->pix_fmt = fmt;
vjsdl->width = width;
vjsdl->height = height;
@@ -64,128 +65,167 @@ void vj_sdl_set_geometry(vj_sdl* sdl, int w, int h)
int vj_sdl_init(vj_sdl * vjsdl, int scaled_width, int scaled_height, const char *caption, int show, int fs)
{
uint8_t *sbuffer;
int i = 0;
if (!vjsdl)
return 0;
uint8_t *sbuffer;
char name[100];
int i = 0;
const int bpp = 24;
const SDL_VideoInfo *info = NULL;
if (!vjsdl)
return 0;
// if (vjsdl->use_yuv_direct == 1)
// setenv("SDL_VIDEO_YUV_DIRECT", "1", 1);
// if (vjsdl->use_yuv_hwaccel == 1)
// setenv("SDL_VIDEO_HWACCEL", "1", 1);
if (vjsdl->custom_geo[0] != -1 && vjsdl->custom_geo[1]!=-1)
{
char exp_str[100];
sprintf(exp_str, "SDL_VIDEO_WINDOW_POS=%d,%d",vjsdl->custom_geo[0],
vjsdl->custom_geo[1]);
if(putenv(exp_str)==0)
veejay_msg(VEEJAY_MSG_DEBUG,"SDL geometry %d , %d",
vjsdl->custom_geo[0],vjsdl->custom_geo[1]);
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
veejay_msg(VEEJAY_MSG_ERROR, "%s", SDL_GetError());
veejay_msg(VEEJAY_MSG_INFO, "\tHint: 'export SDL_VIDEODRIVER=x11'");
return 0;
}
if (SDL_Init(SDL_INIT_VIDEO) < 0)
return 0;
/* dont overwrite environment settings */
setenv( "SDL_VIDEO_YUV_DIRECT", "1", 0 );
setenv( "SDL_VIDEO_HWACCEL", "1", 0 );
if (scaled_width)
vjsdl->sw_scale_width = scaled_width;
if (scaled_height)
vjsdl->sw_scale_height = scaled_height;
char *hw_env = getenv("SDL_VIDEO_HWACCEL");
int hw_on = 0;
if(hw_env)
{
char *val = strtok(hw_env, "=");
hw_on = val ? atoi(val): 0;
}
if(fs == 0 )
vjsdl->screen =
SDL_SetVideoMode(vjsdl->sw_scale_width, vjsdl->sw_scale_height, 0,
SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_DOUBLEBUF |
SDL_HWACCEL);
if( hw_on == 0 )
{
veejay_msg(VEEJAY_MSG_DEBUG, "Setting up for software emulation");
vjsdl->flags[0] = SDL_SWSURFACE | SDL_ASYNCBLIT | SDL_ANYFORMAT;
vjsdl->flags[1] = SDL_SWSURFACE | SDL_FULLSCREEN | SDL_ASYNCBLIT |SDL_ANYFORMAT;
}
else
vjsdl->screen =
SDL_SetVideoMode(vjsdl->sw_scale_width, vjsdl->sw_scale_height, 0,
SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_DOUBLEBUF |
SDL_HWACCEL | SDL_FULLSCREEN);
{
veejay_msg(VEEJAY_MSG_DEBUG, "Setting up for Hardware Acceleration");
vjsdl->flags[0] = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_DOUBLEBUF;
vjsdl->flags[1] = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_FULLSCREEN | SDL_DOUBLEBUF;
}
if (!vjsdl->screen) {
sprintf(vjsdl->last_error, "%s", SDL_GetError());
return 0;
}
if (vjsdl->custom_geo[0] != -1 && vjsdl->custom_geo[1]!=-1)
{
char exp_str[100];
sprintf(exp_str, "SDL_VIDEO_WINDOW_POS=%d,%d",vjsdl->custom_geo[0],
vjsdl->custom_geo[1]);
if(putenv(exp_str)==0)
veejay_msg(VEEJAY_MSG_DEBUG,"SDL geometry %d , %d",
vjsdl->custom_geo[0],vjsdl->custom_geo[1]);
}
if (vjsdl->use_keyboard == 1) {
SDL_EventState(SDL_KEYDOWN, SDL_ENABLE);
} else {
SDL_EventState(SDL_KEYDOWN, SDL_DISABLE);
}
if (vjsdl->mouse_motion == 1) {
SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
} else {
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
}
if (scaled_width)
vjsdl->sw_scale_width = scaled_width;
if (scaled_height)
vjsdl->sw_scale_height = scaled_height;
if (vjsdl->show_cursor == 1) {
SDL_ShowCursor(SDL_ENABLE);
} else {
SDL_ShowCursor(SDL_DISABLE);
}
vjsdl->yuv_overlay = SDL_CreateYUVOverlay(vjsdl->width,
SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, 100 );
info = SDL_GetVideoInfo();
veejay_msg(VEEJAY_MSG_DEBUG, "Video output driver: SDL");
veejay_msg(VEEJAY_MSG_DEBUG, " hw_surface = %s",
(info->hw_available ? "Yes" : "No"));
veejay_msg(VEEJAY_MSG_DEBUG, " window manager = %s",
(info->wm_available ? "Yes" : "No" ));
veejay_msg(VEEJAY_MSG_DEBUG, " BLIT acceleration: %s ",
( info->blit_hw ? "Yes" : "No" ) );
veejay_msg(VEEJAY_MSG_DEBUG, " Software surface: %s",
( info->blit_sw ? "Yes" : "No" ) );
veejay_msg(VEEJAY_MSG_DEBUG, " Video memory: %dKB ", info->video_mem );
veejay_msg(VEEJAY_MSG_DEBUG, " Preferred depth: %d bits/pixel", info->vfmt->BitsPerPixel);
int my_bpp = SDL_VideoModeOK( vjsdl->sw_scale_width, vjsdl->sw_scale_height,bpp,
vjsdl->flags[fs] );
if(!my_bpp)
{
veejay_msg(VEEJAY_MSG_DEBUG, "Requested depth of 24 bits/pixel not supported");
return 0;
}
vjsdl->screen = SDL_SetVideoMode( vjsdl->sw_scale_width, vjsdl->sw_scale_height,my_bpp,
vjsdl->flags[fs]);
if (!vjsdl->screen)
{
veejay_msg(VEEJAY_MSG_WARNING, "%s", SDL_GetError());
return 0;
}
if (vjsdl->use_keyboard == 1)
SDL_EventState(SDL_KEYDOWN, SDL_ENABLE);
else
SDL_EventState(SDL_KEYDOWN, SDL_DISABLE);
if (vjsdl->mouse_motion == 1)
SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
else
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
if (vjsdl->show_cursor == 1)
SDL_ShowCursor(SDL_ENABLE);
else
SDL_ShowCursor(SDL_DISABLE);
vjsdl->yuv_overlay = SDL_CreateYUVOverlay(vjsdl->width,
vjsdl->height,
vjsdl->pix_format,
vjsdl->screen);
if (!vjsdl->yuv_overlay) {
sprintf(vjsdl->last_error, "%s", SDL_GetError());
return 0;
}
if (!vjsdl->yuv_overlay)
{
veejay_msg(VEEJAY_MSG_ERROR, "%s", SDL_GetError());
return 0;
}
SDL_VideoDriverName( name, 100 );
veejay_msg(VEEJAY_MSG_DEBUG, "Using Video Driver %s", name );
veejay_msg(VEEJAY_MSG_INFO, "Initialized %s SDL video overlay (%dx%d), %s",
( vjsdl->pix_format == SDL_YV12_OVERLAY ? "YV12" : "YUYV"),
scaled_width, scaled_height,
( vjsdl->yuv_overlay->hw_overlay ? "using Hardware Acceleration" : "not using Hardware Acceleration"));
/*
if (vjsdl->yuv_overlay->pitches[0] !=
vjsdl->yuv_overlay->pitches[1] * 2
|| vjsdl->yuv_overlay->pitches[0] !=
vjsdl->yuv_overlay->pitches[2] * 2) {
veejay_msg(VEEJAY_MSG_ERROR, "SDL return non YUV 420 overlay %d %d %d",
vjsdl->yuv_overlay->pitches[0],
vjsdl->yuv_overlay->pitches[1],
vjsdl->yuv_overlay->pitches[2]);
// return 0;
}
*/
vjsdl->rectangle.x = 0;
vjsdl->rectangle.y = 0;
vjsdl->rectangle.w = scaled_width;
vjsdl->rectangle.h = scaled_height;
vjsdl->rectangle.x = 0;
vjsdl->rectangle.y = 0;
vjsdl->rectangle.w = scaled_width;
vjsdl->rectangle.h = scaled_height;
if (!vj_sdl_lock(vjsdl))
return 0;
sbuffer = (uint8_t *) vjsdl->screen->pixels;
for (i = 0; i < vjsdl->screen->h; ++i) {
memset(sbuffer, (i * 255) / vjsdl->screen->h,
vjsdl->screen->w * vjsdl->screen->format->BytesPerPixel);
sbuffer += vjsdl->screen->pitch;
}
SDL_WM_SetCaption(caption, "0000000");
if (!vj_sdl_unlock(vjsdl))
return 0;
/*
we can draw something on the raw surface.
*/
if(show) {
SDL_UpdateRect(vjsdl->screen, 0, 0, vjsdl->rectangle.w,
vjsdl->rectangle.h);
if (!vj_sdl_lock(vjsdl))
{
veejay_msg(VEEJAY_MSG_ERROR, "Cant lock SDL Surface");
return 0;
}
return 1;
sbuffer = (uint8_t *) vjsdl->screen->pixels;
for (i = 0; i < vjsdl->screen->h; ++i)
{
memset(sbuffer, (i * 255) / vjsdl->screen->h,
vjsdl->screen->w * vjsdl->screen->format->BytesPerPixel);
sbuffer += vjsdl->screen->pitch;
}
SDL_WM_SetCaption(caption, "0000000");
if (!vj_sdl_unlock(vjsdl))
return 0;
/*
we can draw something on the raw surface.
*/
if(show)
{
SDL_UpdateRect(vjsdl->screen, 0, 0, vjsdl->rectangle.w,
vjsdl->rectangle.h);
}
return 1;
}
void vj_sdl_show(vj_sdl *vjsdl) {
@@ -218,63 +258,22 @@ int vj_sdl_unlock(vj_sdl * vjsdl)
int vj_sdl_update_yuv_overlay(vj_sdl * vjsdl, uint8_t ** yuv420)
{
if (!vj_sdl_lock(vjsdl))
return 0;
if (!yuv420[0] || !yuv420[1] || !yuv420[2])
return 0;
if (!vj_sdl_lock(vjsdl))
return 0;
if (!yuv420[0] || !yuv420[1] || !yuv420[2])
return 0;
if( vjsdl->pix_fmt == FMT_420)
{
// SDL needs IV12, which is equal to YUV420 but with Cb/Cr swapped
veejay_memcpy(vjsdl->yuv_overlay->pixels[0],yuv420[0],
vjsdl->frame_size);
veejay_memcpy(vjsdl->yuv_overlay->pixels[1],yuv420[2],
vjsdl->frame_size / 4);
veejay_memcpy(vjsdl->yuv_overlay->pixels[2],yuv420[1],
vjsdl->frame_size / 4);
}
else
{
if(vjsdl->pix_fmt == FMT_420)
yuv420p_to_yuv422( yuv420, vjsdl->yuv_overlay->pixels[0],vjsdl->width,vjsdl->height);
else
yuv422_to_yuyv( yuv420, vjsdl->yuv_overlay->pixels[0], vjsdl->width,vjsdl->height);
if (!vj_sdl_unlock(vjsdl))
return 0;
/*
int w = vjsdl->width;
int h = vjsdl->height;
int x,y;
uint8_t *pixels = vjsdl->yuv_overlay->pixels[0];
uint8_t *Y = yuv420[0];
uint8_t *U = yuv420[1];
uint8_t *V = yuv420[2]; // U Y V Y
/// YUY2: Y0, U0, Y1 , V0
SDL_DisplayYUVOverlay(vjsdl->yuv_overlay, &(vjsdl->rectangle));
for(y = 0; y < h; y ++ )
{
Y = yuv420[0] + y * w;
U = yuv420[1] + (y>>1) * w;
V = yuv420[2] + (y>>1) * w;
for(x=0; x < w; x+= 2)
{
*(pixels + 0) = Y[0];
*(pixels + 1) = U[0];
*(pixels + 2) = Y[1];
*(pixels + 3) = V[0];
pixels += 4;
Y+=2;
++U;
++V;
}
}
*/
}
if (!vj_sdl_unlock(vjsdl))
return 0;
SDL_DisplayYUVOverlay(vjsdl->yuv_overlay, &(vjsdl->rectangle));
return 1;
return 1;
}

View File

@@ -30,8 +30,7 @@ typedef struct vj_sdl_t {
SDL_Overlay *yuv_overlay;
SDL_Rect rectangle;
SDL_Event event;
int use_yuv_direct;
int use_yuv_hwaccel;
uint32_t flags[2];
int show_cursor;
int mouse_motion;
int use_keyboard;