Skip to content

Commit

Permalink
ffmpeg: fix resampler data linesize planar bug
Browse files Browse the repository at this point in the history
  • Loading branch information
nareix committed Jul 16, 2016
1 parent 038b70d commit 37c9a0c
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions cgo/ffmpeg/audio.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,32 @@ func (self *Resampler) Resample(in av.AudioFrame) (out av.AudioFrame, err error)
self.avr = avr
}

inChannels := self.inChannelLayout.Count()
var inChannels, inLinesize int
inSampleCount := in.SampleCount
if !self.inSampleFormat.IsPlanar() {
inChannels = 1
inLinesize = inSampleCount*in.SampleFormat.BytesPerSample()*self.inChannelLayout.Count()
} else {
inChannels = self.inChannelLayout.Count()
inLinesize = inSampleCount*in.SampleFormat.BytesPerSample()
}
inSampleCount := in.SampleCount
inLinesize := inSampleCount*in.SampleFormat.BytesPerSample()
inData := make([]*C.uint8_t, inChannels)
for i := 0; i < inChannels; i++ {
inData[i] = (*C.uint8_t)(unsafe.Pointer(&in.Data[i][0]))
}

outChannels := self.OutChannelLayout.Count()
var outChannels, outLinesize, outBytesPerSample int
outSampleCount := int(C.avresample_get_out_samples(self.avr, C.int(in.SampleCount)))
if !self.OutSampleFormat.IsPlanar() {
outChannels = 1
outBytesPerSample = self.OutSampleFormat.BytesPerSample()*self.OutChannelLayout.Count()
outLinesize = outSampleCount*outBytesPerSample
} else {
outChannels = self.OutChannelLayout.Count()
outBytesPerSample = self.OutSampleFormat.BytesPerSample()
outLinesize = outSampleCount*outBytesPerSample
}
outData := make([]*C.uint8_t, outChannels)
outSampleCount := int(C.avresample_get_out_samples(self.avr, C.int(in.SampleCount)))
outLinesize := outSampleCount*self.OutSampleFormat.BytesPerSample()
out.Data = make([][]byte, outChannels)
for i := 0; i < outChannels; i++ {
out.Data[i] = make([]byte, outLinesize)
Expand All @@ -127,10 +135,11 @@ func (self *Resampler) Resample(in av.AudioFrame) (out av.AudioFrame, err error)
err = fmt.Errorf("ffmpeg: avresample_convert_frame failed")
return
}

out.SampleCount = convertSamples
if convertSamples < outSampleCount {
for i := 0; i < outChannels; i++ {
out.Data[i] = out.Data[i][:convertSamples*self.OutSampleFormat.BytesPerSample()]
out.Data[i] = out.Data[i][:convertSamples*outBytesPerSample]
}
}

Expand Down

0 comments on commit 37c9a0c

Please sign in to comment.