annotate src/libmad-0.15.1b/stream.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 545efbb81310
children
rev   line source
cannam@85 1 /*
cannam@85 2 * libmad - MPEG audio decoder library
cannam@85 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
cannam@85 4 *
cannam@85 5 * This program is free software; you can redistribute it and/or modify
cannam@85 6 * it under the terms of the GNU General Public License as published by
cannam@85 7 * the Free Software Foundation; either version 2 of the License, or
cannam@85 8 * (at your option) any later version.
cannam@85 9 *
cannam@85 10 * This program is distributed in the hope that it will be useful,
cannam@85 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@85 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@85 13 * GNU General Public License for more details.
cannam@85 14 *
cannam@85 15 * You should have received a copy of the GNU General Public License
cannam@85 16 * along with this program; if not, write to the Free Software
cannam@85 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
cannam@85 18 *
cannam@85 19 * $Id: stream.c,v 1.12 2004/02/05 09:02:39 rob Exp $
cannam@85 20 */
cannam@85 21
cannam@85 22 # ifdef HAVE_CONFIG_H
cannam@85 23 # include "config.h"
cannam@85 24 # endif
cannam@85 25
cannam@85 26 # include "global.h"
cannam@85 27
cannam@85 28 # include <stdlib.h>
cannam@85 29
cannam@85 30 # include "bit.h"
cannam@85 31 # include "stream.h"
cannam@85 32
cannam@85 33 /*
cannam@85 34 * NAME: stream->init()
cannam@85 35 * DESCRIPTION: initialize stream struct
cannam@85 36 */
cannam@85 37 void mad_stream_init(struct mad_stream *stream)
cannam@85 38 {
cannam@85 39 stream->buffer = 0;
cannam@85 40 stream->bufend = 0;
cannam@85 41 stream->skiplen = 0;
cannam@85 42
cannam@85 43 stream->sync = 0;
cannam@85 44 stream->freerate = 0;
cannam@85 45
cannam@85 46 stream->this_frame = 0;
cannam@85 47 stream->next_frame = 0;
cannam@85 48 mad_bit_init(&stream->ptr, 0);
cannam@85 49
cannam@85 50 mad_bit_init(&stream->anc_ptr, 0);
cannam@85 51 stream->anc_bitlen = 0;
cannam@85 52
cannam@85 53 stream->main_data = 0;
cannam@85 54 stream->md_len = 0;
cannam@85 55
cannam@85 56 stream->options = 0;
cannam@85 57 stream->error = MAD_ERROR_NONE;
cannam@85 58 }
cannam@85 59
cannam@85 60 /*
cannam@85 61 * NAME: stream->finish()
cannam@85 62 * DESCRIPTION: deallocate any dynamic memory associated with stream
cannam@85 63 */
cannam@85 64 void mad_stream_finish(struct mad_stream *stream)
cannam@85 65 {
cannam@85 66 if (stream->main_data) {
cannam@85 67 free(stream->main_data);
cannam@85 68 stream->main_data = 0;
cannam@85 69 }
cannam@85 70
cannam@85 71 mad_bit_finish(&stream->anc_ptr);
cannam@85 72 mad_bit_finish(&stream->ptr);
cannam@85 73 }
cannam@85 74
cannam@85 75 /*
cannam@85 76 * NAME: stream->buffer()
cannam@85 77 * DESCRIPTION: set stream buffer pointers
cannam@85 78 */
cannam@85 79 void mad_stream_buffer(struct mad_stream *stream,
cannam@85 80 unsigned char const *buffer, unsigned long length)
cannam@85 81 {
cannam@85 82 stream->buffer = buffer;
cannam@85 83 stream->bufend = buffer + length;
cannam@85 84
cannam@85 85 stream->this_frame = buffer;
cannam@85 86 stream->next_frame = buffer;
cannam@85 87
cannam@85 88 stream->sync = 1;
cannam@85 89
cannam@85 90 mad_bit_init(&stream->ptr, buffer);
cannam@85 91 }
cannam@85 92
cannam@85 93 /*
cannam@85 94 * NAME: stream->skip()
cannam@85 95 * DESCRIPTION: arrange to skip bytes before the next frame
cannam@85 96 */
cannam@85 97 void mad_stream_skip(struct mad_stream *stream, unsigned long length)
cannam@85 98 {
cannam@85 99 stream->skiplen += length;
cannam@85 100 }
cannam@85 101
cannam@85 102 /*
cannam@85 103 * NAME: stream->sync()
cannam@85 104 * DESCRIPTION: locate the next stream sync word
cannam@85 105 */
cannam@85 106 int mad_stream_sync(struct mad_stream *stream)
cannam@85 107 {
cannam@85 108 register unsigned char const *ptr, *end;
cannam@85 109
cannam@85 110 ptr = mad_bit_nextbyte(&stream->ptr);
cannam@85 111 end = stream->bufend;
cannam@85 112
cannam@85 113 while (ptr < end - 1 &&
cannam@85 114 !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0))
cannam@85 115 ++ptr;
cannam@85 116
cannam@85 117 if (end - ptr < MAD_BUFFER_GUARD)
cannam@85 118 return -1;
cannam@85 119
cannam@85 120 mad_bit_init(&stream->ptr, ptr);
cannam@85 121
cannam@85 122 return 0;
cannam@85 123 }
cannam@85 124
cannam@85 125 /*
cannam@85 126 * NAME: stream->errorstr()
cannam@85 127 * DESCRIPTION: return a string description of the current error condition
cannam@85 128 */
cannam@85 129 char const *mad_stream_errorstr(struct mad_stream const *stream)
cannam@85 130 {
cannam@85 131 switch (stream->error) {
cannam@85 132 case MAD_ERROR_NONE: return "no error";
cannam@85 133
cannam@85 134 case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)";
cannam@85 135 case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer";
cannam@85 136
cannam@85 137 case MAD_ERROR_NOMEM: return "not enough memory";
cannam@85 138
cannam@85 139 case MAD_ERROR_LOSTSYNC: return "lost synchronization";
cannam@85 140 case MAD_ERROR_BADLAYER: return "reserved header layer value";
cannam@85 141 case MAD_ERROR_BADBITRATE: return "forbidden bitrate value";
cannam@85 142 case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value";
cannam@85 143 case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value";
cannam@85 144
cannam@85 145 case MAD_ERROR_BADCRC: return "CRC check failed";
cannam@85 146 case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value";
cannam@85 147 case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index";
cannam@85 148 case MAD_ERROR_BADMODE: return "bad bitrate/mode combination";
cannam@85 149 case MAD_ERROR_BADFRAMELEN: return "bad frame length";
cannam@85 150 case MAD_ERROR_BADBIGVALUES: return "bad big_values count";
cannam@85 151 case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type";
cannam@85 152 case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info";
cannam@85 153 case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer";
cannam@85 154 case MAD_ERROR_BADPART3LEN: return "bad audio data length";
cannam@85 155 case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select";
cannam@85 156 case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun";
cannam@85 157 case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS";
cannam@85 158 }
cannam@85 159
cannam@85 160 return 0;
cannam@85 161 }