簡體   English   中英

使用C語言使用libFLAC解碼數據

[英]Decoding data with libFLAC using C

我的目的是解碼flac數據以進行測試。 我將創建一個小存根,它具有一個將數據和大小作為輸入參數的函數。 沒有必要制作任何輸出文件,因為我只是要進行解碼測試。 我已經從libflac頁面( https://xiph.org/flac/api/ )上閱讀了一些示例和api文檔。

現在這給了我:錯誤:初始化解碼器:( null)因為FLAC__stream_decoder_init_stream被評論。 評論的原因是我不知道如何正確使用它並進行解碼工作。 任何建議和評論可以幫助我解碼工作?

#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(
                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

您通常需要實現一個事件處理框架,類似於ffmpeg所做的事情,其中​​flac庫使用回調掛鈎到事件處理中。 到目前為止,您實現的內容看起來像流程圖的(最小)初始化部分,但您缺少所有處理元素。

可恥的只是看看別人在這里這里什么,你需要用簽名來實現回調函數

寫回調示例:

 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數據,並實現支持功能。

由於您使用了extern "C" ,因此您必須將其實際編譯為C ++代碼。 現在,在C ++中,你需要使用const_cast<>來傳遞const uint8_t*參數,其中需要一個非常量的(即void* )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM