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; } }
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; } }