示例#1
0
void libcedarx_display_free_frame(cedarx_picture_t *picture)
{
    cedarx_display_t* display = cedarx_display;

    if (display && picture)
        fbm_free_frame_buffer(picture);
}
示例#2
0
static s32 fbm_alloc_frame_buffer(cedarx_picture_t* picture)
{
    if(picture->size_y[0]) {
        picture->y[0] = (u8*)mem_palloc(picture->size_y[0], 0);
        if(!picture->y[0]) 
          goto err;
    }
      
    if(picture->size_u[0]) {
        picture->u[0] = (u8*)mem_palloc(picture->size_u[0], 0);
        if(!picture->u[0])
          goto err;
    }
      
    if(picture->size_v[0]) {
        picture->v[0] = (u8*)mem_palloc(picture->size_v[0], 0);
        if(!picture->v[0])
          goto err;
    }
      
    if(picture->size_alpha[0]) {
        picture->alpha[0] = (u8*)mem_palloc(picture->size_alpha[0], 0);
        if(!picture->alpha[0])
          goto err;
    }
    
    if(picture->size_y[1]) {
        picture->y[1] = (u8*)mem_palloc(picture->size_y[1], 0);
        if(!picture->y[1]) 
          goto err;
    }
      
    if(picture->size_u[1]) {
        picture->u[1] = (u8*)mem_palloc(picture->size_u[1], 0);
        if(!picture->u[1])
          goto err;
    }
      
    if(picture->size_v[1]) {
        picture->v[1] = (u8*)mem_palloc(picture->size_v[1], 0);
        if(!picture->v[1])
          goto err;
    }
      
    if(picture->size_alpha[1]) {
        picture->alpha[1] = (u8*)mem_palloc(picture->size_alpha[1], 0);
        if(!picture->alpha[1])
          goto err;
    }
    return CEDARX_RESULT_OK;
err:
    fbm_free_frame_buffer(picture);
    return CEDARX_RESULT_NO_ENOUGH_MEMORY;
}
示例#3
0
void fbm_release(Handle h, void* parent)
{
    u32     i;
    fbm_t*  fbm;
    
    fbm = (fbm_t*)h;
    
    if(fbm == NULL)
        return;
        
    if(fbm->mutex)
    {
    	semaphore_delete(fbm->mutex, SEM_DEL_ALWAYS);
        fbm->mutex = NULL;
    }
        
    for(i=0; i<fbm->max_frame_num; i++)
    {
    	if(fbm->is_preview_mode)
    	{
    		if(i == 0)
    		{
    			fbm_free_frame_buffer(&fbm->frames[i].picture);
    			break;
    		}
    	}
    	else
    	{
    		fbm_free_frame_buffer(&fbm->frames[i].picture);
    	}
    }
    
    mem_free(fbm);
    
    return;
}
示例#4
0
static s32 fbm_alloc_frame_buffer(cedarx_picture_t* picture)
{
    cedarx_decoder_t* decoder = cedarx_decoder;

    if (decoder && decoder->fbm) {
        fbm_t* fbm = decoder->fbm;
        if (picture->size_y[0] < fbm->size_y[0])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_y[0], picture->size_y[0], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_u[0] < fbm->size_u[0])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_u[0], picture->size_u[0], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_v[0] < fbm->size_v[0])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_v[0], picture->size_v[0], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_alpha[0] < fbm->size_alpha[0])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_alpha[0], picture->size_alpha[0], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_y[1] < fbm->size_y[1])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_y[1], picture->size_y[1], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_u[1] < fbm->size_u[1])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_u[1], picture->size_u[1], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_v[1] < fbm->size_v[1])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_v[1], picture->size_v[1], __FILE__, __FUNCTION__, __LINE__);

        if (picture->size_alpha[1] < fbm->size_alpha[1])
            printf("Warning: need 0x%x bytes but just request 0x%x bytes at %s:%s:%d!!!!\n", \
                fbm->size_alpha[1], picture->size_alpha[1], __FILE__, __FUNCTION__, __LINE__);
    }

    if(picture->size_y[0]) {
        picture->y[0] = (u8*)mem_palloc(picture->size_y[0], 0);
        if(!picture->y[0]) 
          goto err;
    }
      
    if(picture->size_u[0]) {
        picture->u[0] = (u8*)mem_palloc(picture->size_u[0], 0);
        if(!picture->u[0])
          goto err;
    }
      
    if(picture->size_v[0]) {
        picture->v[0] = (u8*)mem_palloc(picture->size_v[0], 0);
        if(!picture->v[0])
          goto err;
    }
      
    if(picture->size_alpha[0]) {
        picture->alpha[0] = (u8*)mem_palloc(picture->size_alpha[0], 0);
        if(!picture->alpha[0])
          goto err;
    }
    
    if(picture->size_y[1]) {
        picture->y[1] = (u8*)mem_palloc(picture->size_y[1], 0);
        if(!picture->y[1]) 
          goto err;
    }
      
    if(picture->size_u[1]) {
        picture->u[1] = (u8*)mem_palloc(picture->size_u[1], 0);
        if(!picture->u[1])
          goto err;
    }
      
    if(picture->size_v[1]) {
        picture->v[1] = (u8*)mem_palloc(picture->size_v[1], 0);
        if(!picture->v[1])
          goto err;
    }
      
    if(picture->size_alpha[1]) {
        picture->alpha[1] = (u8*)mem_palloc(picture->size_alpha[1], 0);
        if(!picture->alpha[1])
          goto err;
    }
    return CEDARX_RESULT_OK;
