Documentação da API WebP Container

Manipulação de contêineres RIFF para imagens WebP.

API Mux

Permite a manipulação de imagens de contêiner WebP, contendo recursos como perfil de cores, metadados, animação e imagens fragmentadas.

Exemplos de código

Crie um MUX com dados de imagem, perfil de cor e metadados XMP.

int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICCP color profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);

Obter dados de perfil de imagem e cor de um arquivo WebP

int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_data).
WebPMuxDelete(mux);
free(data);

Vida útil de um objeto Mux

Enums

// Error codes
typedef enum WebPMuxError {
  WEBP_MUX_OK                 =  1,
  WEBP_MUX_NOT_FOUND          =  0,
  WEBP_MUX_INVALID_ARGUMENT   = -1,
  WEBP_MUX_BAD_DATA           = -2,
  WEBP_MUX_MEMORY_ERROR       = -3,
  WEBP_MUX_NOT_ENOUGH_DATA    = -4
} WebPMuxError;

// IDs for different types of chunks.
typedef enum WebPChunkId {
  WEBP_CHUNK_VP8X,     // VP8X
  WEBP_CHUNK_ICCP,     // ICCP
  WEBP_CHUNK_ANIM,     // ANIM
  WEBP_CHUNK_ANMF,     // ANMF
  WEBP_CHUNK_ALPHA,    // ALPH
  WEBP_CHUNK_IMAGE,    // VP8/VP8L
  WEBP_CHUNK_EXIF,     // EXIF
  WEBP_CHUNK_XMP,      // XMP
  WEBP_CHUNK_UNKNOWN,  // Other chunks.
  WEBP_CHUNK_NIL
} WebPChunkId;

WebPGetMuxVersion()

Retorna o número da versão da biblioteca mux, empacotada em hexadecimal usando 8 bits para cada principal/secundária/revisão. Por exemplo, v2.5.7 é 0x020507.

int WebPGetMuxVersion(void);

WebPMuxNew()

Cria um objeto mux vazio.

WebPMux* WebPMuxNew(void);
Retorna
Um ponteiro para o objeto mux vazio recém-criado.

WebPMuxDelete()

Exclui o objeto mux.

void WebPMuxDelete(WebPMux* mux);
Parâmetros
mux: o objeto (de entrada/saída) a ser excluído.

Criação de Mux

WebPMuxCreate()

Cria um objeto mux de dados brutos fornecidos no formato WebP RIFF.

WebPMux* WebPMuxCreate(const WebPData* bitstream, int copy_data);
Parâmetros

bitstream: (in) os dados do bitstream no formato WebP RIFF

copy_data: (in) o valor 1 indica que os dados serão copiados para o mux, e o valor 0 indica que os dados NÃO serão copiados para o objeto mux.

Retorna

Um ponteiro para o objeto mux criado a partir de dados fornecidos, em caso de sucesso.

NULL: em caso de dados inválidos ou erro de memória.

Pedaços que não são de imagem

WebPMuxSetChunk()

Adiciona um bloco com ID fourcc e dados chunk_data no objeto mux. Todos os blocos existentes com o mesmo ID serão removidos.

WebPMuxError WebPMuxSetChunk(WebPMux* mux,
                             const char fourcc[4],
                             const WebPData* chunk_data,
                             int copy_data);

Observação:somente blocos não relacionados a imagens devem ser gerenciados por APIs de bloco. (Os blocos relacionados às imagens são: "ANMF", "FRGM", "VP8 ", "VP8L" e "ALPH"). Para adicionar, receber e excluir imagens, use WebPMuxSetImage(), WebPMuxPushFrame(), WebPMuxGetFrame() e WebPMuxDeleteFrame().

Parâmetros

mux: objeto (de entrada/saída) ao qual o bloco será adicionado

fourcc: (in) uma matriz de caracteres contendo o quatrocc do bloco especificado. Por exemplo, "ICCP", "XMP ", "EXIF" etc.

chunk_data: (in) o bloco de dados a ser adicionado

