⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_phyuv.c

📁 Simple DirectMedia Layer - Simple DirectMedia Layer 是一个跨平台的多媒体库设计用来提供快速图形framebuffer和音频驱动。应用MPEG为软件
💻 C
📖 第 1 页 / 共 2 页
字号:
				}		else if(overlay->hwdata->caps.format  == Pg_VIDEO_FORMAT_V422)		{						Priority[i-1] = 5;			Type[i-1] = Pg_VIDEO_FORMAT_V422;					}				else if(overlay->hwdata->caps.format  == Pg_VIDEO_FORMAT_CLJR)		{						Priority[i-1] = 6;			Type[i-1] = Pg_VIDEO_FORMAT_CLJR;				}			else		{				Priority[i-1] = 0;		}			overlay->hwdata->caps.size = sizeof(overlay->hwdata->caps);}	if ( xv_port == -1 )	{		SDL_SetError("No available video ports for requested format");		return(NULL);	} //Pick the highest priority formatentries = i -2;highest = Priority[0]; //make first entry top at beginingselect = 0;for (i = 1; i < entries; i++){   if(Priority[i] > highest)   {      highest = Priority[i];      select  = i;   }}    overlay->hwdata->caps.size = sizeof (overlay->hwdata->caps	);PgGetScalerCapabilities(overlay->hwdata->channel, select, &(overlay->hwdata->caps));overlay->hwdata->props.format = overlay->hwdata->caps.format ;    overlay->hwdata->format = overlay->hwdata->props.format;  //to make easier for apps to use	overlay->hwdata->props.size = sizeof (overlay->hwdata->props);    overlay->hwdata->props.src_dim.w = width;       overlay->hwdata->props.src_dim.h = height;   		overlay->hwdata->chromakey = PgGetOverlayChromaColor();	// Set chromakey in video widget so we can see overlay data	/* I don't know where the container widget is!!!, I guess it is in hidden->window*/		PtEnter(0);	PtSetArg( &argt, Pt_ARG_FILL_COLOR, overlay->hwdata->chromakey, 0 );	PtSetResources( window, 1, &argt ); 	PtLeave(0);	fflush( stderr );	overlay->hwdata->props.viewport.ul.x = overlay->hwdata->CurrentWindow.x;	overlay->hwdata->props.viewport.ul.y = overlay->hwdata->CurrentWindow.y;	//Next line MIGHT have x and y reversed!!!!!!!!!!!!	overlay->hwdata->props.viewport.lr.x = overlay->hwdata->CurrentWindow.x +overlay->hwdata->CurrentWindow.w;	overlay->hwdata->props.viewport.lr.y = overlay->hwdata->CurrentWindow.y + overlay->hwdata->CurrentWindow.h;			overlay->hwdata->props.flags =	    ~Pg_SCALER_PROP_SCALER_ENABLE | Pg_SCALER_PROP_DOUBLE_BUFFER ;	if (overlay->hwdata->chromakey) {		overlay->hwdata->props.flags |= Pg_SCALER_PROP_CHROMA_ENABLE;		overlay->hwdata->props.color_key = overlay->hwdata->chromakey;		overlay->hwdata->props.color_key_mask = 0xffffff;	} 	else	{		overlay->hwdata->props.flags &= ~Pg_SCALER_PROP_CHROMA_ENABLE;	}	overlay->hwdata->scaler_on = FALSE; rtncode =    PgConfigScalerChannel(overlay->hwdata->channel, &(overlay->hwdata->props));		switch(rtncode)	{	case -1:		SDL_SetError("PgConfigScalerChannel failed\n");		SDL_FreeYUVOverlay(overlay);		return(NULL);   		break;	case 1:		grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0, overlay->hwdata->FrameData1);		break;	case 0:	default:   		break;	}	grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0, overlay->hwdata->FrameData1);if(overlay->hwdata->channel->yplane1 != NULL)				overlay->hwdata->YStride = overlay->hwdata->channel->yplane1->pitch;if(overlay->hwdata->channel->uplane1 != NULL)				overlay->hwdata->UStride = overlay->hwdata->channel->uplane1->pitch;if(overlay->hwdata->channel->vplane1 != NULL)				overlay->hwdata->VStride = overlay->hwdata->channel->vplane1->pitch;	overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);	if (overlay->hwdata->current == -1)	{		SDL_SetError("PgNextFrame failed, bailing out\n");		SDL_FreeYUVOverlay(overlay);		return(NULL);	}                //set current frame for double buffering	if(overlay->hwdata->current == 0)	{		overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;	}	else	{		overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;	}    	overlay->hwdata->State = OVERLAY_STATE_ACTIVE;	/* We're all done.. */	return(overlay);}int ph_LockYUVOverlay(_THIS, SDL_Overlay *overlay){//int rtncode;if(overlay == NULL)   return 0;//set current frame for double buffering	if(overlay->hwdata->current == 0)	{		overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;	}	else	{		overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;	}	//Lock gets the pointer and passes it to the app. The app writes all yuv data into overlay->pixels//Note this is defined as Uint8 **pixels;				/* Read-write */		overlay->pixels = &overlay->hwdata->CurrentFrameData->Y; 	overlay->pitches = (Uint16*) &(overlay->hwdata->YStride);			return(0);}void ph_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay){int rtncode;if(overlay == NULL)   return ;		if(overlay->hwdata->scaler_on == FALSE) 		{							overlay->hwdata->props.flags |= Pg_SCALER_PROP_SCALER_ENABLE;        rtncode =PgConfigScalerChannel(overlay->hwdata->channel, &(overlay->hwdata->props));        	switch(rtncode)			{				case -1:					SDL_SetError("PgConfigScalerChannel failed\n");					SDL_FreeYUVOverlay(overlay);   					break;				case 1:					grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0, overlay->hwdata->FrameData1);					overlay->hwdata->scaler_on = TRUE;					break;				case 0:					default:					overlay->hwdata->scaler_on = TRUE;   					break;			}//This would be the best place to draw chromakey but we do not have a SDL_Surface in the args//This means we might see a chromakey flicker at startup		}		overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);	if (overlay->hwdata->current == -1) {		SDL_SetError("PgNextVideoFrame failed\n");		SDL_FreeYUVOverlay(overlay);			return;		}	overlay->pixels = NULL;}int ph_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *dstrect){int rtncode;if(overlay == NULL)   return 0;	/*SDL_Rect CurrentWindow*///If CurrentWindow has change, move the viewportif((overlay->hwdata->CurrentWindow.x != dstrect->x) ||  (overlay->hwdata->CurrentWindow.y != dstrect->y) ||  (overlay->hwdata->CurrentWindow.w != dstrect->w) ||  (overlay->hwdata->CurrentWindow.h != dstrect->h)){		if(overlay->hwdata->State == OVERLAY_STATE_UNINIT)		return -1;	overlay->hwdata->CurrentWindow.x = dstrect->x;  	overlay->hwdata->CurrentWindow.y = dstrect->y;  	overlay->hwdata->CurrentWindow.w = dstrect->w;  	overlay->hwdata->CurrentWindow.h = dstrect->h;	overlay->hwdata->props.viewport.ul.x = overlay->hwdata->CurrentWindow.x;	overlay->hwdata->props.viewport.ul.y = overlay->hwdata->CurrentWindow.y;	//Next line MIGHT have x and y reversed!!!!!!!!!!!!	overlay->hwdata->props.viewport.lr.x = overlay->hwdata->CurrentWindow.x +overlay->hwdata->CurrentWindow.w;	overlay->hwdata->props.viewport.lr.y = overlay->hwdata->CurrentWindow.y + overlay->hwdata->CurrentWindow.h;	     rtncode = PgConfigScalerChannel(overlay->hwdata->channel, &(overlay->hwdata->props));	switch(rtncode)	{	case -1:		SDL_SetError("PgConfigScalerChannel failed\n");		SDL_FreeYUVOverlay(overlay);		return(0);   		break;	case 1:		grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0, overlay->hwdata->FrameData1);		break;	case 0:	default:   		break;	}}//JB the X11 file did this. We do this in SDL_unlock, we need to confirm that lock and unlock are called for each frame!//	XvShmPutImage(GFX_Display, hwdata->port, SDL_Window, SDL_GC,//	              hwdata->image, 0, 0, overlay->w, overlay->h,//	              dstrect->x, dstrect->y, dstrect->w, dstrect->h, False);	           /*  This is what this call isint XvShmPutImage (   Display *dpy,   XvPortID port,   Drawable d,   GC gc,   XvImage *image,   int src_x,   int src_y,   unsigned int src_w,   unsigned int src_h,   int dest_x,    int dest_y,   unsigned int dest_w,   unsigned int dest_h,   Bool send_event)*/	return(0);}void ph_FreeYUVOverlay(_THIS, SDL_Overlay *overlay){	//struct private_yuvhwdata *hwdata;	if(overlay == NULL)		return;		if(overlay->hwdata == NULL)		return;		overlay->hwdata->State = OVERLAY_STATE_UNINIT;	if( overlay->hwdata->channel == NULL )	{		return;	}		PgDestroyVideoChannel(overlay->hwdata->channel);	overlay->hwdata->channel = NULL;	overlay->hwdata->CurrentFrameData = NULL;  		free(overlay->hwdata->FrameData0);	free(overlay->hwdata->FrameData1);	overlay->hwdata->FrameData0 = NULL;	overlay->hwdata->FrameData1 = NULL;	free(overlay->hwdata);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -