void fbm_decoder_share_frame(vpicture_t* frame, Handle h) { u8 idx; fbm_t* fbm; frame_info_t* frame_info; fbm = (fbm_t*)h; if(fbm == NULL) return; idx = fbm_pointer_to_index(frame, h); if(idx >= fbm->max_frame_num) return; frame_info = &fbm->frames[idx]; if(lock(fbm) != 0) return; frame_info->status = FS_DECODER_AND_DISPLAY_USING; fbm_enqueue(&fbm->display_queue, frame_info); unlock(fbm); return; }
void fbm_decoder_return_frame(vpicture_t* frame, u8 valid, Handle h) { u8 idx; fbm_t* fbm; frame_info_t* frame_info; fbm = (fbm_t*)h; if(fbm == NULL) return; idx = fbm_pointer_to_index(frame, h); if(idx >= fbm->max_frame_num) return; frame_info = &fbm->frames[idx]; if(lock(fbm) != 0) return; if(frame_info->status == FS_DECODER_USING) { if(valid) { frame_info->status = FS_DISPLAY_USING; fbm_enqueue(&fbm->display_queue, frame_info); } else { frame_info->status = FS_EMPTY; fbm_enqueue(&fbm->empty_queue, frame_info); } } else if(frame_info->status == FS_DECODER_AND_DISPLAY_USING) { frame_info->status = FS_DISPLAY_USING; } else if(frame_info->status == FS_DECODER_USING_DISPLAY_DISCARD) { frame_info->status = FS_EMPTY; fbm_enqueue(&fbm->empty_queue, frame_info); } else { //* error case, program should not run to here. } unlock(fbm); return; }
static void fbm_return_decoder_frame(vpicture_t* frame, u8 valid, Handle h) { u8 idx; fbm_t* fbm = (fbm_t*)h; display_frame_t* frame_info = NULL; cedarx_picture_t *picture; if(fbm && frame && fbm->decoder) { pthread_mutex_lock(&fbm->mutex); idx = fbm_pointer_to_index(frame, h); if(idx < FBM_MAX_FRAME_NUM) { frame_info = &fbm->frames[idx]; switch (frame_info->status) { case FS_DECODER_USING: picture = &frame_info->picture; if(valid) { frame_info->status = FS_DECODER_DISCARD; fbm_enqueue_tail(&fbm->decoded_queue, frame_info); } else { if (fbm->decoder->release_buffer) fbm->decoder->release_buffer(picture, fbm->decoder->sys); frame_info->status = FS_BINDING; fbm_enqueue_tail(&fbm->bind_queue, frame_info); } break; case FS_DECODER_SHARED: frame_info->status = FS_DECODER_DISCARD; break; case FS_DECODER_SHARE_DISCARD: picture = &frame_info->picture; if (fbm->decoder->unlock_buffer) fbm->decoder->unlock_buffer(picture, fbm->decoder->sys); frame_info->status = FS_BINDING; fbm_enqueue_tail(&fbm->bind_queue, frame_info); break; default: printf("Fatal Error: invalid frame(%d) at %s:%s:%d!!!!\n", \ frame_info->status, __FILE__, __FUNCTION__, __LINE__); case FS_BINDING: break; } } pthread_mutex_unlock(&fbm->mutex); } }
void fbm_vdecoder_return_frame(vpicture_t * frame, Handle h) { u8 idx; fbm_t * fbm; frame_info_t *frame_info; fbm = (fbm_t *)h; if(fbm == NULL) return ; idx = fbm_pointer_to_index(frame, h); frame_info = &fbm->frames[idx]; if(lock(fbm) != 0) return ; fbm_enqueue_to_head(&fbm->display_queue, frame_info); unlock(fbm); return ; }
static void fbm_share_decoder_frame(vpicture_t* frame, Handle h) { u8 idx; fbm_t* fbm = (fbm_t*)h; display_frame_t* frame_info = NULL; if(fbm && frame) { pthread_mutex_lock(&fbm->mutex); idx = fbm_pointer_to_index(frame, h); if(idx < FBM_MAX_FRAME_NUM) { frame_info = &fbm->frames[idx]; if (frame_info->status == FS_DECODER_USING) { vpicture_t* vpicture = &frame_info->vpicture; frame_info->status = FS_DECODER_SHARED; fbm_enqueue(&fbm->decoded_queue, frame_info); } else { printf("Fatal Error: invalid frame at %s:%s:%d!!!!\n", __FILE__, __FUNCTION__, __LINE__); } } pthread_mutex_unlock(&fbm->mutex); } }