copy_data: (in) o valor 1 indica que os dados serão copiados para o mux, e o valor 0 indica que os dados NÃO serão copiados para o objeto mux.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux, Fourcc ou chunk_data for NULL ou se quatrocc corresponde a um bloco de imagem.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxGetChunk()

Recebe uma referência aos dados do bloco com o ID fourcc no objeto mux. O autor da chamada NÃO deve liberar os dados retornados.

WebPMuxError WebPMuxGetChunk(const WebPMux* mux,
                             const char fourcc[4],
                             WebPData* chunk_data);
Parâmetros

mux: objeto (in) do qual os dados do bloco serão buscados

fourcc: (in) uma matriz de caracteres contendo o quatrocc do bloco. Por exemplo, "ICCP", "XMP ", "EXIF" etc.

chunk_data: retorna os dados de bloco

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux, Fourcc ou chunk_data for NULL ou se quatrocc corresponde a um bloco de imagem.

WEBP_MUX_NOT_FOUND: se o mux não tiver um bloco com o ID fornecido.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxDeleteChunk()

Exclui o bloco com o fourcc especificado do objeto mux.

WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
Parâmetros

mux: objeto (de entrada/saída) do qual o bloco será excluído

fourcc: (in) uma matriz de caracteres contendo o quatrocc do bloco. Por exemplo, "ICCP", "XMP ", "EXIF" etc.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou Fourcc for NULL ou se Fourcc corresponder a um bloco de imagem.

WEBP_MUX_NOT_FOUND: se o mux não tiver um bloco com o fourcc especificado.

WEBP_MUX_OK -- em caso de sucesso.

Imagens

Encapsula os dados sobre um único frame/fragmento.

struct WebPMuxFrameInfo {
  WebPData    bitstream;  // image data: can be a raw VP8/VP8L bitstream
                          // or a single-image WebP file.
  int         x_offset;   // x-offset of the frame.
  int         y_offset;   // y-offset of the frame.
  int         duration;   // duration of the frame (in milliseconds).

  WebPChunkId id;         // frame type: should be one of WEBP_CHUNK_ANMF,
                          // WEBP_CHUNK_FRGM or WEBP_CHUNK_IMAGE
  WebPMuxAnimDispose dispose_method;  // Disposal method for the frame.
  WebPMuxAnimBlend   blend_method;    // Blend operation for the frame.
};

WebPMuxSetImage()

Define a imagem (não animada e não fragmentada) no objeto mux. Observação:todas as imagens atuais (incluindo frames/fragmentos) vão ser removidas.

WebPMuxError WebPMuxSetImage(WebPMux* mux,
                             const WebPData* bitstream,
                             int copy_data);
Parâmetros

mux: objeto (entrada/saída) em que a imagem será definida

bitstream: pode ser um bitstream VP8/VP8L bruto ou um arquivo WebP de imagem única (sem animação e não fragmentado).

copy_data: (in) o valor 1 indica que os dados serão copiados para o mux, e o valor 0 indica que os dados NÃO serão copiados para o objeto mux.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se o mux for NULL ou o bitstream for NULL.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxPushFrame()

Adiciona um frame ao final do objeto mux.

WebPMuxError WebPMuxPushFrame(WebPMux* mux,
                              const WebPMuxFrameInfo* frame,
                              int copy_data);

Notes:

  1. O frame.id precisa ser WEBP_CHUNK_ANMF ou WEBP_CHUNK_FRGM
  2. Para definir uma imagem não fragmentada e não animada, use WebPMuxSetImage().
  3. O tipo de frame sendo empurrado deve ser o mesmo que os frames no mux.
  4. Como o WebP só oferece suporte a deslocamentos pares, qualquer deslocamento ímpar será ajustado a um local par usando: offset &= ~1
Parâmetros

mux: o objeto (de entrada/saída) ao qual o frame será adicionado.

frame: dados de frame (in).

copy_data: (in) o valor 1 indica que os dados serão copiados para o mux, e o valor 0 indica que os dados NÃO serão copiados para o objeto mux.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou frame for NULL ou se o conteúdo do frame for inválido.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WEBP_MUX_OK -- em caso de sucesso.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WebPMuxGetFrame()

