⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maioggdec.c

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    FILLPRINTF((M_TEXT("%2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %d\n"), buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13]));    memcpy(pPInfo->m_pucAudioInBuf, pPInfo->m_pucAudioInBuf + to_get, pPInfo->m_uiAudioInbufSize - to_get);    pPInfo->m_uiAudioInbufSize -= to_get;    FILLPRINTF((M_TEXT("got %x, have %x\n"), to_get, pPInfo->m_uiAudioInbufSize));    DUMPCOMPAUDIO(buf, to_get);    return to_get;  }  else if (pPInfo->m_uiAudioInbufSize > 0)  {    to_get = pPInfo->m_uiAudioInbufSize;    memcpy(buf, pPInfo->m_pucAudioInBuf, to_get);    pPInfo->m_uiAudioInbufSize = 0;      if (!pPInfo->m_iLastFrame)    {      ERRORPRINTF((M_TEXT("ERROR: OGG wanted %x, but only have %x\n"), to_get, pPInfo->m_uiAudioInbufSize));    }    FILLPRINTF((M_TEXT("got %x, have %x\n"), to_get, pPInfo->m_uiAudioInbufSize));    DUMPCOMPAUDIO(buf, to_get);    return to_get;  }  else  {    if (!pPInfo->m_iLastFrame)    {      if (pPInfo->m_uiOutcount > 0) // ignore first time      {        ERRORPRINTF((M_TEXT("ERROR: OGG wanted %x, but have none\n"), to_get));      }    }    wrap_errno = 1;    return 0;  }}int fseek64_wrap(FILE *f, ogg_int64_t off, int whence){       //  if (f == NULL)//    return (- 1);//  if (whence == 0)//    cur_position = (int)off;//  DPRINTF((M_TEXT("seek to %x, %x\n"), (int)off, whence));  return -1;//  return fseek(f, off, whence);}MAIStatus_e _processbuffer(MAICompHandle_t hComp, MAICompBuffer_t *pInBufferInfo){  MAIStatus_e eStatus = MAI_STATUS_OK;  unsigned int insize = pInBufferInfo->uiDataSize;  unsigned char *inbuf_ptr = pInBufferInfo->pBuffer;  unsigned int uiBufFlags=pInBufferInfo->dwFlags;  int current_section;  MAICompBuffer_t BufferInfo;  int out_size;  /* This one must remain signed */  unsigned int buf_pad = OGG_INTERNAL_INPUT_BUFFER_SIZE;     pPInfo = (ProcessorInfo_t *)HCOMP_TO_USERINFO(hComp);  pPInfo->m_uiOutcount = 0;  APIPRINTF((M_TEXT("OGGDEC: _processbuffer() enter %d %d  %x %x %x %x %x %x %x %x  %c %c %c %c %c %c %c %c\n"), pPInfo->m_uiNormalAudioInbufSize, pInBufferInfo->uiDataSize,     pInBufferInfo->pBuffer[0], pInBufferInfo->pBuffer[1], pInBufferInfo->pBuffer[2], pInBufferInfo->pBuffer[3], pInBufferInfo->pBuffer[4], pInBufferInfo->pBuffer[5], pInBufferInfo->pBuffer[6], pInBufferInfo->pBuffer[7],     pInBufferInfo->pBuffer[0], pInBufferInfo->pBuffer[1], pInBufferInfo->pBuffer[2], pInBufferInfo->pBuffer[3], pInBufferInfo->pBuffer[4], pInBufferInfo->pBuffer[5], pInBufferInfo->pBuffer[6], pInBufferInfo->pBuffer[7]   ));  if (pPInfo->m_uiNeedsInit)  {    open_ogg(pPInfo);    buf_pad = OGG_INTERNAL_INPUT_BUFFER_SIZE;  }  pPInfo->m_iLastFrame = 0;  if ((uiBufFlags & MAICOMPBUF_FLAG_EOS) && (pPInfo->m_uiNormalAudioInbufSize > pInBufferInfo->uiDataSize))  {    DPRINTF((M_TEXT("audoggdecode EOS flag found. Shortening buf_pad, insize %x\n"), insize));    buf_pad = 100; /* Try to play the end of the file. */    pPInfo->m_iLastFrame = 1;  }  pPInfo->m_uiNormalAudioInbufSize = pInBufferInfo->uiDataSize;  while (((insize > 0) || (pPInfo->m_uiAudioInbufSize > buf_pad)))   {    if (pPInfo->m_pucAudioInBuf == NULL)    {      pPInfo->m_pucAudioInBuf = (unsigned char *)malloc(3*OGG_INTERNAL_INPUT_BUFFER_SIZE);      if (pPInfo->m_pucAudioInBuf == NULL)        return MAI_STATUS_MEMORY;    }    if (pPInfo->m_uiAudioInbufSize < OGG_INTERNAL_INPUT_BUFFER_SIZE )    {      int read_length = (insize >= (OGG_INTERNAL_INPUT_BUFFER_SIZE  - pPInfo->m_uiAudioInbufSize)) ? (OGG_INTERNAL_INPUT_BUFFER_SIZE  - pPInfo->m_uiAudioInbufSize) : insize;      FILLPRINTF((M_TEXT("fill rl %x %x\n"), read_length, pPInfo->m_uiAudioInbufSize));      if (read_length)      {        FILLPRINTF((M_TEXT("fill %x %x, "), pPInfo->m_uiAudioInbufSize, read_length));        memcpy(pPInfo->m_pucAudioInBuf + pPInfo->m_uiAudioInbufSize, inbuf_ptr, read_length);        pPInfo->m_uiAudioInbufSize += read_length;        insize -= read_length;        inbuf_ptr += read_length;        FILLPRINTF((M_TEXT("fill end %x %x, insize %x\n"), read_length, pPInfo->m_uiAudioInbufSize, insize));      }    }    DPRINTF((M_TEXT("check %x %x, m_bNewFormat %d\n"), pPInfo->m_uiAudioInbufSize, buf_pad, pPInfo->m_bNewFormat));    if (pPInfo->m_uiAudioInbufSize < buf_pad)       break;    if (pPInfo->m_bNewFormat)    {      /* Note, arg 0 should be a file pointer, but we really just need a non-null pointer since we have short circuited fread(). */      DPRINTF((M_TEXT("OGGDEC: _processbuffer() calling ov_open().\n")));      if (pPInfo->m_pAudioInitBuf != NULL)      {        memcpy(pPInfo->m_pAudioInitBuf, pPInfo->m_pucAudioInBuf, AUDIOINITBUFSIZE);      }      if (ov_open((void *)&pPInfo->vf, &pPInfo->vf, NULL, 0) < 0)       {        DPRINTF((M_TEXT("OGGDEC: _processbuffer() Trying to use saved init stream %d.\n"), pPInfo->m_uiInitialInputBufValid));        if (pPInfo->m_pucAudioInBuf != NULL)        {          int read_length;          insize = pInBufferInfo->uiDataSize;          inbuf_ptr = pInBufferInfo->pBuffer;          read_length = (insize >= (OGG_INTERNAL_INPUT_BUFFER_SIZE - AUDIOINITBUFSIZE)) ? (OGG_INTERNAL_INPUT_BUFFER_SIZE - AUDIOINITBUFSIZE) : insize;          memcpy(pPInfo->m_pucAudioInBuf, pPInfo->m_InitialInputBuf, AUDIOINITBUFSIZE);          pPInfo->m_uiAudioInbufSize = AUDIOINITBUFSIZE;          FILLPRINTF((M_TEXT("fill AudioInbufSize %x read_length %x, "), pPInfo->m_uiAudioInbufSize, read_length));          if (read_length)          {            FILLPRINTF((M_TEXT("fill %x %x, "), pPInfo->m_uiAudioInbufSize, read_length));            memcpy(pPInfo->m_pucAudioInBuf + pPInfo->m_uiAudioInbufSize, inbuf_ptr, read_length);            pPInfo->m_uiAudioInbufSize += read_length;            insize -= read_length;            inbuf_ptr += read_length;            FILLPRINTF((M_TEXT("fill end %x %x, insize %x\n"), read_length, pPInfo->m_uiAudioInbufSize, insize));          }          if ((pPInfo->m_uiInitialInputBufValid) && (ov_open((void *)&pPInfo->vf, &pPInfo->vf, NULL, 0) < 0))           {            ERRORPRINTF((M_TEXT("OGGDEC: _processbuffer() Input does not appear to be an Ogg bitstream.\n")));            return MAI_STATUS_ERROR;          }        }        else        {          ERRORPRINTF((M_TEXT("OGGDEC: _processbuffer() Cold not use saved buffer, m_pucAudioInBuf NULL.\n")));          return MAI_STATUS_ERROR;        }      }      else if ((pPInfo->m_pAudioInitBuf[0] == 0x4f) && (pPInfo->m_pAudioInitBuf[1] == 0x67) && (pPInfo->m_pAudioInitBuf[2] == 0x67) && (pPInfo->m_pAudioInitBuf[3] == 0x53))      {        unsigned char *buf = pPInfo->m_pAudioInitBuf;        DPRINTF((M_TEXT("OGGDEC: _processbuffer() Setting up saved init stream %x %x %x %x %x %x %x %x  %c %c %c %c %c %c %c %c.\n"),            buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7],            buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]          ));        memcpy(pPInfo->m_InitialInputBuf, buf, AUDIOINITBUFSIZE);        pPInfo->m_uiInitialInputBufValid = AUDIOINITBUFSIZE;        DPRINTF((M_TEXT("OGGDEC: _processbuffer() Set up saved init stream succeeded.\n")));      }      /* Throw the comments plus a few lines about the bitstream we are decoding */      {        char **ptr = ov_comment(&pPInfo->vf, -1)->user_comments;          pPInfo->vi = ov_info(&pPInfo->vf, -1);        while (*ptr)        {          DPRINTF((M_TEXT("%s\n"), *ptr));          ++ptr;        }        DPRINTF((M_TEXT("\nBitstream is %d channel, %ldhz\n"), pPInfo->vi->channels, pPInfo->vi->rate));        DPRINTF((M_TEXT("Encoded by: %s\n\n"), ov_comment(&pPInfo->vf, - 1)->vendor));      }    }    /* guard against overflowing the number of output buffers */    if (pPInfo->m_uiOutcount >= (NUMBER_OF_OUTPUT_BUFFERS-1))    {      APIPRINTF((M_TEXT("OGGDEC: _processbuffer() count %d exceeded, lost %d input bytes\n"), pPInfo->m_uiOutcount, insize));      break;    }    out_size = ov_read(&pPInfo->vf, pPInfo->m_pAudioOutBuf, OPTIMAL_OGG_OUTBUFFER_SIZE, &current_section);    pPInfo->m_uiProcessLoops++;    if (out_size < 0) // error condition    {      if (pPInfo->m_iLastFrame)      {        APIPRINTF((M_TEXT("OGGDEC: _processbuffer() predictable error at end %d\n"), out_size));        break;      }      else      {        /* error in the stream.  Not a big problem, just reporting it in case we (the app) cares.  In this case, we don't. */        APIPRINTF((M_TEXT("OGGDEC: _processbuffer() ogg error %d\n"), out_size));//printf("error considering punt %d\n", pPInfo->m_nErrorCount);        if (pPInfo->m_nErrorCount++ > 2)        {          pPInfo->m_nErrorCount = 0;          pPInfo->m_uiAudioInbufSize = 0;//printf("error punt\n");          return MAI_STATUS_OK;        }      }    }    else if (out_size >= 0)     {      DPRINTF((M_TEXT("OGGDEC: _processbuffer() out_size %d  m_bNewFormat %d\n"), out_size, pPInfo->m_bNewFormat));      if (pPInfo->m_uiPrevSRate != (unsigned int)pPInfo->vi->rate)      {        pPInfo->m_uiPrevSRate = pPInfo->vi->rate;        pPInfo->m_bNewFormat = 1;        DPRINTF((M_TEXT("OGGDEC: audoggdecode() NEWFORMAT rate change\n")));      }      if (pPInfo->m_nPrevChannels != (unsigned int)pPInfo->vi->channels)      {        pPInfo->m_nPrevChannels = pPInfo->vi->channels;        pPInfo->m_bNewFormat = 1;        DPRINTF((M_TEXT("OGGDEC: audoggdecode() NEWFORMAT channel change\n")));      }          if (pPInfo->m_bNewFormat)      {          MAIMediaTypeAudio_t AudioInfo;        MAIMediaTypeAudio_t *pAudioInfo=&AudioInfo;          DPRINTF((M_TEXT("OGGDEC: _processbuffer() New Format\n")));        pPInfo->m_bNewFormat = 0;        /* clear EOS flag, we're on a new stream */        MAICompBase_SetEOS(hComp, EOS_NONE);        MAICompBase_SetFormatState(hComp, FORMAT_STATE_KNOWN);        memset(pAudioInfo, 0, sizeof(MAIMediaTypeAudio_t));        pAudioInfo->MediaTypeInfo.uiSize=sizeof(MAIMediaTypeAudio_t);        pAudioInfo->MediaTypeInfo.eMType=MAI_MTYPE_AUDIO;        pAudioInfo->MediaTypeInfo.eMSubtype=MAI_MSUBTYPE_PCM;        pAudioInfo->MediaTypeInfo.uiFlags=0;        pAudioInfo->uiFlags = 0;        pAudioInfo->uiModeFlags = 0;        pAudioInfo->uiBitsPerSample = 16;        pAudioInfo->uiMaxBufSize = 4096;        pAudioInfo->uiChannels = pPInfo->vi->channels;        pAudioInfo->uiSamplesPerSec = pPInfo->vi->rate;        DPRINTF((M_TEXT("OGGDEC: audoggdecode() NEWFORMAT: %d ch, %d rate, %d bits, %d bufsize\n"),           pAudioInfo->uiChannels, pAudioInfo->uiSamplesPerSec, pAudioInfo->uiBitsPerSample, pAudioInfo->uiMaxBufSize));        BufferInfo.dwFlags = MAICOMPBUF_FLAG_NEWFORMAT|MAICOMPBUF_FLAG_AUDIO;        BufferInfo.tTimeStamp = 0;        BufferInfo.pBuffer = (unsigned char *)pAudioInfo;        BufferInfo.uiBufSize = 0;        BufferInfo.uiDataSize = sizeof(MAIMediaTypeAudio_t);        MAICompBase_OutputPutBuf(hComp, 0, &BufferInfo);      }      /* if a frame has been decoded, output it */      BufferInfo.dwFlags = 0;  /* default - no special flags */      BufferInfo.tTimeStamp = 0;      if (pInBufferInfo && (uiBufFlags&MAICOMPBUF_FLAG_PTS)!=0) /* input buffer was timestamped */      {        MAITIME_ASSIGN(BufferInfo.tTimeStamp, pInBufferInfo->tTimeStamp);        MAICompBase_UpdateTime(hComp, 0, BufferInfo.tTimeStamp);        DPRINTF((M_TEXT("OGGDEC: _processbuffer() pass PTS=%u\n"), (unsigned int)(BufferInfo.tTimeStamp)));        BufferInfo.dwFlags |= MAICOMPBUF_FLAG_PTS;        MAICompBase_ReportTime(hComp, 0);        uiBufFlags&=~MAICOMPBUF_FLAG_PTS; /* clear PTS flag, report only once for this buffer */      }      if ((uiBufFlags&MAICOMPBUF_FLAG_DATADISCON)!=0) /* check for discontinuity */      {        APIPRINTF((M_TEXT("OGGDEC: _processbuffer() pass DATADISCON\n")));        BufferInfo.dwFlags |= MAICOMPBUF_FLAG_DATADISCON;        uiBufFlags&=~MAICOMPBUF_FLAG_DATADISCON; /* clear DATADISCON flag, report only once for this buffer */      }      BufferInfo.pBuffer = pPInfo->m_pAudioOutBuf;      BufferInfo.uiDataSize = out_size;      pPInfo->m_uiOutcount++;      if (pPInfo->m_uiOutcount > 0)        buf_pad = OGG_INTERNAL_INPUT_BUFFER_SIZE>>1;      else if (pPInfo->m_uiOutcount > 8)        buf_pad = OGG_INTERNAL_INPUT_BUFFER_SIZE>>2;      if (out_size > 0)      {        pPInfo->m_nErrorCount = 0;        DUMPAUDIO(BufferInfo.pBuffer, BufferInfo.uiDataSize);        DPRINTF((M_TEXT("OGGDEC: audoggdecode() OutputPutBuf(%d:%d)\n"), out_size, pPInfo->m_uiOutcount));        if (MAICompBase_OutputPutBuf(hComp, 0, &BufferInfo) != MAI_STATUS_OK)        {          APIPRINTF((M_TEXT("OGGDEC: _processbuffer() MAICompBase_OutputPutBuf failed, count %d\n"), pPInfo->m_uiOutcount));          /* Do not break. We must continue to prcess the input, else we will crash due to input buffer overflow. */        }      }    }    DPRINTF((M_TEXT("insize %d, %d buf_pad %d\n"), insize, pPInfo->m_uiAudioInbufSize, buf_pad));  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -