1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVCODEC_CODEC_INTERNAL_H 20cabdff1aSopenharmony_ci#define AVCODEC_CODEC_INTERNAL_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include <stdint.h> 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 25cabdff1aSopenharmony_ci#include "codec.h" 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci/** 28cabdff1aSopenharmony_ci * The codec does not modify any global variables in the init function, 29cabdff1aSopenharmony_ci * allowing to call the init function without locking any global mutexes. 30cabdff1aSopenharmony_ci */ 31cabdff1aSopenharmony_ci#define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0) 32cabdff1aSopenharmony_ci/** 33cabdff1aSopenharmony_ci * The codec allows calling the close function for deallocation even if 34cabdff1aSopenharmony_ci * the init function returned a failure. Without this capability flag, a 35cabdff1aSopenharmony_ci * codec does such cleanup internally when returning failures from the 36cabdff1aSopenharmony_ci * init function and does not expect the close function to be called at 37cabdff1aSopenharmony_ci * all. 38cabdff1aSopenharmony_ci */ 39cabdff1aSopenharmony_ci#define FF_CODEC_CAP_INIT_CLEANUP (1 << 1) 40cabdff1aSopenharmony_ci/** 41cabdff1aSopenharmony_ci * Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set 42cabdff1aSopenharmony_ci * AVFrame.pkt_dts manually. If the flag is set, decode.c won't overwrite 43cabdff1aSopenharmony_ci * this field. If it's unset, decode.c tries to guess the pkt_dts field 44cabdff1aSopenharmony_ci * from the input AVPacket. 45cabdff1aSopenharmony_ci */ 46cabdff1aSopenharmony_ci#define FF_CODEC_CAP_SETS_PKT_DTS (1 << 2) 47cabdff1aSopenharmony_ci/** 48cabdff1aSopenharmony_ci * The decoder extracts and fills its parameters even if the frame is 49cabdff1aSopenharmony_ci * skipped due to the skip_frame setting. 50cabdff1aSopenharmony_ci */ 51cabdff1aSopenharmony_ci#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM (1 << 3) 52cabdff1aSopenharmony_ci/** 53cabdff1aSopenharmony_ci * The decoder sets the cropping fields in the output frames manually. 54cabdff1aSopenharmony_ci * If this cap is set, the generic code will initialize output frame 55cabdff1aSopenharmony_ci * dimensions to coded rather than display values. 56cabdff1aSopenharmony_ci */ 57cabdff1aSopenharmony_ci#define FF_CODEC_CAP_EXPORTS_CROPPING (1 << 4) 58cabdff1aSopenharmony_ci/** 59cabdff1aSopenharmony_ci * Codec initializes slice-based threading with a main function 60cabdff1aSopenharmony_ci */ 61cabdff1aSopenharmony_ci#define FF_CODEC_CAP_SLICE_THREAD_HAS_MF (1 << 5) 62cabdff1aSopenharmony_ci/* 63cabdff1aSopenharmony_ci * The codec supports frame threading and has inter-frame dependencies, so it 64cabdff1aSopenharmony_ci * uses ff_thread_report/await_progress(). 65cabdff1aSopenharmony_ci */ 66cabdff1aSopenharmony_ci#define FF_CODEC_CAP_ALLOCATE_PROGRESS (1 << 6) 67cabdff1aSopenharmony_ci/** 68cabdff1aSopenharmony_ci * Codec handles avctx->thread_count == 0 (auto) internally. 69cabdff1aSopenharmony_ci */ 70cabdff1aSopenharmony_ci#define FF_CODEC_CAP_AUTO_THREADS (1 << 7) 71cabdff1aSopenharmony_ci/** 72cabdff1aSopenharmony_ci * Codec handles output frame properties internally instead of letting the 73cabdff1aSopenharmony_ci * internal logic derive them from AVCodecInternal.last_pkt_props. 74cabdff1aSopenharmony_ci */ 75cabdff1aSopenharmony_ci#define FF_CODEC_CAP_SETS_FRAME_PROPS (1 << 8) 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci/** 78cabdff1aSopenharmony_ci * FFCodec.codec_tags termination value 79cabdff1aSopenharmony_ci */ 80cabdff1aSopenharmony_ci#define FF_CODEC_TAGS_END -1 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_citypedef struct FFCodecDefault { 83cabdff1aSopenharmony_ci const char *key; 84cabdff1aSopenharmony_ci const char *value; 85cabdff1aSopenharmony_ci} FFCodecDefault; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_cistruct AVCodecContext; 88cabdff1aSopenharmony_cistruct AVSubtitle; 89cabdff1aSopenharmony_cistruct AVPacket; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_cienum FFCodecType { 92cabdff1aSopenharmony_ci /* The codec is a decoder using the decode callback; 93cabdff1aSopenharmony_ci * audio and video codecs only. */ 94cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_DECODE, 95cabdff1aSopenharmony_ci /* The codec is a decoder using the decode_sub callback; 96cabdff1aSopenharmony_ci * subtitle codecs only. */ 97cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_DECODE_SUB, 98cabdff1aSopenharmony_ci /* The codec is a decoder using the receive_frame callback; 99cabdff1aSopenharmony_ci * audio and video codecs only. */ 100cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_RECEIVE_FRAME, 101cabdff1aSopenharmony_ci /* The codec is an encoder using the encode callback; 102cabdff1aSopenharmony_ci * audio and video codecs only. */ 103cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_ENCODE, 104cabdff1aSopenharmony_ci /* The codec is an encoder using the encode_sub callback; 105cabdff1aSopenharmony_ci * subtitle codecs only. */ 106cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_ENCODE_SUB, 107cabdff1aSopenharmony_ci /* The codec is an encoder using the receive_packet callback; 108cabdff1aSopenharmony_ci * audio and video codecs only. */ 109cabdff1aSopenharmony_ci FF_CODEC_CB_TYPE_RECEIVE_PACKET, 110cabdff1aSopenharmony_ci}; 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_citypedef struct FFCodec { 113cabdff1aSopenharmony_ci /** 114cabdff1aSopenharmony_ci * The public AVCodec. See codec.h for it. 115cabdff1aSopenharmony_ci */ 116cabdff1aSopenharmony_ci AVCodec p; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci /** 119cabdff1aSopenharmony_ci * Internal codec capabilities FF_CODEC_CAP_*. 120cabdff1aSopenharmony_ci */ 121cabdff1aSopenharmony_ci unsigned caps_internal:29; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci /** 124cabdff1aSopenharmony_ci * This field determines the type of the codec (decoder/encoder) 125cabdff1aSopenharmony_ci * and also the exact callback cb implemented by the codec. 126cabdff1aSopenharmony_ci * cb_type uses enum FFCodecType values. 127cabdff1aSopenharmony_ci */ 128cabdff1aSopenharmony_ci unsigned cb_type:3; 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci int priv_data_size; 131cabdff1aSopenharmony_ci /** 132cabdff1aSopenharmony_ci * @name Frame-level threading support functions 133cabdff1aSopenharmony_ci * @{ 134cabdff1aSopenharmony_ci */ 135cabdff1aSopenharmony_ci /** 136cabdff1aSopenharmony_ci * Copy necessary context variables from a previous thread context to the current one. 137cabdff1aSopenharmony_ci * If not defined, the next thread will start automatically; otherwise, the codec 138cabdff1aSopenharmony_ci * must call ff_thread_finish_setup(). 139cabdff1aSopenharmony_ci * 140cabdff1aSopenharmony_ci * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. 141cabdff1aSopenharmony_ci */ 142cabdff1aSopenharmony_ci int (*update_thread_context)(struct AVCodecContext *dst, const struct AVCodecContext *src); 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci /** 145cabdff1aSopenharmony_ci * Copy variables back to the user-facing context 146cabdff1aSopenharmony_ci */ 147cabdff1aSopenharmony_ci int (*update_thread_context_for_user)(struct AVCodecContext *dst, const struct AVCodecContext *src); 148cabdff1aSopenharmony_ci /** @} */ 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci /** 151cabdff1aSopenharmony_ci * Private codec-specific defaults. 152cabdff1aSopenharmony_ci */ 153cabdff1aSopenharmony_ci const FFCodecDefault *defaults; 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci /** 156cabdff1aSopenharmony_ci * Initialize codec static data, called from av_codec_iterate(). 157cabdff1aSopenharmony_ci * 158cabdff1aSopenharmony_ci * This is not intended for time consuming operations as it is 159cabdff1aSopenharmony_ci * run for every codec regardless of that codec being used. 160cabdff1aSopenharmony_ci */ 161cabdff1aSopenharmony_ci void (*init_static_data)(struct FFCodec *codec); 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci int (*init)(struct AVCodecContext *); 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci union { 166cabdff1aSopenharmony_ci /** 167cabdff1aSopenharmony_ci * Decode to an AVFrame. 168cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_DECODE. 169cabdff1aSopenharmony_ci * 170cabdff1aSopenharmony_ci * @param avctx codec context 171cabdff1aSopenharmony_ci * @param[out] frame AVFrame for output 172cabdff1aSopenharmony_ci * @param[out] got_frame_ptr decoder sets to 0 or 1 to indicate that 173cabdff1aSopenharmony_ci * a non-empty frame was returned in frame. 174cabdff1aSopenharmony_ci * @param[in] avpkt AVPacket containing the data to be decoded 175cabdff1aSopenharmony_ci * @return amount of bytes read from the packet on success, 176cabdff1aSopenharmony_ci * negative error code on failure 177cabdff1aSopenharmony_ci */ 178cabdff1aSopenharmony_ci int (*decode)(struct AVCodecContext *avctx, struct AVFrame *frame, 179cabdff1aSopenharmony_ci int *got_frame_ptr, struct AVPacket *avpkt); 180cabdff1aSopenharmony_ci /** 181cabdff1aSopenharmony_ci * Decode subtitle data to an AVSubtitle. 182cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_DECODE_SUB. 183cabdff1aSopenharmony_ci * 184cabdff1aSopenharmony_ci * Apart from that this is like the decode callback. 185cabdff1aSopenharmony_ci */ 186cabdff1aSopenharmony_ci int (*decode_sub)(struct AVCodecContext *avctx, struct AVSubtitle *sub, 187cabdff1aSopenharmony_ci int *got_frame_ptr, const struct AVPacket *avpkt); 188cabdff1aSopenharmony_ci /** 189cabdff1aSopenharmony_ci * Decode API with decoupled packet/frame dataflow. 190cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_RECEIVE_FRAME. 191cabdff1aSopenharmony_ci * 192cabdff1aSopenharmony_ci * This function is called to get one output frame. It should call 193cabdff1aSopenharmony_ci * ff_decode_get_packet() to obtain input data. 194cabdff1aSopenharmony_ci */ 195cabdff1aSopenharmony_ci int (*receive_frame)(struct AVCodecContext *avctx, struct AVFrame *frame); 196cabdff1aSopenharmony_ci /** 197cabdff1aSopenharmony_ci * Encode data to an AVPacket. 198cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_ENCODE 199cabdff1aSopenharmony_ci * 200cabdff1aSopenharmony_ci * @param avctx codec context 201cabdff1aSopenharmony_ci * @param[out] avpkt output AVPacket 202cabdff1aSopenharmony_ci * @param[in] frame AVFrame containing the input to be encoded 203cabdff1aSopenharmony_ci * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a 204cabdff1aSopenharmony_ci * non-empty packet was returned in avpkt. 205cabdff1aSopenharmony_ci * @return 0 on success, negative error code on failure 206cabdff1aSopenharmony_ci */ 207cabdff1aSopenharmony_ci int (*encode)(struct AVCodecContext *avctx, struct AVPacket *avpkt, 208cabdff1aSopenharmony_ci const struct AVFrame *frame, int *got_packet_ptr); 209cabdff1aSopenharmony_ci /** 210cabdff1aSopenharmony_ci * Encode subtitles to a raw buffer. 211cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_ENCODE_SUB. 212cabdff1aSopenharmony_ci */ 213cabdff1aSopenharmony_ci int (*encode_sub)(struct AVCodecContext *avctx, uint8_t *buf, 214cabdff1aSopenharmony_ci int buf_size, const struct AVSubtitle *sub); 215cabdff1aSopenharmony_ci /** 216cabdff1aSopenharmony_ci * Encode API with decoupled frame/packet dataflow. 217cabdff1aSopenharmony_ci * cb is in this state if cb_type is FF_CODEC_CB_TYPE_RECEIVE_PACKET. 218cabdff1aSopenharmony_ci * 219cabdff1aSopenharmony_ci * This function is called to get one output packet. 220cabdff1aSopenharmony_ci * It should call ff_encode_get_frame() to obtain input data. 221cabdff1aSopenharmony_ci */ 222cabdff1aSopenharmony_ci int (*receive_packet)(struct AVCodecContext *avctx, struct AVPacket *avpkt); 223cabdff1aSopenharmony_ci } cb; 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci int (*close)(struct AVCodecContext *); 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci /** 228cabdff1aSopenharmony_ci * Flush buffers. 229cabdff1aSopenharmony_ci * Will be called when seeking 230cabdff1aSopenharmony_ci */ 231cabdff1aSopenharmony_ci void (*flush)(struct AVCodecContext *); 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci /** 234cabdff1aSopenharmony_ci * Decoding only, a comma-separated list of bitstream filters to apply to 235cabdff1aSopenharmony_ci * packets before decoding. 236cabdff1aSopenharmony_ci */ 237cabdff1aSopenharmony_ci const char *bsfs; 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci /** 240cabdff1aSopenharmony_ci * Array of pointers to hardware configurations supported by the codec, 241cabdff1aSopenharmony_ci * or NULL if no hardware supported. The array is terminated by a NULL 242cabdff1aSopenharmony_ci * pointer. 243cabdff1aSopenharmony_ci * 244cabdff1aSopenharmony_ci * The user can only access this field via avcodec_get_hw_config(). 245cabdff1aSopenharmony_ci */ 246cabdff1aSopenharmony_ci const struct AVCodecHWConfigInternal *const *hw_configs; 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci /** 249cabdff1aSopenharmony_ci * List of supported codec_tags, terminated by FF_CODEC_TAGS_END. 250cabdff1aSopenharmony_ci */ 251cabdff1aSopenharmony_ci const uint32_t *codec_tags; 252cabdff1aSopenharmony_ci} FFCodec; 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci#define FF_CODEC_DECODE_CB(func) \ 255cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_DECODE, \ 256cabdff1aSopenharmony_ci .cb.decode = (func) 257cabdff1aSopenharmony_ci#define FF_CODEC_DECODE_SUB_CB(func) \ 258cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_DECODE_SUB, \ 259cabdff1aSopenharmony_ci .cb.decode_sub = (func) 260cabdff1aSopenharmony_ci#define FF_CODEC_RECEIVE_FRAME_CB(func) \ 261cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_RECEIVE_FRAME, \ 262cabdff1aSopenharmony_ci .cb.receive_frame = (func) 263cabdff1aSopenharmony_ci#define FF_CODEC_ENCODE_CB(func) \ 264cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_ENCODE, \ 265cabdff1aSopenharmony_ci .cb.encode = (func) 266cabdff1aSopenharmony_ci#define FF_CODEC_ENCODE_SUB_CB(func) \ 267cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_ENCODE_SUB, \ 268cabdff1aSopenharmony_ci .cb.encode_sub = (func) 269cabdff1aSopenharmony_ci#define FF_CODEC_RECEIVE_PACKET_CB(func) \ 270cabdff1aSopenharmony_ci .cb_type = FF_CODEC_CB_TYPE_RECEIVE_PACKET, \ 271cabdff1aSopenharmony_ci .cb.receive_packet = (func) 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_cistatic av_always_inline const FFCodec *ffcodec(const AVCodec *codec) 274cabdff1aSopenharmony_ci{ 275cabdff1aSopenharmony_ci return (const FFCodec*)codec; 276cabdff1aSopenharmony_ci} 277cabdff1aSopenharmony_ci 278cabdff1aSopenharmony_ci#endif /* AVCODEC_CODEC_INTERNAL_H */ 279