ref: 05467e5cadf38168e9ddc402755597cf91e6c9b4
parent: f089e3f4207814731ed257fa31341524a896b2d3
author: Jean-Marc Valin <[email protected]>
date: Thu Apr 27 11:34:41 EDT 2017
More comments code
--- a/examples/opusenc_example.c
+++ b/examples/opusenc_example.c
@@ -19,6 +19,8 @@
printf("cannout open output file: %s\n", argv[2]);
return 1;
}
+ ope_add_comment(enc, "ARTIST", "Someone");
+ ope_add_comment(enc, "TITLE", "Some track");
ope_close_and_free(enc);
return 0;
}
--- a/include/opusenc.h
+++ b/include/opusenc.h
@@ -38,13 +38,17 @@
#define OPE_CANNOT_OPEN -10
#define OPE_UNIMPLEMENTED -11
#define OPE_BAD_ARG -12
+#define OPE_INTERNAL_ERROR -13
typedef int (*ope_write_func)(void *user_data, const unsigned char *ptr, int len);
typedef int (*ope_close_func)(void *user_data);
+/** Callback functions for accessing the stream. */
typedef struct {
+ /** Callback for writing to the stream. */
ope_write_func write;
+ /** Callback for closing the stream. */
ope_close_func close;
} OpusEncCallbacks;
--- a/src/opus_header.c
+++ b/src/opus_header.c
@@ -200,7 +200,7 @@
*comments=p;
}
-void comment_add(char **comments, int* length, char *tag, char *val)
+int comment_add(char **comments, int* length, char *tag, char *val)
{
char* p=*comments;
int vendor_length=readint(p, 8);
@@ -210,7 +210,7 @@
int len=(*length)+4+tag_len+val_len;
p=(char*)realloc(p, len);
- if (p == NULL) return;
+ if (p == NULL) return 1;
writeint(p, *length, tag_len+val_len); /* length of comment */
if(tag){
@@ -221,6 +221,7 @@
writeint(p, 8+4+vendor_length, user_comment_list_length+1);
*comments=p;
*length=len;
+ return 0;
}
void comment_pad(char **comments, int* length, int amount)
--- a/src/opus_header.h
+++ b/src/opus_header.h
@@ -50,7 +50,7 @@
void comment_init(char **comments, int* length, const char *vendor_string);
-void comment_add(char **comments, int* length, char *tag, char *val);
+int comment_add(char **comments, int* length, char *tag, char *val);
void comment_pad(char **comments, int* length, int amount);
--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -40,8 +40,13 @@
#include "opusenc.h"
#include "opus_header.h"
-#define BUFFER_SAMPLES 96000
+/* Allow up to 2 seconds for delayed decision. */
+#define MAX_LOOKAHEAD 96000
+/* We can't have a circular buffer (because of delayed decision), so let's not copy too often. */
+#define BUFFER_EXTRA 24000
+#define BUFFER_SAMPLES (MAX_LOOKAHEAD + BUFFER_EXTRA)
+
static int oe_write_page(ogg_page *page, OpusEncCallbacks *cb, void *user_data)
{
int err;
@@ -59,6 +64,8 @@
struct OggOpusEnc {
OpusMSEncoder *st;
float *buffer;
+ int buffer_start;
+ int buffer_end;
OpusEncCallbacks callbacks;
void *user_data;
int os_allocated;
@@ -155,7 +162,6 @@
char encoder_string[1024];
snprintf(encoder_string, sizeof(encoder_string), "%s version %s", PACKAGE_NAME, PACKAGE_VERSION);
comment_add(&enc->comment, &enc->comment_length, "ENCODER", encoder_string);
- comment_pad(&enc->comment, &enc->comment_length, 512);
}
if (enc->comment == NULL) goto fail;
if ( (enc->buffer = malloc(sizeof(*enc->buffer)*BUFFER_SAMPLES*channels)) == NULL) goto fail;
@@ -188,6 +194,7 @@
}
/* FIXME: Compute preskip. */
enc->header.preskip = 0;
+ comment_pad(&enc->comment, &enc->comment_length, 512);
/*Write header*/
{
@@ -270,9 +277,7 @@
/* Add a comment to the file (can only be called before encoding samples). */
int ope_add_comment(OggOpusEnc *enc, char *tag, char *val) {
- (void)enc;
- (void)tag;
- (void)val;
+ if (comment_add(&enc->comment, &enc->comment_length, tag, val)) return OPE_INTERNAL_ERROR;
return OPE_OK;
}
@@ -280,7 +285,7 @@
int ope_set_vendor_string(OggOpusEnc *enc, char *vendor) {
(void)enc;
(void)vendor;
- return OPE_OK;
+ return OPE_UNIMPLEMENTED;
}
/* Goes straight to the libopus ctl() functions. */