Recebe o enésimo frame do objeto mux. O conteúdo de frame->bitstream é alocado usando shoppingoc() e NÃO é de propriedade do objeto mux. Ele PRECISA ser desalocado pelo autor da chamada chamando WebPDataClear(). nth=0 tem um significado especial: última posição.

WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
                             uint32_t nth,
                             WebPMuxFrameInfo* frame);
Parâmetros

mux: objeto (em) em que as informações serão buscadas

nth: índice (in) do frame no objeto mux

frame: dados (fora) do frame retornado.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se o multiplex ou o frame for NULL.

WEBP_MUX_NOT_FOUND: se houver menos de enésimos frames no objeto mux.

WEBP_MUX_BAD_DATA: se o enésimo fragmento do frame no mux for inválido.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxDeleteFrame()

Exclui um frame do objeto mux. nth=0 tem um significado especial: a última posição.

WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
Parâmetros

mux: o objeto (entrada/saída) do qual um frame será excluído.

nth: (in) a posição em que o frame será excluído.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se o mux for NULL.

WEBP_MUX_NOT_FOUND: se houver menos de enésimos frames no objeto mux antes da exclusão.

WEBP_MUX_OK -- em caso de sucesso.

Animação

Parâmetros de animação

struct WebPMuxAnimParams {
  uint32_t bgcolor;  // Background color of the canvas stored (in MSB order) as:
                     // Bits 00 to 07: Alpha.
                     // Bits 08 to 15: Red.
                     // Bits 16 to 23: Green.
                     // Bits 24 to 31: Blue.
  int loop_count;    // Number of times to repeat the animation [0 = infinite].
};

WebPMuxSetAnimationParams()

Define os parâmetros de animação no objeto mux. Os blocos ANIM atuais serão removidos.

WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
                                       const WebPMuxAnimParams* params);
Parâmetros

mux: o objeto (entrada/saída) em que o bloco ANIM será definido/adicionado

params: (in) parâmetros de animação.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou params for NULL.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxGetAnimationParams()

Recebe os parâmetros de animação do objeto mux.

WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux,
                                       WebPMuxAnimParams* params);
Parâmetros

mux: objeto (in) em que os parâmetros de animação serão buscados

params: parâmetros de animação (out) extraídos do bloco ANIM

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou params for NULL.

WEBP_MUX_NOT_FOUND: se um fragmento de ANIM não estiver presente no objeto mux.

WEBP_MUX_OK -- em caso de sucesso.

Utilitários diversos

WebPMuxGetCanvasSize()

Recebe o tamanho da tela do objeto mux.

WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
                                  int* width,
                                  int* height);

Observação:esse método pressupõe que o bloco VP8X, se presente, está atualizado. Ou seja, o objeto mux não foi modificado desde a última chamada para WebPMuxAssemble() ou WebPMuxCreate().

Parâmetros

mux: objeto (em) em que o tamanho da tela será buscado.

width: largura (fora) da tela

height: altura (fora) da tela

Retorna

WEBP_MUX_INVALID_ARGUMENT: se o mux, a largura ou a altura for NULL.

WEBP_MUX_BAD_DATA: se o tamanho do bloco ou da tela VP8X/VP8/VP8L for inválido.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxGetFeatures()

Recebe as flags de recursos do objeto mux.

WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags);

Observação:esse método pressupõe que o bloco VP8X, se presente, está atualizado. Ou seja, o objeto mux não foi modificado desde a última chamada para WebPMuxAssemble() ou WebPMuxCreate().

Parâmetros

mux: (em) objeto em que os recursos serão buscados

flags: (fora) as flags que especificam quais recursos estão presentes no objeto mux. Esse valor será um OR de vários valores de sinalização. O enumeração WebPFeatureFlags pode ser usado para testar valores de sinalização individuais.

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou flags for NULL.

WEBP_MUX_BAD_DATA: se o tamanho do bloco ou da tela VP8X/VP8/VP8L for inválido.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxNumChunks()

Recebe o número de blocos que têm o valor da tag especificado no objeto mux.

WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
                              WebPChunkId id,
                              int* num_elements);
Parâmetros

mux: objeto (em) em que as informações serão buscadas

id -- ID do bloco (in) especificando o tipo de bloco

num_elements: número (out) de blocos com o ID de bloco especificado

Retorna

WEBP_MUX_INVALID_ARGUMENT: se mux ou num_elementos forem NULL.

WEBP_MUX_OK -- em caso de sucesso.

WebPMuxAssemble()

Monta todos os blocos no formato WebP RIFF e retorna em assembled_data. Essa função também valida o objeto mux.

WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data);

Observação: o conteúdo de assembled_data será ignorado e substituído. Além disso, o conteúdo de assembled_data é alocado usando Malloc() e NÃO pertencente ao objeto mux. Ele PRECISA ser desalocado pelo autor da chamada chamando WebPDataClear().

Parâmetros

mux: o objeto (de entrada/saída) cujos pedaços serão montados

assembled_data: (out) dados WebP reunidos

Retorna

WEBP_MUX_BAD_DATA: se o objeto mux for inválido.

WEBP_MUX_INVALID_ARGUMENT: se mux ou assembled_data for NULL.

WEBP_MUX_MEMORY_ERROR: em erro de alocação de memória.

WEBP_MUX_OK -- em caso de sucesso.

API WebPAnimEncoder

Essa API permite codificar (possivelmente) imagens WebP animadas.

Exemplo de código

WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// Tune 'enc_options' as needed.
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
  WebPConfig config;
  WebPConfigInit(&config);
  // Tune 'config' as needed.
  WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config);
}
WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL);
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// Write the 'webp_data' to a file, or re-mux it further.

typedef struct WebPAnimEncoder WebPAnimEncoder;  // Main opaque object.

Opções globais

struct WebPAnimEncoderOptions {
  WebPMuxAnimParams anim_params;  // Animation parameters.
  int minimize_size;    // If true, minimize the output size (slow). Implicitly
                        // disables key-frame insertion.
  int kmin;
  int kmax;             // Minimum and maximum distance between consecutive key
                        // frames in the output. The library may insert some key
                        // frames as needed to satisfy this criteria.
                        // Note that these conditions should hold: kmax > kmin
                        // and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then
                        // key-frame insertion is disabled; and if kmax == 1,
                        // then all frames will be key-frames (kmin value does
                        // not matter for these special cases).
  int allow_mixed;      // If true, use mixed compression mode; may choose
                        // either lossy and lossless for each frame.
  int verbose;          // If true, print info and warning messages to stderr.
};

WebPAnimEncoderOptionsInit()

Precisa ser sempre chamado para inicializar uma nova estrutura WebPAnimEncoderOptions antes da modificação. Retorna falso em caso de incompatibilidade de versão. WebPAnimEncoderOptionsInit() precisa ser bem-sucedido antes de usar o objeto enc_options.

Parâmetros
enc_options: opções (in/out) usadas para codificar animação
Retorna
Verdadeiro em caso de sucesso.
int WebPAnimEncoderOptionsInit(
    WebPAnimEncoderOptions* enc_options);

WebPAnimEncoderNew()

Cria e inicializa um objeto WebPAnimEncoder.

Parâmetros

width/height: (pol) largura e altura da tela da animação.

enc_options: (in) opções de codificação. Pode ser transmitido como NULL para escolher padrões razoáveis.

Retorna

Um ponteiro para o objeto WebPAnimEncoder recém-criado ou NULL em caso de erro de memória.

WebPAnimEncoder* WebPAnimEncoderNew(
    int width, int height, const WebPAnimEncoderOptions* enc_options);

WebPAnimEncoderAdd()

Otimize o frame fornecido para WebP, o codifique e adicione ao objeto WebPAnimEncoder.

A última chamada para WebPAnimEncoderAdd precisa ser usando frame = NULL, o que indica que não há mais frames a serem adicionados. Essa chamada também é usada para determinar a duração do último frame.

Parâmetros

enc: o objeto (entrada/saída) ao qual o frame será adicionado.

