X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.0%2Fcinelerra%2Fffmpeg.C;h=db6ca9d6e71278cb82bfdfefbef2dd0c290b5602;hp=48a8bf40099abc85932c1f266be1e84d0d9ebfb8;hb=a2adb92f17159c0399504ab4b18acb1d94122077;hpb=8ca6d1b8ee0a3e687c57f76e793d1b1688a426f2 diff --git a/cinelerra-5.0/cinelerra/ffmpeg.C b/cinelerra-5.0/cinelerra/ffmpeg.C index 48a8bf40..db6ca9d6 100644 --- a/cinelerra-5.0/cinelerra/ffmpeg.C +++ b/cinelerra-5.0/cinelerra/ffmpeg.C @@ -105,14 +105,15 @@ void FFAudioHistory::reserve(long sz, int nch) void FFAudioHistory::realloc(long sz, int nch) { - if( this->sz >= sz && this->nch == nch ) return; - long isz = used() * nch; + if( this->nch != nch ) + reset(); + else if( this->sz >= sz ) + return; this->nch = nch; this->sz = sz; bsz = sz * nch; float *np = new float[bsz]; - if( isz > 0 ) copy(np, isz); - inp = np + isz; + inp = np + copy(np, used()); outp = np; lmt = np + bsz; delete [] bfr; bfr = np; @@ -157,42 +158,49 @@ int64_t FFAudioHistory::get_inp(int ofs) int FFAudioHistory::write(const float *fp, long len) { long n = len * nch; + float *ip = inp; while( n > 0 ) { - int k = lmt - inp; + int k = lmt - ip; if( k > n ) k = n; n -= k; - while( --k >= 0 ) *inp++ = *fp++; - if( inp >= lmt ) inp -= bsz; + while( --k >= 0 ) *ip++ = *fp++; + if( ip >= lmt ) ip = bfr; } + inp = ip; return len; } int FFAudioHistory::copy(float *fp, long len) { - long n = len; + long n = len * nch; + float *op = outp; while( n > 0 ) { - int k = lmt - outp; + int k = lmt - op; if( k > n ) k = n; n -= k; - while( --k >= 0 ) *fp++ = *outp++; - if( outp >= lmt ) outp -= bsz; + while( --k >= 0 ) *fp++ = *op++; + if( op >= lmt ) op = bfr; } + outp = op; return len; } int FFAudioHistory::zero(long len) { long n = len * nch; + float *ip = inp; while( n > 0 ) { - int k = lmt - inp; + int k = lmt - ip; if( k > n ) k = n; n -= k; - while( --k >= 0 ) *inp++ = 0; - if( inp >= lmt ) inp -= bsz; + while( --k >= 0 ) *ip++ = 0; + if( ip >= lmt ) ip = bfr; } + inp = ip; return len; } +// does not advance outp int FFAudioHistory::read(double *dp, long len, int ch) { long sz = used(); @@ -200,8 +208,9 @@ int FFAudioHistory::read(double *dp, long len, int ch) if( len > sz ) len = sz; long n = len; float *op = outp + ch; + float *lmt1 = lmt + nch-1; while( n > 0 ) { - int k = (lmt - outp) / nch; + int k = (lmt1 - op) / nch; if( k > n ) k = n; n -= k; while( --k >= 0 ) { *dp++ = *op; op += nch; } @@ -345,9 +354,9 @@ int FFStream::decode(AVFrame *frame) if( !ret ) ipkt->stream_index = st->index; } if( ipkt->stream_index == st->index ) { - while( ipkt->size > 0 && !got_frame ) { + while( (ipkt->size > 0 || !ipkt->data) && !got_frame ) { ret = decode_frame(frame, got_frame); - if( ret < 0 ) break; + if( ret < 0 || !ipkt->data ) break; ipkt->data += ret; ipkt->size -= ret; }