190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1279f15823c34ae1e423108295e416213200bb280fAndreas Huber/*!\file 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \brief Describes the decoder algorithm interface for algorithm 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * implementations. 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This file defines the private structures and data types that are only 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * relevant to implementing an algorithm, as opposed to using it. 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * To create a decoder algorithm class, an interface structure is put 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * into the global namespace: 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * <pre> 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * my_codec.c: 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * vpx_codec_iface_t my_codec = { 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * "My Codec v1.0", 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * VPX_CODEC_ALG_ABI_VERSION, 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ... 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * }; 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * </pre> 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * An application instantiates a specific decoder instance by using 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * vpx_codec_init() and a pointer to the algorithm's interface structure: 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * <pre> 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * my_app.c: 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * extern vpx_codec_iface_t my_codec; 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * { 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * vpx_codec_ctx_t algo; 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * res = vpx_codec_init(&algo, &my_codec); 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * } 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * </pre> 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Once initialized, the instance is manged using other functions from 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * the vpx_codec_* family. 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VPX_INTERNAL_VPX_CODEC_INTERNAL_H_ 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VPX_INTERNAL_VPX_CODEC_INTERNAL_H_ 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "../vpx_decoder.h" 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "../vpx_encoder.h" 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdarg.h> 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Current ABI version number 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \internal 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * If this file is altered in any way that changes the ABI, this value 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * must be bumped. Examples include, but are not limited to, changing 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * types, removing or reassigning enums, adding/removing/rearranging 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * fields to structures 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VPX_CODEC_INTERNAL_ABI_VERSION (5) /**<\hideinitializer*/ 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct vpx_codec_alg_priv vpx_codec_alg_priv_t; 651b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct vpx_codec_priv_enc_mr_cfg vpx_codec_priv_enc_mr_cfg_t; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief init function pointer prototype 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Performs algorithm-specific initialization of the decoder context. This 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * function is called by the generic vpx_codec_init() wrapper function, so 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * plugins implementing this interface may trust the input parameters to be 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * properly initialized. 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The input stream was recognized and decoder initialized. 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_MEM_ERROR 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Memory operation failed. 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 801b362b15af34006e6a11974088a46d42b903418eJohanntypedef vpx_codec_err_t (*vpx_codec_init_fn_t)(vpx_codec_ctx_t *ctx, 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_priv_enc_mr_cfg_t *data); 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief destroy function pointer prototype 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Performs algorithm-specific destruction of the decoder context. This 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * function is called by the generic vpx_codec_destroy() wrapper function, 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * so plugins implementing this interface may trust the input parameters 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * to be properly initialized. 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The input stream was recognized and decoder initialized. 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_MEM_ERROR 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Memory operation failed. 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_destroy_fn_t)(vpx_codec_alg_priv_t *ctx); 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief parse stream info function pointer prototype 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 10091037db265ecdd914a26e056cf69207b4f50924ehkuang * Performs high level parsing of the bitstream. This function is called by the 10191037db265ecdd914a26e056cf69207b4f50924ehkuang * generic vpx_codec_peek_stream_info() wrapper function, so plugins 10291037db265ecdd914a26e056cf69207b4f50924ehkuang * implementing this interface may trust the input parameters to be properly 10391037db265ecdd914a26e056cf69207b4f50924ehkuang * initialized. 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] data Pointer to a block of data to parse 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] data_sz Size of the data buffer 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in,out] si Pointer to stream info to update. The size member 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \ref MUST be properly initialized, but \ref MAY be 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * clobbered by the algorithm. This parameter \ref MAY 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * be NULL. 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Bitstream is parsable and stream information updated 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_peek_si_fn_t)(const uint8_t *data, 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int data_sz, 117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_stream_info_t *si); 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Return information about the current stream. 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Returns information about the stream that has been parsed during decoding. 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in,out] si Pointer to stream info to update. The size member 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \ref MUST be properly initialized, but \ref MAY be 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * clobbered by the algorithm. This parameter \ref MAY 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * be NULL. 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Bitstream is parsable and stream information updated 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_get_si_fn_t)(vpx_codec_alg_priv_t *ctx, 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_stream_info_t *si); 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief control function pointer prototype 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This function is used to exchange algorithm specific data with the decoder 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * instance. This can be used to implement features specific to a particular 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * algorithm. 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This function is called by the generic vpx_codec_control() wrapper 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * function, so plugins implementing this interface may trust the input 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * parameters to be properly initialized. However, this interface does not 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * provide type safety for the exchanged data or assign meanings to the 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * control codes. Those details should be specified in the algorithm's 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * header file. In particular, the ctrl_id parameter is guaranteed to exist 147f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the algorithm's control mapping table, and the data parameter may be NULL. 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctrl_id Algorithm specific control identifier 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in,out] data Data to exchange with algorithm instance. 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The internal state data was deserialized. 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_control_fn_t)(vpx_codec_alg_priv_t *ctx, 158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ctrl_id, 159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_list ap); 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief control function pointer mapping 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This structure stores the mapping between control identifiers and 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * implementing functions. Each algorithm provides a list of these 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * mappings. This list is searched by the vpx_codec_control() wrapper 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * function to determine which function to invoke. The special 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * value {0, NULL} is used to indicate end-of-list, and must be 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * present. The special value {0, <non-null>} can be used as a catch-all 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * mapping. This implies that ctrl_id values chosen by the algorithm 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \ref MUST be non-zero. 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef const struct vpx_codec_ctrl_fn_map { 173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ctrl_id; 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_control_fn_t fn; 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vpx_codec_ctrl_fn_map_t; 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief decode data function pointer prototype 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Processes a buffer of coded data. If the processing results in a new 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * decoded frame becoming available, #VPX_CODEC_CB_PUT_SLICE and 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * #VPX_CODEC_CB_PUT_FRAME events are generated as appropriate. This 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * function is called by the generic vpx_codec_decode() wrapper function, 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * so plugins implementing this interface may trust the input parameters 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * to be properly initialized. 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] data Pointer to this block of new coded data. If 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * NULL, a #VPX_CODEC_CB_PUT_FRAME event is posted 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * for the previously decoded frame. 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] data_sz Size of the coded data, in bytes. 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \return Returns #VPX_CODEC_OK if the coded data was processed completely 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * and future pictures can be decoded without error. Otherwise, 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * see the descriptions of the other error codes in ::vpx_codec_err_t 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * for recoverability capabilities. 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_decode_fn_t)(vpx_codec_alg_priv_t *ctx, 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t *data, 199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int data_sz, 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *user_priv, 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang long deadline); 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Decoded frames iterator 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Iterates over a list of the frames available for display. The iterator 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * storage should be initialized to NULL to start the iteration. Iteration is 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * complete when this function returns NULL. 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The list of available frames becomes valid upon completion of the 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * vpx_codec_decode call, and remains valid until the next call to vpx_codec_decode. 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in out] iter Iterator storage, initialized to NULL 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \return Returns a pointer to an image, if one is ready for display. Frames 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * produced will always be in PTS (presentation time stamp) order. 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef vpx_image_t *(*vpx_codec_get_frame_fn_t)(vpx_codec_alg_priv_t *ctx, 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iter_t *iter); 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 221b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/*!\brief Pass in external frame buffers for the decoder to use. 222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 223b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Registers functions to be called when libvpx needs a frame buffer 224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * to decode the current frame and a function to be called when libvpx does 225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * not internally reference the frame buffer. This set function must 226b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * be called before the first call to decode or libvpx will assume the 227b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * default behavior of allocating frame buffers internally. 228b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \param[in] ctx Pointer to this instance's context 230b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \param[in] cb_get Pointer to the get callback function 231b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \param[in] cb_release Pointer to the release callback function 232b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \param[in] cb_priv Callback's private data 233b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 234b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \retval #VPX_CODEC_OK 235b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * External frame buffers will be used by libvpx. 236b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \retval #VPX_CODEC_INVALID_PARAM 237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * One or more of the callbacks were NULL. 238b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \retval #VPX_CODEC_ERROR 239b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Decoder context not initialized, or algorithm not capable of 240b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * using external frame buffers. 241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 242b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * \note 243b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * When decoding VP9, the application may be required to pass in at least 244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * #VP9_MAXIMUM_REF_BUFFERS + #VPX_MAXIMUM_WORK_BUFFERS external frame 245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * buffers. 246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */ 247b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef vpx_codec_err_t (*vpx_codec_set_fb_fn_t)( 248b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_codec_alg_priv_t *ctx, 249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_get_frame_buffer_cb_fn_t cb_get, 250b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_release_frame_buffer_cb_fn_t cb_release, void *cb_priv); 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25279f15823c34ae1e423108295e416213200bb280fAndreas Huber/*\brief eXternal Memory Allocation memory map get iterator 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Iterates over a list of the memory maps requested by the decoder. The 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * iterator storage should be initialized to NULL to start the iteration. 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Iteration is complete when this function returns NULL. 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in out] iter Iterator storage, initialized to NULL 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \return Returns a pointer to an memory segment descriptor, or NULL to 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * indicate end-of-list. 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_get_mmap_fn_t)(const vpx_codec_ctx_t *ctx, 264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_mmap_t *mmap, 265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iter_t *iter); 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26879f15823c34ae1e423108295e416213200bb280fAndreas Huber/*\brief eXternal Memory Allocation memory map set iterator 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Sets a memory descriptor inside the decoder instance. 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] ctx Pointer to this instance's context 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \param[in] mmap Memory map to store. 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_OK 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The memory map was accepted and stored. 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \retval #VPX_CODEC_MEM_ERROR 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The memory map was rejected. 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_set_mmap_fn_t)(vpx_codec_ctx_t *ctx, 281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const vpx_codec_mmap_t *mmap); 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t (*vpx_codec_encode_fn_t)(vpx_codec_alg_priv_t *ctx, 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const vpx_image_t *img, 286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_pts_t pts, 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned long duration, 288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_enc_frame_flags_t flags, 289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned long deadline); 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef const vpx_codec_cx_pkt_t *(*vpx_codec_get_cx_data_fn_t)(vpx_codec_alg_priv_t *ctx, 291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iter_t *iter); 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_err_t 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(*vpx_codec_enc_config_set_fn_t)(vpx_codec_alg_priv_t *ctx, 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const vpx_codec_enc_cfg_t *cfg); 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_fixed_buf_t * 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(*vpx_codec_get_global_headers_fn_t)(vpx_codec_alg_priv_t *ctx); 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_image_t * 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(*vpx_codec_get_preview_frame_fn_t)(vpx_codec_alg_priv_t *ctx); 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3021b362b15af34006e6a11974088a46d42b903418eJohanntypedef vpx_codec_err_t 3031b362b15af34006e6a11974088a46d42b903418eJohann(*vpx_codec_enc_mr_get_mem_loc_fn_t)(const vpx_codec_enc_cfg_t *cfg, 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void **mem_loc); 3051b362b15af34006e6a11974088a46d42b903418eJohann 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief usage configuration mapping 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This structure stores the mapping between usage identifiers and 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * configuration structures. Each algorithm provides a list of these 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * mappings. This list is searched by the vpx_codec_enc_config_default() 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * wrapper function to determine which config to return. The special value 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * {-1, {0}} is used to indicate end-of-list, and must be present. At least 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * one mapping must be present, in addition to the end-of-list. 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef const struct vpx_codec_enc_cfg_map { 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int usage; 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_enc_cfg_t cfg; 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vpx_codec_enc_cfg_map_t; 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define NOT_IMPLEMENTED 0 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Decoder algorithm interface interface 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * All decoders \ref MUST expose a variable of this type. 32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct vpx_codec_iface { 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *name; /**< Identification String */ 329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int abi_version; /**< Implemented ABI version */ 330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_caps_t caps; /**< Decoder capabilities */ 331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_init_fn_t init; /**< \copydoc ::vpx_codec_init_fn_t */ 332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_destroy_fn_t destroy; /**< \copydoc ::vpx_codec_destroy_fn_t */ 333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_ctrl_fn_map_t *ctrl_maps; /**< \copydoc ::vpx_codec_ctrl_fn_map_t */ 334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_get_mmap_fn_t get_mmap; /**< \copydoc ::vpx_codec_get_mmap_fn_t */ 335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_set_mmap_fn_t set_mmap; /**< \copydoc ::vpx_codec_set_mmap_fn_t */ 336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_dec_iface { 337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_peek_si_fn_t peek_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */ 33891037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_codec_get_si_fn_t get_si; /**< \copydoc ::vpx_codec_get_si_fn_t */ 339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_decode_fn_t decode; /**< \copydoc ::vpx_codec_decode_fn_t */ 340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_get_frame_fn_t get_frame; /**< \copydoc ::vpx_codec_get_frame_fn_t */ 341b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_codec_set_fb_fn_t set_fb_fn; /**< \copydoc ::vpx_codec_set_fb_fn_t */ 342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } dec; 343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_enc_iface { 344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_enc_cfg_map_t *cfg_maps; /**< \copydoc ::vpx_codec_enc_cfg_map_t */ 345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_encode_fn_t encode; /**< \copydoc ::vpx_codec_encode_fn_t */ 346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_get_cx_data_fn_t get_cx_data; /**< \copydoc ::vpx_codec_get_cx_data_fn_t */ 347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_enc_config_set_fn_t cfg_set; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */ 348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_get_global_headers_fn_t get_glob_hdrs; /**< \copydoc ::vpx_codec_get_global_headers_fn_t */ 349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_get_preview_frame_fn_t get_preview; /**< \copydoc ::vpx_codec_get_preview_frame_fn_t */ 350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_enc_mr_get_mem_loc_fn_t mr_get_mem_loc; /**< \copydoc ::vpx_codec_enc_mr_get_mem_loc_fn_t */ 351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } enc; 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Callback function pointer / user data pair storage */ 355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct vpx_codec_priv_cb_pair { 356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang union { 357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_put_frame_cb_fn_t put_frame; 358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_put_slice_cb_fn_t put_slice; 359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } u; 360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *user_priv; 36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vpx_codec_priv_cb_pair_t; 36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Instance private storage 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This structure is allocated by the algorithm's init function. It can be 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * extended in one of two ways. First, a second, algorithm specific structure 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * can be allocated and the priv member pointed to it. Alternatively, this 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * structure can be made the first member of the algorithm specific structure, 37079f15823c34ae1e423108295e416213200bb280fAndreas Huber * and the pointer cast to the proper type. 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct vpx_codec_priv { 373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int sz; 374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iface_t *iface; 375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_alg_priv *alg_priv; 376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *err_detail; 377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_flags_t init_flags; 378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct { 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_priv_cb_pair_t put_frame_cb; 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_priv_cb_pair_t put_slice_cb; 381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } dec; 382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct { 383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int tbd; 384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_fixed_buf cx_data_dst_buf; 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int cx_data_pad_before; 386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int cx_data_pad_after; 387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_cx_pkt_t cx_data_pkt; 388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int total_encoders; 389ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } enc; 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3921b362b15af34006e6a11974088a46d42b903418eJohann/* 3931b362b15af34006e6a11974088a46d42b903418eJohann * Multi-resolution encoding internal configuration 3941b362b15af34006e6a11974088a46d42b903418eJohann */ 3951b362b15af34006e6a11974088a46d42b903418eJohannstruct vpx_codec_priv_enc_mr_cfg 3961b362b15af34006e6a11974088a46d42b903418eJohann{ 3971b362b15af34006e6a11974088a46d42b903418eJohann unsigned int mr_total_resolutions; 3981b362b15af34006e6a11974088a46d42b903418eJohann unsigned int mr_encoder_id; 3991b362b15af34006e6a11974088a46d42b903418eJohann struct vpx_rational mr_down_sampling_factor; 4001b362b15af34006e6a11974088a46d42b903418eJohann void* mr_low_res_mode_info; 4011b362b15af34006e6a11974088a46d42b903418eJohann}; 4021b362b15af34006e6a11974088a46d42b903418eJohann 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef VPX_CTRL_USE_TYPE 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_CTRL_USE_TYPE(id, typ) \ 405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static typ id##__value(va_list args) {return va_arg(args, typ);} \ 406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static typ id##__convert(void *x)\ 407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang {\ 408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang union\ 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {\ 410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x;\ 411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang typ d;\ 412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } u;\ 413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang u.x = x;\ 414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return u.d;\ 415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef VPX_CTRL_USE_TYPE_DEPRECATED 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \ 420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static typ id##__value(va_list args) {return va_arg(args, typ);} \ 421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static typ id##__convert(void *x)\ 422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang {\ 423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang union\ 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {\ 425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x;\ 426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang typ d;\ 427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } u;\ 428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang u.x = x;\ 429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return u.d;\ 430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CAST(id, arg) id##__value(arg) 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define RECAST(id, x) id##__convert(x) 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 436538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* CODEC_INTERFACE convenience macro 437538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 438538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * By convention, each codec interface is a struct with extern linkage, where 439538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * the symbol is suffixed with _algo. A getter function is also defined to 440538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * return a pointer to the struct, since in some cases it's easier to work 441538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * with text symbols than data symbols (see issue #169). This function has 442538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * the same name as the struct, less the _algo suffix. The CODEC_INTERFACE 443538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * macro is provided to define this getter function automatically. 444538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 445538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define CODEC_INTERFACE(id)\ 446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iface_t* id(void) { return &id##_algo; }\ 447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iface_t id##_algo 448538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 449538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Internal Utility Functions 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 45279f15823c34ae1e423108295e416213200bb280fAndreas Huber * The following functions are intended to be used inside algorithms as 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * utilities for manipulating vpx_codec_* data structures. 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct vpx_codec_pkt_list { 456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int cnt; 457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int max; 458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_cx_pkt pkts[1]; 45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vpx_codec_pkt_list_decl(n)\ 462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang union {struct vpx_codec_pkt_list head;\ 463ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct {struct vpx_codec_pkt_list head;\ 464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_cx_pkt pkts[n];} alloc;} 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vpx_codec_pkt_list_init(m)\ 467ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (m)->alloc.head.cnt = 0,\ 468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (m)->alloc.head.max = sizeof((m)->alloc.pkts) / sizeof((m)->alloc.pkts[0]) 46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_pkt_list_add(struct vpx_codec_pkt_list *, 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const struct vpx_codec_cx_pkt *); 47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vpx_codec_cx_pkt_t * 47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, 47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_iter_t *iter); 47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h> 48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <setjmp.h> 481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct vpx_internal_error_info { 483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_err_t error_code; 484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int has_detail; 485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang char detail[80]; 486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int setjmp; 487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang jmp_buf jmp; 48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vpx_internal_error(struct vpx_internal_error_info *info, 49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t error, 49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const char *fmt, 493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ...) { 494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_list ap; 49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 496ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang info->error_code = error; 497ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang info->has_detail = 0; 49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (fmt) { 500ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang size_t sz = sizeof(info->detail); 50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 502ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang info->has_detail = 1; 503ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_start(ap, fmt); 504ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vsnprintf(info->detail, sz - 1, fmt, ap); 505ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_end(ap); 506ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang info->detail[sz - 1] = '\0'; 507ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 509ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (info->setjmp) 510ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang longjmp(info->jmp, info->error_code); 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 51291037db265ecdd914a26e056cf69207b4f50924ehkuang 51391037db265ecdd914a26e056cf69207b4f50924ehkuang//------------------------------------------------------------------------------ 51491037db265ecdd914a26e056cf69207b4f50924ehkuang// mmap interface 51591037db265ecdd914a26e056cf69207b4f50924ehkuang 51691037db265ecdd914a26e056cf69207b4f50924ehkuangtypedef struct { 51791037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int id; 51891037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned long sz; 51991037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int align; 52091037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int flags; 52191037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned long (*calc_sz)(const vpx_codec_dec_cfg_t *, vpx_codec_flags_t); 52291037db265ecdd914a26e056cf69207b4f50924ehkuang} mem_req_t; 52391037db265ecdd914a26e056cf69207b4f50924ehkuang 52491037db265ecdd914a26e056cf69207b4f50924ehkuang// Allocates mmap.priv and sets mmap.base based on mmap.sz/align/flags 52591037db265ecdd914a26e056cf69207b4f50924ehkuang// requirements. 52691037db265ecdd914a26e056cf69207b4f50924ehkuang// Returns #VPX_CODEC_OK on success, #VPX_CODEC_MEM_ERROR otherwise. 52791037db265ecdd914a26e056cf69207b4f50924ehkuangvpx_codec_err_t vpx_mmap_alloc(vpx_codec_mmap_t *mmap); 52891037db265ecdd914a26e056cf69207b4f50924ehkuang 52991037db265ecdd914a26e056cf69207b4f50924ehkuang// Frees mmap.base allocated by a call to vpx_mmap_alloc(). 53091037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vpx_mmap_dtor(vpx_codec_mmap_t *mmap); 53191037db265ecdd914a26e056cf69207b4f50924ehkuang 53291037db265ecdd914a26e056cf69207b4f50924ehkuang// Checks each mmap has the size requirement specificied by mem_reqs. 53391037db265ecdd914a26e056cf69207b4f50924ehkuang// Returns #VPX_CODEC_OK on success, #VPX_CODEC_MEM_ERROR otherwise. 53491037db265ecdd914a26e056cf69207b4f50924ehkuangvpx_codec_err_t vpx_validate_mmaps(const vpx_codec_stream_info_t *si, 53591037db265ecdd914a26e056cf69207b4f50924ehkuang const vpx_codec_mmap_t *mmaps, 53691037db265ecdd914a26e056cf69207b4f50924ehkuang const mem_req_t *mem_reqs, int nreqs, 53791037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_codec_flags_t init_flags); 538b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 539b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 541b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 542b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif // VPX_INTERNAL_VPX_CODEC_INTERNAL_H_ 543