mirror of
https://github.com/aaru-dps/Aaru.Compression.Native.git
synced 2025-12-16 19:24:31 +00:00
Updated flac to new API.
This commit is contained in:
101
flac.c
101
flac.c
@@ -6,27 +6,34 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "library.h"
|
|
||||||
#include "3rdparty/flac/include/FLAC/metadata.h"
|
#include "3rdparty/flac/include/FLAC/metadata.h"
|
||||||
#include "3rdparty/flac/include/FLAC/stream_decoder.h"
|
#include "3rdparty/flac/include/FLAC/stream_decoder.h"
|
||||||
#include "3rdparty/flac/include/FLAC/stream_encoder.h"
|
#include "3rdparty/flac/include/FLAC/stream_encoder.h"
|
||||||
|
#include "library.h"
|
||||||
#include "flac.h"
|
#include "flac.h"
|
||||||
|
|
||||||
static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
|
static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder,
|
||||||
size_t *bytes, void *client_data);
|
FLAC__byte buffer[],
|
||||||
|
size_t * bytes,
|
||||||
|
void * client_data);
|
||||||
|
|
||||||
static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame,
|
static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder,
|
||||||
const FLAC__int32 const *buffer[], void *client_data);
|
const FLAC__Frame * frame,
|
||||||
|
const FLAC__int32 *const buffer[],
|
||||||
|
void * client_data);
|
||||||
|
|
||||||
static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status,
|
static void error_callback(const FLAC__StreamDecoder * decoder,
|
||||||
void *client_data);
|
FLAC__StreamDecoderErrorStatus status,
|
||||||
|
void * client_data);
|
||||||
|
|
||||||
AARU_EXPORT size_t AARU_CALL AARU_flac_decode_redbook_buffer(uint8_t *dst_buffer, size_t dst_size,
|
AARU_EXPORT size_t AARU_CALL AARU_flac_decode_redbook_buffer(uint8_t * dst_buffer,
|
||||||
const uint8_t *src_buffer, size_t src_size)
|
size_t dst_size,
|
||||||
|
const uint8_t *src_buffer,
|
||||||
|
size_t src_size)
|
||||||
{
|
{
|
||||||
FLAC__StreamDecoder *decoder;
|
FLAC__StreamDecoder * decoder;
|
||||||
FLAC__StreamDecoderInitStatus init_status;
|
FLAC__StreamDecoderInitStatus init_status;
|
||||||
aaru_flac_ctx *ctx = (aaru_flac_ctx *)malloc(sizeof(aaru_flac_ctx));
|
aaru_flac_ctx * ctx = (aaru_flac_ctx *)malloc(sizeof(aaru_flac_ctx));
|
||||||
size_t ret_size;
|
size_t ret_size;
|
||||||
|
|
||||||
memset(ctx, 0, sizeof(aaru_flac_ctx));
|
memset(ctx, 0, sizeof(aaru_flac_ctx));
|
||||||
@@ -49,8 +56,16 @@ AARU_EXPORT size_t AARU_CALL AARU_flac_decode_redbook_buffer(uint8_t *dst_buffer
|
|||||||
|
|
||||||
FLAC__stream_decoder_set_md5_checking(decoder, false);
|
FLAC__stream_decoder_set_md5_checking(decoder, false);
|
||||||
|
|
||||||
init_status = FLAC__stream_decoder_init_stream(decoder, read_callback, NULL, NULL, NULL, NULL, write_callback, NULL,
|
init_status = FLAC__stream_decoder_init_stream(decoder, read_callback, // 1
|
||||||
error_callback, ctx);
|
NULL, // 2 seek
|
||||||
|
NULL, // 3 tell
|
||||||
|
NULL, // 4 length
|
||||||
|
NULL, // 5 eof
|
||||||
|
write_callback, // 6 write
|
||||||
|
NULL, // 7 metadata
|
||||||
|
error_callback, // 8 error
|
||||||
|
ctx // 9 client_data
|
||||||
|
);
|
||||||
|
|
||||||
if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
|
if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
|
||||||
{
|
{
|
||||||
@@ -70,8 +85,10 @@ AARU_EXPORT size_t AARU_CALL AARU_flac_decode_redbook_buffer(uint8_t *dst_buffer
|
|||||||
return ret_size;
|
return ret_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
|
static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder,
|
||||||
size_t *bytes, void *client_data)
|
FLAC__byte buffer[],
|
||||||
|
size_t * bytes,
|
||||||
|
void * client_data)
|
||||||
{
|
{
|
||||||
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
||||||
|
|
||||||
@@ -85,12 +102,14 @@ static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *de
|
|||||||
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame,
|
static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder,
|
||||||
const FLAC__int32 const *buffer[], void *client_data)
|
const FLAC__Frame * frame,
|
||||||
|
const FLAC__int32 *const buffer[],
|
||||||
|
void * client_data)
|
||||||
{
|
{
|
||||||
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
||||||
size_t i;
|
size_t i;
|
||||||
uint16_t *buffer16 = (uint16_t *)(ctx->dst_buffer + ctx->dst_pos);
|
uint16_t * buffer16 = (uint16_t *)(ctx->dst_buffer + ctx->dst_pos);
|
||||||
|
|
||||||
// Why FLAC does not interleave the channels as PCM do, oh the mistery, we could use memcpy instead of looping
|
// Why FLAC does not interleave the channels as PCM do, oh the mistery, we could use memcpy instead of looping
|
||||||
for(i = 0; i < frame->header.blocksize && ctx->dst_pos < ctx->dst_len; i++)
|
for(i = 0; i < frame->header.blocksize && ctx->dst_pos < ctx->dst_len; i++)
|
||||||
@@ -125,24 +144,37 @@ static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecod
|
|||||||
}
|
}
|
||||||
|
|
||||||
static FLAC__StreamEncoderWriteStatus encoder_write_callback(const FLAC__StreamEncoder *encoder,
|
static FLAC__StreamEncoderWriteStatus encoder_write_callback(const FLAC__StreamEncoder *encoder,
|
||||||
const FLAC__byte buffer[], size_t bytes, uint32_t samples,
|
const FLAC__byte buffer[],
|
||||||
uint32_t current_frame, void *client_data);
|
size_t bytes,
|
||||||
|
uint32_t samples,
|
||||||
|
uint32_t current_frame,
|
||||||
|
void * client_data);
|
||||||
|
|
||||||
AARU_EXPORT size_t AARU_CALL AARU_flac_encode_redbook_buffer(
|
AARU_EXPORT size_t AARU_CALL AARU_flac_encode_redbook_buffer(uint8_t * dst_buffer,
|
||||||
uint8_t *dst_buffer, size_t dst_size, const uint8_t *src_buffer, size_t src_size, uint32_t blocksize,
|
size_t dst_size,
|
||||||
int32_t do_mid_side_stereo, int32_t loose_mid_side_stereo, const char *apodization, uint32_t max_lpc_order,
|
const uint8_t *src_buffer,
|
||||||
uint32_t qlp_coeff_precision, int32_t do_qlp_coeff_prec_search, int32_t do_exhaustive_model_search,
|
size_t src_size,
|
||||||
uint32_t min_residual_partition_order, uint32_t max_residual_partition_order, const char *application_id,
|
uint32_t blocksize,
|
||||||
|
int32_t do_mid_side_stereo,
|
||||||
|
int32_t loose_mid_side_stereo,
|
||||||
|
const char * apodization,
|
||||||
|
uint32_t max_lpc_order,
|
||||||
|
uint32_t qlp_coeff_precision,
|
||||||
|
int32_t do_qlp_coeff_prec_search,
|
||||||
|
int32_t do_exhaustive_model_search,
|
||||||
|
uint32_t min_residual_partition_order,
|
||||||
|
uint32_t max_residual_partition_order,
|
||||||
|
const char * application_id,
|
||||||
uint32_t application_id_len)
|
uint32_t application_id_len)
|
||||||
{
|
{
|
||||||
FLAC__StreamEncoder *encoder;
|
FLAC__StreamEncoder * encoder;
|
||||||
aaru_flac_ctx *ctx = (aaru_flac_ctx *)malloc(sizeof(aaru_flac_ctx));
|
aaru_flac_ctx * ctx = (aaru_flac_ctx *)malloc(sizeof(aaru_flac_ctx));
|
||||||
FLAC__StreamEncoderInitStatus init_status;
|
FLAC__StreamEncoderInitStatus init_status;
|
||||||
size_t ret_size;
|
size_t ret_size;
|
||||||
FLAC__int32 *pcm;
|
FLAC__int32 * pcm;
|
||||||
int i;
|
int i;
|
||||||
int16_t *buffer16 = (int16_t *)src_buffer;
|
int16_t * buffer16 = (int16_t *)src_buffer;
|
||||||
FLAC__StreamMetadata *metadata[1];
|
FLAC__StreamMetadata * metadata[1];
|
||||||
|
|
||||||
memset(ctx, 0, sizeof(aaru_flac_ctx));
|
memset(ctx, 0, sizeof(aaru_flac_ctx));
|
||||||
|
|
||||||
@@ -211,7 +243,7 @@ AARU_EXPORT size_t AARU_CALL AARU_flac_encode_redbook_buffer(
|
|||||||
|
|
||||||
pcm = malloc((src_size / 2) * sizeof(FLAC__int32));
|
pcm = malloc((src_size / 2) * sizeof(FLAC__int32));
|
||||||
|
|
||||||
for(i = 0; i < src_size / 2; i++) pcm[i] = (FLAC__int32) * (buffer16++);
|
for(i = 0; i < src_size / 2; i++) pcm[i] = (FLAC__int32)*(buffer16++);
|
||||||
|
|
||||||
FLAC__stream_encoder_process_interleaved(encoder, pcm, src_size / 4);
|
FLAC__stream_encoder_process_interleaved(encoder, pcm, src_size / 4);
|
||||||
|
|
||||||
@@ -229,8 +261,11 @@ AARU_EXPORT size_t AARU_CALL AARU_flac_encode_redbook_buffer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static FLAC__StreamEncoderWriteStatus encoder_write_callback(const FLAC__StreamEncoder *encoder,
|
static FLAC__StreamEncoderWriteStatus encoder_write_callback(const FLAC__StreamEncoder *encoder,
|
||||||
const FLAC__byte buffer[], size_t bytes, uint32_t samples,
|
const FLAC__byte buffer[],
|
||||||
uint32_t current_frame, void *client_data)
|
size_t bytes,
|
||||||
|
uint32_t samples,
|
||||||
|
uint32_t current_frame,
|
||||||
|
void * client_data)
|
||||||
{
|
{
|
||||||
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
aaru_flac_ctx *ctx = (aaru_flac_ctx *)client_data;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user