Skip to content

Instantly share code, notes, and snippets.

@sourrust
Last active January 9, 2016 20:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sourrust/4d86c3e495600c83190b to your computer and use it in GitHub Desktop.
Save sourrust/4d86c3e495600c83190b to your computer and use it in GitHub Desktop.
Comparing the reference decoder of FLAC to my implementation in Rust
#include <stdio.h>
#include <stdlib.h>
#include <FLAC/stream_decoder.h>
uint64_t _total_samples = 0;
uint64_t total_samples = 0;
static FLAC__StreamDecoderWriteStatus write_callback(
const FLAC__StreamDecoder* decoder,
const FLAC__Frame* frame,
const FLAC__int32* const buffer[],
void* client_data) {
(void)decoder, (void) client_data, (void)buffer;
size_t block_size = (size_t)frame->header.blocksize;
size_t channels = (size_t)frame->header.channels;
size_t i;
for(i = 0; i < block_size * channels; i++) {
_total_samples += 1;
}
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
static void metadata_callback(const FLAC__StreamDecoder* decoder,
const FLAC__StreamMetadata* metadata,
void* client_data) {
(void)decoder, (void)metadata, (void)client_data;
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
total_samples = metadata->data.stream_info.total_samples;
}
}
static void error_callback(const FLAC__StreamDecoder* decoder,
FLAC__StreamDecoderErrorStatus status,
void* client_data) {
(void)decoder, (void)status, (void)client_data;
}
int main(int argc, char* argv[]) {
(void)argc;
FLAC__bool ok = true;
FLAC__StreamDecoder* decoder = NULL;
FLAC__StreamDecoderInitStatus init_status;
if((decoder = FLAC__stream_decoder_new()) == NULL) {
fprintf(stderr, "ERROR: allocating decoder\n");
return 1;
}
init_status = FLAC__stream_decoder_init_file(
decoder, argv[1], write_callback, metadata_callback, error_callback,
/*client_data=*/NULL);
if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
fprintf(stderr, "ERROR: initializing decoder: %s\n",
FLAC__StreamDecoderInitStatusString[init_status]);
ok = false;
}
if(ok) {
ok = FLAC__stream_decoder_process_until_end_of_stream(decoder);
printf("Decoded %llu samples\n Total samples %llu", (_total_samples / 2),
total_samples);
}
FLAC__stream_decoder_delete(decoder);
return 0;
}
extern crate flac;
use std::env;
use std::fs::File;
use flac::{ReadStream, Stream};
fn main() {
let mut total_samples = 0_u64;
let mut _total_samples = 0_u64;
let filename = env::args().nth(1).unwrap();
let mut stream = Stream::<ReadStream<File>>::from_file(&filename)
.expect("ERROR: initializing decoder");
total_samples = stream.info().total_samples;
for _ in &mut stream {
_total_samples += 1;
}
println!("Decoded {} samples\n Total samples {}", _total_samples / 2
, total_samples);
}

C (reference decoder)

File Name: 01 Colorful..flac
Size: 33.2 MB
Minimum block size: 4096
Maximum block size: 4096
Minimum frame size: 14
Maximum frame size: 14296
Sample rate: 44100
Number of channels: 2
Bits per sample: 16
Total samples: 11321352
MD5 sum: d9baa49f4aca47fa2400e141dc8b96ac

     0.66 real         0.43 user         0.04 sys
     0.48 real         0.43 user         0.03 sys
     0.47 real         0.43 user         0.03 sys
     0.47 real         0.43 user         0.03 sys
     0.48 real         0.43 user         0.03 sys

-------------------------------------------------

avg: 0.512 real        0.43 user         0.032 sys

File Name: 04 - City 2 City ft Belle Humble.flac
Size: 46.1 MB
Minimum block size: 4096
Maximum block size: 4096
Minimum frame size: 2227
Maximum frame size: 15421
Sample rate: 44100
Number of channels: 2
Bits per sample: 16
Total samples: 13995450
MD5 sum: f11ef9ad441d5cf362b3bb7021337a4c

     1.34 real         0.58 user         0.06 sys
     0.61 real         0.55 user         0.04 sys
     0.65 real         0.54 user         0.04 sys
     0.60 real         0.55 user         0.04 sys
     0.61 real         0.54 user         0.04 sys

-------------------------------------------------

avg: 0.762 real        0.552 user        0.044 sys

Rust (my implementation)

File Name: 01 Colorful..flac
Size: 33.2 MB
Minimum block size: 4096
Maximum block size: 4096
Minimum frame size: 14
Maximum frame size: 14296
Sample rate: 44100
Number of channels: 2
Bits per sample: 16
Total samples: 11321352
MD5 sum: d9baa49f4aca47fa2400e141dc8b96ac

     1.14 real         1.06 user         0.01 sys
     1.11 real         1.08 user         0.01 sys
     1.11 real         1.08 user         0.01 sys
     1.11 real         1.08 user         0.01 sys
     1.10 real         1.07 user         0.01 sys

-------------------------------------------------

avg: 1.114 real        1.074 user        0.01 sys

File Name: 04 - City 2 City ft Belle Humble.flac
Size: 46.1 MB
Minimum block size: 4096
Maximum block size: 4096
Minimum frame size: 2227
Maximum frame size: 15421
Sample rate: 44100
Number of channels: 2
Bits per sample: 16
Total samples: 13995450
MD5 sum: f11ef9ad441d5cf362b3bb7021337a4c

     1.43 real         1.37 user         0.02 sys
     1.45 real         1.36 user         0.02 sys
     1.54 real         1.40 user         0.02 sys
     1.44 real         1.37 user         0.02 sys
     1.43 real         1.37 user         0.02 sys

-------------------------------------------------

avg: 1.458 real        1.446 user        0.02 sys
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment