int main(int argc, char *argv[]) { FILE *f = fopen(argv[1], "rb"); OggReader *reader = oggreader_open(f); BitstreamReader *packet = bs_substream_new(BS_LITTLE_ENDIAN); ogg_status result; do { result = oggreader_next_packet(reader, packet); if (result < 0) { fprintf(stderr, "Error : %s\n", ogg_error(result)); } else if (result == OGG_OK) { printf("packet size %u\n", packet->input.substream->buffer_size); } } while (result == OGG_OK); packet->close(packet); oggreader_close(reader); fclose(f); return 0; }
static int OGG_open(Sound_Sample *sample, const char *ext) { int rc; double total_time; OggVorbis_File *vf; vorbis_info *info; Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; vf = (OggVorbis_File *) malloc(sizeof (OggVorbis_File)); BAIL_IF_MACRO(vf == NULL, ERR_OUT_OF_MEMORY, 0); rc = ov_open_callbacks(internal->rw, vf, NULL, 0, RWops_ogg_callbacks); if (rc != 0) { #if (defined DEBUG_CHATTER) SNDDBG(("OGG: can't grok data. reason: [%s].\n", ogg_error(rc))); #endif free(vf); BAIL_MACRO("OGG: Not valid Ogg Vorbis data.", 0); } /* if */ info = ov_info(vf, -1); if (info == NULL) { ov_clear(vf); free(vf); BAIL_MACRO("OGG: failed to retrieve bitstream info", 0); } /* if */ output_ogg_comments(vf); SNDDBG(("OGG: bitstream version == (%d).\n", info->version)); SNDDBG(("OGG: bitstream channels == (%d).\n", info->channels)); SNDDBG(("OGG: bitstream sampling rate == (%ld).\n", info->rate)); SNDDBG(("OGG: seekable == {%s}.\n", ov_seekable(vf) ? "TRUE" : "FALSE")); SNDDBG(("OGG: number of logical bitstreams == (%ld).\n", ov_streams(vf))); SNDDBG(("OGG: serial number == (%ld).\n", ov_serialnumber(vf, -1))); SNDDBG(("OGG: total seconds of sample == (%f).\n", ov_time_total(vf, -1))); internal->decoder_private = vf; sample->flags = SOUND_SAMPLEFLAG_CANSEEK; sample->actual.rate = (uint32_t) info->rate; sample->actual.channels = (uint8_t) info->channels; total_time = ov_time_total(vf, -1); if (OV_EINVAL == total_time) internal->total_time = -1; else internal->total_time = (int32_t)(total_time); /* * Since we might have more than one logical bitstream in the OGG file, * and these bitstreams may be in different formats, we might be * converting two or three times: once in vorbisfile, once again in * SDL_sound, and perhaps a third time to get it to the sound device's * format. That's wickedly inefficient. * * To combat this a little, if the user specified a desired format, we * claim that to be the "actual" format of the collection of logical * bitstreams. This means that VorbisFile will do a conversion as * necessary, and SDL_sound will not. If the user didn't specify a * desired format, then we pretend the "actual" format is something that * OGG files are apparently commonly encoded in. */ sample->actual.format = (sample->desired.format == 0) ? AUDIO_S16SYS : sample->desired.format; return(1); } /* OGG_open */