📄 xv.c
字号:
intSDL_NAME(XvStopVideo)( Display *dpy, XvPortID port, Drawable draw){ XExtDisplayInfo *info = xv_find_display(dpy); xvStopVideoReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(StopVideo, req); req->port = port; req->drawable = draw; UnlockDisplay(dpy); SyncHandle(); return Success;}intSDL_NAME(XvGrabPort)( Display *dpy, XvPortID port, Time time){ XExtDisplayInfo *info = xv_find_display(dpy); int result; xvGrabPortReply rep; xvGrabPortReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(GrabPort, req); req->port = port; req->time = time; if (_XReply (dpy, (xReply *) &rep, 0, xTrue) == 0) rep.result = GrabSuccess; result = rep.result; UnlockDisplay(dpy); SyncHandle(); return result;}intSDL_NAME(XvUngrabPort)( Display *dpy, XvPortID port, Time time){ XExtDisplayInfo *info = xv_find_display(dpy); xvUngrabPortReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(UngrabPort, req); req->port = port; req->time = time; UnlockDisplay(dpy); SyncHandle(); return Success;}intSDL_NAME(XvSelectVideoNotify)( Display *dpy, Drawable drawable, Bool onoff){ XExtDisplayInfo *info = xv_find_display(dpy); xvSelectVideoNotifyReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(SelectVideoNotify, req); req->drawable = drawable; req->onoff = onoff; UnlockDisplay(dpy); SyncHandle(); return Success;}intSDL_NAME(XvSelectPortNotify)( Display *dpy, XvPortID port, Bool onoff){ XExtDisplayInfo *info = xv_find_display(dpy); xvSelectPortNotifyReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(SelectPortNotify, req); req->port = port; req->onoff = onoff; UnlockDisplay(dpy); SyncHandle(); return Success;}intSDL_NAME(XvSetPortAttribute) ( Display *dpy, XvPortID port, Atom attribute, int value){ XExtDisplayInfo *info = xv_find_display(dpy); xvSetPortAttributeReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(SetPortAttribute, req); req->port = port; req->attribute = attribute; req->value = value; UnlockDisplay(dpy); SyncHandle(); return (Success);}intSDL_NAME(XvGetPortAttribute) ( Display *dpy, XvPortID port, Atom attribute, int *p_value){ XExtDisplayInfo *info = xv_find_display(dpy); xvGetPortAttributeReq *req; xvGetPortAttributeReply rep; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(GetPortAttribute, req); req->port = port; req->attribute = attribute; /* READ THE REPLY */ if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { UnlockDisplay(dpy); SyncHandle(); return(XvBadReply); } *p_value = rep.value; UnlockDisplay(dpy); SyncHandle(); return (Success);}intSDL_NAME(XvQueryBestSize)( Display *dpy, XvPortID port, Bool motion, unsigned int vid_w, unsigned int vid_h, unsigned int drw_w, unsigned int drw_h, unsigned int *p_actual_width, unsigned int *p_actual_height){ XExtDisplayInfo *info = xv_find_display(dpy); xvQueryBestSizeReq *req; xvQueryBestSizeReply rep; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); XvGetReq(QueryBestSize, req); req->port = port; req->motion = motion; req->vid_w = vid_w; req->vid_h = vid_h; req->drw_w = drw_w; req->drw_h = drw_h; /* READ THE REPLY */ if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { UnlockDisplay(dpy); SyncHandle(); return(XvBadReply); } *p_actual_width = rep.actual_width; *p_actual_height = rep.actual_height; UnlockDisplay(dpy); SyncHandle(); return (Success);}SDL_NAME(XvAttribute)* SDL_NAME(XvQueryPortAttributes)(Display *dpy, XvPortID port, int *num){ XExtDisplayInfo *info = xv_find_display(dpy); xvQueryPortAttributesReq *req; xvQueryPortAttributesReply rep; SDL_NAME(XvAttribute) *ret = NULL; *num = 0; XvCheckExtension(dpy, info, NULL); LockDisplay(dpy); XvGetReq(QueryPortAttributes, req); req->port = port; /* READ THE REPLY */ if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { UnlockDisplay(dpy); SyncHandle(); return ret; } if(rep.num_attributes) { int size = (rep.num_attributes * sizeof(SDL_NAME(XvAttribute))) + rep.text_size; if((ret = Xmalloc(size))) { char* marker = (char*)(&ret[rep.num_attributes]); xvAttributeInfo Info; int i; for(i = 0; i < rep.num_attributes; i++) { _XRead(dpy, (char*)(&Info), sz_xvAttributeInfo); ret[i].flags = (int)Info.flags; ret[i].min_value = Info.min; ret[i].max_value = Info.max; ret[i].name = marker; _XRead(dpy, marker, Info.size); marker += Info.size; (*num)++; } } else _XEatData(dpy, rep.length << 2); } UnlockDisplay(dpy); SyncHandle(); return ret;}SDL_NAME(XvImageFormatValues) * SDL_NAME(XvListImageFormats) ( Display *dpy, XvPortID port, int *num){ XExtDisplayInfo *info = xv_find_display(dpy); xvListImageFormatsReq *req; xvListImageFormatsReply rep; SDL_NAME(XvImageFormatValues) *ret = NULL; *num = 0; XvCheckExtension(dpy, info, NULL); LockDisplay(dpy); XvGetReq(ListImageFormats, req); req->port = port; /* READ THE REPLY */ if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { UnlockDisplay(dpy); SyncHandle(); return NULL; } if(rep.num_formats) { int size = (rep.num_formats * sizeof(SDL_NAME(XvImageFormatValues))); if((ret = Xmalloc(size))) { xvImageFormatInfo Info; int i; for(i = 0; i < rep.num_formats; i++) { _XRead(dpy, (char*)(&Info), sz_xvImageFormatInfo); ret[i].id = Info.id; ret[i].type = Info.type; ret[i].byte_order = Info.byte_order; memcpy(&(ret[i].guid[0]), &(Info.guid[0]), 16); ret[i].bits_per_pixel = Info.bpp; ret[i].format = Info.format; ret[i].num_planes = Info.num_planes; ret[i].depth = Info.depth; ret[i].red_mask = Info.red_mask; ret[i].green_mask = Info.green_mask; ret[i].blue_mask = Info.blue_mask; ret[i].y_sample_bits = Info.y_sample_bits; ret[i].u_sample_bits = Info.u_sample_bits; ret[i].v_sample_bits = Info.v_sample_bits; ret[i].horz_y_period = Info.horz_y_period; ret[i].horz_u_period = Info.horz_u_period; ret[i].horz_v_period = Info.horz_v_period; ret[i].vert_y_period = Info.vert_y_period; ret[i].vert_u_period = Info.vert_u_period; ret[i].vert_v_period = Info.vert_v_period; memcpy(&(ret[i].component_order[0]), &(Info.comp_order[0]), 32); ret[i].scanline_order = Info.scanline_order; (*num)++; } } else _XEatData(dpy, rep.length << 2); } UnlockDisplay(dpy); SyncHandle(); return ret;}SDL_NAME(XvImage) * SDL_NAME(XvCreateImage) ( Display *dpy, XvPortID port, int id, char *data, int width, int height ) { XExtDisplayInfo *info = xv_find_display(dpy); xvQueryImageAttributesReq *req; xvQueryImageAttributesReply rep; SDL_NAME(XvImage) *ret = NULL; XvCheckExtension(dpy, info, NULL); LockDisplay(dpy); XvGetReq(QueryImageAttributes, req); req->id = id; req->port = port; req->width = width; req->height = height; /* READ THE REPLY */ if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); return NULL; } if((ret = (SDL_NAME(XvImage)*)Xmalloc(sizeof(SDL_NAME(XvImage)) + (rep.num_planes << 3)))) { ret->id = id; ret->width = rep.width; ret->height = rep.height; ret->data_size = rep.data_size; ret->num_planes = rep.num_planes; ret->pitches = (int*)(&ret[1]); ret->offsets = ret->pitches + rep.num_planes; ret->data = data; ret->obdata = NULL; _XRead(dpy, (char*)(ret->pitches), rep.num_planes << 2); _XRead(dpy, (char*)(ret->offsets), rep.num_planes << 2); } else _XEatData(dpy, rep.length << 2); UnlockDisplay(dpy); SyncHandle(); return ret;}SDL_NAME(XvImage) * SDL_NAME(XvShmCreateImage) ( Display *dpy, XvPortID port, int id, char *data, int width, int height, XShmSegmentInfo *shminfo){ SDL_NAME(XvImage) *ret; ret = SDL_NAME(XvCreateImage)(dpy, port, id, data, width, height); if(ret) ret->obdata = (XPointer)shminfo; return ret;}int SDL_NAME(XvPutImage) ( Display *dpy, XvPortID port, Drawable d, GC gc, SDL_NAME(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){ XExtDisplayInfo *info = xv_find_display(dpy); xvPutImageReq *req; int len; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); FlushGC(dpy, gc); XvGetReq(PutImage, req); req->port = port; req->drawable = d; req->gc = gc->gid; req->id = image->id; req->src_x = src_x; req->src_y = src_y; req->src_w = src_w; req->src_h = src_h; req->drw_x = dest_x; req->drw_y = dest_y; req->drw_w = dest_w; req->drw_h = dest_h; req->width = image->width; req->height = image->height; len = (image->data_size + 3) >> 2; SetReqLen(req, len, len); /* Yes it's kindof lame that we are sending the whole thing, but for video all of it may be needed even if displaying only a subsection, and I don't want to go through the trouble of creating subregions to send */ Data(dpy, (char *)image->data, image->data_size); UnlockDisplay(dpy); SyncHandle(); return Success;}int SDL_NAME(XvShmPutImage) ( Display *dpy, XvPortID port, Drawable d, GC gc, SDL_NAME(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){ XExtDisplayInfo *info = xv_find_display(dpy); XShmSegmentInfo *shminfo = (XShmSegmentInfo *)image->obdata; xvShmPutImageReq *req; XvCheckExtension(dpy, info, XvBadExtension); LockDisplay(dpy); FlushGC(dpy, gc); XvGetReq(ShmPutImage, req); req->port = port; req->drawable = d; req->gc = gc->gid; req->shmseg = shminfo->shmseg; req->id = image->id; req->src_x = src_x; req->src_y = src_y; req->src_w = src_w; req->src_h = src_h; req->drw_x = dest_x; req->drw_y = dest_y; req->drw_w = dest_w; req->drw_h = dest_h; req->offset = image->data - shminfo->shmaddr; req->width = image->width; req->height = image->height; req->send_event = send_event; UnlockDisplay(dpy); SyncHandle(); return Success;}static Boolxv_wire_to_event(Display *dpy, XEvent *host, xEvent *wire){ XExtDisplayInfo *info = xv_find_display(dpy); SDL_NAME(XvEvent) *re = (SDL_NAME(XvEvent) *)host; xvEvent *event = (xvEvent *)wire; XvCheckExtension(dpy, info, False); switch((event->u.u.type & 0x7F) - info->codes->first_event) { case XvVideoNotify: re->xvvideo.type = event->u.u.type & 0x7f; re->xvvideo.serial = _XSetLastRequestRead(dpy, (xGenericReply *)event); re->xvvideo.send_event = ((event->u.u.type & 0x80) != 0); re->xvvideo.display = dpy; re->xvvideo.time = event->u.videoNotify.time; re->xvvideo.reason = event->u.videoNotify.reason; re->xvvideo.drawable = event->u.videoNotify.drawable; re->xvvideo.port_id = event->u.videoNotify.port; break; case XvPortNotify: re->xvport.type = event->u.u.type & 0x7f; re->xvport.serial = _XSetLastRequestRead(dpy, (xGenericReply *)event); re->xvport.send_event = ((event->u.u.type & 0x80) != 0); re->xvport.display = dpy; re->xvport.time = event->u.portNotify.time; re->xvport.port_id = event->u.portNotify.port; re->xvport.attribute = event->u.portNotify.attribute; re->xvport.value = event->u.portNotify.value; break; default: return False; } return (True);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -