shithub: opusfile

Download patch

ref: 934d522b007698e61f123d52beb6938d37026159
parent: 9d718345ce03b2fad5d7d28e0bcd1cc69ab2b166
author: qwx <qwx@sciops.net>
date: Mon Mar 6 17:10:59 EST 2023

up-to-date port

--- /dev/null
+++ b/mkfile
@@ -1,0 +1,34 @@
+APE=/sys/src/ape
+<$APE/config
+
+LIB=/$objtype/lib/ape/libopusfile.a
+
+OFILES=\
+	info.$O \
+	internal.$O \
+	opusfile.$O \
+	stream.$O \
+
+HFILES=\
+	/sys/include/ape/opus/opusfile.h \
+
+UPDATE=\
+	mkfile\
+	$HFILES\
+	${OFILES:%.$O=%.c}\
+
+</sys/src/cmd/mksyslib
+
+CFLAGS=$CFLAGS -c\
+	-Iinclude \
+	-I/sys/src/cmd/audio/libogg \
+	-I/sys/include/ape/opus \
+	-DPACKAGE_VERSION="fuckoff" \
+	-D_POSIX_SOURCE
+
+%.$O:	src/%.c
+	$CC $CFLAGS src/$stem.c
+
+$HFILES:
+	mkdir -p /sys/include/ape/opus
+	dircp include /sys/include/ape/opus
--- a/src/opusfile.c
+++ b/src/opusfile.c
@@ -328,7 +328,9 @@
   opus_int64     original_end;
   opus_int32     chunk_size;
   int            preferred_found;
-  original_end=end=begin=_offset;
+  original_end=_offset;
+  end=_offset;
+  begin=_offset;
   preferred_found=0;
   _offset=-1;
   chunk_size=OP_CHUNK_SIZE;
@@ -351,7 +353,8 @@
         We're not interested in the page itself... just the serial number, byte
          offset, page size, and granule position.*/
       _sr->search_start=search_start;
-      _sr->offset=_offset=llret;
+      _sr->offset=llret;
+      _offset=llret;
       _sr->serialno=serialno;
       OP_ASSERT(_of->offset-_offset>=0);
       OP_ASSERT(_of->offset-_offset<=OP_PAGE_SIZE_MAX);
@@ -417,7 +420,9 @@
   opus_int32  chunk_size;
   /*The target serial number must belong to the current link.*/
   OP_ASSERT(op_lookup_serialno(_serialno,_serialnos,_nserialnos));
-  original_end=end=begin=_offset;
+  begin=_offset;
+  end=_offset;
+  original_end=_offset;
   _offset=-1;
   /*We shouldn't have to initialize gp, but gcc is too dumb to figure out that
      ret>=0 implies we entered the if(page_gp!=-1) block at least once.*/
@@ -860,7 +865,8 @@
       _link->pcm_file_offset=0;
       /*Set pcm_end and end_offset so we can skip the call to
          op_find_final_pcm_offset().*/
-      _link->pcm_start=_link->pcm_end=0;
+      _link->pcm_start=0;
+      _link->pcm_end=0;
       _link->end_offset=_link->data_offset;
       return 0;
     }
@@ -870,7 +876,8 @@
       /*Set pcm_end and end_offset so we can skip the call to
          op_find_final_pcm_offset().*/
       _link->pcm_file_offset=0;
-      _link->pcm_start=_link->pcm_end=0;
+      _link->pcm_start=0;
+      _link->pcm_end=0;
       _link->end_offset=_link->data_offset;
       /*Tell the caller we've got a buffered page for them.*/
       return 1;
@@ -940,7 +947,8 @@
         /*If we trimmed the entire packet, stop (the spec says encoders
            shouldn't do this, but we support it anyway).*/
         if(OP_UNLIKELY(diff>durations[pi]))break;
-        _of->op[pi].granulepos=prev_packet_gp=cur_page_gp;
+        _of->op[pi].granulepos=cur_page_gp;
+        prev_packet_gp=cur_page_gp;
         /*Move the EOS flag to this packet, if necessary, so we'll trim the
            samples.*/
         _of->op[pi].e_o_s=1;
@@ -956,7 +964,8 @@
   _of->op_count=pi;
   _of->cur_discard_count=_link->head.pre_skip;
   _link->pcm_file_offset=0;
