| 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: |
|---|
| 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: |
|---|
| 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 = |
|---|
| 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 | } |
|---|