?? video_out_x11.c
字號(hào):
instance->frame[i].data = instance->frame[i].ximage->data = alloc; 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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -