📄 maioggdec.c
字号:
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, ¤t_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 + -