5
5
"errors"
6
6
"fmt"
7
7
"io"
8
+ "syscall"
8
9
9
10
// Packages
10
11
ff "github.com/mutablelogic/go-media/sys/ffmpeg61"
@@ -161,122 +162,23 @@ func (d *decoder) close() error {
161
162
// PUBLIC METHODS
162
163
163
164
func (d * demuxer ) Demux (ctx context.Context , fn DecoderFunc ) error {
164
- // If the decoder is nil then set it to default - which is to send the
165
- // packet to the appropriate decoder
166
165
if fn == nil {
167
- fn = func (packet Packet ) error {
168
- fmt .Println ("TODO" , packet )
169
- return nil
170
- }
171
- }
172
-
173
- // Allocate a packet
174
- packet := ff .AVCodec_packet_alloc ()
175
- if packet == nil {
176
- return errors .New ("failed to allocate packet" )
177
- }
178
- defer ff .AVCodec_packet_free (packet )
179
-
180
- // Read packets
181
- FOR_LOOP:
182
- for {
183
- select {
184
- case <- ctx .Done ():
185
- break FOR_LOOP
186
- default :
187
- if err := ff .AVFormat_read_frame (d .input , packet ); errors .Is (err , io .EOF ) {
188
- break FOR_LOOP
189
- } else if err != nil {
190
- return err
191
- }
192
- stream := packet .StreamIndex ()
193
- if decoder := d .decoders [stream ]; decoder != nil {
194
- if err := decoder .decode (fn , packet ); errors .Is (err , io .EOF ) {
195
- break FOR_LOOP
196
- } else if err != nil {
197
- return err
198
- }
199
- }
200
- // Unreference the packet
201
- ff .AVCodec_packet_unref (packet )
202
- }
166
+ return errors .New ("no decoder function provided" )
203
167
}
204
-
205
- // Flush the decoders
206
- for _ , decoder := range d .decoders {
207
- if err := decoder .decode (fn , nil ); err != nil {
208
- return err
209
- }
210
- }
211
-
212
- // Return the context error - will be cancelled, perhaps, or nil if the
213
- // demuxer finished successfully without cancellation
214
- return ctx .Err ()
168
+ return d .demux (ctx , fn , nil )
215
169
}
216
170
217
- func (d * demuxer ) Decode (context.Context , FrameFunc ) error {
218
- // TODO
219
- return errors .New ("not implemented" )
171
+ func (d * demuxer ) Decode (ctx context.Context , fn FrameFunc ) error {
172
+ if fn == nil {
173
+ return errors .New ("no decoder function provided" )
174
+ }
175
+ return d .demux (ctx , nil , fn )
220
176
}
221
177
222
178
////////////////////////////////////////////////////////////////////////////
223
179
// PRIVATE METHODS
224
180
225
- func (d * decoder ) decode (fn DecoderFunc , packet * ff.AVPacket ) error {
226
- // Send the packet to the user defined packet function or
227
- // to the default version
228
- return fn (newPacket (packet ))
229
- }
230
-
231
- /*
232
- // Get the codec
233
- stream.
234
-
235
- // Find the decoder for the stream
236
- dec := ff.AVCodec_find_decoder(codec.ID())
237
- if dec == nil {
238
- return nil, fmt.Errorf("failed to find decoder for codec %q", codec.Name())
239
- }
240
-
241
- // Allocate a codec context for the decoder
242
- dec_ctx := ff.AVCodec_alloc_context(dec)
243
- if dec_ctx == nil {
244
- return nil, fmt.Errorf("failed to allocate codec context for codec %q", codec.Name())
245
- }
246
-
247
- // Create a frame for encoding - after resampling and resizing
248
- if frame := ff.AVUtil_frame_alloc(); frame == nil {
249
- return nil, errors.New("failed to allocate frame")
250
- } else {
251
- decoder.frame = frame
252
- }
253
-
254
- // Return success
255
- return decoder, nil
256
- }
257
-
258
- // Close the demuxer
259
- func (d *demuxer) close() error {
260
-
261
- }
262
-
263
- // Close the decoder
264
- func (d *decoder) close() error {
265
-
266
- }
267
-
268
- // Demultiplex streams from the reader
269
- func (d *demuxer) Demux(ctx context.Context, fn DecoderFunc) error {
270
- // If the decoder is nil then set it to default
271
- if fn == nil {
272
- fn = func(packet Packet) error {
273
- if packet == nil {
274
- return d.decodePacket(nil)
275
- }
276
- return d.decodePacket(packet.(*ff.AVPacket))
277
- }
278
- }
279
-
181
+ func (d * demuxer ) demux (ctx context.Context , demuxfn DecoderFunc , framefn FrameFunc ) error {
280
182
// Allocate a packet
281
183
packet := ff .AVCodec_packet_alloc ()
282
184
if packet == nil {
@@ -292,13 +194,13 @@ FOR_LOOP:
292
194
break FOR_LOOP
293
195
default :
294
196
if err := ff .AVFormat_read_frame (d .input , packet ); errors .Is (err , io .EOF ) {
295
- break
197
+ break FOR_LOOP
296
198
} else if err != nil {
297
199
return err
298
200
}
299
201
stream := packet .StreamIndex ()
300
202
if decoder := d .decoders [stream ]; decoder != nil {
301
- if err := decoder.decode(fn, packet ); errors.Is(err, io.EOF) {
203
+ if err := decoder .decode (packet , demuxfn , framefn ); errors .Is (err , io .EOF ) {
302
204
break FOR_LOOP
303
205
} else if err != nil {
304
206
return err
@@ -311,23 +213,23 @@ FOR_LOOP:
311
213
312
214
// Flush the decoders
313
215
for _ , decoder := range d .decoders {
314
- if err := decoder.decode(fn, nil ); err != nil {
216
+ if err := decoder .decode (nil , demuxfn , framefn ); err != nil {
315
217
return err
316
218
}
317
219
}
318
220
319
- // Return success
320
- return nil
221
+ // Return the context error - will be cancelled, perhaps, or nil if the
222
+ // demuxer finished successfully without cancellation
223
+ return ctx .Err ()
321
224
}
322
225
323
- func (d *decoder) decode(fn DecoderFunc, packet *ff.AVPacket) error {
324
- // Send the packet to the user defined packet function or
325
- // to the default version
326
- return fn( packet)
327
- }
226
+ func (d * decoder ) decode (packet * ff.AVPacket , demuxfn DecoderFunc , framefn FrameFunc ) error {
227
+ if demuxfn != nil {
228
+ // Send the packet to the user defined packet function
229
+ return demuxfn ( newPacket ( packet ) )
230
+ }
328
231
329
- func (d *demuxer) decodePacket(packet *ff.AVPacket) error {
330
- // Submit the packet to the decoder. If nil then flush
232
+ // Submit the packet to the decoder (nil packet will flush the decoder)
331
233
if err := ff .AVCodec_send_packet (d .codec , packet ); err != nil {
332
234
return err
333
235
}
@@ -341,62 +243,16 @@ func (d *demuxer) decodePacket(packet *ff.AVPacket) error {
341
243
return err
342
244
}
343
245
344
- fmt.Println("TODO", d.frame)
345
- }
346
- return nil
347
- }
348
-
349
- // Resample or resize the frame, then pass back
350
- /*
351
- if frame, err := d.re(d.frame); err != nil {
352
- return err
353
- } else if err := fn(frame); errors.Is(err, io.EOF) {
354
- // End early
355
- break
356
- } else if err != nil {
357
- return err
358
- }*/
359
-
360
- // Flush
361
- /*
362
- if frame, err := d.re(nil); err != nil {
363
- return err
364
- } else if frame == nil {
365
- // NOOP
366
- } else if err := fn(frame); errors.Is(err, io.EOF) {
367
- // NOOP
368
- } else if err != nil {
369
- return err
370
- }
371
- */
372
-
373
- /*
374
-
375
- // Return a function to decode packets from the streams into frames
376
- func (r *reader) Decode(fn FrameFunc) DecoderFunc {
377
- return func(codec Decoder, packet Packet) error {
378
- if packet != nil {
379
- // Submit the packet to the decoder
380
- if err := ff.AVCodec_send_packet(codec.(*decoder).codec, packet.(*ff.AVPacket)); err != nil {
381
- return err
382
- }
383
- } else {
384
- // Flush remaining frames
385
- if err := ff.AVCodec_send_packet(codec.(*decoder).codec, nil); err != nil {
386
- return err
387
- }
246
+ // Pass the frame
247
+ if err := framefn (newFrame (d .frame )); errors .Is (err , io .EOF ) {
248
+ // End early
249
+ break
250
+ } else if err != nil {
251
+ return err
388
252
}
389
253
390
- // get all the available frames from the decoder
391
- for {
392
- if err := ff.AVCodec_receive_frame(codec.(*decoder).codec, r.frame); errors.Is(err, syscall.EAGAIN) || errors.Is(err, io.EOF) {
393
- // Finished decoding packet or EOF
394
- break
395
- } else if err != nil {
396
- return err
397
- }
398
-
399
- // Resample or resize the frame, then pass back
254
+ // Resample or resize the frame, then pass back
255
+ /*
400
256
if frame, err := codec.(*decoder).re(r.frame); err != nil {
401
257
return err
402
258
} else if err := fn(frame); errors.Is(err, io.EOF) {
@@ -405,9 +261,11 @@ func (r *reader) Decode(fn FrameFunc) DecoderFunc {
405
261
} else if err != nil {
406
262
return err
407
263
}
408
- }
264
+ */
265
+ }
409
266
410
- // Flush
267
+ // TODO: Flush
268
+ /*
411
269
if frame, err := codec.(*decoder).re(nil); err != nil {
412
270
return err
413
271
} else if frame == nil {
@@ -416,10 +274,8 @@ func (r *reader) Decode(fn FrameFunc) DecoderFunc {
416
274
// NOOP
417
275
} else if err != nil {
418
276
return err
419
- }
277
+ }*/
420
278
421
- // Success
422
- return nil
423
- }
279
+ // Return success
280
+ return nil
424
281
}
425
- */
0 commit comments