Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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);
    }
}
Exemple #4
0
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 ;
}
Exemple #5
0
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);
    }
}