summaryrefslogtreecommitdiff
path: root/rotord/libavaudioloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/libavaudioloader.cpp')
-rw-r--r--rotord/libavaudioloader.cpp45
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;