ffmpeg: fix resampler data linesize planar bug

This commit is contained in:
nareix 2016-07-16 11:32:46 +08:00
parent 038b70d129
commit 37c9a0c41e

View File

@ -91,24 +91,32 @@ func (self *Resampler) Resample(in av.AudioFrame) (out av.AudioFrame, err error)
self.avr = avr self.avr = avr
} }
inChannels := self.inChannelLayout.Count() var inChannels, inLinesize int
inSampleCount := in.SampleCount
if !self.inSampleFormat.IsPlanar() { if !self.inSampleFormat.IsPlanar() {
inChannels = 1 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) inData := make([]*C.uint8_t, inChannels)
for i := 0; i < inChannels; i++ { for i := 0; i < inChannels; i++ {
inData[i] = (*C.uint8_t)(unsafe.Pointer(&in.Data[i][0])) 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() { if !self.OutSampleFormat.IsPlanar() {
outChannels = 1 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) 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) out.Data = make([][]byte, outChannels)
for i := 0; i < outChannels; i++ { for i := 0; i < outChannels; i++ {
out.Data[i] = make([]byte, outLinesize) out.Data[i] = make([]byte, outLinesize)
@ -127,10 +135,11 @@ func (self *Resampler) Resample(in av.AudioFrame) (out av.AudioFrame, err error)
err = fmt.Errorf("ffmpeg: avresample_convert_frame failed") err = fmt.Errorf("ffmpeg: avresample_convert_frame failed")
return return
} }
out.SampleCount = convertSamples out.SampleCount = convertSamples
if convertSamples < outSampleCount { if convertSamples < outSampleCount {
for i := 0; i < outChannels; i++ { for i := 0; i < outChannels; i++ {
out.Data[i] = out.Data[i][:convertSamples*self.OutSampleFormat.BytesPerSample()] out.Data[i] = out.Data[i][:convertSamples*outBytesPerSample]
} }
} }