More comments code
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Thu, 27 Apr 2017 19:34:41 +0000 (15:34 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Thu, 27 Apr 2017 19:45:46 +0000 (15:45 -0400)
examples/opusenc_example.c
include/opusenc.h
src/opus_header.c
src/opus_header.h
src/opusenc.c

index d2f662e..8a22c30 100644 (file)
@@ -19,6 +19,8 @@ int main(int argc, char **argv) {
     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;
 }
index 5208f26..d72a8dc 100644 (file)
@@ -38,13 +38,17 @@ extern "C" {
 #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;
 
index c566932..13d8ecc 100644 (file)
@@ -200,7 +200,7 @@ void comment_init(char **comments, int* length, const char *vendor_string)
   *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 @@ void comment_add(char **comments, int* length, char *tag, char *val)
   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 @@ void comment_add(char **comments, int* length, char *tag, char *val)
   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)
index a3f491c..be1cc76 100644 (file)
@@ -50,7 +50,7 @@ extern const int wav_permute_matrix[8][8];
 
 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);
 
index 4901e26..3491bff 100644 (file)
 #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)
 {
@@ -59,6 +64,8 @@ struct StdioObject {
 struct OggOpusEnc {
   OpusMSEncoder *st;
   float *buffer;
+  int buffer_start;
+  int buffer_end;
   OpusEncCallbacks callbacks;
   void *user_data;
   int os_allocated;
@@ -155,7 +162,6 @@ OggOpusEnc *ope_create_callbacks(const OpusEncCallbacks *callbacks, void *user_d
     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 @@ static void init_stream(OggOpusEnc *enc) {
   }
   /* FIXME: Compute preskip. */
   enc->header.preskip = 0;
+  comment_pad(&enc->comment, &enc->comment_length, 512);
 
   /*Write header*/
   {
@@ -270,9 +277,7 @@ int ope_continue_new_callbacks(OggOpusEnc *enc, void *user_data) {
 
 /* 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_add_comment(OggOpusEnc *enc, char *tag, char *val) {
 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. */