Implement ope_flush_header()
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 2 May 2017 15:53:59 +0000 (11:53 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 2 May 2017 15:53:59 +0000 (11:53 -0400)
include/opusenc.h
src/opusenc.c

index 88772dd..4028f30 100644 (file)
@@ -53,6 +53,7 @@ extern "C" {
 #define OPE_UNIMPLEMENTED -11
 #define OPE_BAD_ARG -12
 #define OPE_INTERNAL_ERROR -13
+#define OPE_TOO_LATE -14
 
 /* These are the "raw" request values -- they should usually not be used. */
 #define OPE_SET_DECISION_DELAY_REQUEST 14000
@@ -123,6 +124,9 @@ OPE_EXPORT int ope_add_picture(OggOpusEnc *enc, const char *spec);
 /** Sets the Opus comment vendor string (optional, defaults to library info). */
 OPE_EXPORT int ope_set_vendor_string(OggOpusEnc *enc, const char *vendor);
 
+/** Write out the header now rather than wait for audio to begin. */
+OPE_EXPORT int ope_flush_header(OggOpusEnc *enc);
+
 /** Goes straight to the libopus ctl() functions. */
 OPE_EXPORT int ope_encoder_ctl(OggOpusEnc *enc, int request, ...);
 
index db35f22..9e28868 100644 (file)
@@ -452,6 +452,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, const char *tag, const char *val) {
+  if (enc->stream_is_init) return OPE_TOO_LATE;
   if (comment_add(&enc->comment, &enc->comment_length, tag, val)) return OPE_INTERNAL_ERROR;
   return OPE_OK;
 }
@@ -459,6 +460,7 @@ int ope_add_comment(OggOpusEnc *enc, const char *tag, const char *val) {
 int ope_add_picture(OggOpusEnc *enc, const char *spec) {
   const char *error_message;
   char *picture_data;
+  if (enc->stream_is_init) return OPE_TOO_LATE;
   picture_data = parse_picture_specification(spec, &error_message, &enc->seen_file_icons);
   if(picture_data==NULL){
     /* FIXME: return proper errors rather than printing a message. */
@@ -472,11 +474,17 @@ int ope_add_picture(OggOpusEnc *enc, const char *spec) {
 
 /* Sets the Opus comment vendor string (optional, defaults to library info). */
 int ope_set_vendor_string(OggOpusEnc *enc, const char *vendor) {
+  if (enc->stream_is_init) return OPE_TOO_LATE;
   (void)enc;
   (void)vendor;
   return OPE_UNIMPLEMENTED;
 }
 
+int ope_flush_header(OggOpusEnc *enc) {
+  if (enc->stream_is_init) return OPE_TOO_LATE;
+  else init_stream(enc);
+}
+
 /* Goes straight to the libopus ctl() functions. */
 int ope_encoder_ctl(OggOpusEnc *enc, int request, ...) {
   int ret;