diff options
Diffstat (limited to 'rotord/libavaudioloader.cpp')
| -rw-r--r-- | rotord/libavaudioloader.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/rotord/libavaudioloader.cpp b/rotord/libavaudioloader.cpp index 133fcd4..b842a42 100644 --- a/rotord/libavaudioloader.cpp +++ b/rotord/libavaudioloader.cpp @@ -100,6 +100,30 @@ bool libav::Audioloader::setup(const std::string &filename){ return frame; } + AVPacket* libav::Audioloader::get_packet() { + + if (!ready) return nullptr; + + int ret=av_read_frame(formatContext, &packet); + if (ret<0) { + std::cerr << "finished with code "<<ret <<(ret==AVERROR_EOF?" ,EOF":"")<<std::endl; + ready=false; + return nullptr; + } + //if (packet.stream_index == audioStream->index) + //{ + //int bytes = + // avcodec_decode_audio4(codecContext, frame, &frameFinished, &packet); + + // Some frames rely on multiple packets, so we have to make sure the frame is finished before + // we can use it + //} + // You *must* call av_free_packet() after each call to av_read_frame() or else you'll leak memory + //av_free_packet(&packet);????? + //} + return &packet; + + } /* // Some codecs will cause frames to be buffered up in the decoding process. If the CODEC_CAP_DELAY flag @@ -130,8 +154,8 @@ uint16_t* libav::Audioloader::get_samples(int num){ //presumes 16bpc here //shuffle down samples if (sample_start>0){ for (int i=0;i<sample_end-sample_start;i++){ - for (int j=0;j<frame->channels;j++) { - buffer[(i*frame->channels)+j]=buffer[((sample_start+i)*frame->channels)+j]; + for (int j=0;j<av_frame_get_channels(frame);j++) { + buffer[(i*av_frame_get_channels(frame))+j]=buffer[((sample_start+i)*av_frame_get_channels(frame))+j]; } } sample_start=sample_end-sample_start; @@ -139,18 +163,25 @@ uint16_t* libav::Audioloader::get_samples(int num){ //presumes 16bpc here sample_end=sample_start; while (sample_end<num) { frame=get_frame(); - if (((sample_end+frame->nb_samples)*frame->channels)>buffer.size()){ - buffer.reserve((sample_end+frame->nb_samples)*frame->channels); + if (((sample_end+std::max(num,frame->nb_samples))*av_frame_get_channels(frame))>buffer.size()){ + int m=buffer.size(); + int s=((sample_end+std::max(num,frame->nb_samples))*av_frame_get_channels(frame)); + buffer.reserve(s); + std::cerr << "audioloader reserved buffer to " << s << std::endl; + for (int i=m;i<s;i++) buffer.push_back(0); } if (!frame) { - for (int i=0;i<num*frame->channels;i++){ + for (int i=0;i<num*av_frame_get_channels(frame);i++){ buffer[sample_end+i]=0; } } + //std::cerr<<"filling buffer to "<<((sample_end+frame->nb_samples)*frame->channels)<<std::endl; for (int i=0;i<frame->nb_samples;i++) { - for (int j=0;j<frame->channels;j++) { - buffer[((sample_end+i)*frame->channels)+j]= ((uint16_t*) frame->buf[0])[(i*frame->channels)+j]; + for (int j=0;j<av_frame_get_channels(frame);j++) { + uint16_t s=((uint16_t*) frame->buf[j]->data)[i]; + //uint16_t s=frame->buf[j]->data[i*2]+((frame->buf[j]->data)[i*2+1]<<8); + buffer[((sample_end+i)*frame->channels)+j]= s; } } sample_end+=frame->nb_samples; |
