Skip to content

Commit 7b76834

Browse files
committed
Updating scaling code
1 parent 8b1103e commit 7b76834

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

pkg/ffmpeg/decoder.go

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,12 @@ func (decoder *decoder) ResampleS16Mono(sample_rate int) error {
130130
decoder.frame.ChannelLayout(), decoder.frame.SampleFormat(), decoder.frame.SampleRate(), // destination
131131
decoder.codec.ChannelLayout(), decoder.codec.SampleFormat(), decoder.codec.SampleRate(), // source
132132
); err != nil {
133-
return err
133+
return fmt.Errorf("SWResample_set_opts: %w", err)
134134
}
135135

136136
// Initialize the resampling context
137137
if err := ff.SWResample_init(ctx); err != nil {
138-
return err
139-
} else if err := ff.AVUtil_frame_get_buffer(decoder.frame, false); err != nil {
140-
return err
138+
return fmt.Errorf("SWResample_init: %w", err)
141139
}
142140

143141
// Return success
@@ -168,11 +166,6 @@ func (decoder *decoder) Rescale(width, height int) error {
168166
decoder.rescaler = ctx
169167
}
170168

171-
// Allocate frame buffer
172-
if err := ff.AVUtil_frame_get_buffer(decoder.frame, false); err != nil {
173-
return err
174-
}
175-
176169
// Return success
177170
return nil
178171
}
@@ -207,15 +200,15 @@ func (decoder *decoder) re(src *ff.AVFrame) (*ff.AVFrame, error) {
207200
func (decoder *decoder) resample(dest, src *ff.AVFrame) error {
208201
dest_samples, err := ff.SWResample_get_out_samples(decoder.resampler, src.NumSamples())
209202
if err != nil {
210-
return err
203+
return fmt.Errorf("SWResample_get_out_samples: %w", err)
211204
}
212205

213206
dest.SetNumSamples(dest_samples)
214207
dest.SetPts(decoder.get_next_pts(src))
215208

216209
// Perform resampling
217210
if err := ff.SWResample_convert_frame(decoder.resampler, src, dest); err != nil {
218-
return err
211+
return fmt.Errorf("SWResample_convert_frame: %w", err)
219212
}
220213

221214
//fmt.Println("in_samples", src.NumSamples(), "out_samples", dest.NumSamples())
@@ -227,13 +220,13 @@ func (decoder *decoder) resample(dest, src *ff.AVFrame) error {
227220

228221
func (decoder *decoder) rescale(dest, src *ff.AVFrame) error {
229222
// Copy properties from source
230-
if err := AVUtil_frame_copy_props(dest, src); err != nil {
231-
return err
232-
}
223+
//if err := ff.AVUtil_frame_copy_props(dest, src); err != nil {
224+
// return fmt.Errorf("failed to copy props: %w", err)
225+
//}
233226

234227
// Perform resizing
235-
if err := ff.SWScale_scale_frame(decoder.rescaler, dest, src); err != nil {
236-
return fmt.Errorf("failed to scale frame: %w", err)
228+
if err := ff.SWScale_scale_frame(decoder.rescaler, dest, src, false); err != nil {
229+
return fmt.Errorf("SWScale_scale_frame: %w", err)
237230
}
238231

239232
// Return success

pkg/ffmpeg/reader.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,6 @@ func (r *reader) Decode(fn FrameFunc) DecoderFunc {
200200
} else if err != nil {
201201
return err
202202
}
203-
204-
// Unreference the frame
205-
ff.AVUtil_frame_unref(r.frame)
206203
}
207204
}
208205
}

sys/ffmpeg61/swscale_core.go

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ffmpeg
22

33
import (
4+
"fmt"
45
"unsafe"
56
)
67

@@ -56,9 +57,56 @@ func SWScale_scale(ctx *SWSContext, src [][]byte, src_stride []int, src_slice_y,
5657
))
5758
}
5859

59-
// Scale source data from src and write the output to dst.
60-
func SWScale_scale_frame(ctx *SWSContext, dest, src *AVFrame) error {
61-
if ret := C.sws_scale_frame((*C.struct_SwsContext)(ctx), (*C.struct_AVFrame)(dest), (*C.struct_AVFrame)(src)); ret != 0 {
60+
// Scale source data from src and write the output to dst. Need to find out
61+
// why the native version is returning -22 error TODO
62+
func SWScale_scale_frame(ctx *SWSContext, dest, src *AVFrame, native bool) error {
63+
if native {
64+
if ret := C.sws_scale_frame((*C.struct_SwsContext)(ctx), (*C.struct_AVFrame)(dest), (*C.struct_AVFrame)(src)); ret != 0 {
65+
return AVError(ret)
66+
}
67+
} else {
68+
if err := SWScale_frame_start(ctx, dest, src); err != nil {
69+
return fmt.Errorf("SWScale_frame_start: %w", err)
70+
}
71+
if err := SWScale_send_slice(ctx, 0, uint(src.Height())); err != nil {
72+
return fmt.Errorf("SWScale_send_slice: %w", err)
73+
}
74+
if err := SWScale_receive_slice(ctx, 0, uint(dest.Height())); err != nil {
75+
return fmt.Errorf("SWScale_receive_slice: %w", err)
76+
}
77+
SWScale_frame_end(ctx)
78+
}
79+
80+
// Return success
81+
return nil
82+
}
83+
84+
// Initialize the scaling process for a given pair of source/destination frames.
85+
func SWScale_frame_start(ctx *SWSContext, dest, src *AVFrame) error {
86+
if ret := C.sws_frame_start((*C.struct_SwsContext)(ctx), (*C.struct_AVFrame)(dest), (*C.struct_AVFrame)(src)); ret != 0 {
87+
return AVError(ret)
88+
} else {
89+
return nil
90+
}
91+
}
92+
93+
// Finish the scaling process for a pair of source/destination frames.
94+
func SWScale_frame_end(ctx *SWSContext) {
95+
C.sws_frame_end((*C.struct_SwsContext)(ctx))
96+
}
97+
98+
// Indicate that a horizontal slice of input data is available in the source frame
99+
func SWScale_send_slice(ctx *SWSContext, slice_start, slice_height uint) error {
100+
if ret := C.sws_send_slice((*C.struct_SwsContext)(ctx), C.uint(slice_start), C.uint(slice_height)); ret < 0 {
101+
return AVError(ret)
102+
} else {
103+
return nil
104+
}
105+
}
106+
107+
// Request a horizontal slice of the output data to be written into the frame
108+
func SWScale_receive_slice(ctx *SWSContext, slice_start, slice_height uint) error {
109+
if ret := C.sws_receive_slice((*C.struct_SwsContext)(ctx), C.uint(slice_start), C.uint(slice_height)); ret < 0 {
62110
return AVError(ret)
63111
} else {
64112
return nil

0 commit comments

Comments
 (0)