Skip to content

Commit dac70ab

Browse files
committed
Updated decoder
1 parent 7b76834 commit dac70ab

File tree

3 files changed

+29
-21
lines changed

3 files changed

+29
-21
lines changed

pkg/ffmpeg/decoder.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func (decoder *decoder) Rescale(width, height int) error {
176176
func (decoder *decoder) re(src *ff.AVFrame) (*ff.AVFrame, error) {
177177
switch decoder.codec.Codec().Type() {
178178
case ff.AVMEDIA_TYPE_AUDIO:
179-
// Resample the audio
179+
// Resample the audio - can flush if src is nil
180180
if decoder.resampler != nil {
181181
if err := decoder.resample(decoder.frame, src); err != nil {
182182
return nil, err
@@ -185,7 +185,7 @@ func (decoder *decoder) re(src *ff.AVFrame) (*ff.AVFrame, error) {
185185
}
186186
case ff.AVMEDIA_TYPE_VIDEO:
187187
// Rescale the video
188-
if decoder.rescaler != nil {
188+
if decoder.rescaler != nil && src != nil {
189189
if err := decoder.rescale(decoder.frame, src); err != nil {
190190
return nil, err
191191
}
@@ -198,13 +198,19 @@ func (decoder *decoder) re(src *ff.AVFrame) (*ff.AVFrame, error) {
198198
}
199199

200200
func (decoder *decoder) resample(dest, src *ff.AVFrame) error {
201-
dest_samples, err := ff.SWResample_get_out_samples(decoder.resampler, src.NumSamples())
201+
num_samples := 0
202+
if src != nil {
203+
num_samples = src.NumSamples()
204+
}
205+
dest_samples, err := ff.SWResample_get_out_samples(decoder.resampler, num_samples)
202206
if err != nil {
203207
return fmt.Errorf("SWResample_get_out_samples: %w", err)
204208
}
205209

206210
dest.SetNumSamples(dest_samples)
207-
dest.SetPts(decoder.get_next_pts(src))
211+
if src != nil {
212+
dest.SetPts(decoder.get_next_pts(src))
213+
}
208214

209215
// Perform resampling
210216
if err := ff.SWResample_convert_frame(decoder.resampler, src, dest); err != nil {
@@ -223,7 +229,6 @@ func (decoder *decoder) rescale(dest, src *ff.AVFrame) error {
223229
//if err := ff.AVUtil_frame_copy_props(dest, src); err != nil {
224230
// return fmt.Errorf("failed to copy props: %w", err)
225231
//}
226-
227232
// Perform resizing
228233
if err := ff.SWScale_scale_frame(decoder.rescaler, dest, src, false); err != nil {
229234
return fmt.Errorf("SWScale_scale_frame: %w", err)

pkg/ffmpeg/reader.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func (r *reader) Decode(fn FrameFunc) DecoderFunc {
186186
for {
187187
if err := ff.AVCodec_receive_frame(codec.(*decoder).codec, r.frame); errors.Is(err, syscall.EAGAIN) || errors.Is(err, io.EOF) {
188188
// Finished decoding packet or EOF
189-
return nil
189+
break
190190
} else if err != nil {
191191
return err
192192
}
@@ -196,11 +196,25 @@ func (r *reader) Decode(fn FrameFunc) DecoderFunc {
196196
return err
197197
} else if err := fn(frame); errors.Is(err, io.EOF) {
198198
// End early
199-
return nil
199+
break
200200
} else if err != nil {
201201
return err
202202
}
203203
}
204+
205+
// Flush
206+
if frame, err := codec.(*decoder).re(nil); err != nil {
207+
return err
208+
} else if frame == nil {
209+
// NOOP
210+
} else if err := fn(frame); errors.Is(err, io.EOF) {
211+
// NOOP
212+
} else if err != nil {
213+
return err
214+
}
215+
216+
// Success
217+
return nil
204218
}
205219
}
206220

sys/ffmpeg61/avutil_frame.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,13 @@ func (ctx *AVFrame) Linesize(plane int) int {
218218
}
219219

220220
// Return a buffer reference to the data for a plane.
221-
func (ctx *AVFrame) BufferRef(plane int) *AVBufferRef {
221+
func (ctx *AVFrame) bufferRef(plane int) *AVBufferRef {
222222
return (*AVBufferRef)(C.av_frame_get_plane_buffer((*C.AVFrame)(ctx), C.int(plane)))
223223
}
224224

225225
// Returns a plane as a uint8 array.
226226
func (ctx *AVFrame) Uint8(plane int) []uint8 {
227-
if buf := ctx.BufferRef(plane); buf == nil {
227+
if buf := ctx.bufferRef(plane); buf == nil {
228228
return nil
229229
} else {
230230
return cUint8Slice(unsafe.Pointer(buf.data), C.int(buf.size))
@@ -233,20 +233,9 @@ func (ctx *AVFrame) Uint8(plane int) []uint8 {
233233

234234
// Returns a plane as a int16 array.
235235
func (ctx *AVFrame) Int16(plane int) []int16 {
236-
if buf := ctx.BufferRef(plane); buf == nil {
236+
if buf := ctx.bufferRef(plane); buf == nil {
237237
return nil
238238
} else {
239239
return cInt16Slice(unsafe.Pointer(buf.data), C.int(buf.size)>>1)
240240
}
241241
}
242-
243-
// Returns the data as a set of planes and strides
244-
func (ctx *AVFrame) Data() ([][]byte, []int) {
245-
planes := make([][]byte, int(C.AV_NUM_DATA_POINTERS))
246-
strides := make([]int, int(C.AV_NUM_DATA_POINTERS))
247-
for i := 0; i < int(C.AV_NUM_DATA_POINTERS); i++ {
248-
planes[i] = ctx.Uint8(i)
249-
strides[i] = ctx.Linesize(i)
250-
}
251-
return planes, strides
252-
}

0 commit comments

Comments
 (0)