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 {
/* 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; }