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; }
int OggFlacDecoder_init(decoders_OggFlacDecoder *self, PyObject *args, PyObject *kwds) { char* filename; ogg_status result; uint16_t header_packets; self->ogg_stream = NULL; self->ogg_file = NULL; self->subframe_data = aa_int_new(); self->residuals = a_int_new(); self->qlp_coeffs = a_int_new(); self->framelist_data = a_int_new(); self->audiotools_pcm = NULL; self->packet = br_substream_new(BS_BIG_ENDIAN); self->stream_finalized = 0; if (!PyArg_ParseTuple(args, "si", &filename, &(self->channel_mask))) return -1; if (self->channel_mask < 0) { PyErr_SetString(PyExc_ValueError, "channel_mask must be >= 0"); return -1; } self->ogg_file = fopen(filename, "rb"); if (self->ogg_file == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); return -1; } else { self->ogg_stream = oggreader_open(self->ogg_file); } /*the first packet should be the FLAC's STREAMINFO*/ if ((result = oggreader_next_packet(self->ogg_stream, self->packet)) == OGG_OK) { if (!oggflac_read_streaminfo(self->packet, &(self->streaminfo), &header_packets)) return -1; } else { PyErr_SetString(ogg_exception(result), ogg_strerror(result)); return -1; } /*skip subsequent header packets*/ for (; header_packets > 0; header_packets--) { if ((result = oggreader_next_packet(self->ogg_stream, self->packet)) != OGG_OK) { PyErr_SetString(ogg_exception(result), ogg_strerror(result)); return -1; } } /*initialize the output MD5 sum*/ audiotools__MD5Init(&(self->md5)); /*add callback for CRC16 calculation*/ br_add_callback(self->packet, (bs_callback_f)flac_crc16, &(self->crc16)); /*setup a framelist generator function*/ if ((self->audiotools_pcm = open_audiotools_pcm()) == NULL) return -1; /*mark stream as not closed and ready for reading*/ self->closed = 0; return 0; }
int main(int argc, char* argv[]) { FILE* ogg_file; OggReader* ogg_stream = NULL; BitstreamReader* packet = NULL; struct flac_STREAMINFO streaminfo; uint16_t header_packets; a_int* residuals = NULL; a_int* qlp_coeffs = NULL; aa_int* subframe_data = NULL; a_int* framelist_data = NULL; ogg_status result; uint16_t crc16 = 0; FrameList_int_to_char_converter converter; unsigned pcm_size; unsigned output_data_size = 1; uint8_t* output_data = NULL; audiotools__MD5Context md5; unsigned char stream_md5sum[16]; const static unsigned char blank_md5sum[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; if (argc < 2) { fprintf(stderr, "*** Usage: %s <file.oga>\n", argv[0]); return 1; } /*open input file for reading*/ if ((ogg_file = fopen(argv[1], "rb")) == NULL) { fprintf(stderr, "*** %s: %s\n", argv[1], strerror(errno)); return 1; } else { /*open bitstream and setup temporary arrays/buffers*/ ogg_stream = oggreader_open(ogg_file); packet = br_substream_new(BS_BIG_ENDIAN); subframe_data = aa_int_new(); residuals = a_int_new(); qlp_coeffs = a_int_new(); framelist_data = a_int_new(); output_data = malloc(output_data_size); } /*the first packet should be the FLAC's STREAMINFO*/ if ((result = oggreader_next_packet(ogg_stream, packet)) == OGG_OK) { if (!oggflac_read_streaminfo(packet, &streaminfo, &header_packets)) { goto error; } else { converter = FrameList_get_int_to_char_converter( streaminfo.bits_per_sample, 0, 1); } } else { fprintf(stderr, "*** Error: %s\n", ogg_strerror(result)); goto error; } /*skip subsequent header packets*/ for (; header_packets > 0; header_packets--) { if ((result = oggreader_next_packet(ogg_stream, packet)) != OGG_OK) { fprintf(stderr, "*** Error: %s\n", ogg_strerror(result)); goto error; } } /*initialize the output MD5 sum*/ audiotools__MD5Init(&md5); /*add callback for CRC16 calculation*/ br_add_callback(packet, (bs_callback_f)flac_crc16, &crc16); /*decode the next FrameList from the stream*/ result = oggreader_next_packet(ogg_stream, packet); while (result != OGG_STREAM_FINISHED) { if (result == OGG_OK) { flac_status flac_status; struct flac_frame_header frame_header; unsigned channel; subframe_data->reset(subframe_data); if (!setjmp(*br_try(packet))) { /*read frame header*/ if ((flac_status = flacdec_read_frame_header(packet, &streaminfo, &frame_header)) != OK) { fprintf(stderr, "*** Error: %s\n", FlacDecoder_strerror(flac_status)); br_etry(packet); goto error; } /*read 1 subframe per channel*/ for (channel = 0; channel < frame_header.channel_count; channel++) if ((flac_status = flacdec_read_subframe( packet, qlp_coeffs, residuals, frame_header.block_size, flacdec_subframe_bits_per_sample(&frame_header, channel), subframe_data->append(subframe_data))) != OK) { fprintf(stderr, "*** Error: %s\n", FlacDecoder_strerror(flac_status)); br_etry(packet); goto error; } br_etry(packet); } else { br_etry(packet); fprintf(stderr, "*** I/O Error reading FLAC frame\n"); goto error; } /*handle difference channels, if any*/ flacdec_decorrelate_channels(frame_header.channel_assignment, subframe_data, framelist_data); /*check CRC-16*/ packet->byte_align(packet); packet->read(packet, 16); if (crc16 != 0) { fprintf(stderr, "*** Error: invalid checksum in frame\n"); goto error; } /*turn FrameList into string of output*/ pcm_size = (streaminfo.bits_per_sample / 8) * framelist_data->len; if (pcm_size > output_data_size) { output_data_size = pcm_size; output_data = realloc(output_data, output_data_size); } FrameList_samples_to_char(output_data, framelist_data->_, converter, framelist_data->len, streaminfo.bits_per_sample); /*update MD5 sum*/ audiotools__MD5Update(&md5, output_data, pcm_size); /*output string to stdout*/ fwrite(output_data, sizeof(unsigned char), pcm_size, stdout); result = oggreader_next_packet(ogg_stream, packet); } else { /*some error reading Ogg stream*/ fprintf(stderr, "*** Error: %s\n", ogg_strerror(result)); goto error; } } /*Ogg stream is finished so verify stream's MD5 sum*/ audiotools__MD5Final(stream_md5sum, &md5); if (!((memcmp(streaminfo.md5sum, blank_md5sum, 16) == 0) || (memcmp(stream_md5sum, streaminfo.md5sum, 16) == 0))) { fprintf(stderr, "*** MD5 mismatch at end of stream\n"); goto error; } /*close streams, temporary buffers*/ oggreader_close(ogg_stream); packet->close(packet); subframe_data->del(subframe_data); residuals->del(residuals); qlp_coeffs->del(qlp_coeffs); framelist_data->del(framelist_data); free(output_data); return 0; error: oggreader_close(ogg_stream); packet->close(packet); subframe_data->del(subframe_data); residuals->del(residuals); qlp_coeffs->del(qlp_coeffs); framelist_data->del(framelist_data); free(output_data); return 1; }
int VorbisDecoder_init(decoders_VorbisDecoder *self, PyObject *args, PyObject *kwds) { char* filename; ogg_status ogg_result; vorbis_status vorbis_result; self->ogg_stream = NULL; self->ogg_file = NULL; self->packet = br_substream_new(BS_LITTLE_ENDIAN); if (!PyArg_ParseTuple(args, "s", &filename)) goto error; self->ogg_file = fopen(filename, "rb"); if (self->ogg_file == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); goto error; } else { self->ogg_stream = oggreader_open(self->ogg_file); } /*read identification packet*/ if ((ogg_result = oggreader_next_packet(self->ogg_stream, self->packet)) == OGG_OK) { if ((vorbis_result = vorbis_read_identification_packet(self->packet, &(self->identification))) != VORBIS_OK) { PyErr_SetString(vorbis_exception(vorbis_result), vorbis_strerror(vorbis_result)); goto error; } } else { PyErr_SetString(ogg_exception(ogg_result), ogg_strerror(ogg_result)); goto error; } /*skip comments packet, but ensure it's positioned properly*/ if ((ogg_result = oggreader_next_packet(self->ogg_stream, self->packet)) == OGG_OK) { if (vorbis_read_common_header(self->packet) != 3) { PyErr_SetString(PyExc_ValueError, "comment not second Ogg packet"); goto error; } } else { PyErr_SetString(ogg_exception(ogg_result), ogg_strerror(ogg_result)); goto error; } /*read setup header*/ if ((ogg_result = oggreader_next_packet(self->ogg_stream, self->packet)) == OGG_OK) { if ((vorbis_result = vorbis_read_setup_packet(self->packet)) != VORBIS_OK) { PyErr_SetString(vorbis_exception(vorbis_result), vorbis_strerror(vorbis_result)); goto error; } } else { PyErr_SetString(ogg_exception(ogg_result), ogg_strerror(ogg_result)); goto error; } return 0; error: return -1; }