Vdec_ReturnType vdec_close(struct VDecoder *dec) { VDEC_ERROR err; VideoDecoder* pDec = (VideoDecoder*)(dec->core); QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_LOW,"vdec: vdec_close()\n"); #ifdef PROFILE_DECODER usecs_t time_taken_by_arm = QPERF_TERMINATE(arm_decode); float avArmTime = (float)time_taken_by_arm/(qperf_total_frame_cnt*1000); usecs_t frame_data_time = QPERF_TERMINATE(frame_data); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"===========================================================\n"); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL," Arm Statistics \n"); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"===========================================================\n"); QTV_PERF_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"Total number of frames decoded = %ld\n",qperf_total_frame_cnt); QTV_PERF_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"Average Arm time/frame(ms) = %f\n",avArmTime); QTV_PERF_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"Frames Arm Decoded/sec = %f\n",1000/avArmTime); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"===========================================================\n"); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL," Frame Done Statistics \n"); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"===========================================================\n"); QTV_PERF_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"Frame done cumulative time = %lld\n",frame_data_time); QTV_PERF_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"Frames Done per second = %f\n",(float)(qperf_total_frame_cnt-1)*1000000/frame_data_time); QTV_PERF_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"===========================================================\n"); #endif #ifdef LOG_YUV_FRAMES if (pYUVFile) { fclose (pYUVFile); pYUVFile = NULL; } #endif #ifdef LOG_INPUT_BUFFERS if (pInputFile) { fclose (pInputFile); } #endif vdec_output_frame_index = 0; #if NEED_VDEC_LP if (vdec->fake) { //jlk - adsp_close() calls adsp_disable right now. Calling adsp_disable() twice causes problems //Renable this line when we fix the kernel driver //adsp_disable((adsp_module*)vdec->fake); adsp_close((adsp_module*)vdec->fake); } else { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: adsp modules is NULL\n"); } #endif nFrameDoneCnt = 0; nGoodFrameCnt = 0; if (dec->core) { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_LOW,"vdec: calling Suspend"); err = pDec->Suspend( ); if (VDEC_ERR_EVERYTHING_FINE != err) { QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_ERROR,"vdec: Suspend returned error: %d\n", (int)err); } QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_LOW,"vdec: calling vdec_destroy"); QTV_Delete( (VideoDecoder*)(dec->core) ); } else { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: core is NULL"); } pmem_free(&dec->arena); free(dec); QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_MED,"vdec: closed\n"); return VDEC_SUCCESS; }
void adsp_close(struct adsp_module *mod) { #if PROFILE_DECODER QPERF_TERMINATE(dsp_decode); QPERF_RESET(dsp_decode); #endif #ifndef T_WINNT int ret; int thread_ret = 0; if (NULL == mod) { QTV_MSG_PRIO1(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "adsp_close() mod NULL: 0x%x\n", mod); return ; } mod->dead = 1; if (ioctl(mod->fd, VDEC_IOCTL_CLOSE, NULL) < 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "VDEC_IOCTL_CLOSE failed\n"); return; } QTV_MSG_PRIO1(QTVDIAG_GENERAL, QTVDIAG_PRIO_LOW, "adsp_close: 0x%x", (unsigned)mod); /*Wait on the adsp event thread completion */ ret = pthread_join(mod->thr, (void **)&thread_ret); if (ret != 0) { QTV_MSG_PRIO1(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "*************adsp_close: Could not join on the adsp event thread err=%d!!\n", ret); } /*Wait on the adsp event thread completion */ ret = close(mod->fd); if (ret < 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "*************adsp_close ERROR!"); } QTV_MSG_PRIO2(QTVDIAG_GENERAL, QTVDIAG_PRIO_LOW, "adsp_close returned %d, fd: %d", ret, mod->fd); #if DEBUG if (logFD) { pthread_mutex_lock(&logMTX); fclose(logFD); logFD = NULL; pthread_mutex_destroy(&logMTX); } #endif //sleep(1); /* XXX need better way to stop thread XXX */ free(mod); mod = NULL; #endif //T_WINNT }