MCPcopy Create free account
hub / github.com/anthumchris/opus-stream-decoder / opus_chunkdecoder_enqueue

Function opus_chunkdecoder_enqueue

src/opus_chunkdecoder.c:46–98  ·  view source on GitHub ↗

* Feed opus audio data for decoding. Calling program should enqueue and decode * immedately after enqueuing to reduce decoding latency and reduce size of * undecoded decoder->buffer data. Per https://xiph.org/ogg/doc/oggstream.html, * decoding would be possible by 64k. Otherwise, you're feeding invalid Opus * data that is not recognized as a valid, decodable Ogg Opus File * * The undecoded

Source from the content-addressed store, hash-verified

44 * Returns 1 or 0 for success or error
45 */
46int opus_chunkdecoder_enqueue(OpusChunkDecoder *decoder, unsigned char *data, size_t size) {
47 ssize_t bufferMax = sizeof(decoder->buffer._data),
48 bufferUsed = decoder->buffer.num_unread;
49
50 // fprintf(stdout, "Undecoded: %zd\n", bufferUsed);
51
52 if (bufferUsed + size > bufferMax) {
53 fprintf(stderr, "ERROR: Cannot enqueue %zd bytes, overflows by %zd. Used: "\
54 "%zd/%zd, OggOpusFile discovered: %s. " \
55 "Try reducing chunk or decode before enqueuing more\n",
56 size,
57 size + bufferUsed - bufferMax,
58 bufferUsed,
59 bufferMax,
60 (!decoder->of)? "false" : "true"
61 );
62 return 0;
63 }
64
65 decoder->buffer.cursor = decoder->buffer.start;
66
67 /*
68 initialize OggOpusFile if not yet initialized. A few attempts are needed
69 until enough bytes are collected for it to discover first Ogg page
70 */
71 if (!decoder->of) {
72 memcpy( decoder->buffer.cursor + decoder->buffer.num_unread, data, size );
73 decoder->buffer.num_unread += size;
74
75 int err;
76
77 decoder->of = op_open_callbacks(
78 decoder,
79 &decoder->cb,
80 decoder->buffer.cursor,
81 decoder->buffer.num_unread,
82 &err
83 );
84
85 if (err == 0) {
86 fprintf(stderr, "OggOpusFile discovered with %d bytes\n", decoder->buffer.num_unread);
87
88 // OggOpusFile instantiated. Reset unread buffer count
89 decoder->buffer.num_unread = 0;
90 }
91 } else {
92 // set buffer to new data
93 decoder->buffer.num_unread += size;
94 memcpy( decoder->buffer.cursor, data, size );
95 }
96
97 return 1;
98}
99
100// returns total samples decoded
101int opus_chunkdecoder_decode_float_stereo(OpusChunkDecoder *decoder, float *pcm_out, int pcm_out_size) {

Callers 1

mainFunction · 0.85

Calls

no outgoing calls

Tested by 1

mainFunction · 0.68