@@ -90,31 +90,45 @@ func (r *resampler) Frame(src *Frame) (*Frame, error) {
90
90
}
91
91
}
92
92
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
97
106
}
98
107
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
108
122
}
109
- fmt .Println (r .dest )
110
123
}
111
124
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 )
117
128
}
129
+
130
+ // Return the destination frame or nil
131
+ return r .dest , nil
118
132
}
119
133
120
134
////////////////////////////////////////////////////////////////////////////////
@@ -136,43 +150,12 @@ func newResampler(dest, src *Frame) (*ff.SWRContext, error) {
136
150
return nil , fmt .Errorf ("SWResample_set_opts: %w" , err )
137
151
}
138
152
139
- fmt .Println ("new context" )
140
- fmt .Println (" src" , src )
141
-
142
153
// Initialize the resampling context
143
154
if err := ff .SWResample_init (ctx ); err != nil {
144
155
ff .SWResample_free (ctx )
145
156
return nil , fmt .Errorf ("SWResample_init: %w" , err )
146
157
}
147
158
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
-
176
159
// Return success
177
160
return ctx , nil
178
161
}
0 commit comments