libogg: updated to upstream rev ea2b95940

This commit is contained in:
2018-03-27 11:39:04 +08:00
parent 8d39b7a01b
commit 3ff991027f
+62 -15
View File
@@ -12,7 +12,7 @@
function: code raw packets into framed OggSquish stream and
decode Ogg streams back into raw packets
last mod: $Id: framing.c 18052 2011-08-04 17:57:02Z giles $
last mod: $Id$
note: The CRC code is directly derived from public domain code by
Ross Williams (ross@guest.adelaide.edu.au). See docs/framing.html
@@ -21,6 +21,7 @@
********************************************************************/
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <ogg/ogg.h>
@@ -236,39 +237,51 @@ int ogg_stream_destroy(ogg_stream_state *os){
/* Helpers for ogg_stream_encode; this keeps the structure and
what's happening fairly clear */
static int _os_body_expand(ogg_stream_state *os,int needed){
if(os->body_storage<=os->body_fill+needed){
static int _os_body_expand(ogg_stream_state *os,long needed){
if(os->body_storage-needed<=os->body_fill){
long body_storage;
void *ret;
ret=_ogg_realloc(os->body_data,(os->body_storage+needed+1024)*
sizeof(*os->body_data));
if(os->body_storage>LONG_MAX-needed){
ogg_stream_clear(os);
return -1;
}
body_storage=os->body_storage+needed;
if(body_storage<LONG_MAX-1024)body_storage+=1024;
ret=_ogg_realloc(os->body_data,body_storage*sizeof(*os->body_data));
if(!ret){
ogg_stream_clear(os);
return -1;
}
os->body_storage+=(needed+1024);
os->body_storage=body_storage;
os->body_data=ret;
}
return 0;
}
static int _os_lacing_expand(ogg_stream_state *os,int needed){
if(os->lacing_storage<=os->lacing_fill+needed){
static int _os_lacing_expand(ogg_stream_state *os,long needed){
if(os->lacing_storage-needed<=os->lacing_fill){
long lacing_storage;
void *ret;
ret=_ogg_realloc(os->lacing_vals,(os->lacing_storage+needed+32)*
sizeof(*os->lacing_vals));
if(os->lacing_storage>LONG_MAX-needed){
ogg_stream_clear(os);
return -1;
}
lacing_storage=os->lacing_storage+needed;
if(lacing_storage<LONG_MAX-32)lacing_storage+=32;
ret=_ogg_realloc(os->lacing_vals,lacing_storage*sizeof(*os->lacing_vals));
if(!ret){
ogg_stream_clear(os);
return -1;
}
os->lacing_vals=ret;
ret=_ogg_realloc(os->granule_vals,(os->lacing_storage+needed+32)*
ret=_ogg_realloc(os->granule_vals,lacing_storage*
sizeof(*os->granule_vals));
if(!ret){
ogg_stream_clear(os);
return -1;
}
os->granule_vals=ret;
os->lacing_storage+=(needed+32);
os->lacing_storage=lacing_storage;
}
return 0;
}
@@ -304,12 +317,17 @@ void ogg_page_checksum_set(ogg_page *og){
int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count,
long e_o_s, ogg_int64_t granulepos){
int bytes = 0, lacing_vals, i;
long bytes = 0, lacing_vals;
int i;
if(ogg_stream_check(os)) return -1;
if(!iov) return 0;
for (i = 0; i < count; ++i) bytes += (int)iov[i].iov_len;
for (i = 0; i < count; ++i){
if(iov[i].iov_len>LONG_MAX) return -1;
if(bytes>LONG_MAX-(long)iov[i].iov_len) return -1;
bytes += (long)iov[i].iov_len;
}
lacing_vals=bytes/255+1;
if(os->body_returned){
@@ -857,6 +875,7 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){
some segments */
if(continued){
if(os->lacing_fill<1 ||
(os->lacing_vals[os->lacing_fill-1]&0xff)<255 ||
os->lacing_vals[os->lacing_fill-1]==0x400){
bos=0;
for(;segptr<segments;segptr++){
@@ -1474,6 +1493,34 @@ const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05,
1,
0};
int compare_packet(const ogg_packet *op1, const ogg_packet *op2){
if(op1->packet!=op2->packet){
fprintf(stderr,"op1->packet != op2->packet\n");
return(1);
}
if(op1->bytes!=op2->bytes){
fprintf(stderr,"op1->bytes != op2->bytes\n");
return(1);
}
if(op1->b_o_s!=op2->b_o_s){
fprintf(stderr,"op1->b_o_s != op2->b_o_s\n");
return(1);
}
if(op1->e_o_s!=op2->e_o_s){
fprintf(stderr,"op1->e_o_s != op2->e_o_s\n");
return(1);
}
if(op1->granulepos!=op2->granulepos){
fprintf(stderr,"op1->granulepos != op2->granulepos\n");
return(1);
}
if(op1->packetno!=op2->packetno){
fprintf(stderr,"op1->packetno != op2->packetno\n");
return(1);
}
return(0);
}
void test_pack(const int *pl, const int **headers, int byteskip,
int pageskip, int packetskip){
unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */
@@ -1582,7 +1629,7 @@ void test_pack(const int *pl, const int **headers, int byteskip,
ogg_stream_packetout(&os_de,&op_de); /* just catching them all */
/* verify peek and out match */
if(memcmp(&op_de,&op_de2,sizeof(op_de))){
if(compare_packet(&op_de,&op_de2)){
fprintf(stderr,"packetout != packetpeek! pos=%ld\n",
depacket);
exit(1);