ffmpeg: fix resampler data linesize planar bug
This commit is contained in:
parent
038b70d129
commit
37c9a0c41e
@ -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]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user