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

📄 xv.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
int
SDL_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;
}

int
SDL_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;
}

int
SDL_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;
}

int
SDL_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;
}

int
SDL_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;
}

int
SDL_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);
}

int
SDL_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);
}

int
SDL_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 Bool
xv_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 + -