Exemplo n.º 1
0
retvalue target_addpackage(struct target *target, struct logger *logger, const char *name, const char *version, const char *control, const struct strlist *filekeys, bool downgrade, struct trackingdata *trackingdata, architecture_t architecture, const char *causingrule, const char *suitefrom, struct description *description) {
	struct strlist oldfilekeys, *ofk;
	char *newcontrol;
	struct package old;
	retvalue r;

	assert(target->packages!=NULL);

	r = package_get(target, name, NULL, &old);
	if (RET_WAS_ERROR(r))
		return r;
	if (r == RET_NOTHING) {
		ofk = NULL;
		setzero(struct package, &old);
	} else {
Exemplo n.º 2
0
/* Remove a package from the given target. */
retvalue target_removepackage(struct target *target, struct logger *logger, const char *name, struct trackingdata *trackingdata) {
	struct package old;
	retvalue r;

	assert(target != NULL && target->packages != NULL && name != NULL);

	r = package_get(target, name, NULL, &old);
	if (RET_WAS_ERROR(r)) {
		return r;
	}
	else if (r == RET_NOTHING) {
		if (verbose >= 10)
			fprintf(stderr, "Could not find '%s' in '%s'...\n",
					name, target->identifier);
		return RET_NOTHING;
	}
	r = package_remove(&old, logger, trackingdata);
	package_done(&old);
	return r;
}
void *audio_decode_loop(void *args)
{
    int ret;
    aml_audio_dec_t *audec;
    audio_out_operations_t *aout_ops;
    audio_decoder_operations_t *adec_ops;
    int nNextFrameSize=0;//next read frame size
    int inlen = 0;//real data size in in_buf
    int nRestLen=0;//left data after last decode 
    int nInBufferSize=0;//full buffer size
    //int nStartDecodePoint=0;//start decode point in in_buf
    char *inbuf = NULL;//real buffer
    int rlen = 0;//read buffer ret size
    char *pRestData=NULL;
    char *inbuf2;
    
    int dlen = 0;//decode size one time
    int declen = 0;//current decoded size
    int nCurrentReadCount=0;
    
    char startcode[5];	
    int extra_data = 8;
    int nCodecID;
    int nAudioFormat;
    char *outbuf=pcm_buf_tmp;
    int outlen = 0;
    	
    adec_print("adec_armdec_loop start!\n");
    audec = (aml_audio_dec_t *)args;
    aout_ops = &audec->aout_ops;
    adec_ops=audec->adec_ops;
    memset(outbuf, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE);

    //nAudioFormat=audec->pcodec->audio_type;
    nAudioFormat=audec->format;
    inlen=0;
    //nNextFrameSize=READ_ABUFFER_SIZE;//default frame size
    nNextFrameSize=adec_ops->nInBufSize;    
    while (1){
exit_decode_loop:
          //detect quit condition
          if(exit_decode_thread)
	      {
        	        if (inbuf) 
        	        {
            	            free(inbuf);
            		     inbuf = NULL;
        		  }
        		  //if(pRestData)
        		  //{
        		  //  free(pRestData);
        		  //  pRestData=NULL;
        		  //}
        		  //adec_print("====exit decode thread\n");
        		  exit_decode_thread_success=1;
        		  break;
	      }
	      //detect audio info changed
	      memset(&g_AudioInfo,0,sizeof(AudioInfo));
	     adec_ops->getinfo(audec->adec_ops, &g_AudioInfo);
	      if(g_AudioInfo.channels!=0&&g_AudioInfo.samplerate!=0)
	      {
	        if((g_AudioInfo.channels !=g_bst->channels)||(g_AudioInfo.samplerate!=g_bst->samplerate))
	        {
	            adec_print("====Info Changed: src:sample:%d  channel:%d dest sample:%d  channel:%d \n",g_bst->samplerate,g_bst->channels,g_AudioInfo.samplerate,g_AudioInfo.channels);
				audec->format_changed_flag = 1;
				g_bst->channels=audec->channels=g_AudioInfo.channels;
				g_bst->samplerate=audec->samplerate=g_AudioInfo.samplerate;
				
#if 0
				if(aout_stop_mutex==0)
	            {
        	            aout_stop_mutex=1;
        	            //send Message
        	            //reset param
        	            
    	            	aout_ops->stop(audec);
						aout_ops->init(audec);
						aout_ops->start(audec);
        	            aout_stop_mutex=0;
	            }
#endif				
				
	        }
	      }
	      //step 2  get read buffer size
             struct package *p_Package;
             p_Package=package_get();
             if(!p_Package){
                usleep(1000);
                continue;
             }
             if (inbuf != NULL) {
        	    free(inbuf);
                  inbuf = NULL;
             }
             if(inlen&&pRestData)
    	      {
    	            rlen=p_Package->size+inlen;
    	            inbuf=malloc(rlen);
    	            memcpy(inbuf, pRestData, inlen);
    	            memcpy(inbuf+inlen,p_Package->data,p_Package->size);
    	            free(pRestData);
    	            free(p_Package->data);
    	      }
    	      else
    	      {
    	        rlen=p_Package->size;
    	        inbuf=p_Package->data;
    	        p_Package->data=NULL;
    	      }
    	       free(p_Package);
    	       nCurrentReadCount=rlen;
    	       inlen=rlen;
              declen  = 0;
              if (nCurrentReadCount > 0)
              {
    			  //inlen = rlen;
    			  //adec_print("declen=%d,rlen = %d--------------------------------------------------\n\n", declen,rlen);
    			  while (declen<rlen) {
				 if(exit_decode_thread)
    				  {
					 adec_print("exit decoder,-----------------------------\n");
    				        goto exit_decode_loop;
    				  }
    				  outlen = AVCODEC_MAX_AUDIO_FRAME_SIZE;
    				  //adec_print("decode_audio------------------------------------\n");
    				  //dlen = decode_audio(audec->pcodec->ctxCodec, outbuf, &outlen, inbuf+declen, inlen);
    				  dlen = adec_ops->decode(audec->adec_ops, outbuf, &outlen, inbuf+declen, inlen);
    				  //dlen = decodeAACfile(outbuf, &outlen, inbuf+declen, inlen);
    				  if (dlen <= 0)
    				  {
    				  	  //adec_print("dlen = %d error----\n",dlen);
    					  if (nAudioFormat==ACODEC_FMT_APE)
    					  {
    					        inlen=0;	  
    					  }
    					  else if(inlen>0)
    					  {
    					         // adec_print("packet end %d bytes----\n",inlen);
    						  //memcpy(apkt_end, (uint8_t *)(inbuf+declen), inlen);
    						  pRestData=malloc(inlen);
    						  if(pRestData)
    						    memcpy(pRestData, (uint8_t *)(inbuf+declen), inlen);
    					  }
    					  nDecodeErrCount++;//decode failed, add err_count
    					  break;
    				  }
    				  nDecodeErrCount=0;//decode success reset to 0
    				  declen += dlen;
    				  inlen -= dlen;
    				  //adec_print("after decode_audio rlen=%d,declen=%d,inlen=%d,dlen=%d,outlen=%d,-----------------------------\n",rlen,declen,inlen,dlen,outlen);

    				  //write to the pcm buffer
    				  decode_offset+=dlen;
    				  pcm_cache_size=outlen;
    				  if(g_bst)
    				  {
            				//while(g_bst->buf_level>=g_bst->buf_length*0.8)
            				while(g_bst->buf_length-g_bst->buf_level<outlen)
            				{
            				    if(exit_decode_thread)
            				    {
    						 adec_print("exit decoder,-----------------------------\n");
            				        goto exit_decode_loop;
            				        break;
            				    }
            				    usleep(100000);
            				}
            				int wlen=0;
            				while(outlen)
            				{
            				    wlen=write_pcm_buffer(outbuf, g_bst,outlen); 
            				    outlen-=wlen;
            				    pcm_cache_size-=wlen;
            				}
    				  }
    				//write end
    			  }
        	  }
              else
              {
                   //get data failed,maybe at the end
                   usleep(1000);
                   continue;
              }
	}
    
    adec_print("Exit adec_armdec_loop Thread!");
    pthread_exit(NULL);
error:	
    pthread_exit(NULL);
    return NULL;
}