frame: (entrada/saída) os dados de frame em formato ARGB ou YUV(A). Se ele estiver no formato YUV(A), será convertido para ARGB, o que incorre em uma pequena perda.

timestamp_ms: o carimbo de data/hora (in) do frame em milissegundos. A duração de um frame seria calculada como "carimbo de data/hora do próximo frame - carimbo de data/hora deste frame". Portanto, os carimbos de data/hora devem estar em ordem não decrescente.

config: (in) opções de codificação. Pode ser passado como NULL para escolher padrões razoáveis.

Retorna

Em caso de erro, retorna falso e frame->error_code está definido corretamente. Caso contrário, retorna "true".

int WebPAnimEncoderAdd(
    WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
    const struct WebPConfig* config);

WebPAnimEncoderAssemble()

Monte todos os frames adicionados até agora em um bitstream WebP. Essa chamada precisa ser precedida por uma chamada para WebPAnimEncoderAdd com frame = NULL. Caso contrário, a duração do último frame será estimada internamente.

Parâmetros

enc: o objeto (de entrada/saída) do qual os frames serão montados.

webp_data: (out) gerado o bitstream WebP.

Retorna

Verdadeiro em caso de sucesso.

int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);

WebPAnimEncoderGetError()

Receba a string de erro correspondente à chamada mais recente usando enc. A string retornada é de propriedade de enc e é válida somente até a próxima chamada para WebPAnimEncoderAdd(), WebPAnimEncoderAssemble() ou WebPAnimEncoderDelete().

Parâmetros
enc: objeto (entrada/saída) em que a string de erro será buscada.
Retorna
NULL if enc is NULL. Caso contrário, retorna a string de erro se a última chamada para enc tiver um erro ou uma string vazia se a última chamada tiver sido bem-sucedida.
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);

WebPAnimEncoderDelete()

Exclui o objeto WebPAnimEncoder.

Parâmetros
enc: o objeto (entrada/saída) a ser excluído
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);

API Demux

Permite a extração de dados de imagem e formato estendido de arquivos WebP.

Exemplos de código

Usar dados WebP para extrair todos os frames, o perfil ICC e os metadados EXIF/XMP

WebPDemuxer* demux = WebPDemux(&webp_data);

uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);

// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
  do {
    // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
    // ... and get other frame properties like width, height, offsets etc.
    // ... see 'struct WebPIterator' below for more info).
  } while (WebPDemuxNextFrame(&iter));
  WebPDemuxReleaseIterator(&iter);
}

// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);

A vida de um objeto Demux

Enums

typedef enum WebPDemuxState {
  WEBP_DEMUX_PARSE_ERROR    = -1,  // An error occurred while parsing.
  WEBP_DEMUX_PARSING_HEADER =  0,  // Not enough data to parse full header.
  WEBP_DEMUX_PARSED_HEADER  =  1,  // Header parsing complete,
                                   // data may be available.
  WEBP_DEMUX_DONE           =  2   // Entire file has been parsed.
} WebPDemuxState;

WebPGetDemuxVersion()

Retorna o número da versão da biblioteca demux, empacotada em hexadecimal usando 8 bits para cada principal/secundária/revisão. Por exemplo, v2.5.7 é 0x020507.

int WebPGetDemuxVersion(void);

WebPDemux()

Analisa o arquivo WebP completo fornecido por data.

WebPDemuxer WebPDemux(const WebPData* data);

Retorna um objeto WebPDemuxer em uma análise bem-sucedida. Caso contrário, retorna NULL.

WebPDemuxPartial()

Analisa o arquivo WebP possivelmente incompleto fornecido por data. Se state não for NULL, ele será definido para indicar o status do demuxer.

WebPDemuxer WebPDemuxPartial(const WebPData* data, WebPDemuxState* state);

Retorna NULL em caso de erro ou se não houver dados suficientes para iniciar a análise, e um objeto WebPDemuxer em uma análise bem-sucedida.

Observe que WebPDemuxer mantém ponteiros internos para o segmento de memória de dados. Se esses dados forem voláteis, o objeto de multiplexador deverá ser excluído (chamando WebPDemuxDelete()) e WebPDemuxPartial() chamado novamente nos novos dados. Geralmente, essa é uma operação de baixo custo.