-  _of->prev_packet_gp=_link->pcm_start=pcm_start;
+  _of->prev_packet_gp=pcm_start;
+  _link->pcm_start=pcm_start;
   _of->prev_page_offset=page_offset;
   return 0;
 }
@@ -1397,7 +1406,8 @@
   int            ret;
   /*We can seek, so set out learning all about this file.*/
   (*_of->callbacks.seek)(_of->stream,0,SEEK_END);
-  _of->offset=_of->end=(*_of->callbacks.tell)(_of->stream);
+  _of->offset=(*_of->callbacks.tell)(_of->stream);
+  _of->end=(*_of->callbacks.tell)(_of->stream);
   if(OP_UNLIKELY(_of->end<0))return OP_EREAD;
   data_offset=_of->links[0].data_offset;
   if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK;
@@ -2287,10 +2297,13 @@
   _of->bytes_tracked=0;
   _of->samples_tracked=0;
   link=_of->links+_li;
-  best_gp=pcm_start=link->pcm_start;
+  best_gp=link->pcm_start;
+  pcm_start=link->pcm_start;
   pcm_end=link->pcm_end;
   serialno=link->serialno;
-  best=best_start=begin=link->data_offset;
+  best=link->data_offset;
+  best_start=link->data_offset;
+  begin=link->data_offset;
   page_offset=-1;
   buffering=0;
   /*We discard the first 80 ms of data after a seek, so seek back that much
@@ -2303,9 +2316,12 @@
   /*Special case seeking to the start of the link.*/
   pre_skip=link->head.pre_skip;
   OP_ALWAYS_TRUE(!op_granpos_add(&pcm_pre_skip,pcm_start,pre_skip));
-  if(op_granpos_cmp(_target_gp,pcm_pre_skip)<0)end=boundary=begin;
-  else{
-    end=boundary=link->end_offset;
+  if(op_granpos_cmp(_target_gp,pcm_pre_skip)<0){
+    end=begin;
+    boundary=begin;
+  }else{
+    end=link->end_offset;
+    boundary=link->end_offset;
 #if !defined(OP_SMALL_FOOTPRINT)
     /*If we were decoding from this link, we can narrow the range a bit.*/
     if(_li==_of->cur_link&&_of->ready_state>=OP_INITSET){
@@ -2340,8 +2356,10 @@
              first seek location gives better results, on average.*/
           if(diff<0){
             if(offset-begin>=end-begin>>1||diff>-OP_CUR_TIME_THRESH){
-              best=begin=offset;
-              best_gp=pcm_start=gp;
+              best=offset;
+              begin=offset;
+              best_gp=gp;
+              pcm_start=gp;
               /*If we have buffered data from a continued packet, remember the
                  offset of the previous page's start, so that if we do wind up
                  having to seek back here later, we can prime the stream with
@@ -2391,7 +2409,8 @@
               Check if we can cut off at least half the range, though.*/
             if(offset-begin<=end-begin>>1||diff<OP_CUR_TIME_THRESH){
               /*We really want the page start here, but this will do.*/
-              end=boundary=offset;
+              end=offset;
+              boundary=offset;
               pcm_end=gp;
             }
           }
@@ -2408,7 +2427,9 @@
   _of->cur_link=_li;
   _of->ready_state=OP_STREAMSET;
   /*Initialize the interval size history.*/
-  d2=d1=d0=end-begin;
+  d0=end-begin;
+  d1=d0;
+  d2=d0;
   force_bisect=0;
   while(begin<end){
     opus_int64 bisect;
@@ -2512,7 +2533,8 @@
           }
           /*Save the byte offset of the end of the page with this granule
              position.*/
-          best=best_start=begin;
+          best=begin;
+          best_start=begin;
           /*Buffer any data from a continued packet, if necessary.
             This avoids the need to seek back here if the next timestamp we
              encounter while scanning forward lies after our target.*/
@@ -2528,7 +2550,8 @@
           /*Then force buffering on, so that if a packet starts (but does not
              end) on the next page, we still avoid the extra seek back.*/
           buffering=1;
-          best_gp=pcm_start=gp;
+          best_gp=gp;
+          pcm_start=gp;
           OP_ALWAYS_TRUE(!op_granpos_diff(&diff,_target_gp,pcm_start));
           /*If we're more than a second away from our target, break out and
              do another bisection.*/