int adsp_post_input_buffer(struct adsp_module *mod, struct adsp_input_buf input, unsigned int eos) { struct vdec_input_buf ip; struct vdec_queue_status stat; if (NULL == mod) { QTV_MSG_PRIO1(QTVDIAG_GENERAL, QTVDIAG_PRIO_LOW, "adsp_post_input_buffer() mod NULL: 0x%x\n", mod); return -1; } ip.pmem_id = input.pmem_id; ip.buffer.avsync_state = input.avsync_state; ip.buffer.data = input.data; ip.buffer.offset = input.offset; ip.buffer.size = input.size; ip.buffer.timestamp_lo = input.timestamp_lo; ip.buffer.timestamp_hi = input.timestamp_hi; ip.buffer.flags = input.flags; ip.queue_status = &stat; #if PROFILE_DECODER QPERF_START(dsp_decode); #endif if (eos) { if (ioctl(mod->fd, VDEC_IOCTL_EOS, NULL) < 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "adsp:VDEC_IOCTL_EOS failed\n"); return -1; } } else { //usleep(1000000); if (ioctl(mod->fd, VDEC_IOCTL_QUEUE, &ip) < 0) { QTV_MSG_PRIO(QTVDIAG_GENERAL, QTVDIAG_PRIO_ERROR, "adsp:VDEC_IOCTL_QUEUE failed\n"); return -1; } } return 0; }
void vdec_frame_cb_handler ( const VDEC_STREAM_ID /*stream*/, VDEC_CB_STATUS status, VDEC_FRAME * const pFrame, unsigned long int /*nBytesConsumed*/, void * const pCbData ) { int index; ++nFrameDoneCnt; QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_MED,"vdec: frame done cb cnt: %d", nFrameDoneCnt); switch(status) { case VDEC_STATUS_GOOD_FRAME: case VDEC_STATUS_FLUSH: { if (NULL == pFrame) { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: pFrame parameter is NULL, dropping frame\n"); break; } //Iterate through the output frame array to locate corresponding index for (index=0; index<vdec_decoder_info->ctxt->outputBuffer.numBuffers; index++) { //if (pFrame->pBuf == (VDEC_BYTE*)vdec_decoder_info->output[index].phys) if (pFrame->pBuf == (VDEC_BYTE*)vdec_decoder_info->output[index].base) { break; } } if (vdec_decoder_info->ctxt->outputBuffer.numBuffers == index) { QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: error: unable to map address %p, dropping frame\n", pFrame->pBuf); } else { if(VDEC_STATUS_FLUSH == status) { vdec_decoder_info->output[index].flags |= FRAME_FLAG_FLUSHED; } else { ++nGoodFrameCnt; #ifdef PROFILE_DECODER ++qperf_total_frame_cnt; #endif vdec_decoder_info->output[index].flags = 0; QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_LOW,"vdec: callback status good frame, cnt: %d\n", nGoodFrameCnt); #ifdef LOG_YUV_FRAMES if (pYUVFile) { int size = vdec_decoder_info->width*vdec_decoder_info->height*1.5; fwritex(vdec_decoder_info->output[index].base, size, pYUVFile); } #endif } if(nGoodFrameCnt >1) { QPERF_END(frame_data); } QPERF_START(frame_data); vdec_decoder_info->output[index].timestamp = pFrame->timestamp; if(pFrame->frameType == VDEC_FRAMETYPE_I) { vdec_decoder_info->output[index].frameDetails.ePicType[0] = VDEC_PICTURE_TYPE_I; } if(pFrame->frameType == VDEC_FRAMETYPE_B) { vdec_decoder_info->output[index].frameDetails.ePicType[0] = VDEC_PICTURE_TYPE_B; } if(pFrame->frameType == VDEC_FRAMETYPE_P) { vdec_decoder_info->output[index].frameDetails.ePicType[0] = VDEC_PICTURE_TYPE_P; } vdec_decoder_info->ctxt->frame_done(vdec_decoder_info->ctxt, &vdec_decoder_info->output[index]); } break; } case VDEC_STATUS_DECODE_ERROR: { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_ERROR,"vdec: callback status decode error\n"); break; } case VDEC_STATUS_FATAL_ERROR: { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"vdec: callback status error fatal\n"); //Iterate through the output frame array to locate corresponding index for (index=0; index<vdec_decoder_info->ctxt->outputBuffer.numBuffers; index++) { if (pFrame->pBuf == (VDEC_BYTE*)vdec_decoder_info->output[index].base) { break; } } if (vdec_decoder_info->ctxt->outputBuffer.numBuffers == index) { QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL, "vdec: error: unable to map address %p for VDEC_STATUS_FATAL_ERROR, dropping frame\n", pFrame->pBuf); } else { QTV_MSG_PRIO1(QTVDIAG_GENERAL,QTVDIAG_PRIO_FATAL,"vdec: frame done index = %d\n",index); vdec_decoder_info->output[index].flags = FRAME_FLAG_FATAL_ERROR; vdec_decoder_info->ctxt->frame_done(vdec_decoder_info->ctxt, &vdec_decoder_info->output[index]); } break; } case VDEC_STATUS_VOP_NOT_CODED: { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: callback status not coded\n"); break; } case VDEC_STATUS_SUSPEND_DONE: { QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_MED,"vdec: callback status suspend done\n"); break; } case VDEC_STATUS_EOS: { static struct vdec_frame frame; memset(&frame, 0, sizeof(frame)); frame.flags |= FRAME_FLAG_EOS; QPERF_END(frame_data); vdec_decoder_info->ctxt->frame_done(vdec_decoder_info->ctxt, &frame); QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_LOW,"vdec: callback status EOS\n"); break; } default: QTV_MSG_PRIO(QTVDIAG_GENERAL,QTVDIAG_PRIO_HIGH,"vdec: callback status unknown status\n"); break; } return; }