static void package(struct PackageList *plout, const struct PackageList *plin) { int i; plout->num_pkgs = plin->num_pkgs/2; for(i = 0; i < plout->num_pkgs; i++) { plout->pkgs[i] = plin->pkgs[i*2]; package_add(plout->pkgs + i, plin->pkgs + i*2 + 1); } }
void *audio_getpackage_loop(void *args) { int ret; aml_audio_dec_t *audec; audio_decoder_operations_t *adec_ops; int nNextFrameSize=0;//next read frame size int inlen = 0;//real data size in in_buf int nInBufferSize=0;//full buffer size char *inbuf = NULL;//real buffer int rlen = 0;//read buffer ret size int nAudioFormat; adec_print("adec_getpackage_loop start!\n"); audec = (aml_audio_dec_t *)args; adec_ops=audec->adec_ops; nAudioFormat=audec->format; inlen=0; nNextFrameSize=adec_ops->nInBufSize; while (1){ exit_decode_loop: /*detect quit condition*/ if(exit_decode_thread) { if(inbuf) free(inbuf); package_list_free(); break; } /*step 2 get read buffer size*/ nNextFrameSize=get_frame_size(nAudioFormat); //adec_print("==get frame size:%d \n",nNextFrameSize); if(nNextFrameSize==-1) nNextFrameSize=adec_ops->nInBufSize; else if(nNextFrameSize==0) { usleep(1000); continue; } /*step 3 read buffer*/ nInBufferSize = nNextFrameSize; if (inbuf != NULL) { free(inbuf); inbuf = NULL; } inbuf = malloc(nInBufferSize); int nNextReadSize=nInBufferSize; int nRet=0; int nReadErrCount=0; int nCurrentReadCount=0; int nReadSizePerTime=1*1024; rlen=0; while(nNextReadSize>0) { if(exit_decode_thread) goto exit_decode_loop; if(nNextReadSize<=nReadSizePerTime) nReadSizePerTime=nNextReadSize; nRet = read_buffer(inbuf+rlen, nReadSizePerTime);//read 10K per time if(nRet<=0) { usleep(1000); continue; } rlen+=nRet; nNextReadSize-=nRet; } nCurrentReadCount=rlen; rlen += inlen; while(package_add(inbuf,rlen)) { //add failed if(exit_decode_thread) goto exit_decode_loop; usleep(1000); } inbuf=NULL; } QUIT: adec_print("Exit adec_getpackage_loop Thread!"); pthread_exit(NULL); return NULL; }