2016-07-06 25 views
1

Mein Zweck ist es, FLAC-Daten für Testzwecke zu dekodieren. Ich werde einen kleinen Stub erstellen, der eine Funktion hat, die Daten und Größe als Eingabeargumente verwendet. Es ist nicht nötig, irgendeine Ausgabedatei zu erstellen, weil ich nur einen Test für die Decodierung machen werde. Ich habe einige Beispiele und eine API-Dokumentation von der libflac-Seite (https://xiph.org/flac/api/) gelesen.Decoding Daten mit LibFLAC mit C

Jetzt gibt mir das: Fehler: Initialisierung Decoder: (Null), weil FLAC__stream_decoder_init_stream kommentiert ist. Grund ist, dass ich nicht weiß, wie man es richtig benutzt und Dekodierarbeit bekommt. Irgendwelche Ratschläge und Kommentare, die mir helfen könnten, Entschlüsselungsarbeit zu bekommen?

#include <stdio.h> 
#include <stdlib.h> 
#include "share/compat.h" 
#include "FLAC/stream_decoder.h" 

static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *data); 
static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *data); 
static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *data); 

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 
    FLAC__bool ok = true; 
    FLAC__StreamDecoder *decoder = 0; 
    FLAC__StreamDecoderInitStatus init_status; 

    // init decoder 
    if((decoder = FLAC__stream_decoder_new()) == NULL) { 
     fprintf(stderr, "ERROR: allocating decoder\n"); 
     return 1; 
    } 

    (void)FLAC__stream_decoder_set_md5_checking(decoder, true); 

    init_status = FLAC__stream_decoder_init_stream ( decoder, read_callback, /*seek_callback*/ NULL, /*tell_callback*/ NULL, /*length_callback*/ NULL, /*eof_callback*/ NULL, write_callback, /*metadata_callback*/ NULL, error_callback, data); 

    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); 
    fprintf(stderr, "decoding: %s\n", ok? "succeeded" : "FAILED"); 
    fprintf(stderr, " state: %s\n", FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(decoder)]); 
    } 

    FLAC__stream_decoder_delete(decoder); 

    return 0; 
} 

void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *data) 
{ 
    (void)decoder, (void)data; 
    fprintf(stderr, "Got error callback: %s\n", FLAC__StreamDecoderErrorStatusString[status]); 
} 

Update: Nach Callback-Funktionen hinzugefügt bekomme ich diesen Fehler:

flac_fuzzer.c:23:16: error: no matching function for call to 'FLAC__stream_decoder_init_stream' 
init_status = FLAC__stream_decoder_init_stream (  decoder, 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
include/FLAC/stream_decoder.h:1073:40: note: candidate function not viable: no known conversion from 'const uint8_t *' 
(aka 'const unsigned char *') to 'void *' for 10th argument; take the address of the argument with & 
FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream(
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+1

Es ist beabsichtigt, in einem Streaming-Framework zu arbeiten, wie dem von ffmpeg, und alles wird mit Callbacks in einer Event-Schleife gemacht - wo ist die Implementierung von 'write_callback' und' error_callback'? – Soren

Antwort

0

Sie müssen in der Regel eine Ereignisverarbeitung Rahmen, ähnlich wie das umzusetzen, was mit ffmpeg getan wird, wo die flac Bibliothek Haken in die Ereignisverarbeitung mit den Callbacks. Was Sie bisher implementiert haben, sieht wie der (minimale) Initialisierungsteil des Flussgraphen aus, Ihnen fehlen jedoch alle Verarbeitungselemente.

Beschämenderweise einfach nur an, was jemand anderes haben here getan und here Sie werden die Callback-Funktionen mit Signaturen wie

Schreibrückruf Beispiel implementieren müssen:

static FLAC__StreamDecoderWriteStatus flac_write_music_cb(
            const FLAC__StreamDecoder *decoder, 
            const FLAC__Frame *frame, 
            const FLAC__int32 *const buffer[], 
            void *client_data) 

Fehler-Callback Beispiel:

static void flac_error_music_cb(
       const FLAC__StreamDecoder *decoder, 
       FLAC__StreamDecoderErrorStatus status, 
       void *client_data) 

Sie sollten auch sehen, wie die Flac-Daten gelesen werden, und implementieren Sie die unterstützende Funktion als auch l.

+0

Danke. Ich habe Callback-Funktionen hinzugefügt. Jetzt habe ich Problem, wie man Datenargument benutzt. Es sollte void * client_data sein, aber meine Funktion gibt mir uint8_t – Marso

+0

Das Datenargument sind nicht die tatsächlichen flac-Daten, sondern die 'client_data', die in den Callback-Signaturen angezeigt werden, was nur eine Möglichkeit ist, Hilfskonfigurationsdaten zu analysieren Ihr Plugin – Soren

+0

Lesen Sie den Beispielcode, den ich in der Antwort verlinkt habe, sorgfältig durch. – Soren