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