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

📄 video_out_x11.c

📁 比较早的MPEG-2的解码源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	alloc += size;    }    return 0;}static void x11_teardown (x11_instance_t * instance){    int i;    for (i = 0; i < 3; i++) {	while (instance->frame[i].wait_completion)	    x11_event (instance);	XDestroyImage (instance->frame[i].ximage);    }    destroy_shm (instance);}static void x11_close (vo_instance_t * _instance){    x11_instance_t * instance = (x11_instance_t *) _instance;    if (instance->teardown != NULL)	instance->teardown (instance);    XFreeGC (instance->display, instance->gc);    XDestroyWindow (instance->display, instance->window);#ifdef LIBVO_XV    if (instance->adaptors)	XvFreeAdaptorInfo (instance->adaptorInfo);#endif    XCloseDisplay (instance->display);    free (instance);}#ifdef LIBVO_XVstatic void xv_setup_fbuf (vo_instance_t * _instance,			   uint8_t ** buf, void ** id){    x11_instance_t * instance = (x11_instance_t *) _instance;    uint8_t * data;    data = (uint8_t *) instance->frame[instance->index].xvimage->data;    buf[0] = data + instance->frame[instance->index].xvimage->offsets[0];    buf[1] = data + instance->frame[instance->index].xvimage->offsets[2];    buf[2] = data + instance->frame[instance->index].xvimage->offsets[1];    *id = instance->frame + instance->index++;}static void xv_draw_frame (vo_instance_t * _instance,			   uint8_t * const * buf, void * id){    x11_frame_t * frame = (x11_frame_t *) id;    x11_instance_t * instance = (x11_instance_t *) _instance;    XvShmPutImage (instance->display, instance->port, instance->window,		   instance->gc, frame->xvimage, 0, 0,		   instance->width, instance->height, 0, 0,		   instance->width, instance->height, True);    XFlush (instance->display);    frame->wait_completion = 1;}static int xv_check_fourcc (x11_instance_t * instance, XvPortID port,			    int fourcc, const char * fourcc_str){    XvImageFormatValues * formatValues;    int formats;    int i;    formatValues = XvListImageFormats (instance->display, port, &formats);    for (i = 0; i < formats; i++)	if ((formatValues[i].id == fourcc) &&	    (! (strcmp (formatValues[i].guid, fourcc_str)))) {	    XFree (formatValues);	    return 0;	}    XFree (formatValues);    return 1;}static int xv_check_extension (x11_instance_t * instance,			       int fourcc, const char * fourcc_str){    unsigned int i;    unsigned long j;    if (!instance->adaptorInfo) {	unsigned int version;	unsigned int release;	unsigned int dummy;	if ((XvQueryExtension (instance->display, &version, &release,			       &dummy, &dummy, &dummy) != Success) ||	    (version < 2) || ((version == 2) && (release < 2))) {	    fprintf (stderr, "No xv extension\n");	    return 1;	}	XvQueryAdaptors (instance->display, instance->window,			 &instance->adaptors, &instance->adaptorInfo);    }    for (i = 0; i < instance->adaptors; i++)	if (instance->adaptorInfo[i].type & XvImageMask)	    for (j = 0; j < instance->adaptorInfo[i].num_ports; j++)		if ((! (xv_check_fourcc (instance,					 instance->adaptorInfo[i].base_id + j,					 fourcc, fourcc_str))) &&		    (XvGrabPort (instance->display,				 instance->adaptorInfo[i].base_id + j,				 0) == Success)) {		    instance->port = instance->adaptorInfo[i].base_id + j;		    return 0;		}    fprintf (stderr, "Cannot find xv %s port\n", fourcc_str);    return 1;}static int xv_alloc_frames (x11_instance_t * instance, int size,			    int fourcc){    char * alloc;    int i = 0;    alloc = (char *) create_shm (instance, 3 * size);    if (alloc == NULL)	return 1;    while (i < 3) {	instance->frame[i].wait_completion = 0;	instance->frame[i].xvimage =	    XvShmCreateImage (instance->display, instance->port, fourcc,			      alloc, instance->width, instance->height,			      &(instance->shminfo));	instance->frame[i].data = alloc;	alloc += size;	if ((instance->frame[i].xvimage == NULL) ||	    (instance->frame[i++].xvimage->data_size != size)) {	    while (--i >= 0)		XFree (instance->frame[i].xvimage);	    destroy_shm (instance);	    return 1;	}    }    return 0;}static void xv_teardown (x11_instance_t * instance){    int i;    for (i = 0; i < 3; i++) {	while (instance->frame[i].wait_completion)	    x11_event (instance);	XFree (instance->frame[i].xvimage);    }    destroy_shm (instance);    XvUngrabPort (instance->display, instance->port, 0);}#endifstatic int common_setup (vo_instance_t * _instance, unsigned int width,			 unsigned int height, unsigned int chroma_width,			 unsigned int chroma_height,			 vo_setup_result_t * result){    x11_instance_t * instance = (x11_instance_t *) _instance;    if (instance->display != NULL) {	/* Already setup, just adjust to the new size */	if (instance->teardown != NULL)	    instance->teardown (instance);        XResizeWindow (instance->display, instance->window, width, height);    } else {	/* Not setup yet, do the full monty */        if (open_display (instance, width, height))            return 1;        XMapWindow (instance->display, instance->window);    }    instance->vo.setup_fbuf = NULL;    instance->vo.start_fbuf = NULL;    instance->vo.set_fbuf = NULL;    instance->vo.draw = NULL;    instance->vo.discard = NULL;    instance->vo.close = x11_close;    instance->width = width;    instance->height = height;    instance->index = 0;    instance->teardown = NULL;    result->convert = NULL;#ifdef LIBVO_XV    if (instance->xv == 1 &&	(chroma_width == width >> 1) && (chroma_height == height >> 1) &&	!xv_check_extension (instance, FOURCC_YV12, "YV12") &&	!xv_alloc_frames (instance, 3 * width * height / 2, FOURCC_YV12)) {	instance->vo.setup_fbuf = xv_setup_fbuf;	instance->vo.start_fbuf = x11_start_fbuf;	instance->vo.draw = xv_draw_frame;	instance->teardown = xv_teardown;    } else if (instance->xv && (chroma_width == width >> 1) &&	       !xv_check_extension (instance, FOURCC_UYVY, "UYVY") &&	       !xv_alloc_frames (instance, 2 * width * height, FOURCC_UYVY)) {	instance->vo.setup_fbuf = x11_setup_fbuf;	instance->vo.start_fbuf = x11_start_fbuf;	instance->vo.draw = xv_draw_frame;	instance->teardown = xv_teardown;	result->convert = mpeg2convert_uyvy;    } else#endif    if (!x11_alloc_frames (instance)) {	int bpp;	instance->vo.setup_fbuf = x11_setup_fbuf;	instance->vo.start_fbuf = x11_start_fbuf;	instance->vo.draw = x11_draw_frame;	instance->teardown = x11_teardown;#ifdef WORDS_BIGENDIAN	if (instance->frame[0].ximage->byte_order != MSBFirst) {	    fprintf (stderr, "No support for non-native byte order\n");	    return 1;	}#else	if (instance->frame[0].ximage->byte_order != LSBFirst) {	    fprintf (stderr, "No support for non-native byte order\n");	    return 1;	}#endif	/*	 * depth in X11 terminology land is the number of bits used to	 * actually represent the colour.	 *	 * bpp in X11 land means how many bits in the frame buffer per	 * pixel.	 *	 * ex. 15 bit color is 15 bit depth and 16 bpp. Also 24 bit	 *     color is 24 bit depth, but can be 24 bpp or 32 bpp.	 *	 * If we have blue in the lowest bit then "obviously" RGB	 * (the guy who wrote this convention never heard of endianness ?)	 */	bpp = ((instance->vinfo.depth == 24) ?	       instance->frame[0].ximage->bits_per_pixel :	       instance->vinfo.depth);	result->convert =	    mpeg2convert_rgb (((instance->frame[0].ximage->blue_mask & 1) ?			       MPEG2CONVERT_RGB : MPEG2CONVERT_BGR), bpp);	if (result->convert == NULL) {	    fprintf (stderr, "%dbpp not supported\n", bpp);	    return 1;	}    }    return 0;}static vo_instance_t * common_open (int xv){    x11_instance_t * instance;    instance = (x11_instance_t *) malloc (sizeof (x11_instance_t));    if (instance == NULL)	return NULL;    instance->vo.setup = common_setup;    instance->vo.close = (void (*) (vo_instance_t *)) free;    instance->display = NULL;#ifdef LIBVO_XV    instance->xv = xv;#endif    return (vo_instance_t *) instance;}vo_instance_t * vo_x11_open (void){    return common_open (0);}#ifdef LIBVO_XVvo_instance_t * vo_xv_open (void){    return common_open (1);}vo_instance_t * vo_xv2_open (void){    return common_open (2);}#endif#endif

⌨️ 快捷键说明

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