ref: de802c33bd4bbddddc9b34421cb5278d5720e8d4
parent: 8630085e38ed539e461553503a8cb4efbc10c3f0
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Mon Apr 24 14:28:46 EDT 2017
wip
--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -34,11 +34,28 @@
#include <stdlib.h>
#include <stdio.h>
#include "opusenc.h"
+#include <opus_multistream.h>
+struct StdioObject {
+ FILE *file;
+};
+
+struct OggOpusEnc {
+ OpusMSEncoder *enc;
+};
+
int stdio_write(void *user_data, const unsigned char *ptr, int len) {
- return fwrite(ptr, 1, len, (FILE*)user_data) != len;
+ struct StdioObject *obj = (struct StdioObject*)user_data;
+ return fwrite(ptr, 1, len, obj->file) != len;
}
+int stdio_close(void *user_data) {
+ struct StdioObject *obj = (struct StdioObject*)user_data;
+ int ret = fclose(obj->file);
+ free(obj);
+ return ret;
+}
+
static const OpusEncCallbacks stdio_callbacks = {
stdio_write,
fclose
@@ -47,12 +64,21 @@
/* Create a new OggOpus file. */
OggOpusEnc *ope_create_file(const char *path, const OggOpusComments *comments,
int rate, int channels, int family, int *error) {
- FILE *file = fopen(path, "wb");
- if (!file) {
+ OggOpusEnc *enc;
+ struct StdioObject *obj;
+ obj = malloc(sizeof(*obj));
+ enc = ope_create_callbacks(&stdio_callbacks, obj, comments, rate, channels, family, error);
+ if (enc == NULL || (error && *error)) {
+ return NULL;
+ }
+ obj->file = fopen(path, "wb");
+ if (!obj->file) {
if (error) *error = OPE_ERROR_CANNOT_OPEN;
+ /* FIXME: Destroy the encoder properly. */
+ free(obj);
return NULL;
}
- return ope_create_callbacks(&stdio_callbacks, file, comments, rate, channels, family, error);
+ return enc;
}
/* Create a new OggOpus file (callback-based). */
@@ -71,9 +97,14 @@
return 0;
}
+static void finalize_stream(OggOpusEnc *enc) {
+}
+
/* Close/finalize the stream. */
int ope_close_and_free(OggOpusEnc *enc) {
- return 0;
+ finalize_stream(enc);
+ opus_encoder_destroy(enc);
+ return OPE_OK;
}
/* Ends the stream and create a new stream within the same file. */