err:
    fbm_free_frame_buffer(picture);
    return CEDARX_RESULT_NO_ENOUGH_MEMORY;
}
示例#5
0
Handle fbm_init_yv32(u32 max_frame_num,
                u32 min_frame_num,
                u32 size_y[2],
                u32 size_u[2],
                u32 size_v[2],
                u32 size_alpha[2],
                _3d_mode_e out_3d_mode,
                pixel_format_e format,
                u8	is_preview_mode,
                void* parent)

{
    s32     i;
    fbm_t*  fbm;
    //video_decoder_t* decoder;


    if(size_y[0] >= (480*272))
    		max_frame_num = min_frame_num;

    if(max_frame_num < min_frame_num)
    {
        max_frame_num = min_frame_num;
    }
	if(min_frame_num > FBM_MAX_FRAME_NUM)
		return NULL;

	if(max_frame_num > FBM_MAX_FRAME_NUM)
		max_frame_num = FBM_MAX_FRAME_NUM;

	fbm = (fbm_t*) mem_alloc(sizeof(fbm_t));
	if(!fbm)
	{
        return NULL;
	}
	mem_set(fbm, 0, sizeof(fbm_t));

#if 0
    libve_io_ctrl(LIBVE_COMMAND_GET_PARENT, (u32)&decoder, parent);
    if(decoder == NULL)
    {
        mem_free(fbm);
    }

    if(decoder->status == CEDARV_STATUS_PREVIEW)
    {
        max_frame_num = 2;
        min_frame_num = 2;
    }
#else
    if(is_preview_mode)
    {
    	max_frame_num = 2;
        min_frame_num = 2;
    }

#endif
    //* alloc memory frame buffer.
    for(i=0; i<(s32)max_frame_num; i++)
    {
    	fbm->frames[i].picture.id 		  = i;
    	fbm->frames[i].picture.size_y 	  = size_y[0];
    	fbm->frames[i].picture.size_u 	  = size_u[0];
    	fbm->frames[i].picture.size_v 	  = size_v[0];
    	fbm->frames[i].picture.size_alpha = size_alpha[0];

    	fbm->frames[i].picture.size_y2		= size_y[1];
    	fbm->frames[i].picture.size_u2		= size_u[1];
    	fbm->frames[i].picture.size_v2		= size_v[1];
    	fbm->frames[i].picture.size_alpha2	= size_alpha[1];

    	//if(fbm_alloc_yv32_frame_buffer(&fbm->frames[i].picture) != 0)
    	if(fbm_alloc_frame_buffer(&fbm->frames[i].picture) != 0)
    	{
    	    break;
    	}
    }
    if(i < (s32)min_frame_num)
    {
    	for(; i>=0; i--)
    		fbm_free_frame_buffer(&fbm->frames[i].picture);

    	mem_free(fbm);
    	return NULL;
    }

    fbm->max_frame_num = i;
//    if(out_3d_mode == _3D_MODE_DOUBLE_STREAM)
//    {
//       if(fbm_alloc_redBlue_frame_buffer((Handle)fbm) < 0)
//       {
//            fbm_release((Handle)fbm, parent);
//            return NULL;
//       }
//    }


    //* initialize empty frame queue semaphore.
    fbm->mutex = semaphore_create(1);
    if(fbm->mutex == NULL)
    {
        fbm_release((Handle)fbm, parent);
        return NULL;
    }

    //* put all frame to empty frame queue.
    for(i=0; i<(s32)fbm->max_frame_num; i++)
    {
        fbm_enqueue(&fbm->empty_queue, &fbm->frames[i]);
    }

    return (Handle)fbm;
}