WebPDemuxDelete()

Libera a memória associada ao dmux.

void WebPDemuxDelete(WebPDemuxer* dmux);

Extração de dados/informações

typedef enum WebPFormatFeature {
  WEBP_FF_FORMAT_FLAGS,      // bit-wise combination of WebPFeatureFlags
                             // corresponding to the 'VP8X' chunk (if present).
  WEBP_FF_CANVAS_WIDTH,
  WEBP_FF_CANVAS_HEIGHT,
  WEBP_FF_LOOP_COUNT,        // only relevant for animated file
  WEBP_FF_BACKGROUND_COLOR,  // idem.
  WEBP_FF_FRAME_COUNT        // Number of frames present in the demux object.
                             // In case of a partial demux, this is the number
                             // of frames seen so far, with the last frame
                             // possibly being partial.
} WebPFormatFeature;

WebPDemuxGetI()

Encontre o valor de feature no dmux.

uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature);

Observação:os valores só serão válidos se WebPDemux() tiver sido usado ou WebPDemuxPartial() tiver retornado um estado > WEBP_DEMUX_PARSING_HEADER.

Iteração do frame

struct WebPIterator {
  int frame_num;
  int num_frames;          // equivalent to WEBP_FF_FRAME_COUNT.
  int fragment_num;
  int num_fragments;
  int x_offset, y_offset;  // offset relative to the canvas.
  int width, height;       // dimensions of this frame or fragment.
  int duration;            // display duration in milliseconds.
  WebPMuxAnimDispose dispose_method;  // dispose method for the frame.
  int complete;   // true if 'fragment' contains a full frame. partial images
                  // may still be decoded with the WebP incremental decoder.
  WebPData fragment;  // The frame or fragment given by 'frame_num' and
                      // 'fragment_num'.
  int has_alpha;      // True if the frame or fragment contains transparency.
  WebPMuxAnimBlend blend_method;  // Blend operation for the frame.
};

WebPDemuxGetFrame()

Recupera o frame frame_number de dmux.

int WebPDemuxGetFrame(const WebPDemuxer* dmux,
                      int frame_number,
                      WebPIterator* iter);

iter->fragment aponta para o primeiro fragmento quando essa função é retornada. Fragmentos individuais podem ser extraídos usando WebPDemuxSelectFragment(). Definir frame_number igual a 0 retornará o último frame da imagem.

Retorna "false" se dmux é NULL ou se o frame_number do frame não está presente. Chame WebPDemuxReleaseIterator() quando o uso do iterador for concluído.

Observação:dmux precisa persistir durante o ciclo de vida de iter.

WebPDemuxNextFrame(), WebPDemuxPrevFrame()

Define iter->fragment para apontar para o frame seguinte (iter->frame_num + 1) ou anterior (iter->frame_num - 1). Essas funções não se repetem.

int WebPDemuxNextFrame(WebPIterator* iter);
int WebPDemuxPrevFrame(WebPIterator* iter);

Retorna verdadeiro em caso de sucesso. Caso contrário, retorna falso.

WebPDemuxSelectFragment()

Define iter->fragment para refletir o número do fragmento fragment_num.

int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);

Retorna verdadeiro se o fragmento fragment_num estiver presente. Caso contrário, será falso.

WebPDemuxReleaseIterator()

Libera qualquer memória associada a iter.

void WebPDemuxReleaseIterator(WebPIterator* iter);

Precisa ser chamado antes de qualquer chamada subsequente para WebPDemuxGetChunk() no mesmo iteração. Além disso, ele precisa ser chamado antes de destruir o WebPDemuxer associado com WebPDemuxDelete().

Iteração em pedaços

struct WebPChunkIterator {
  // The current and total number of chunks with the fourcc given to
  // WebPDemuxGetChunk().
  int chunk_num;
  int num_chunks;
  WebPData chunk;    // The payload of the chunk.
};

WebPDemuxGetChunk()

