예제 #1
0
static s32 vdecoder_decode(cedarv_decoder_t* p)
{
    vresult_e        vresult;

#if (DECODE_FREE_RUN == 0)
    u64              video_time;
#endif

    video_decoder_t* decoder;

    if(p == NULL)
        return CEDARV_RESULT_ERR_INVALID_PARAM;

    decoder = (video_decoder_t*)p;

    if(decoder->mode_switched)
    {
    	libve_reset(0, decoder->ve);

        vbv_reset(decoder->vbv);
        if(p->free_vbs_buffer_sem != NULL)
            p->free_vbs_buffer_sem(p->cedarx_cookie);

        if(decoder->fbm != NULL)
        {
			fbm_flush(decoder->fbm);
            if(p->release_frame_buffer_sem != NULL)
                p->release_frame_buffer_sem(p->cedarx_cookie);
        }

    	decoder->mode_switched = 0;

    	return CEDARV_RESULT_NO_BITSTREAM;
    }

    if(decoder->status == CEDARV_STATUS_BACKWARD || decoder->status == CEDARV_STATUS_FORWARD)
    {
    	vresult = libve_decode(1, 0, 0, decoder->ve);
    }
    else
    {
    	if(decoder->stream_info.format == STREAM_FORMAT_H264 && decoder->display_already_begin == 0)
    	{
    		//* for H264, when decoding the first data unit containing PPS, we have to promise
    		//* there is more than one bitstream frame for decoding.
    		//* that is because the decoder uses the start code of the second bitstream frame
    		//* to judge PPS end.
    		if(vbv_get_stream_num(decoder->vbv) < 2)
    			return CEDARV_RESULT_NO_BITSTREAM;
    	}

    	if(decoder->status == CEDARV_STATUS_PREVIEW)
    	{
    		vresult = libve_decode(1, 0, 0, decoder->ve);
    	}
    	else
    	{
#if (DECODE_FREE_RUN == 0)
    	video_time = esMODS_MIoctrl(vdrv_com->avsync, DRV_AVS_CMD_GET_VID_TIME, DRV_AVS_TIME_TOTAL, 0);
    	video_time *= 1000;
    	vresult = libve_decode(0, 1, video_time, decoder->ve);
#else
    	vresult = libve_decode(0, 0, 0, decoder->ve);
#endif
    	}
    }

    if(vresult == VRESULT_OK)
    {
        return CEDARV_RESULT_OK;
    }
    else if(vresult == VRESULT_FRAME_DECODED)
    {
    	return CEDARV_RESULT_FRAME_DECODED;
    }
    else if(vresult == VRESULT_KEYFRAME_DECODED)
    {
    	if(decoder->status == CEDARV_STATUS_BACKWARD || decoder->status == CEDARV_STATUS_FORWARD || decoder->status == CEDARV_STATUS_PREVIEW)
    	{
    		libve_reset(1, decoder->ve);
    	}
        return CEDARV_RESULT_KEYFRAME_DECODED;
    }
    else if(vresult == VRESULT_NO_FRAME_BUFFER)
    {
        return CEDARV_RESULT_NO_FRAME_BUFFER;
    }
    else if(vresult == VRESULT_NO_BITSTREAM)
    {
        return CEDARV_RESULT_NO_BITSTREAM;
    }
    else if(vresult == VRESULT_ERR_NO_MEMORY)
    {
        return CEDARV_RESULT_ERR_NO_MEMORY;
    }
    else if( vresult == VRESULT_ERR_UNSUPPORTED)
    {
        return CEDARV_RESULT_ERR_UNSUPPORTED;
    }
    else if(vresult == VRESULT_ERR_LIBRARY_NOT_OPEN)
    {
        return CEDARV_RESULT_ERR_FAIL;
    }
    else
    {
        return CEDARV_RESULT_OK;
    }
}
예제 #2
0
static s32 vdecoder_io_ctrl(cedarv_decoder_t* p, u32 cmd, u32 param)
{
    video_decoder_t* decoder;

    if(p == NULL)
        return CEDARV_RESULT_ERR_INVALID_PARAM;

    decoder = (video_decoder_t*)p;

    if(p == NULL)
        return CEDARV_RESULT_ERR_INVALID_PARAM;

    switch(cmd)
    {
    case CEDARV_COMMAND_PLAY:
    {
        if(decoder->status != CEDARV_STATUS_PLAY && decoder->status != CEDARV_STATUS_STOP)
            decoder->mode_switched = 1;

        decoder->status = CEDARV_STATUS_PLAY;

        return CEDARV_RESULT_OK;
    }

    case CEDARV_COMMAND_FORWARD:
    {
        if(decoder->status != CEDARV_STATUS_PLAY)
            return CEDARV_RESULT_ERR_FAIL;

        decoder->status = CEDARV_STATUS_FORWARD;
        decoder->mode_switched = 1;

        return CEDARV_RESULT_OK;
    }

    case CEDARV_COMMAND_BACKWARD:
    {
        if(decoder->status != CEDARV_STATUS_PLAY)
            return CEDARV_RESULT_ERR_FAIL;

        decoder->status = CEDARV_STATUS_BACKWARD;
        decoder->mode_switched = 1;

        return CEDARV_RESULT_OK;
    }

    case CEDARV_COMMAND_STOP:
    {
        if(decoder->status != CEDARV_STATUS_PLAY && decoder->status != CEDARV_STATUS_FORWARD && decoder->status != CEDARV_STATUS_BACKWARD)
            return CEDARV_RESULT_ERR_FAIL;

        decoder->status = CEDARV_STATUS_STOP;
        decoder->mode_switched = 1;

        return CEDARV_RESULT_OK;
    }

    case CEDARV_COMMAND_ROTATE:
    {
        if(param > 5)
            return CEDARV_RESULT_ERR_FAIL;

        decoder->config_info.rotate_angle  = param;
        if(param != 0)
            decoder->config_info.rotate_enable = 1;

        return CEDARV_RESULT_OK;
    }

    case CEDARV_COMMAND_JUMP:
    {
        libve_reset(0, decoder->ve);

        mem_set(&decoder->cur_stream_part, 0, sizeof(vstream_data_t));
        vbv_reset(decoder->vbv);
        if(p->free_vbs_buffer_sem != NULL)
            p->free_vbs_buffer_sem(p->cedarx_cookie);

        if(decoder->fbm != NULL)
        {
            fbm_flush(decoder->fbm);

            if(p->release_frame_buffer_sem != NULL)
                p->release_frame_buffer_sem(p->cedarx_cookie);
        }

        return CEDARV_RESULT_OK;
    }

//        case VDEC_QUERY_VBSBUFFER_USAGE_CMD:
//        {
//            s32 usage1, usage2;
//
//            if(p->vbv != NULL && vbv_get_buffer_size(p->vbv) != 0)
//            {
//                usage1 = vbv_get_valid_data_size(p->vbv) * 100 / vbv_get_buffer_size(p->vbv);
//                usage2 = vbv_get_valid_frame_num(p->vbv) * 100 / vbv_get_max_stream_frame_num(p->vbv);
//
//                return (usage1 > usage2) ? usage1 : usage2;
//            }
//
//            return 0;
//        }

    case CEDARV_COMMAND_SET_TOTALMEMSIZE:
    {
        decoder->remainMemorySize = param;
        return CEDARV_RESULT_OK;
    }


    case CEDARV_COMMAND_PREVIEW_MODE:
    {
        decoder->status = CEDARV_STATUS_PREVIEW;
        return CEDARV_RESULT_OK;
    }

    default:
        return CEDARV_RESULT_ERR_FAIL;
    }
}