2015-05-18 08:43:10 +00:00
|
|
|
#ifndef KVAZAAR_H_
|
|
|
|
#define KVAZAAR_H_
|
|
|
|
/*****************************************************************************
|
|
|
|
* This file is part of Kvazaar HEVC encoder.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2013-2015 Tampere University of Technology and others (see
|
|
|
|
* COPYING file).
|
|
|
|
*
|
|
|
|
* Kvazaar is free software: you can redistribute it and/or modify it under
|
|
|
|
* the terms of the GNU Lesser General Public License as published by the
|
|
|
|
* Free Software Foundation; either version 2.1 of the License, or (at your
|
|
|
|
* option) any later version.
|
|
|
|
*
|
|
|
|
* Kvazaar is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
|
|
|
* more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with Kvazaar. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
* \brief This file defines the public API of Kvazaar when used as a library.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include "kvazaar_version.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct config_t kvz_cfg;
|
|
|
|
typedef struct encoder_state_t encoder_state_t;
|
|
|
|
typedef struct kvz_payload kvz_payload;
|
|
|
|
typedef struct encoder_control_t encoder_control_t;
|
2015-05-18 15:21:23 +00:00
|
|
|
typedef struct image_t kvz_picture;
|
|
|
|
|
|
|
|
|
|
|
|
#define BIT_DEPTH 8
|
|
|
|
#if BIT_DEPTH == 8
|
|
|
|
typedef uint8_t pixel_t;
|
|
|
|
#else
|
|
|
|
typedef uint16_t pixel_t;
|
|
|
|
#endif
|
|
|
|
|
2015-05-18 08:43:10 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A payload unit containing at most a single frame.
|
|
|
|
* If next is not NULL, the bytestream continues in that payload unit.
|
|
|
|
*/
|
|
|
|
typedef struct kvz_payload {
|
|
|
|
uint32_t type;
|
|
|
|
uint32_t size_bytes;
|
|
|
|
uint8_t *payload;
|
|
|
|
kvz_payload *next;
|
|
|
|
} kvz_payload;
|
|
|
|
|
2015-05-18 15:21:23 +00:00
|
|
|
/**
|
|
|
|
* \brief Struct which contains all picture data
|
|
|
|
*/
|
|
|
|
typedef struct image_t {
|
|
|
|
pixel_t *fulldata; //!< \brief Allocated buffer (only used in the base_image)
|
|
|
|
|
|
|
|
pixel_t *y; //!< \brief Pointer to luma pixel array.
|
|
|
|
pixel_t *u; //!< \brief Pointer to chroma U pixel array.
|
|
|
|
pixel_t *v; //!< \brief Pointer to chroma V pixel array.
|
|
|
|
pixel_t *data[3]; //!< \brief Alternate access method to same data.
|
|
|
|
|
|
|
|
int32_t width; //!< \brief Luma pixel array width.
|
|
|
|
int32_t height; //!< \brief Luma pixel array height.
|
|
|
|
|
|
|
|
int32_t stride; //!< \brief Luma pixel array width for the full picture (should be used as stride)
|
|
|
|
|
|
|
|
struct image_t * base_image; //!< \brief Pointer to the image to which the pixels belong
|
|
|
|
int32_t refcount; //!< \brief Number of references in reflist to the picture
|
|
|
|
|
|
|
|
int32_t poc; //!< \brief Picture order count
|
|
|
|
} image_t;
|
2015-05-18 08:43:10 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Main datastructure representing one instance of the encoder.
|
|
|
|
* - encoder_open
|
|
|
|
* - encoder_close
|
|
|
|
*/
|
|
|
|
typedef struct kvz_encoder {
|
|
|
|
encoder_control_t* control;
|
|
|
|
encoder_state_t* states;
|
2015-05-19 14:48:37 +00:00
|
|
|
unsigned num_encoder_states;
|
|
|
|
unsigned cur_state_num;
|
|
|
|
unsigned frames_started;
|
2015-05-18 08:43:10 +00:00
|
|
|
|
|
|
|
size_t bitstream_length;
|
|
|
|
} kvz_encoder;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct kvz_api {
|
|
|
|
kvz_cfg * (*config_alloc)(void);
|
|
|
|
int (*config_destroy)(kvz_cfg *);
|
|
|
|
int (*config_init)(kvz_cfg *);
|
2015-05-20 13:19:40 +00:00
|
|
|
int (*config_parse)(kvz_cfg *, const char *name, const char *value);
|
2015-05-18 08:43:10 +00:00
|
|
|
|
|
|
|
kvz_encoder * (*encoder_open)(kvz_cfg *);
|
|
|
|
void (*encoder_close)(kvz_encoder *);
|
|
|
|
|
|
|
|
// \brief Encode one picture.
|
|
|
|
// \param encoder
|
|
|
|
// \param pic_in Picture containing the encoded data.
|
|
|
|
// \param pic_out Picture containing the reconstructed data.
|
|
|
|
// \param nals_out The first NAL containing bitstream generated, or NULL.
|
|
|
|
// \return 1 on success, negative on error.
|
2015-05-19 14:48:37 +00:00
|
|
|
int (*encoder_encode)(kvz_encoder *encoder, kvz_picture *pic_in, kvz_picture **pic_out, kvz_payload **payload);
|
2015-05-18 08:43:10 +00:00
|
|
|
} kvz_api;
|
|
|
|
|
|
|
|
// Append API version to the getters name to prevent linking against incompatible versions.
|
|
|
|
#define KVZ_API_CONCAT(func, version) func ## _apiv ## version
|
|
|
|
#define KVZ_API_EXPAND_VERSION(func, version) KVZ_API_CONCAT(func, version)
|
|
|
|
#define kvz_api_get KVZ_API_EXPAND_VERSION(kvz_api_get, KVZ_API_VERSION)
|
|
|
|
const kvz_api* kvz_api_get(int bit_depth);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // KVAZAAR_H_
|