Recupera a instância chunk_number do bloco com o ID fourcc de dmux.

int WebPDemuxGetChunk(const WebPDemuxer* dmux,
                      const char fourcc[4], int chunk_number,
                      WebPChunkIterator* iter);

fourcc é uma matriz de caracteres contendo o quatrocc do bloco a ser retornado, por exemplo, "ICCP", "XMP ", "EXIF" etc.

Definir chunk_number igual a 0 retornará a última parte de um conjunto.

Retorna verdadeiro se o bloco for encontrado. Caso contrário, retorna falso. Os payloads de blocos relacionados à imagem são acessados por meio de WebPDemuxGetFrame() e funções relacionadas. Chame WebPDemuxReleaseChunkIterator() quando o uso do iterador for concluído.

Observação:dmux precisa persistir durante o ciclo de vida do iterador.

WebPDemuxNextChunk(), WebPDemuxPrevChunk()

Define iter->chunk para apontar para o bloco seguinte (iter->chunk_num + 1) ou anterior (iter->chunk_num - 1). Essas funções não se repetem.

int WebPDemuxNextChunk(WebPChunkIterator* iter);
int WebPDemuxPrevChunk(WebPChunkIterator* iter);

Retorna verdadeiro em caso de sucesso. Caso contrário, retorna falso.

WebPDemuxReleaseChunkIterator()

Libera qualquer memória associada a iter.

void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);

Precisa ser chamado antes de destruir o WebPDemuxer associado com WebPDemuxDelete().

API WebPAnimDecoder

Essa API permite decodificar (possivelmente) imagens WebP animadas.

Exemplo de código

WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
  while (WebPAnimDecoderHasMoreFrames(dec)) {
    uint8_t* buf;
    int timestamp;
    WebPAnimDecoderGetNext(dec, &buf, &timestamp);
    // ... (Render 'buf' based on 'timestamp').
    // ... (Do NOT free 'buf', as it is owned by 'dec').
  }
  WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);

typedef struct WebPAnimDecoder WebPAnimDecoder;  // Main opaque object.

Opções globais

struct WebPAnimDecoderOptions {
  // Output colorspace. Only the following modes are supported:
  // MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA.
  WEBP_CSP_MODE color_mode;
  int use_threads;           // If true, use multi-threaded decoding.
};

WebPAnimDecoderOptionsInit()

Precisa ser sempre chamado para inicializar uma nova estrutura WebPAnimDecoderOptions antes da modificação. Retorna falso em caso de incompatibilidade de versão. WebPAnimDecoderOptionsInit() precisa ser bem-sucedido antes de usar o objeto dec_options.

Parâmetros

dec_options: opções (entrada/saída) usadas para decodificar animação

Retorna
Verdadeiro em caso de sucesso
int WebPAnimDecoderOptionsInit(
    WebPAnimDecoderOptions* dec_options);

WebPAnimDecoderNew()

Cria e inicializa um objeto WebPAnimDecoder.

Parâmetros

webp_data: (in) bitstream do WebP. Isso precisa permanecer inalterado durante o ciclo de vida do objeto WebPAnimDecoder de saída.

dec_options -- (in) opções de decodificação. Pode ser transmitido como NULL para escolher padrões razoáveis. Em particular, o modo de cor MODE_RGBA será escolhido.

Retorna

Um ponteiro para o objeto WebPAnimDecoder recém-criado ou NULL em caso de erro de análise, opção inválida ou erro de memória.

WebPAnimDecoder* WebPAnimDecoderNew(
    const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options);

Informações globais sobre a animação.

struct WebPAnimInfo {
  uint32_t canvas_width;
  uint32_t canvas_height;
  uint32_t loop_count;
  uint32_t bgcolor;
  uint32_t frame_count;
};

WebPAnimDecoderGetInfo()

Receba informações globais sobre a animação.

Parâmetros

dec: (in) instância do decodificador da qual receber informações.

info: informações globais (fora) buscadas na animação.

Retorna

Verdadeiro em caso de sucesso.

int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
                           WebPAnimInfo* info);

WebPAnimDecoderGetNext()

