buffer - みる会図書館


検索対象: Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-
5件見つかりました。

1. Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-

第 2 章 / * セの上位ビットから順次出力 * 初回ループでは端数 ( 出力に必要なビット数 ) 分を埋め出力 * 2 回目以降は 8 とれ単位で出力 */ while (n—bits > = stream—>bit—count) { n—bits = n_bits stream—>bit_count ; stream—>bit—buffer ー = (uint8—t) B 工 TSTREAM_GETLOWERBITS (stream—> bit—count , va1 > > n—bits) ; if (fputc (stream—>bit—buffer, stream—>fp) return B 工 TSTREAM_APIRESULT_IOERROR ; = EOF) { 248 247 246 245 244 243 = 8 ; 242 241 240 239 238 237 72 stream—>bit_count stream—>bit_buffer = 0 ; 実装編 この while ループは、ループの度に 1 バイトの出力を行う。出力バッファ while ループを抜けた残りの bit は、リスト 2.16 に示す処理でバッファ 下位 bit から取り出す処理を行う。 た、 B 工 TSTREAM-GETLOWERBITS マクロは第二引数の値から、第一引数で指定した数だけ 数 n-bit s は出力対象の値 val の bit 位置を出力しているかを示す力ウンタとなる。ま 象の 1 バイトデータを設定し、 fputc 関数を実行している。このループにおいて引数変 stream—>bit-buffer に B 工 TSTREAM-GETLOWERBITS マクロによって取り出した出力対 stream → bit-buffer に記録され、次回の書き出し処理への備えを行う。 250 251 252 253 254 2 4.2 リスト 2.16 残った bit の記録処理 (bit_stream. c) / * 端数ビットの処理 : * 残った分をバッフアの上位ビットにセット * / assert (n—bits く = 8 ) ; stream—>bit_count n_b it s ; stream—>bit—buffer ト (uint8-t) (BITSTREAM-GETLOWERB 工 TS (n—bits , bit 単位の取得処理 stream—>bit—count) ; val) くく lbit 取得処理 lbit だけ取得を行う処理をリスト 2.17 に示す。 259 260 261 262 263 264 265 リスト 2.17 lbit の取得処理 (bit_stream. c) / * れ取得 */ BitStreamApiResu1t BitStream—GetBit (struct BitStream* stream, uint8_t* bit) int32_t ch; / * 引数チェック */ if (stream = = NULL Ⅱ bit = NULL) {

2. Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-

2.4 bit_stream . c 73 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 } return B 工 TSTREAM_APIRESULT_ 工 NVALID_ARGUMENT ; / * 読み込みモードでない場合は即時リターン * / if ( ! (stream->flags & BITSTREAM—FLAGS—F 工 LEOPENMODE—READ) ) { return B 工 TSTREAM_APIRESULT_ 工 NVALID_MODE ; / * 入力ビットカウントをプ減らし、バッフアの対象ビットを出力 * / if (stream—>bit—count > 0 ) { stream—>bit_count— (*bit) (stream—>bit—buffer > > stream—>bit—count) & 1 ; return B 工 TSTREAM—APIRESULT_OK ; / * プバイト読み込みとエラー処理 * / if ( ()h = fgetc (stream->fp) ) if (feof(stream → (p)) { / * ファイル終端に達した * / return BITSTREAM_APIRESULT_EOS ; } else { / * それ以外のエラー * / return BITSTREAM_AP 工 RESULT_IOERROR ; / * カウンタとバッフアの更新 * / stream—>bit_count = 7 ; (uint8-t) ch; stream—>bit_buffer / * 取得したバッフアの最上位ビットを出力 * / (*bit) (stream->bit—buffer > > 7 ) & 1 ; return BITSTREAM—APIRESULT_OK ; = EOF) { 常に読み込み予定の bit を含むデータ 1 バイト分をバッファ stream->bit-buffer に 取得しておき、バッフアに残っている bit 数のカウンタ stream->bit_count が残って いる限りはそこから lbit 取り出す。カウンタ stream → bit-count が 0 になったら次の データを fgetc 関数によって 1 バイト取得してバッファ stream->bit-buffer とカウ ンタ stream → bit-count を補充し、 lbit を取り出す。 複数 bit 取得処理 最後に複数 bit 取得を行う処理をリスト 2.18 に示す。 リスト 2.18 複数 bit 取得処理 (bit-stream. c) 302 / * n-bits 取得 ( 最大 6 イい t ) し、その値を右詰めして出力 */ 303 BitStreamApiResu1t BitStream_GetBits(struct BitStream* stream, uint32—t

3. Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-

70 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 } 第 2 章 実装編 / * 読み込みモードでは実行不可能 * / stream—>bit—buffer ー = (uint8—t) ( 1 くく stream—>bit—count) ; if (bit ! = 0 ) { / * ビット出力バッフアに値を格納 */ stream—>bit_count— / * バイト出力するまでのカウントを減らす */ return BITSTREAM_AP 工 RESULT_INVAL 工 D—MODE ; if (stream->flags & BITSTREAM-FLAGS—FILEOPENMODE READ) { / * バッフア出力・更新 * / if (stream—>bit—count if (fputc(stream—>bit-buffer , stream->fp) return BITSTREAM-APIRESULT—IOERROR ; stream—>bit_count = 8 ; stream—>bit—buffer = 0 ; return B 工 TSTREAM_APIRESULT_OK ; = EOF) { lbit だけ出力する場合、その値は即座にファイルに書き出されず、一旦 1 バイ stre ー > bit ー co t に記録されており、このカウントが 0 になったときに始めてバイト ト分のバッファ stream->bit-buffer に蓄えられる。 bit の書き出しカウント数は 複数 bit 出力を行う処理をリスト 2.14 に示す。 複数 bit 出力処理 単位の書き出し (fputc 関数 ) が実行される。 210 211 212 213 214 215 216 217 218 219 リスト 2.14 複数 bit 出力処理 (bit-stream ・ c) * 乙の右側 ( 下位 ) れ一 ts 出力 ( 最大 6 イ t 出力可能 ) * BitStream-PutBits(stream, 3 , の , ・は次と同じ : * BitStream-PutBit(stream, プ ) , ・ BitStream—PutBit(stream, 1 ) , ・ BitStream-PutBit (stream, の , ・ BitStreamApiResu1t BitStream—PutBits (struct BitStream* stream, n—bits , uint64—t val) / * 引数チェック * / if (stream = = NULL) { て e t urn B ITS TREAM_AP IRESULT_ INVAL 工 D_ARGUMENT ; uint32_t

4. Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-

2.4 bit_stream. c 71 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 } / * 読み込みモードでは実行不可能 * / stream—>bit—buffer ー = (uint8—t)BITSTREAM—GETLOWERBITS (stream¯> n_bits = n_bits stream—>bit_count ; whi1e (n—bits > = stream—>bit—count) { * 2 回目以降は 8 し概単位で出力 */ * 初回ループでは端数 ( 出力に必要なビット数 ) 分を埋め出力 / * 乙の上位ビットから順次出力 return B 工 TSTREAM_APIRESULT—OK ; if (n—bits / * 0 ビット出力では何もしない * / return BITSTREAM_APIRESULT—工 NVALID—ARGUMENT ; if (n-bits > sizeof (uint64—t) * 8 ) { / * 出力可能な最大ビット数を越えている * / return B 工 TSTREAM_APIRESULT_ 工 NVALID—MODE ; if (stream->flags & B 工 TSTREAM-FLAGS-FILEOPENMODE—READ) { = EOF) { return BITSTREAM-AP 工 RESULT—IOERROR ; if (fputc (stream—>bit—buffer, stream—>fp) bit—count , va1 > > n—bits) ; / * 端数ビットの処理 : stream—>bit_count stream—>bit—buffer = 0 ; 8 ; * 残った分をバッフアの上位ビットにセット */ assert(n—bits く = 8 ) ; stream—>bit_count n_bits ; stream—>bit—buffer ー = (uint8—t) (BITSTREAM—GETLOWERB 工 TS (n—bits , stream—>bit—count) ; return BITSTREAM_AP 工 RESULT-OK ; val) くく コメントにもあるようにアプリケーション側で出力対象の値を lbit 単位に分けて出力 を行えばリスト 2.14 に相当する処理を実現できるが、その処理の簡略化のために本関数 リスト 2.15 上位 bit からの出力処理 (bit- ト 2.15 の while ループに表れている。 力する。即ち、出力対象の引数値 val の最上位 bit から順に出力を行う。この処理はリス 1 バイト (8bit) を超える数値出力の際には、本モジュールはビッグエンディアンで出 を用意している。 stream . C

5. Introduction to Lossless Audio Codec ロスレス音声コーデック -基本理論と実装-

実装編 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 = 8 ; tmp ト BITSTREAM_GETLOWERBITS (stream—>bit_count , stream—>bit—count ; n_bits while (n—bits > stream—>bit—count) { * 2 回目以降は 8 t 単位で入力し t にセット */ * 初回ループでは t の上位ビットにセット / * 最上位ビットからデータを埋めていく return BITSTREAM_APIRESULT_ 工 NVALID_ARGUMENT ; if (n—bits > sizeof (uint64_t) * 8 ) { / * 入力可能な最大ビット数を越えている * / return BITSTREAM_AP 工 RESULT_INVAL 工 D_MODE ; 第 2 章 n—bits , uint64—t *val) int32_t ch; uint64—t tmp = 0 ; / * 引数チェック * / if (stream = = NULL Ⅱ val = = NULL) { return BITSTREAM_APIRESULT_INVAL 工 D_ARGUMENT ; / * 読み込みモードでない場合は即時リターン */ if ( ! (stream—>flags & BITSTREAM_FLAGS-F 工 LEOPENMODE READ) ) { stream—>bit—buffer) くく n_bits; / * プバイト読み込みとエラー処理 */ if ( ()h = fgetc (stream->fp) ) = EOF) { if (feof (stream->fp) ) { / * 途中でファイル終端に達していたら、ループを抜ける * / goto END-OF_STREAM; } else { / * それ以外のエラー * / return BITSTREAM_APIRESULT_ 工 OERROR ; END_OF_STREAM : / * 端数ビットの処理 stream—>bit—buffer stream—>bit_count (uint8—t) ch ; * 残ったビット分を t の最下位ビットにセット * / stream—>bit—count n_bits; tmp ト (uint64-t) BITSTREAM_GETLOWERB 工 TS (n_bits , bit—buffer > > stream—>bit_count) ) ; / * 正常終了 */ *val tmp ; return B 工 TSTREAM_APIRESULT_OK ; (uint32—t) (stream—>