Changeset 3747

Show
Ignore:
Timestamp:
2008-10-29 04:06:02 (2 months ago)
Author:
conrad
Message:

anx_import_ogg: use oggz functions instead of reading bos headers directly

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libannodex/trunk/src/importers/anx_import_ogg.c

    r3743 r3747  
    317317  AnxSource * m = aod->anx_source; 
    318318  AnxSourceTrack * track = NULL; 
     319  OggzStreamContent content; 
    319320  int need_insert = 1; 
    320321  int got_headers = 0; 
     
    326327 
    327328  if (op->b_o_s) { 
    328     if (!strncmp ((char *)header, "CMML", 5)) { 
     329    content = oggz_stream_get_content (oggz, serialno); 
     330 
     331    if (content == OGGZ_CONTENT_CMML) { 
    329332      /* Don't insert this into the media */ 
    330333      need_insert = 0; 
    331334         
    332335      aod->cmml_serialno = serialno; 
    333  
    334       /* Check the CMML header is of correct length */ 
    335       if (op->bytes > 28) 
    336         aod->cmml_granuleshift = (int)header[28]; 
    337       else 
    338         aod->cmml_granuleshift = 0; 
     336      aod->cmml_granuleshift = oggz_get_granuleshift (oggz, serialno); 
    339337 
    340338#ifdef DEBUG 
     
    356354      track = &(aot->source_track); 
    357355      track->eos = 0; 
    358  
    359       if (!strncmp ((char *)&header[1], "vorbis", 6)) { 
    360         track->content_type = anxogg_strdup (VORBIS_CONTENT_TYPE); 
    361         track->granule_rate_n = (anx_int64_t) INT32_LE_AT(&header[12]); 
    362         track->granule_rate_d = 1; 
    363         track->nr_header_packets = 3; 
     356      track->nr_header_packets = oggz_stream_get_numheaders (oggz, serialno); 
     357      oggz_get_granulerate (oggz, serialno, 
     358                            &track->granule_rate_n, 
     359                            &track->granule_rate_d); 
     360      track->granuleshift = oggz_get_granuleshift (oggz, serialno); 
     361      track->content_type = anxogg_strdup (oggz_stream_get_content_type (oggz, serialno)); 
     362 
     363      switch (content) { 
     364      case OGGZ_CONTENT_VORBIS: 
    364365        if (m->start_time < 1.0) { 
    365366          track->basegranule = 0; 
     
    368369        } 
    369370        track->preroll = 2; 
    370         track->granuleshift = 0; 
    371       } else if (!strncmp ((char *)&op->packet[0], "Speex   ", 8)) { 
    372         track->content_type = anxogg_strdup (SPEEX_CONTENT_TYPE); 
    373         track->granule_rate_n = (ogg_int64_t) INT32_LE_AT(&header[36]); 
    374         track->granule_rate_d = 1; 
    375         track->nr_header_packets = 2 + (ogg_int64_t) INT32_LE_AT(&header[68]); 
     371        break; 
     372      case OGGZ_CONTENT_SPEEX: 
    376373        track->basegranule = 0; 
    377374        track->preroll = 3; 
    378         track->granuleshift = 0; 
    379       } else if (!strncmp ((char *)&op->packet[1], "theora", 6)) { 
    380         char keyframe_granule_shift = 0; 
    381         track->content_type = anxogg_strdup (THEORA_CONTENT_TYPE); 
    382 #if USE_THEORA_PRE_ALPHA_3_FORMAT 
    383         /* old header format, used by Theora alpha 2 and earlier */ 
    384         keyframe_granule_shift =  (header[36] & 0xf8) >> 3; 
    385 #else 
    386         keyframe_granule_shift =  (header[40] & 0x03) /* 00000011 */ << 3; 
    387         keyframe_granule_shift |= (header[41] & 0xe0) /* 11100000 */ >> 5; 
    388 #endif 
    389  
    390 #if USE_ANNODEX2_GRANULERATE 
    391         track->granule_rate_n = INT32_BE_AT(&header[22]) * 
    392           (1 << keyframe_granule_shift) / 1000000; 
    393         track->granule_rate_d = INT32_BE_AT(&header[26]) / 1000000; 
    394 #else /* anx v3 */ 
    395         track->granule_rate_n = INT32_BE_AT(&header[22]); 
    396         track->granule_rate_d = INT32_BE_AT(&header[26]); 
    397 #endif 
    398         track->nr_header_packets = 3; 
     375        break; 
     376      case OGGZ_CONTENT_THEORA: 
    399377        track->basegranule = 0; 
    400378        track->preroll = 0; 
    401         track->granuleshift = keyframe_granule_shift
    402       } else if (!strncmp ((char *)&op->packet[0], "fishead", 8)) { 
     379        break
     380      case OGGZ_CONTENT_SKELETON: 
    403381        need_insert = 0; 
    404382        aod->skeleton_serialno = serialno; 
    405       } else if (!strncmp ((char *)&op->packet[0], "AnxData", 7)) { 
    406         AnxParams * params; 
    407         long n; 
    408         char * buf; 
    409  
    410         /* Mark this track as anxv2, and don't copy the AnxData packet 
    411          * into the bitstream */ 
    412         aot->anxv2_ignore_packet = 1; 
    413  
    414         /* Set default values, these will be overwritten if the track 
    415          * actually contains a content type we can parse */ 
    416  
    417         /* Ensure params is NUL terminated */ 
    418         n = op->bytes - ANX_DATA_SIZE; 
    419         buf = anx_malloc (n+1); 
    420         memcpy (buf, (char *)header + ANX_DATA_SIZE, n); 
    421         buf[n] = '\0'; 
    422  
    423         params = anx_params_new_parse (buf, ANX_PARAMS_HEADERS); 
    424         track->content_type = 
     383        break; 
     384      case OGGZ_CONTENT_ANX2: /* AnxData */ 
     385        { 
     386          AnxParams * params; 
     387          long n; 
     388          char * buf; 
     389 
     390          /* Mark this track as anxv2, and don't copy the AnxData packet 
     391           * into the bitstream */ 
     392          aot->anxv2_ignore_packet = 1; 
     393 
     394          /* Set default values, these will be overwritten if the track 
     395           * actually contains a content type we can parse */ 
     396 
     397          /* Ensure params is NUL terminated */ 
     398          n = op->bytes - ANX_DATA_SIZE; 
     399          buf = anx_malloc (n+1); 
     400          memcpy (buf, (char *)header + ANX_DATA_SIZE, n); 
     401          buf[n] = '\0'; 
     402 
     403          params = anx_params_new_parse (buf, ANX_PARAMS_HEADERS); 
     404          track->content_type = 
    425405                 anxogg_strdup (anx_params_get (params, "Content-Type")); 
    426         track->id = 
     406          track->id = 
    427407                 anxogg_strdup (anx_params_get (params, "ID")); 
    428         anx_params_free (params); 
    429  
    430         anx_free (buf); 
    431  
    432         track->granule_rate_n = INT64_LE_AT(&header[8]); 
    433         track->granule_rate_d = INT64_LE_AT(&header[16]); 
    434         track->nr_header_packets = INT32_LE_AT(&header[24]); 
    435         track->preroll = 0; 
    436         track->granuleshift = 0; 
    437  
    438         if (!strcmp (track->content_type, CMML_CONTENT_TYPE)) { 
    439            need_insert = 0; 
    440            aod->cmml_serialno = serialno; 
    441            aod->cmml_granuleshift = 0; 
    442 #ifdef DEBUG 
    443            fprintf(aod->df, 
    444                       "read_packet_headers: setting need_keygranule to 0\n"); 
    445 #endif 
    446                  aod->cmml_need_keygranule = 0; 
    447               } 
    448  
    449       }  
    450       else if  
    451       ( 
    452         !strncmp ((char *)&op->packet[1], "video", 5)  
    453         &&  
    454                     !strncmp ((char *)&op->packet[9], "XVID", 4) 
    455       ) { 
    456         track->content_type = anxogg_strdup (XVID_CONTENT_TYPE); 
    457         track->granule_rate_n = (ogg_int64_t) 25; 
    458         track->granule_rate_d = 1; 
    459         track->nr_header_packets = 2; 
    460         track->basegranule = 0; 
    461         track->preroll = 0; 
    462         track->granuleshift = 0; 
    463       } else { 
    464         anx_free (aot); 
    465         return OGGZ_STOP_ERR; 
     408          anx_params_free (params); 
     409 
     410          anx_free (buf); 
     411 
     412          track->preroll = 0; 
     413 
     414          if (!strcmp (track->content_type, CMML_CONTENT_TYPE)) { 
     415             need_insert = 0; 
     416             aod->cmml_serialno = serialno; 
     417             aod->cmml_granuleshift = 0; 
     418#ifdef DEBUG 
     419             fprintf(aod->df, 
     420                     "read_packet_headers: setting need_keygranule to 0\n"); 
     421#endif 
     422                     aod->cmml_need_keygranule = 0; 
     423          } 
     424        } 
     425        break; 
     426      default: 
     427        /* Content type not known by Oggz */ 
     428        if ( !strncmp ((char *)&op->packet[1], "video", 5) && !strncmp ((char *)&op->packet[9], "XVID", 4)) { 
     429          track->content_type = anxogg_strdup (XVID_CONTENT_TYPE); 
     430          track->granule_rate_n = (ogg_int64_t) 25; 
     431          track->granule_rate_d = 1; 
     432          track->nr_header_packets = 2; 
     433          track->basegranule = 0; 
     434          track->preroll = 0; 
     435          track->granuleshift = 0; 
     436        } else { 
     437          anx_free (aot); 
     438          return OGGZ_STOP_ERR; 
     439        } 
    466440      } 
    467441