# HG changeset patch # User Sam Lantinga # Date 1021838041 0 # Node ID ba72f259bc8838ecc79a0469c4d31fd7c8b3c84d # Parent e405cf8bf58011e8330420fc20ad3cf504dd8616 Date: Sat, 18 May 2002 17:40:53 +0300 From: Mike Gorchak Subject: New QNX patches - Added more error check to avoid SEGFAULTS; - Fixed bug in update function for SDL_HWSURFACE. BTW: update is much faster than before. - Added checks for SDL_HWSURFACE flag, chosen bpp must be equal to desktop bpp for SDL_HWSURFACE. - Fixed overlay bug, no more SEGFAULTS. diff -r e405cf8bf580 -r ba72f259bc88 src/video/photon/SDL_ph_image.c --- a/src/video/photon/SDL_ph_image.c Sun May 19 19:52:32 2002 +0000 +++ b/src/video/photon/SDL_ph_image.c Sun May 19 19:54:01 2002 +0000 @@ -65,9 +65,7 @@ } break; default:{ - /* should never get here */ - fprintf(stderr,"error: unsupported bbp = %d\n", - screen->format->BitsPerPixel); + fprintf(stderr,"ph_SetupImage(): unsupported bbp = %d\n", screen->format->BitsPerPixel); return -1; } break; @@ -106,83 +104,82 @@ int ph_SetupOCImage(_THIS, SDL_Surface *screen) { - int type = 0; + int type = 0; - /* Determine image type */ - switch(screen->format->BitsPerPixel) - { - case 8:{ - type = Pg_IMAGE_PALETTE_BYTE; - } - break; - case 15:{ - type = Pg_IMAGE_DIRECT_555; - } - break; - case 16:{ - type = Pg_IMAGE_DIRECT_565; - } - break; - - case 24:{ - type = Pg_IMAGE_DIRECT_888; - } - break; - - case 32:{ - type = Pg_IMAGE_DIRECT_8888; - } - break; - default:{ - /* should never get here */ - fprintf(stderr,"error: unsupported bbp = %d\n", - screen->format->BitsPerPixel); - return -1; + /* Determine image type */ + switch(screen->format->BitsPerPixel) + { + case 8: { + type = Pg_IMAGE_PALETTE_BYTE; + } + break; + case 15:{ + type = Pg_IMAGE_DIRECT_555; } break; - } - - OCImage.FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); - OCImage.FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); - - if(OCImage.direct_context == NULL) - OCImage.direct_context = PdCreateDirectContext(); + case 16:{ + type = Pg_IMAGE_DIRECT_565; + } + break; + case 24:{ + type = Pg_IMAGE_DIRECT_888; + } + break; + case 32:{ + type = Pg_IMAGE_DIRECT_8888; + } + break; + default:{ + fprintf(stderr,"ph_SetupOCImage(): unsupported bpp = %d\n", screen->format->BitsPerPixel); + return -1; + } + break; + } - OCImage.offscreen_context = PdCreateOffscreenContext(0,screen->w,screen->h, Pg_OSC_MEM_PAGE_ALIGN); - - if (OCImage.offscreen_context == NULL) - { - printf("PdCreateOffscreenContext failed\n"); - return -1; - } + OCImage.FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof(FRAMEDATA))); + OCImage.FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof(FRAMEDATA))); - OCImage.Stride = OCImage.offscreen_context->pitch; + if(OCImage.direct_context == NULL) + { + OCImage.direct_context = PdCreateDirectContext(); + } - if (OCImage.flags & SDL_DOUBLEBUF) - printf("hardware flag for doublebuf offscreen context\n"); + OCImage.offscreen_context = PdCreateOffscreenContext(0, screen->w, screen->h, Pg_OSC_MEM_PAGE_ALIGN); - - OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context); - - OCImage.CurrentFrameData = OCImage.FrameData0; - OCImage.CurrentFrameData->Y = OCImage.dc_ptr.ptr8; - OCImage.CurrentFrameData->U = NULL; - OCImage.CurrentFrameData->V = NULL; - OCImage.current = 0; - - if(OCImage.dc_ptr.ptr8 == NULL) - { - printf("PdGetOffscreenContextPtr failed\n"); - return -1; - } - - PhDCSetCurrent(OCImage.offscreen_context); + if (OCImage.offscreen_context == NULL) + { + fprintf(stderr, "ph_SetupOCImage(): PdCreateOffscreenContext failed !\n"); + return -1; + } + + OCImage.Stride = OCImage.offscreen_context->pitch; + + if (OCImage.flags & SDL_DOUBLEBUF) + { + fprintf(stderr, "ph_SetupOCImage(): Hardware flag for doublebuf offscreen context\n"); + } + + OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context); - screen->pixels = OCImage.CurrentFrameData->Y; - - this->UpdateRects = ph_OCUpdate; + if (OCImage.dc_ptr.ptr8 == NULL) + { + fprintf(stderr, "ph_SetupOCImage(): PdGetOffscreenContextPtr failed !\n"); + return -1; + } - return 0; + OCImage.CurrentFrameData = OCImage.FrameData0; + OCImage.CurrentFrameData->Y = OCImage.dc_ptr.ptr8; + OCImage.CurrentFrameData->U = NULL; + OCImage.CurrentFrameData->V = NULL; + OCImage.current = 0; + + PhDCSetCurrent(OCImage.offscreen_context); + + screen->pixels = OCImage.CurrentFrameData->Y; + + this->UpdateRects = ph_OCUpdate; + + return 0; } int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen) @@ -242,7 +239,6 @@ return ph_SetupImage(this, screen); } } - int ph_AllocHWSurface(_THIS, SDL_Surface *surface) { return(-1); @@ -302,20 +298,21 @@ if (PgDrawPhImageRectmx(&ph_pos, SDL_Image, &ph_rect, 0) < 0) { - fprintf(stderr,"ph_NormalUpdate: PgDrawPhImageRectmx failed.\n"); + fprintf(stderr,"ph_NormalUpdate(): PgDrawPhImageRectmx failed.\n"); } } if (PgFlush() < 0) { - fprintf(stderr,"ph_NormalUpdate: PgFlush failed.\n"); + fprintf(stderr,"ph_NormalUpdate(): PgFlush failed.\n"); } } + void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects) { PhPoint_t zero = {0}; - PhRect_t src_rect; - PhRect_t dest_rect; + PhArea_t src_rect; + PhArea_t dest_rect; if(OCImage.direct_context == NULL) { @@ -323,7 +320,7 @@ } PgSetRegion(PtWidgetRid(window)); - PgSetClipping(0,NULL); + PgSetClipping(0, NULL); PgWaitHWIdle(); for (i=0; iflags=(flags & (~SDL_OPENGL)); return NULL; #endif /* HAVE_OPENGL */ @@ -332,7 +342,7 @@ { if ((mode = get_mode_any_format(width, height, bpp)) == 0) { - fprintf(stderr,"error: get_mode_any_format failed\n"); + fprintf(stderr,"ph_SetVideoMode(): get_mode_any_format failed !\n"); exit(1); } } @@ -340,7 +350,7 @@ { if ((mode = get_mode(width, height, bpp)) == 0) { - fprintf(stderr,"error: get_mode failed\n"); + fprintf(stderr,"ph_SetVideoMode(): get_mode failed !\n"); exit(1); } } @@ -362,7 +372,7 @@ if (PgSetVideoMode(&settings) < 0) { - fprintf(stderr,"error: PgSetVideoMode failed\n"); + fprintf(stderr,"ph_SetVideoMode(): PgSetVideoMode failed !\n"); } current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */ @@ -424,8 +434,15 @@ current->format->BitsPerPixel = bpp; current->format->BytesPerPixel = (bpp+7)/8; current->pitch = SDL_CalculatePitch(current); + /* Must call at least once it setup image planes */ - ph_ResizeImage(this, current, flags); + rtnval = ph_ResizeImage(this, current, flags); + + if (rtnval==-1) + { + fprintf(stderr,"ph_SetVideoMode(): ph_ResizeImage failed !\n"); + return NULL; + } /* delayed set caption call */ if (captionflag) @@ -512,9 +529,10 @@ SDL_Image->palette[i] |= colors[i-firstcolor].g<<8; SDL_Image->palette[i] |= colors[i-firstcolor].b; } + + /* image needs to be redrawed, very slow method */ + PgDrawPhImage(&point, SDL_Image, 0); } - /* image needs to be redrawed, very slow method */ - PgDrawPhImage(&point, SDL_Image, 0); } else { @@ -533,7 +551,10 @@ /* window mode must use soft palette */ PgSetPalette((PgColor_t*)&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_SOFT, 0); /* image needs to be redrawed, very slow method */ - PgDrawPhImage(&point, SDL_Image, 0); + if (SDL_Image) + { + PgDrawPhImage(&point, SDL_Image, 0); + } } else { @@ -602,7 +623,7 @@ if (oglctx==NULL) { - fprintf(stderr,"ph_SetupOpenGLContext: cannot create OpenGL context.\n"); + fprintf(stderr,"ph_SetupOpenGLContext(): cannot create OpenGL context.\n"); return (-1); } diff -r e405cf8bf580 -r ba72f259bc88 src/video/photon/SDL_phyuv.c --- a/src/video/photon/SDL_phyuv.c Sun May 19 19:52:32 2002 +0000 +++ b/src/video/photon/SDL_phyuv.c Sun May 19 19:54:01 2002 +0000 @@ -29,7 +29,6 @@ #include #include -//#include //only for bool #ifndef bool #define bool char #define TRUE 1 @@ -104,7 +103,7 @@ FRAMEDATA *FrameData0; FRAMEDATA *FrameData1; PgScalerProps_t props; - PgScalerCaps_t caps; + PgScalerCaps_t caps; PgVideoChannel_t *channel; SDL_Rect CurrentWindow; long format; @@ -142,7 +141,7 @@ } -SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) +SDL_Overlay* ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) { SDL_Overlay *overlay; struct private_yuvhwdata *hwdata; @@ -162,7 +161,8 @@ PhDCSetCurrent(0); //Need to set draw context to window esp. if we we in Offscreeen mode /* Create the overlay structure */ - overlay = (SDL_Overlay *)malloc(sizeof *overlay); + overlay = (SDL_Overlay *)malloc(sizeof(SDL_Overlay)); + memset(overlay, 0x00, sizeof(SDL_Overlay)); if ( overlay == NULL ) { SDL_OutOfMemory(); return(NULL); @@ -178,7 +178,8 @@ overlay->hwfuncs = &ph_yuvfuncs; /* Create the pixel data and lookup tables */ - hwdata = (struct private_yuvhwdata *)malloc(sizeof *hwdata); + hwdata = (struct private_yuvhwdata *)malloc(sizeof(struct private_yuvhwdata)); + memset(hwdata, 0x00, sizeof(struct private_yuvhwdata)); overlay->hwdata = hwdata; if ( hwdata == NULL ) { SDL_OutOfMemory(); @@ -186,54 +187,41 @@ return(NULL); } - if (overlay->hwdata->channel == NULL) - { - - - if ((overlay->hwdata->channel = PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER,0)) == NULL) - { - SDL_SetError("Create channel failed:%s\n", strerror( errno )); - free(overlay->hwdata); - free(overlay); - return(NULL); - } -#if 0 - overlay->hwdata->caps.size = sizeof (overlay->hwdata->caps); - PgGetScalerCapabilities(overlay->hwdata->channel, 0, &(overlay->hwdata->caps)); - if (overlay->hwdata->caps.flags & Pg_SCALER_CAP_DOUBLE_BUFFER) - overlay->hwdata->props.flags |= Pg_SCALER_PROP_DOUBLE_BUFFER; -#endif - } + if (overlay->hwdata->channel == NULL) + { + if ((overlay->hwdata->channel = PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER,0)) == NULL) + { + SDL_SetError("ph_CreateYUVOverlay(): Create channel failed: %s\n", strerror( errno )); + free(overlay->hwdata); + free(overlay); + return (NULL); + } + } -overlay->hwdata->CurrentWindow.x = 0; -overlay->hwdata->CurrentWindow.y = 0; -overlay->hwdata->CurrentWindow.w = 320; -overlay->hwdata->CurrentWindow.h = 240; + overlay->hwdata->CurrentWindow.x = 0; + overlay->hwdata->CurrentWindow.y = 0; + overlay->hwdata->CurrentWindow.w = 320; + overlay->hwdata->CurrentWindow.h = 240; - - -overlay->hwdata->State = OVERLAY_STATE_UNINIT; + overlay->hwdata->State = OVERLAY_STATE_UNINIT; -overlay->hwdata->screen_bpp = 2; -overlay->hwdata->scaler_on = FALSE; - -overlay->hwdata->screen_width = 1024; -overlay->hwdata->screen_height = 768; + overlay->hwdata->screen_bpp = 2; + overlay->hwdata->scaler_on = FALSE; + overlay->hwdata->screen_width = 1024; + overlay->hwdata->screen_height = 768; -overlay->hwdata->FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); -overlay->hwdata->FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); + overlay->hwdata->FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); + overlay->hwdata->FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); -overlay->hwdata->caps.size = sizeof(overlay->hwdata->caps); - + overlay->hwdata->caps.size = sizeof(overlay->hwdata->caps); //Note you really don't need to do this for SDL as you are given a format, but this is a good example -xv_port = -1; -i=0; - + xv_port = -1; + i=0; + while(PgGetScalerCapabilities(overlay->hwdata->channel, i++, &(overlay->hwdata->caps)) == 0) { - if(overlay->hwdata->caps.format == Pg_VIDEO_FORMAT_YV12) //in SDL {