Busca o próximo frame em dec com base nas opções fornecidas para WebPAnimDecoderNew(). Essa vai ser uma tela totalmente reconstruída de tamanho canvas_width * 4 * canvas_height, e não apenas o sub-retângulo do frame. O buffer retornado buf é válido somente até a próxima chamada para WebPAnimDecoderGetNext(), WebPAnimDecoderReset() ou WebPAnimDecoderDelete().

Parâmetros

dec: a instância do decodificador (entrada/saída) em que o próximo frame será buscado.

buf: é um frame decodificado (fora).

timestamp: um carimbo de data/hora (out) do frame em milissegundos.

Retorna

Falso se algum dos argumentos for NULL, se houver um erro de análise ou decodificação ou se não houver mais frames. Caso contrário, retorna "true".

int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
                           uint8_t** buf, int* timestamp);

WebPAnimDecoderHasMoreFrames()

Verifique se restam mais frames para decodificar.

Parâmetros
dec: a instância do decodificador (in) a ser verificada.
Retorna
Verdadeiro se dec não for NULL e alguns frames ainda não tiverem sido decodificados. Caso contrário, retorna "false".
int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);

WebPAnimDecoderReset()

Redefine o objeto WebPAnimDecoder para que a próxima chamada para WebPAnimDecoderGetNext() reinicie a decodificação do primeiro frame. Isso será útil quando todos os frames precisarem ser decodificados várias vezes (por exemplo, vezes de info.loop_count) sem destruir e recriar o objeto dec.

Parâmetros
dec -- a instância do decodificador (entrada/saída) a ser redefinida
void WebPAnimDecoderReset(WebPAnimDecoder* dec);

WebPAnimDecoderGetDemuxer()

Pegue o objeto de multiplexador interno.

Conseguir o objeto de multiplexador pode ser útil se você quiser usar operações disponíveis apenas por meio do demuxer, por exemplo, para receber metadados XMP/EXIF/ICC. O objeto demuxer retornado pertence a dec e é válido somente até a próxima chamada para WebPAnimDecoderDelete().

Parâmetros
dec: é a instância (in) do decodificador de onde o objeto de multiplexador será buscado.
const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec);

WebPAnimDecoderDelete()

Exclui o objeto WebPAnimDecoder.

Parâmetros
dec: a instância do decodificador (entrada/saída) a ser excluída.
Retorna
Verdadeiro em caso de sucesso.
void WebPAnimDecoderDelete(WebPAnimDecoder* dec);

Tipos de dados comuns

Enums

typedef enum WebPFeatureFlags {
  FRAGMENTS_FLAG  = 0x00000001,
  ANIMATION_FLAG  = 0x00000002,
  XMP_FLAG        = 0x00000004,
  EXIF_FLAG       = 0x00000008,
  ALPHA_FLAG      = 0x00000010,
  ICCP_FLAG       = 0x00000020
} WebPFeatureFlags;

// Dispose method (animation only). Indicates how the area used by the current
// frame is to be treated before rendering the next frame on the canvas.
typedef enum WebPMuxAnimDispose {
  WEBP_MUX_DISPOSE_NONE,       // Do not dispose.
  WEBP_MUX_DISPOSE_BACKGROUND  // Dispose to background color.
} WebPMuxAnimDispose;

// Blend operation (animation only). Indicates how transparent pixels of the
// current frame are blended with those of the previous canvas.
typedef enum WebPMuxAnimBlend {
  WEBP_MUX_BLEND,              // Blend.
  WEBP_MUX_NO_BLEND            // Do not blend.
} WebPMuxAnimBlend;

WebPDataInit()

Inicializa o conteúdo do objeto webp_data com valores padrão.

void WebPDataInit(WebPData* webp_data);

WebPDataClear()

Limpa o conteúdo do objeto webp_data chamando free(). Não desaloca o objeto em si.

void WebPDataClear(WebPData* webp_data);

WebPDataCopy()

Aloca o armazenamento necessário para dst e copia o conteúdo de src. Retorna verdadeiro em caso de sucesso.

int WebPDataCopy(const WebPData* src, WebPData* dst);