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