2016-07-06 36 views
1

私の目的は、テスト目的でflacデータをデコードすることです。私は入力引数としてデータとサイズを取る関数を持つ小さなスタブを作成します。私はデコードのためのテストを行うつもりであるので、出力ファイルのanykindを作る必要はありません。私はlibflacのページ(https://xiph.org/flac/api/)からいくつかの例とapiのドキュメントを読んだ。C言語を使用してlibFLACでデータをデコードする

これは私に与えられています:エラー:FLAC__stream_decoder_init_streamがコメントされているため、デコーダ:(null)を初期化しています。理由は、私はそれを正しく使用してデコード作業を行う方法がわからないということです。デコード作業を手伝ってくれるアドバイスやコメントはありますか?

#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]); 
} 

更新: コールバック関数を追加した後、私はこのエラーを取得する:

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

これはffmpegのようなストリーミングフレームワークで動作するように意図されており、すべてがイベントループでコールバックを使用して行われます - あなたの 'write_callback'と' error_callback'の実装はどこですか? – Soren

答えて

0

あなたは一般的にffmpegところFLACライブラリフックにして行われているものと同様に、イベント処理フレームワークを実装する必要がありますコールバックを使用したイベント処理。これまで実装してきたのは、フローグラフの(最小)初期化部分のようですが、すべての処理要素がありません。

恥だけでhereをやっている他の誰かを見ているとhereあなたが

書き込みコールバックの例のようにシグネチャを持つコールバック関数を実装する必要があります。

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

エラーコールバックの例:

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

また、flacデータがどのように読み込まれているかを見て、サポート機能をwel l。

+0

ありがとうございます。コールバック関数を追加しました。今私はデータの引数を使用する方法に問題があります。それはvoid * client_dataでなければなりませんが、私の関数は私にuint8_tを与えます – Marso

+0

data引数は実際のflacデータではなく、コールバックシグネチャに表示される 'client_data'です。あなたのプラグイン – Soren

+0

答えにリンクしているサンプルコードを慎重に読んでください。 – Soren

関連する問題