Skip to content

Commit 97d51a9

Browse files
committed
Updated resampler
1 parent fe06c11 commit 97d51a9

File tree

2 files changed

+36
-53
lines changed

2 files changed

+36
-53
lines changed

pkg/ffmpeg/re_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ func Test_re_002(t *testing.T) {
6666
assert := assert.New(t)
6767

6868
r, err := ffmpeg.Open("../../etc/test/sample.mp3")
69-
//r, err := ffmpeg.Open("/Volumes/Drobo/Media/Music/ABBA/Gold_ Greatest Hits/01 Dancing Queen.m4a")
7069
if !assert.NoError(err) {
7170
t.FailNow()
7271
}
7372
defer r.Close()
7473

7574
// Make resampler
76-
re, err := ffmpeg.NewRe(ffmpeg.AudioPar("s16", "stereo", 44100), true)
75+
const sampleRate = 2000
76+
re, err := ffmpeg.NewRe(ffmpeg.AudioPar("s16", "mono", sampleRate), true)
7777
if !assert.NoError(err) {
7878
t.FailNow()
7979
}
@@ -107,6 +107,6 @@ func Test_re_002(t *testing.T) {
107107
t.FailNow()
108108
}
109109
// Print
110-
t.Log(" play with: ffplay -f s16le -ar 44100 -ac 2", w.Name())
110+
t.Log(" play with: ffplay -f s16le -ar ", sampleRate, " -ac 1", w.Name())
111111

112112
}

pkg/ffmpeg/resampler.go

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -90,31 +90,45 @@ func (r *resampler) Frame(src *Frame) (*Frame, error) {
9090
}
9191
}
9292

93-
// Perform resampling
94-
fmt.Println("Do convert")
95-
if err := ff.SWResample_convert_frame(r.ctx, (*ff.AVFrame)(src), (*ff.AVFrame)(r.dest)); err != nil {
96-
return nil, fmt.Errorf("SWResample_convert_frame: %w", err)
93+
// Output buffer size
94+
var num_samples int
95+
if src == nil {
96+
num_samples = int(ff.SWResample_get_delay(r.ctx, int64(r.dest.SampleRate())))
97+
} else {
98+
delay := ff.SWResample_get_delay(r.ctx, int64(src.SampleRate())) + int64(src.NumSamples())
99+
num_samples = int(ff.AVUtil_rescale_rnd(delay, int64(r.dest.SampleRate()), int64(src.SampleRate()), ff.AV_ROUND_UP))
100+
}
101+
if num_samples < 0 {
102+
return nil, errors.New("av_rescale_rnd error")
103+
}
104+
if num_samples == 0 {
105+
return nil, nil
97106
}
98107

99-
// Get remaining samples
100-
for {
101-
samples := ff.SWResample_get_delay(r.ctx, int64(r.dest.SampleRate()))
102-
if samples <= 0 {
103-
break
104-
}
105-
fmt.Println("TODO: SWResample_get_delay remaining samples=", samples)
106-
if err := ff.SWResample_convert_frame(r.ctx, nil, (*ff.AVFrame)(r.dest)); err != nil {
107-
return nil, fmt.Errorf("SWResample_convert_frame: %w", err)
108+
// Check buffer
109+
// TODO UGLY CODE ALERT
110+
if r.dest.NumSamples() < num_samples {
111+
sample_fmt := r.dest.SampleFormat()
112+
sample_rate := r.dest.SampleRate()
113+
sample_ch := r.dest.ChannelLayout()
114+
r.dest.Unref()
115+
(*ff.AVFrame)(r.dest).SetSampleFormat(sample_fmt)
116+
(*ff.AVFrame)(r.dest).SetSampleRate(sample_rate)
117+
(*ff.AVFrame)(r.dest).SetChannelLayout(sample_ch)
118+
(*ff.AVFrame)(r.dest).SetNumSamples(num_samples)
119+
if err := r.dest.AllocateBuffers(); err != nil {
120+
ff.SWResample_free(r.ctx)
121+
return nil, err
108122
}
109-
fmt.Println(r.dest)
110123
}
111124

112-
// Return the destination frame or nil
113-
if r.dest.NumSamples() == 0 {
114-
return nil, nil
115-
} else {
116-
return r.dest, nil
125+
// Perform resampling
126+
if err := ff.SWResample_convert_frame(r.ctx, (*ff.AVFrame)(src), (*ff.AVFrame)(r.dest)); err != nil {
127+
return nil, fmt.Errorf("SWResample_convert_frame: %w", err)
117128
}
129+
130+
// Return the destination frame or nil
131+
return r.dest, nil
118132
}
119133

120134
////////////////////////////////////////////////////////////////////////////////
@@ -136,43 +150,12 @@ func newResampler(dest, src *Frame) (*ff.SWRContext, error) {
136150
return nil, fmt.Errorf("SWResample_set_opts: %w", err)
137151
}
138152

139-
fmt.Println("new context")
140-
fmt.Println(" src", src)
141-
142153
// Initialize the resampling context
143154
if err := ff.SWResample_init(ctx); err != nil {
144155
ff.SWResample_free(ctx)
145156
return nil, fmt.Errorf("SWResample_init: %w", err)
146157
}
147158

148-
// Make a copy of the destination frame parameters
149-
sample_fmt := dest.SampleFormat()
150-
sample_rate := dest.SampleRate()
151-
sample_ch := dest.ChannelLayout()
152-
153-
// Unreference the current frame
154-
dest.Unref()
155-
156-
// Set the number of samples
157-
if dest_samples, err := ff.SWResample_get_out_samples(ctx, src.NumSamples()); err != nil {
158-
ff.SWResample_free(ctx)
159-
return nil, fmt.Errorf("SWResample_get_out_samples: %w", err)
160-
} else if dest_samples == 0 {
161-
ff.SWResample_free(ctx)
162-
return nil, fmt.Errorf("SWResample_get_out_samples: number of samples is zero")
163-
} else {
164-
(*ff.AVFrame)(dest).SetSampleFormat(sample_fmt)
165-
(*ff.AVFrame)(dest).SetSampleRate(sample_rate)
166-
(*ff.AVFrame)(dest).SetChannelLayout(sample_ch)
167-
(*ff.AVFrame)(dest).SetNumSamples(dest_samples)
168-
}
169-
170-
// Create buffers
171-
if err := dest.AllocateBuffers(); err != nil {
172-
ff.SWResample_free(ctx)
173-
return nil, err
174-
}
175-
176159
// Return success
177160
return ctx, nil
178161
}

0 commit comments

Comments
 (0)