📄 sdl_phyuv.c
字号:
} 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 + -