Esempio n. 1
0
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;
}
Esempio n. 2
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;
}