00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "common.h"
00034 #include "structs.h"
00035
00036 #include <stdlib.h>
00037 #include <string.h>
00038 #include "bits.h"
00039
00040
00041 void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size)
00042 {
00043 uint32_t tmp;
00044
00045 if (ld == NULL)
00046 return;
00047
00048 memset(ld, 0, sizeof(bitfile));
00049
00050 if (buffer_size == 0 || _buffer == NULL)
00051 {
00052 ld->error = 1;
00053 ld->no_more_reading = 1;
00054 return;
00055 }
00056
00057 ld->buffer = faad_malloc((buffer_size+12)*sizeof(uint8_t));
00058 memset(ld->buffer, 0, (buffer_size+12)*sizeof(uint8_t));
00059 memcpy(ld->buffer, _buffer, buffer_size*sizeof(uint8_t));
00060
00061 ld->buffer_size = buffer_size;
00062
00063 tmp = getdword((uint32_t*)ld->buffer);
00064 ld->bufa = tmp;
00065
00066 tmp = getdword((uint32_t*)ld->buffer + 1);
00067 ld->bufb = tmp;
00068
00069 ld->start = (uint32_t*)ld->buffer;
00070 ld->tail = ((uint32_t*)ld->buffer + 2);
00071
00072 ld->bits_left = 32;
00073
00074 ld->bytes_used = 0;
00075 ld->no_more_reading = 0;
00076 ld->error = 0;
00077 }
00078
00079 void faad_endbits(bitfile *ld)
00080 {
00081 if (ld)
00082 {
00083 if (ld->buffer)
00084 {
00085 faad_free(ld->buffer);
00086 ld->buffer = NULL;
00087 }
00088 }
00089 }
00090
00091 uint32_t faad_get_processed_bits(bitfile *ld)
00092 {
00093 return (uint32_t)(8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left));
00094 }
00095
00096 uint8_t faad_byte_align(bitfile *ld)
00097 {
00098 uint8_t remainder = (uint8_t)((32 - ld->bits_left) % 8);
00099
00100 if (remainder)
00101 {
00102 faad_flushbits(ld, 8 - remainder);
00103 return (8 - remainder);
00104 }
00105 return 0;
00106 }
00107
00108 void faad_flushbits_ex(bitfile *ld, uint32_t bits)
00109 {
00110 uint32_t tmp;
00111
00112 ld->bufa = ld->bufb;
00113 if (ld->no_more_reading == 0)
00114 {
00115 tmp = getdword(ld->tail);
00116 ld->tail++;
00117 } else {
00118 tmp = 0;
00119 }
00120 ld->bufb = tmp;
00121 ld->bits_left += (32 - bits);
00122 ld->bytes_used += 4;
00123 if (ld->bytes_used == ld->buffer_size)
00124 ld->no_more_reading = 1;
00125 if (ld->bytes_used > ld->buffer_size)
00126 ld->error = 1;
00127 }
00128
00129
00130 void faad_rewindbits(bitfile *ld)
00131 {
00132 uint32_t tmp;
00133
00134 tmp = ld->start[0];
00135 #ifndef ARCH_IS_BIG_ENDIAN
00136 BSWAP(tmp);
00137 #endif
00138 ld->bufa = tmp;
00139
00140 tmp = ld->start[1];
00141 #ifndef ARCH_IS_BIG_ENDIAN
00142 BSWAP(tmp);
00143 #endif
00144 ld->bufb = tmp;
00145 ld->bits_left = 32;
00146 ld->tail = &ld->start[2];
00147 ld->bytes_used = 0;
00148 ld->no_more_reading = 0;
00149 }
00150
00151 uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
00152 DEBUGDEC)
00153 {
00154 uint16_t i;
00155 uint8_t temp;
00156 uint16_t bytes = (uint16_t)bits / 8;
00157 uint8_t remainder = (uint8_t)bits % 8;
00158
00159 uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t));
00160
00161 for (i = 0; i < bytes; i++)
00162 {
00163 buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg));
00164 }
00165
00166 if (remainder)
00167 {
00168 temp = (uint8_t)faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder);
00169
00170 buffer[bytes] = temp;
00171 }
00172
00173 return buffer;
00174 }
00175
00176 #ifdef DRM
00177
00178 void *faad_origbitbuffer(bitfile *ld)
00179 {
00180 return (void*)ld->start;
00181 }
00182
00183
00184 uint32_t faad_origbitbuffer_size(bitfile *ld)
00185 {
00186 return ld->buffer_size;
00187 }
00188 #endif
00189
00190
00191 void faad_initbits_rev(bitfile *ld, void *buffer,
00192 uint32_t bits_in_buffer)
00193 {
00194 uint32_t tmp;
00195 int32_t index;
00196
00197 ld->buffer_size = bit2byte(bits_in_buffer);
00198
00199 index = (bits_in_buffer+31)/32 - 1;
00200
00201 ld->start = (uint32_t*)buffer + index - 2;
00202
00203 tmp = getdword((uint32_t*)buffer + index);
00204 ld->bufa = tmp;
00205
00206 tmp = getdword((uint32_t*)buffer + index - 1);
00207 ld->bufb = tmp;
00208
00209 ld->tail = (uint32_t*)buffer + index;
00210
00211 ld->bits_left = bits_in_buffer % 32;
00212 if (ld->bits_left == 0)
00213 ld->bits_left = 32;
00214
00215 ld->bytes_used = 0;
00216 ld->no_more_reading = 0;
00217 ld->error = 0;
00218 }