int base_resize( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) { unsigned short height; unsigned short width; /* eliminate 'unreferenced' warnings */ widget = widget, apinfo = apinfo, cbinfo = cbinfo; PtContainerCallback_t * cbdata = (PtContainerCallback_t *)cbinfo->cbdata; //PtGetResource( widget, Pt_ARG_HEIGHT, &height, 0 ); //PtGetResource( widget, Pt_ARG_WIDTH, &width, 0 ); height = cbdata->new_dim.h; width = cbdata->new_dim.w; H = (height) - ((H * 0.2 ) + 50); W = (width) - 20; if (uu != NULL) delete []uu; uu = new double[W]; if (vv != NULL) delete []vv; vv = new double[H]; double dx = (double)net_img_w / (double)W; double dy = (double)net_img_h / (double)H; double uu_temp[W]; double vv_temp[H]; uu[0] = 0; vv[0] = 0; uu_temp[0] = 0; vv_temp[0] = 0; double integer_part; double fractional_part; for (int i = 1; i < H; i++) { vv_temp[i] = vv_temp[i-1] + dy; fractional_part = modf(vv_temp[i], &integer_part); vv[i] = (fractional_part < 0.5) ? integer_part : (integer_part + 1); } for (int j = 1; j < W; j++) { uu_temp[j] = uu_temp[j-1] + dx; fractional_part = modf(uu_temp[j], &integer_part); uu[j] = (fractional_part < 0.5) ? integer_part : (integer_part + 1); } if( phimage_vis != NULL ) { phimage_vis->flags = Ph_RELEASE_IMAGE_ALL; PhReleaseImage(phimage_vis); } //Create new image with the new window dimension phimage_vis = PhCreateImage( NULL, W, H, Pg_IMAGE_DIRECT_888, NULL, 0, 1); phimage_vis->bpl = W * 3; PhPoint_t new_pos; new_pos.x = 10; new_pos.y = H +5; PtSetResource( ABW_name_text, Pt_ARG_POS, &new_pos, 0 ); return( Pt_CONTINUE ); }
int ph_SetupImage(_THIS, SDL_Surface *screen) { PgColor_t* palette=NULL; int type=0; int bpp; bpp=screen->format->BitsPerPixel; /* Determine image type */ switch(bpp) { 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:{ SDL_SetError("ph_SetupImage(): unsupported bpp=%d !\n", bpp); return -1; } break; } /* palette emulation code */ if ((bpp==8) && (desktoppal==SDLPH_PAL_EMULATE)) { /* creating image palette */ palette=malloc(_Pg_MAX_PALETTE*sizeof(PgColor_t)); if (palette==NULL) { SDL_SetError("ph_SetupImage(): can't allocate memory for palette !\n"); return -1; } PgGetPalette(palette); /* using shared memory for speed (set last param to 1) */ if ((SDL_Image = PhCreateImage(NULL, screen->w, screen->h, type, palette, _Pg_MAX_PALETTE, 1)) == NULL) { SDL_SetError("ph_SetupImage(): PhCreateImage() failed for bpp=8 !\n"); free(palette); return -1; } } else { /* using shared memory for speed (set last param to 1) */ if ((SDL_Image = PhCreateImage(NULL, screen->w, screen->h, type, NULL, 0, 1)) == NULL) { SDL_SetError("ph_SetupImage(): PhCreateImage() failed for bpp=%d !\n", bpp); return -1; } } screen->pixels = SDL_Image->image; screen->pitch = SDL_Image->bpl; this->UpdateRects = ph_NormalUpdate; return 0; }
/***************************************************************************** * NewPicture: allocate a picture ***************************************************************************** * Returns 0 on success, -1 otherwise *****************************************************************************/ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic, int index ) { /* We know the chroma, allocate a buffer which will be used * directly by the decoder */ p_pic->p_sys = malloc( sizeof( picture_sys_t ) ); if( p_pic->p_sys == NULL ) { return -1; } switch( p_vout->p_sys->i_mode ) { case MODE_NORMAL_MEM: case MODE_SHARED_MEM: /* create images for [shared] memory blit */ if( !( p_pic->p_sys->p_image = PhCreateImage( NULL, p_vout->p_sys->dim.w, p_vout->p_sys->dim.h, p_vout->p_sys->i_img_type, NULL, 0, p_vout->p_sys->i_mode == MODE_SHARED_MEM ) ) ) { msg_Err( p_vout, "cannot create image" ); free( p_pic->p_sys ); return( -1 ); } p_pic->p->p_pixels = p_pic->p_sys->p_image->image; p_pic->p->i_lines = p_pic->p_sys->p_image->size.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_image->size.h; p_pic->p->i_pitch = p_pic->p_sys->p_image->bpl; p_pic->p->i_pixel_pitch = p_vout->p_sys->i_bytes_per_pixel; p_pic->p->i_visible_pitch = p_vout->p_sys->i_bytes_per_pixel * p_pic->p_sys->p_image->size.w; p_pic->i_planes = 1; break; case MODE_VIDEO_MEM: /* create offscreen contexts for video memory blit */ if( ( p_pic->p_sys->p_ctx[0] = PdCreateOffscreenContext( 0, p_vout->p_sys->dim.w, p_vout->p_sys->dim.h, Pg_OSC_MEM_PAGE_ALIGN) ) == NULL ) { msg_Err( p_vout, "unable to create offscreen context" ); free( p_pic->p_sys ); return( -1 ); } /* get context pointers */ if( ( p_pic->p_sys->p_buf[0] = PdGetOffscreenContextPtr ( p_pic->p_sys->p_ctx[0] ) ) == NULL ) { msg_Err( p_vout, "unable to get offscreen context ptr" ); PhDCRelease ( p_pic->p_sys->p_ctx[0] ); p_pic->p_sys->p_ctx[0] = NULL; free( p_pic->p_sys ); return( -1 ); } p_vout->p_sys->i_bytes_per_line = p_pic->p_sys->p_ctx[0]->pitch; memset( p_pic->p_sys->p_buf[0], 0, p_vout->p_sys->i_bytes_per_line * p_vout->p_sys->dim.h ); p_pic->p->p_pixels = p_pic->p_sys->p_buf[0]; p_pic->p->i_lines = p_pic->p_sys->p_ctx[0]->dim.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_ctx[0]->dim.h; p_pic->p->i_pitch = p_pic->p_sys->p_ctx[0]->pitch; p_pic->p->i_pixel_pitch = p_vout->p_sys->i_bytes_per_pixel; p_pic->p->i_visible_pitch = p_vout->p_sys->i_bytes_per_pixel * p_pic->p_sys->p_ctx[0]->dim.w; p_pic->i_planes = 1; break; case MODE_VIDEO_OVERLAY: if (index == 0) { p_pic->p_sys->p_ctx[Y_PLANE] = p_vout->p_sys->p_channel->yplane1; p_pic->p_sys->p_ctx[U_PLANE] = p_vout->p_sys->p_channel->uplane1; p_pic->p_sys->p_ctx[V_PLANE] = p_vout->p_sys->p_channel->vplane1; } else { p_pic->p_sys->p_ctx[Y_PLANE] = p_vout->p_sys->p_channel->yplane2; p_pic->p_sys->p_ctx[U_PLANE] = p_vout->p_sys->p_channel->uplane2; p_pic->p_sys->p_ctx[V_PLANE] = p_vout->p_sys->p_channel->vplane2; } p_pic->p_sys->p_buf[Y_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[Y_PLANE] ); if( p_pic->p_sys->p_buf[Y_PLANE] == NULL ) { msg_Err( p_vout, "unable to get video channel ctx ptr" ); return( 1 ); } switch (p_vout->p_sys->i_vc_format) { case Pg_VIDEO_FORMAT_YUV420: p_vout->output.i_chroma = VLC_CODEC_I420; p_pic->p_sys->p_buf[U_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[U_PLANE] ); p_pic->p_sys->p_buf[V_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[V_PLANE] ); if( p_pic->p_sys->p_buf[U_PLANE] == NULL || p_pic->p_sys->p_buf[V_PLANE] == NULL ) { msg_Err( p_vout, "unable to get video channel ctx ptr" ); return( 1 ); } p_pic->Y_PIXELS = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p[Y_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p[Y_PLANE].i_pixel_pitch = 1; p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p[Y_PLANE].i_pitch; p_pic->U_PIXELS = p_pic->p_sys->p_buf[U_PLANE]; p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h; p_pic->p[U_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h; p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_ctx[U_PLANE]->pitch; p_pic->p[U_PLANE].i_pixel_pitch = 1; p_pic->p[U_PLANE].i_visible_pitch = p_pic->p[U_PLANE].i_pitch; p_pic->V_PIXELS = p_pic->p_sys->p_buf[V_PLANE]; p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h; p_pic->p[V_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h; p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_ctx[V_PLANE]->pitch; p_pic->p[V_PLANE].i_pixel_pitch = 1; p_pic->p[V_PLANE].i_visible_pitch = p_pic->p[V_PLANE].i_pitch; p_pic->i_planes = 3; break; case Pg_VIDEO_FORMAT_YV12: p_vout->output.i_chroma = VLC_CODEC_YV12; p_pic->p_sys->p_buf[U_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[U_PLANE] ); p_pic->p_sys->p_buf[V_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[V_PLANE] ); if( p_pic->p_sys->p_buf[U_PLANE] == NULL || p_pic->p_sys->p_buf[V_PLANE] == NULL ) { msg_Err( p_vout, "unable to get video channel ctx ptr" ); return( 1 ); } p_pic->Y_PIXELS = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p[Y_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p[Y_PLANE].i_pixel_pitch = 1; p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p[Y_PLANE].i_pitch; p_pic->U_PIXELS = p_pic->p_sys->p_buf[U_PLANE]; p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h; p_pic->p[U_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h; p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_ctx[U_PLANE]->pitch; p_pic->p[U_PLANE].i_pixel_pitch = 1; p_pic->p[U_PLANE].i_visible_pitch = p_pic->p[U_PLANE].i_pitch; p_pic->V_PIXELS = p_pic->p_sys->p_buf[V_PLANE]; p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h; p_pic->p[V_PLANE].i_visible_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h; p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_ctx[V_PLANE]->pitch; p_pic->p[V_PLANE].i_pixel_pitch = 1; p_pic->p[V_PLANE].i_visible_pitch = p_pic->p[V_PLANE].i_pitch; p_pic->i_planes = 3; break; case Pg_VIDEO_FORMAT_UYVY: case Pg_VIDEO_FORMAT_YUY2: if (p_vout->p_sys->i_vc_format == Pg_VIDEO_FORMAT_UYVY) { p_vout->output.i_chroma = VLC_CODEC_UYVY; } else { p_vout->output.i_chroma = VLC_CODEC_YUYV; } p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p->i_pixel_pitch = 4; p_pic->p->i_visible_pitch = p_pic->p->i_pitch; p_pic->i_planes = 1; break; case Pg_VIDEO_FORMAT_RGB555: p_vout->output.i_chroma = VLC_CODEC_RGB15; p_vout->output.i_rmask = 0x001f; p_vout->output.i_gmask = 0x03e0; p_vout->output.i_bmask = 0x7c00; p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p->i_pixel_pitch = 2; p_pic->p->i_visible_pitch = 2 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w; p_pic->i_planes = 1; break; case Pg_VIDEO_FORMAT_RGB565: p_vout->output.i_chroma = VLC_CODEC_RGB16; p_vout->output.i_rmask = 0x001f; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0xf800; p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p->i_pixel_pitch = 4; p_pic->p->i_visible_pitch = 4 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w; p_pic->i_planes = 1; break; case Pg_VIDEO_FORMAT_RGB8888: p_vout->output.i_chroma = VLC_CODEC_RGB32; p_vout->output.i_rmask = 0x000000ff; p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x00ff0000; p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE]; p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_visible_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h; p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch; p_pic->p->i_pixel_pitch = 4; p_pic->p->i_visible_pitch = 4 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w; p_pic->i_planes = 1; break; } #if 0 switch( p_vout->output.i_chroma ) { #ifdef MODULE_NAME_IS_xvideo case VLC_CODEC_Y211: p_pic->p->p_pixels = p_pic->p_sys->p_image->data + p_pic->p_sys->p_image->offsets[0]; p_pic->p->i_lines = p_vout->output.i_height; p_pic->p->i_visible_lines = p_vout->output.i_height; /* XXX: this just looks so plain wrong... check it out ! */ p_pic->p->i_pitch = p_pic->p_sys->p_image->pitches[0] / 4; p_pic->p->i_pixel_pitch = 4; p_pic->p->i_visible_pitch = p_pic->p->i_pitch; p_pic->i_planes = 1; break; #endif #endif default: /* This shouldn't happen ! */ break; } return 0; } /***************************************************************************** * FreePicture: destroy a picture allocated with NewPicture ***************************************************************************** * Destroy XImage AND associated data. If using Shm, detach shared memory * segment from server and process, then free it. The XDestroyImage manpage * says that both the image structure _and_ the data pointed to by the * image structure are freed, so no need to free p_image->data. *****************************************************************************/ static void FreePicture( vout_thread_t *p_vout, picture_t *p_pic ) { if( ( p_vout->p_sys->i_mode == MODE_NORMAL_MEM || p_vout->p_sys->i_mode == MODE_SHARED_MEM ) && p_pic->p_sys->p_image ) { PhReleaseImage( p_pic->p_sys->p_image ); free( p_pic->p_sys->p_image ); } else if( p_vout->p_sys->i_mode == MODE_VIDEO_MEM && p_pic->p_sys->p_ctx[0] ) { PhDCRelease( p_pic->p_sys->p_ctx[0] ); } free( p_pic->p_sys ); } static int ResizeOverlayOutput(vout_thread_t *p_vout) { int i_width, i_height, i_x, i_y; int i_ret; PgScalerProps_t props; props.size = sizeof( props ); props.format = p_vout->p_sys->i_vc_format; props.flags = Pg_SCALER_PROP_SCALER_ENABLE | Pg_SCALER_PROP_DOUBLE_BUFFER; /* enable chroma keying if available */ if( p_vout->p_sys->i_vc_flags & Pg_SCALER_CAP_DST_CHROMA_KEY ) { props.flags |= Pg_SCALER_PROP_CHROMA_ENABLE; } /* set viewport position */ props.viewport.ul.x = p_vout->p_sys->pos.x; props.viewport.ul.y = p_vout->p_sys->pos.y; if( !p_vout->b_fullscreen ) { props.viewport.ul.x += p_vout->p_sys->frame.ul.x; props.viewport.ul.y += p_vout->p_sys->frame.ul.y; } /* set viewport dimension */ vout_PlacePicture( p_vout, p_vout->p_sys->dim.w, p_vout->p_sys->dim.h, &i_x, &i_y, &i_width, &i_height ); props.viewport.ul.x += i_x; props.viewport.ul.y += i_y; props.viewport.lr.x = i_width + props.viewport.ul.x; props.viewport.lr.y = i_height + props.viewport.ul.y; /* set source dimension */ props.src_dim.w = p_vout->output.i_width; props.src_dim.h = p_vout->output.i_height; /* configure scaler channel */ i_ret = PgConfigScalerChannel( p_vout->p_sys->p_channel, &props ); if( i_ret == -1 ) { msg_Err( p_vout, "unable to configure video channel" ); return( 1 ); } return ( 0 ); }