void OGGDecoder::reader() { float **pcm; long ret=1; int bit; size_t j,done=0; while (ATOMIC_CAS(&owner->work,true,true) && ret > 0 ){ j=0; ret=1; done=0; while (done<VPBUFFER_FRAMES && ret > 0){ ret = ov_read_float( &vf, &pcm, VPBUFFER_FRAMES - done,&bit ); for (long i=0;i<ret;i++){ for (size_t ch=0;ch<bout->chans;ch++){ buffer[j]=pcm[ch][i]; j++; } } done+=ret; } memcpy(bout->buffer[*bout->cursor], buffer, VPBUFFER_FRAMES*bout->chans*sizeof(float) ); owner->postProcess(bout->buffer[*bout->cursor]); owner->mutex[0].lock(); VP_SWAP_BUFFERS(bout); owner->mutex[1].unlock(); } }
void OGGDecoder::reader() { float **pcm; long ret=1; int bit; size_t j,done=0; while (ATOMIC_CAS(&owner->work,true,true) && ret > 0 ){ j=0; ret=1; done=0; if (ATOMIC_CAS(&seek_to,SEEK_MAX,SEEK_MAX) != SEEK_MAX ){ if (ov_seekable(&vf)) ov_pcm_seek(&vf,(ogg_int64_t) seek_to); seek_to = SEEK_MAX; } while (done<VPBUFFER_FRAMES && ret > 0){ ret = ov_read_float( &vf, &pcm, VPBUFFER_FRAMES - done,&bit ); for (long i=0;i<ret;i++){ for (size_t ch=0;ch<bout->chans;ch++){ buffer[j]=(float)pcm[ch][i]; j++; } } done+=ret; } int samples= done*bout->chans; memcpy(bout->currentBuffer(), buffer,samples*sizeof(float) ); for (int i=samples;i<VPBUFFER_FRAMES*bout->chans;i++){ bout->currentBuffer()[i]=0.0f; } owner->postProcess(); owner->mutex[0].lock(); VP_SWAP_BUFFERS(bout); owner->mutex[1].unlock(); } }
void FFMPEGDecoder::reader() { int frameFinished=0,packetFinished=0; int plane_size; int vpbuffer_write=0; int vpbuffer_samples=(VPBUFFER_FRAMES)*bout->chans; int remainder_write=0; int remainder_read=0; av_init_packet(&packet); AVFrame *frame=avcodec_alloc_frame(); current_in_seconds=0; while (ATOMIC_CAS(&owner->work,true,true) && packetFinished >=0) { vpbuffer_write=0; if (remainder_write>0) { remainder_read = 0; for (int nn=0;nn<remainder_write / vpbuffer_samples; nn++) { vpbuffer_write=0; while (vpbuffer_write < vpbuffer_samples){ bout->buffer[*bout->cursor][vpbuffer_write]=remainder[remainder_read]; remainder_read++; vpbuffer_write++; } owner->postProcess(); owner->mutex[0].lock(); VP_SWAP_BUFFERS(bout); owner->mutex[1].unlock(); } vpbuffer_write=0; while (remainder_read < remainder_write) { bout->buffer[*bout->cursor][vpbuffer_write]=remainder[remainder_read]; vpbuffer_write++; remainder_read++; } } remainder_write=0; while(vpbuffer_write < vpbuffer_samples && packetFinished>=0 ) { packetFinished = av_read_frame(container,&packet); if (packetFinished < 0){ break; } if (ATOMIC_CAS(&seek_to,SEEK_MAX,SEEK_MAX) != SEEK_MAX ){ int ret=av_seek_frame(container,audio_stream_id,seek_to *audio_st->time_base.den / audio_st->time_base.num ,AVSEEK_FLAG_ANY); if (ret<0) { DBG("seek failed"); } else { current_in_seconds=seek_to; avcodec_flush_buffers(ctx); } seek_to = SEEK_MAX; } if(packet.stream_index==audio_stream_id){ avcodec_decode_audio4(ctx,frame,&frameFinished,&packet); av_samples_get_buffer_size(&plane_size, ctx->channels, frame->nb_samples, ctx->sample_fmt, 1); if(frameFinished){ current_in_seconds = ( audio_st->time_base.num * frame->pkt_pts )/ audio_st->time_base.den ; switch (sfmt){ case AV_SAMPLE_FMT_S16P: for (int nb=0;nb<plane_size/sizeof(uint16_t);nb++){ for (int ch = 0; ch < ctx->channels; ch++) { if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ((short *) frame->extended_data[ch])[nb] * SHORTTOFL; vpbuffer_write++; } else { remainder[remainder_write] = ((short *) frame->extended_data[ch])[nb] * SHORTTOFL; remainder_write++; } } } break; case AV_SAMPLE_FMT_FLTP: for (int nb=0;nb<plane_size/sizeof(float);nb++){ for (int ch = 0; ch < ctx->channels; ch++) { if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ((float *) frame->extended_data[ch])[nb]; vpbuffer_write++; } else { remainder[remainder_write] = ((float *) frame->extended_data[ch])[nb]; remainder_write++; } } } break; case AV_SAMPLE_FMT_S16: for (int nb=0;nb<plane_size/sizeof(short);nb++){ if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ((short *) frame->extended_data[0])[nb] * SHORTTOFL ; vpbuffer_write++; } else { remainder[remainder_write] = ((short *) frame->extended_data[0])[nb] * SHORTTOFL; remainder_write++; } } break; case AV_SAMPLE_FMT_FLT: for (int nb=0;nb<plane_size/sizeof(float);nb++){ if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ((float *) frame->extended_data[0])[nb] ; vpbuffer_write++; } else { remainder[remainder_write] = ((float *) frame->extended_data[0])[nb]; remainder_write++; } } break; case AV_SAMPLE_FMT_U8P: for (int nb=0;nb<plane_size/sizeof(uint8_t);nb++){ for (int ch = 0; ch < ctx->channels; ch++) { if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ( ( ((uint8_t *) frame->extended_data[0])[nb] - 127) * 32768 )/ 127 ; vpbuffer_write++; } else { remainder[remainder_write] = ( ( ((uint8_t *) frame->extended_data[0])[nb] - 127) * 32768 )/ 127 ; remainder_write++; } } } break; case AV_SAMPLE_FMT_U8: for (int nb=0;nb<plane_size/sizeof(uint8_t);nb++){ if (vpbuffer_write< vpbuffer_samples){ bout->currentBuffer()[vpbuffer_write]= ( ( ((uint8_t *) frame->extended_data[0])[nb] - 127) * 32768 )/ 127 ; vpbuffer_write++; } else { remainder[remainder_write] = ( ( ((uint8_t *) frame->extended_data[0])[nb] - 127) * 32768 )/ 127 ; remainder_write++; } } break; default: WARN("PCM type not supported"); } } else { DBG("frame failed"); } } } av_free_packet(&packet); owner->postProcess(); owner->mutex[0].lock(); VP_SWAP_BUFFERS(bout); owner->mutex[1].unlock(); last_read=time(NULL); } avcodec_free_frame(&frame); }