ephyr: Refactor XV adaptor feature detection.
This obviously wanted a helper function beforehand, but even more so now that we have XCB. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Julien Cristau <jcristau@debian.org>
This commit is contained in:
		
							parent
							
								
									7a9c311add
								
							
						
					
					
						commit
						fad79d2e3e
					
				| 
						 | 
				
			
			@ -137,74 +137,6 @@ ephyrHostXVAdaptorGetVideoFormats (const xcb_xv_adaptor_info_t *a_this,
 | 
			
		|||
    return formats;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVAdaptorHasPutVideo (const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                               Bool *a_result)
 | 
			
		||||
{
 | 
			
		||||
    EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE);
 | 
			
		||||
 | 
			
		||||
    if ((a_this->type & (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
 | 
			
		||||
        (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
        *a_result = TRUE;
 | 
			
		||||
    else
 | 
			
		||||
        *a_result = FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVAdaptorHasGetVideo(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                              Bool *a_result)
 | 
			
		||||
{
 | 
			
		||||
    if ((a_this->type & (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_OUTPUT_MASK)) ==
 | 
			
		||||
        (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_OUTPUT_MASK))
 | 
			
		||||
        *a_result = TRUE;
 | 
			
		||||
    else
 | 
			
		||||
        *a_result = FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVAdaptorHasPutStill(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                              Bool *a_result)
 | 
			
		||||
{
 | 
			
		||||
    EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE);
 | 
			
		||||
 | 
			
		||||
    if ((a_this->type & (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
 | 
			
		||||
        (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
        *a_result = TRUE;
 | 
			
		||||
    else
 | 
			
		||||
        *a_result = FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVAdaptorHasGetStill(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                              Bool *a_result)
 | 
			
		||||
{
 | 
			
		||||
    EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE);
 | 
			
		||||
 | 
			
		||||
    if ((a_this->type & (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_OUTPUT_MASK)) ==
 | 
			
		||||
        (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_OUTPUT_MASK))
 | 
			
		||||
        *a_result = TRUE;
 | 
			
		||||
    else
 | 
			
		||||
        *a_result = FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVAdaptorHasPutImage(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                              Bool *a_result)
 | 
			
		||||
{
 | 
			
		||||
    EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE);
 | 
			
		||||
 | 
			
		||||
    if ((a_this->type & (XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
 | 
			
		||||
        (XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
        *a_result = TRUE;
 | 
			
		||||
    else
 | 
			
		||||
        *a_result = FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
ephyrHostXVQueryEncodings(int a_port_id,
 | 
			
		||||
                          EphyrHostEncoding ** a_encodings,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,17 +98,6 @@ char* ephyrHostXVAdaptorGetName(const xcb_xv_adaptor_info_t *a_this);
 | 
			
		|||
EphyrHostVideoFormat *ephyrHostXVAdaptorGetVideoFormats
 | 
			
		||||
    (const xcb_xv_adaptor_info_t *a_this, int *a_nb_formats);
 | 
			
		||||
 | 
			
		||||
Bool ephyrHostXVAdaptorHasPutVideo(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                                   Bool *a_result);
 | 
			
		||||
Bool ephyrHostXVAdaptorHasGetVideo(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                                   Bool *a_result);
 | 
			
		||||
Bool ephyrHostXVAdaptorHasPutStill(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                                   Bool *a_result);
 | 
			
		||||
Bool ephyrHostXVAdaptorHasGetStill(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                                   Bool *a_result);
 | 
			
		||||
Bool ephyrHostXVAdaptorHasPutImage(const xcb_xv_adaptor_info_t *a_this,
 | 
			
		||||
                                   Bool *a_result);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * encoding
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -169,6 +169,12 @@ static int s_base_port_id;
 | 
			
		|||
 * <helpers>
 | 
			
		||||
 * ************/
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
adaptor_has_flags(const xcb_xv_adaptor_info_t *adaptor, uint32_t flags)
 | 
			
		||||
{
 | 
			
		||||
    return (adaptor->type & flags) == flags;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
DoSimpleClip(BoxPtr a_dst_box, BoxPtr a_clipper, BoxPtr a_result)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -508,7 +514,6 @@ static Bool
 | 
			
		|||
ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this)
 | 
			
		||||
{
 | 
			
		||||
    int i = 0;
 | 
			
		||||
    Bool has_it = FALSE;
 | 
			
		||||
    xcb_xv_adaptor_info_t *cur_host_adaptor = NULL;
 | 
			
		||||
 | 
			
		||||
    EPHYR_RETURN_VAL_IF_FAIL(a_this, FALSE);
 | 
			
		||||
| 
						 | 
				
			
			@ -528,45 +533,26 @@ ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this)
 | 
			
		|||
            EPHYR_LOG_ERROR("failed to get host adaptor at index %d\n", i);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        has_it = FALSE;
 | 
			
		||||
        if (!ephyrHostXVAdaptorHasPutImage(cur_host_adaptor, &has_it)) {
 | 
			
		||||
            EPHYR_LOG_ERROR("error\n");
 | 
			
		||||
        }
 | 
			
		||||
        if (has_it) {
 | 
			
		||||
 | 
			
		||||
        if (adaptor_has_flags(cur_host_adaptor,
 | 
			
		||||
                              XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
            a_this->adaptors[i].PutImage = ephyrPutImage;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        has_it = FALSE;
 | 
			
		||||
        if (!ephyrHostXVAdaptorHasPutVideo(cur_host_adaptor, &has_it)) {
 | 
			
		||||
            EPHYR_LOG_ERROR("error\n");
 | 
			
		||||
        }
 | 
			
		||||
        if (has_it) {
 | 
			
		||||
        if (adaptor_has_flags(cur_host_adaptor,
 | 
			
		||||
                              XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
            a_this->adaptors[i].PutVideo = ephyrPutVideo;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        has_it = FALSE;
 | 
			
		||||
        if (!ephyrHostXVAdaptorHasGetVideo(cur_host_adaptor, &has_it)) {
 | 
			
		||||
            EPHYR_LOG_ERROR("error\n");
 | 
			
		||||
        }
 | 
			
		||||
        if (has_it) {
 | 
			
		||||
        if (adaptor_has_flags(cur_host_adaptor,
 | 
			
		||||
                              XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_OUTPUT_MASK))
 | 
			
		||||
            a_this->adaptors[i].GetVideo = ephyrGetVideo;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        has_it = FALSE;
 | 
			
		||||
        if (!ephyrHostXVAdaptorHasPutStill(cur_host_adaptor, &has_it)) {
 | 
			
		||||
            EPHYR_LOG_ERROR("error\n");
 | 
			
		||||
        }
 | 
			
		||||
        if (has_it) {
 | 
			
		||||
        if (adaptor_has_flags(cur_host_adaptor,
 | 
			
		||||
                              XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_INPUT_MASK))
 | 
			
		||||
            a_this->adaptors[i].PutStill = ephyrPutStill;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        has_it = FALSE;
 | 
			
		||||
        if (!ephyrHostXVAdaptorHasGetStill(cur_host_adaptor, &has_it)) {
 | 
			
		||||
            EPHYR_LOG_ERROR("error\n");
 | 
			
		||||
        }
 | 
			
		||||
        if (has_it) {
 | 
			
		||||
        if (adaptor_has_flags(cur_host_adaptor,
 | 
			
		||||
                              XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_OUTPUT_MASK))
 | 
			
		||||
            a_this->adaptors[i].GetStill = ephyrGetStill;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    EPHYR_LOG("leave\n");
 | 
			
		||||
    return TRUE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue