shithub: libopusenc

Download patch

ref: da413b17cb8836b94042fc852cbdaccbf3892cb5
parent: 7ff162d8b3dc3bd2f8cc6231d05a6ca4e93d7ff7
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Thu May 11 13:18:30 EDT 2017

Add explicit user data for packet callback, add OPUS_GET_LOOKAHEAD, fix error code

--- a/include/opusenc.h
+++ b/include/opusenc.h
@@ -82,8 +82,8 @@
 #define OPE_SET_SERIALNO(x) OPE_SET_SERIALNO_REQUEST, __opus_check_int(x)
 #define OPE_GET_SERIALNO(x) OPE_GET_SERIALNO_REQUEST, __opus_check_int_ptr(x)
 /* FIXME: Add type-checking macros to these. */
-#define OPE_SET_PACKET_CALLBACK(x) OPE_SET_PACKET_CALLBACK_REQUEST, (x)
-#define OPE_GET_PACKET_CALLBACK(x) OPE_GET_PACKET_CALLBACK_REQUEST, (x)
+#define OPE_SET_PACKET_CALLBACK(x,u) OPE_SET_PACKET_CALLBACK_REQUEST, (x), (u)
+#define OPE_GET_PACKET_CALLBACK(x,u) OPE_GET_PACKET_CALLBACK_REQUEST, (x), (u)
 
 typedef int (*ope_write_func)(void *user_data, const unsigned char *ptr, int len);
 
--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -192,6 +192,7 @@
   int chaining_keyframe_length;
   OpusEncCallbacks callbacks;
   ope_packet_func packet_callback;
+  void *packet_callback_data;
   OpusHeader header;
   int comment_padding;
   EncStream *streams;
@@ -431,12 +432,12 @@
     p = oggp_get_packet_buffer(enc->oggp, 276);
     int packet_size = opus_header_to_packet(&enc->header, p, 276);
     oggp_commit_packet(enc->oggp, packet_size, 0, 0);
-    if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, p, packet_size, 0);
+    if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, p, packet_size, 0);
     oe_flush_page(enc);
     p = oggp_get_packet_buffer(enc->oggp, enc->streams->comment_length);
     memcpy(p, enc->streams->comment, enc->streams->comment_length);
     oggp_commit_packet(enc->oggp, enc->streams->comment_length, 0, 0);
-    if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, p, enc->streams->comment_length, 0);
+    if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, p, enc->streams->comment_length, 0);
     oe_flush_page(enc);
 
 #else
@@ -455,7 +456,7 @@
     op.granulepos=0;
     op.packetno=0;
     ogg_stream_packetin(&enc->streams->os, &op);
-    if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, op.packet, op.bytes, 0);
+    if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, op.packet, op.bytes, 0);
     oe_flush_page(enc);
 
     op.packet = (unsigned char *)enc->streams->comment;
@@ -465,7 +466,7 @@
     op.granulepos = 0;
     op.packetno = 1;
     ogg_stream_packetin(&enc->streams->os, &op);
-    if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, op.packet, op.bytes, 0);
+    if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, op.packet, op.bytes, 0);
     oe_flush_page(enc);
 #endif
   }
@@ -533,7 +534,7 @@
 #else
       ogg_stream_packetin(&enc->streams->os, &op);
 #endif
-      if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, op.packet, op.bytes, 0);
+      if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, op.packet, op.bytes, 0);
       /* FIXME: Also flush on too many segments. */
 #ifdef USE_OGGP
       flush_needed = op.e_o_s;
@@ -586,7 +587,7 @@
 #else
           ogg_stream_packetin(&enc->streams->os, &op2);
 #endif
-          if (enc->packet_callback) enc->packet_callback(enc->streams->user_data, op2.packet, op2.bytes, 0);
+          if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, op2.packet, op2.bytes, 0);
         }
         end_granule48k = (enc->streams->end_granule*48000 + enc->rate - 1)/enc->rate + enc->global_granule_offset;
         cont = 1;
@@ -811,6 +812,12 @@
       ret = opus_multistream_encoder_ctl(enc->st, request, value);
     }
     break;
+    case OPUS_GET_LOOKAHEAD_REQUEST:
+    {
+      opus_int32 *value = va_arg(ap, opus_int32*);
+      ret = opus_multistream_encoder_ctl(enc->st, request, value);
+    }
+    break;
     case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
     {
       opus_int32 value = va_arg(ap, opus_int32);
@@ -890,7 +897,9 @@
     case OPE_SET_PACKET_CALLBACK_REQUEST:
     {
       ope_packet_func value = va_arg(ap, ope_packet_func);
+      void *data = va_arg(ap, void *);
       enc->packet_callback = value;
+      enc->packet_callback_data = data;
       ret = OPE_OK;
     }
     break;
@@ -898,7 +907,7 @@
       return OPE_UNIMPLEMENTED;
   }
   va_end(ap);
-  translate = request < 14000 || (ret < 0 && ret >= -10);
+  translate = ret != 0 && (request < 14000 || (ret < 0 && ret >= -10));
   if (translate) {
     if (ret == OPUS_BAD_ARG) ret = OPE_BAD_ARG;
     else if (ret == OPUS_INTERNAL_ERROR) ret = OPE_INTERNAL_ERROR;