diff options
Diffstat (limited to 'go/cbrotli/internal/encoder.go')
-rwxr-xr-x | go/cbrotli/internal/encoder.go | 134 |
1 files changed, 0 insertions, 134 deletions
diff --git a/go/cbrotli/internal/encoder.go b/go/cbrotli/internal/encoder.go deleted file mode 100755 index 13526f3..0000000 --- a/go/cbrotli/internal/encoder.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2016 Google Inc. All Rights Reserved. -// -// Distributed under MIT license. -// See file LICENSE for detail or copy at https://opensource.org/licenses/MIT - -// Package encoder wraps the brotli encoder C API used by package brotli. -package encoder - -/* -#include <brotli/encode.h> - -// Wrap BrotliEncoderCompressStream so that it doesn't take variable (in-out) -// pointers. Instead of updated pointer, deltas are saved in auxiliary struct. -struct CompressStreamResult { - size_t bytes_consumed; - const uint8_t* output_data; - size_t output_data_size; - int success; - int has_more; -}; - -struct CompressStreamResult CompressStream( - BrotliEncoderState* s, BrotliEncoderOperation op, - const uint8_t* data, size_t data_size) { - struct CompressStreamResult result; - size_t available_in = data_size; - const uint8_t* next_in = data; - size_t available_out = 0; - result.success = BrotliEncoderCompressStream(s, op, - &available_in, &next_in, &available_out, 0, 0) ? 1 : 0; - result.bytes_consumed = data_size - available_in; - result.output_data = 0; - result.output_data_size = 0; - if (result.success) { - result.output_data = BrotliEncoderTakeOutput(s, &result.output_data_size); - } - result.has_more = BrotliEncoderHasMoreOutput(s) ? 1 : 0; - return result; -} -*/ -import "C" -import ( - "unsafe" -) - -// Operation represents type of request to CompressStream -type Operation int - -const ( - // Process input - Process Operation = iota - // Flush input processed so far - Flush - // Finish stream - Finish -) - -// Status represents internal state after CompressStream invocation -type Status int - -const ( - // Error happened - Error Status = iota - // Done means that no more output will be produced - Done - // Ok means that more output might be produced with no additional input - Ok -) - -// Encoder is the Brotli c-encoder handle. -type Encoder struct { - state *C.BrotliEncoderState -} - -// New returns a new Brotli c-encoder handle. -// quality and lgWin are described in third_party/Brotli/enc/encode.h. -// Close MUST be called to free resources. -func New(quality, lgWin int) Encoder { - state := C.BrotliEncoderCreateInstance(nil, nil, nil) - C.BrotliEncoderSetParameter( - state, C.BROTLI_PARAM_QUALITY, (C.uint32_t)(quality)) - C.BrotliEncoderSetParameter( - state, C.BROTLI_PARAM_LGWIN, (C.uint32_t)(lgWin)) - return Encoder{state} -} - -// Close frees resources used by encoder. -func (z *Encoder) Close() { - C.BrotliEncoderDestroyInstance(z.state) - z.state = nil -} - -// cBytes casts a Go []byte into a C uint8_t*. We pass &buf[0] directly to C, -// which is legal because C doesn't save the pointer longer than the call and -// the byte array itself doesn't contain any pointers. -func cBytes(buf []byte) (*C.uint8_t, C.size_t) { - if len(buf) == 0 { - return (*C.uint8_t)(nil), 0 - } - return (*C.uint8_t)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)) -} - -func cOperation(op Operation) (cOp C.BrotliEncoderOperation) { - switch op { - case Flush: - return C.BROTLI_OPERATION_FLUSH - case Finish: - return C.BROTLI_OPERATION_FINISH - } - return C.BROTLI_OPERATION_PROCESS -} - -// CompressStream processes data and produces Brotli-encoded bytes. Encoder may -// consume considerable amount of input before the first output bytes come out. -// Flush and Finish operations force Encoder to produce output that corresponds -// to input consumed so far. Output contents should not be modified. Liveness of -// output is hard-limited by Encoder liveness; slice becomes invalid when any -// Encoder method is invoked. -func (z *Encoder) CompressStream(in []byte, op Operation) ( - bytesConsumed int, output []byte, status Status) { - cin, cinSize := cBytes(in) - result := C.CompressStream(z.state, cOperation(op), cin, cinSize) - output = C.GoBytes( - unsafe.Pointer(result.output_data), C.int(result.output_data_size)) - var outcome Status - if result.success == 0 { - outcome = Error - } else if result.has_more != 0 { - outcome = Ok - } else { - outcome = Done - } - return int(result.bytes_consumed), output, outcome -} |