Beispiel #1
0
void
ephyr_glamor_xv_init(ScreenPtr screen)
{
    KdVideoAdaptorRec *adaptor;
    glamor_port_private *port_privates;
    KdVideoEncodingRec encoding = {
        0,
        "XV_IMAGE",
        /* These sizes should probably be GL_MAX_TEXTURE_SIZE instead
         * of 2048, but our context isn't set up yet.
         */
        2048, 2048,
        {1, 1}
    };
    int i;

    glamor_xv_core_init(screen);

    adaptor = xnfcalloc(1, sizeof(*adaptor));

    adaptor->name = "glamor textured video";
    adaptor->type = XvWindowMask | XvInputMask | XvImageMask;
    adaptor->flags = 0;
    adaptor->nEncodings = 1;
    adaptor->pEncodings = &encoding;

    adaptor->pFormats = Formats;
    adaptor->nFormats = NUM_FORMATS;

    adaptor->nPorts = 16; /* Some absurd number */
    port_privates = xnfcalloc(adaptor->nPorts,
                              sizeof(glamor_port_private));
    adaptor->pPortPrivates = xnfcalloc(adaptor->nPorts,
                                       sizeof(glamor_port_private *));
    for (i = 0; i < adaptor->nPorts; i++) {
        adaptor->pPortPrivates[i].ptr = &port_privates[i];
        glamor_xv_init_port(&port_privates[i]);
    }

    adaptor->pAttributes = glamor_xv_attributes;
    adaptor->nAttributes = glamor_xv_num_attributes;

    adaptor->pImages = glamor_xv_images;
    adaptor->nImages = glamor_xv_num_images;

    adaptor->StopVideo = ephyr_glamor_xv_stop_video;
    adaptor->SetPortAttribute = ephyr_glamor_xv_set_port_attribute;
    adaptor->GetPortAttribute = ephyr_glamor_xv_get_port_attribute;
    adaptor->QueryBestSize = ephyr_glamor_xv_query_best_size;
    adaptor->PutImage = ephyr_glamor_xv_put_image;
    adaptor->QueryImageAttributes = ephyr_glamor_xv_query_image_attributes;

    KdXVScreenInit(screen, adaptor, 1);
}
Beispiel #2
0
static Bool
ephyrXVPrivRegisterAdaptors(EphyrXVPriv * a_this, ScreenPtr a_screen)
{
    KdScreenPriv(a_screen);
    KdScreenInfo *screen = pScreenPriv->screen;
    Bool is_ok = FALSE;
    KdVideoAdaptorPtr *adaptors = NULL, *registered_adaptors = NULL;
    int num_registered_adaptors = 0, i = 0, num_adaptors = 0;

    EPHYR_RETURN_VAL_IF_FAIL(a_this && a_screen, FALSE);

    EPHYR_LOG("enter\n");

    if (!a_this->num_adaptors)
        goto out;
    num_registered_adaptors =
        KdXVListGenericAdaptors(screen, &registered_adaptors);

    num_adaptors = num_registered_adaptors + a_this->num_adaptors;
    adaptors = calloc(num_adaptors, sizeof(KdVideoAdaptorPtr));
    if (!adaptors) {
        EPHYR_LOG_ERROR("failed to allocate adaptors tab\n");
        goto out;
    }
    memmove(adaptors, registered_adaptors, num_registered_adaptors);
    for (i = 0; i < a_this->num_adaptors; i++) {
        *(adaptors + num_registered_adaptors + i) = &a_this->adaptors[i];
    }
    if (!KdXVScreenInit(a_screen, adaptors, num_adaptors)) {
        EPHYR_LOG_ERROR("failed to register adaptors\n");
        goto out;
    }
    EPHYR_LOG("there are  %d registered adaptors\n", num_adaptors);
    is_ok = TRUE;

 out:
    free(registered_adaptors);
    registered_adaptors = NULL;
    free(adaptors);
    adaptors = NULL;

    EPHYR_LOG("leave\n");
    return is_ok;
}