void libcedarx_display_free_frame(cedarx_picture_t *picture) { cedarx_display_t* display = cedarx_display; if (display && picture) fbm_free_frame_buffer(picture); }
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; }
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; }
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; }
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; }