Changeset 3717

Show
Ignore:
Timestamp:
2008-09-16 02:31:48 (3 months ago)
Author:
conrad
Message:

generalize bos parsing functions to work on raw data instead of
ogg packet structures

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • liboggz/trunk/src/liboggz/oggz_auto.c

    r3665 r3717  
    8282 
    8383static int 
    84 auto_speex (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    85 { 
    86   unsigned char * header = op->packet
     84auto_speex (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     85{ 
     86  unsigned char * header = data
    8787  ogg_int64_t granule_rate = 0; 
    8888  int numheaders; 
    8989 
    90   if (op->bytes < 68) return 0; 
     90  if (length < 68) return 0; 
    9191 
    9292  granule_rate = (ogg_int64_t) INT32_LE_AT(&header[36]); 
     
    104104 
    105105static int 
    106 auto_vorbis (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    107 { 
    108   unsigned char * header = op->packet
     106auto_vorbis (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     107{ 
     108  unsigned char * header = data
    109109  ogg_int64_t granule_rate = 0; 
    110110 
    111   if (op->bytes < 30) return 0; 
     111  if (length < 30) return 0; 
    112112 
    113113  granule_rate = (ogg_int64_t) INT32_LE_AT(&header[12]); 
     
    135135 
    136136static int 
    137 auto_theora (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    138 { 
    139   unsigned char * header = op->packet
     137auto_theora (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     138{ 
     139  unsigned char * header = data
    140140  ogg_int32_t fps_numerator, fps_denominator; 
    141141  char keyframe_granule_shift = 0; 
     
    143143 
    144144  /* TODO: this should check against 42 for the relevant version numbers */ 
    145   if (op->bytes < 41) return 0; 
     145  if (length < 41) return 0; 
    146146 
    147147  fps_numerator = INT32_BE_AT(&header[22]); 
     
    179179 
    180180static int 
    181 auto_annodex (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
     181auto_annodex (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
    182182{ 
    183183  /* Apply a zero metric */ 
     
    188188 
    189189static int 
    190 auto_anxdata (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    191 { 
    192   unsigned char * header = op->packet
     190auto_anxdata (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     191{ 
     192  unsigned char * header = data
    193193  ogg_int64_t granule_rate_numerator = 0, granule_rate_denominator = 0; 
    194194 
    195   if (op->bytes < 28) return 0; 
     195  if (length < 28) return 0; 
    196196 
    197197  granule_rate_numerator = INT64_LE_AT(&header[8]); 
     
    210210 
    211211static int 
    212 auto_flac0 (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    213 { 
    214   unsigned char * header = op->packet
     212auto_flac0 (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     213{ 
     214  unsigned char * header = data
    215215  ogg_int64_t granule_rate = 0; 
    216216 
     
    229229 
    230230static int 
    231 auto_flac (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    232 { 
    233   unsigned char * header = op->packet
     231auto_flac (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     232{ 
     233  unsigned char * header = data
    234234  ogg_int64_t granule_rate = 0; 
    235235  int numheaders; 
    236236 
    237   if (op->bytes < 51) return 0; 
     237  if (length < 51) return 0; 
    238238 
    239239  granule_rate = (ogg_int64_t) (header[27] << 12) | (header[28] << 4) |  
     
    256256 */ 
    257257static int 
    258 auto_oggpcm2 (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    259 { 
    260   unsigned char * header = op->packet
     258auto_oggpcm2 (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     259{ 
     260  unsigned char * header = data
    261261  ogg_int64_t granule_rate; 
    262262 
    263   if (op->bytes < 28) return 0; 
     263  if (length < 28) return 0; 
    264264 
    265265  granule_rate = (ogg_int64_t) INT32_BE_AT(&header[16]); 
     
    276276 
    277277static int 
    278 auto_celt (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    279 { 
    280   unsigned char * header = op->packet
     278auto_celt (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     279{ 
     280  unsigned char * header = data
    281281  ogg_int64_t granule_rate = 0; 
    282282  int numheaders; 
    283283 
    284   if (op->bytes < 56) return 0; 
     284  if (length < 56) return 0; 
    285285 
    286286  granule_rate = (ogg_int64_t) INT32_LE_AT(&header[40]); 
     
    298298 
    299299static int 
    300 auto_cmml (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    301 { 
    302   unsigned char * header = op->packet
     300auto_cmml (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     301{ 
     302  unsigned char * header = data
    303303  ogg_int64_t granule_rate_numerator = 0, granule_rate_denominator = 0; 
    304304  int granuleshift; 
    305305 
    306   if (op->bytes < 28) return 0; 
     306  if (length < 28) return 0; 
    307307 
    308308  granule_rate_numerator = INT64_LE_AT(&header[12]); 
    309309  granule_rate_denominator = INT64_LE_AT(&header[20]); 
    310   if (op->bytes > 28) 
     310  if (length > 28) 
    311311    granuleshift = (int)header[28]; 
    312312  else 
     
    329329 
    330330static int 
    331 auto_kate (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    332 { 
    333   unsigned char * header = op->packet
     331auto_kate (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     332{ 
     333  unsigned char * header = data
    334334  ogg_int32_t gps_numerator, gps_denominator; 
    335335  unsigned char granule_shift = 0; 
    336336  int numheaders; 
    337337 
    338   if (op->bytes < 64) return 0; 
     338  if (length < 64) return 0; 
    339339 
    340340  gps_numerator = INT32_LE_AT(&header[24]); 
     
    359359 
    360360static int 
    361 auto_dirac (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
     361auto_dirac (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
    362362{ 
    363363  char keyframe_granule_shift = 32; 
     
    367367  info = malloc(sizeof(dirac_info)); 
    368368 
    369   dirac_parse_info(info, op->packet, op->bytes); 
    370  
     369  dirac_parse_info(info, data, length); 
    371370 
    372371  /* 
     
    393392 
    394393static int 
    395 auto_fisbone (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    396 { 
    397   unsigned char * header = op->packet
     394auto_fisbone (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     395{ 
     396  unsigned char * header = data
    398397  long fisbone_serialno; /* The serialno referred to in this fisbone */ 
    399398  ogg_int64_t granule_rate_numerator = 0, granule_rate_denominator = 0; 
    400399  int granuleshift, numheaders; 
    401400 
    402   if (op->bytes < 48) return 0; 
     401  if (length < 48) return 0; 
    403402 
    404403  fisbone_serialno = (long) INT32_LE_AT(&header[12]); 
     
    430429 
    431430static int 
    432 auto_fishead (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    433 
    434   if (!op->b_o_s) 
    435   { 
    436     return auto_fisbone(oggz, op, serialno, user_data); 
    437   } 
    438    
     431auto_fishead (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) 
     432
    439433  oggz_set_granulerate (oggz, serialno, 0, 1); 
    440434 
     
    11261120  if (content < 0 || content >= OGGZ_CONTENT_UNKNOWN) { 
    11271121    return 0; 
    1128   } 
    1129  
    1130   oggz_auto_codec_ident[content].reader(oggz, op, serialno, user_data); 
    1131   return 0; 
     1122  } else if (content == OGGZ_CONTENT_SKELETON && !op->b_o_s) { 
     1123    return auto_fisbone(oggz, serialno, op->packet, op->bytes, user_data); 
     1124  } else { 
     1125    return oggz_auto_codec_ident[content].reader(oggz, serialno, op->packet, op->bytes, user_data); 
     1126  } 
    11321127} 
    11331128 
  • liboggz/trunk/src/liboggz/oggz_stream_private.h

    r3391 r3717  
    3636typedef struct _oggz_stream_t oggz_stream_t; 
    3737 
     38typedef int (*OggzReadBOS) (OGGZ * oggz, long serialno, 
     39                            unsigned char * data, long length, 
     40                            void * user_data); 
     41 
    3842typedef struct { 
    3943  const char      *bos_str; 
    4044  int             bos_str_len; 
    4145  const char      *content_type; 
    42   OggzReadPacket  reader; 
     46  OggzReadBOS     reader; 
    4347  ogg_int64_t     (*calculator)(ogg_int64_t now, oggz_stream_t *stream,  
    4448                  ogg_packet *op);