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/**
20cabdff1aSopenharmony_ci * @file
21cabdff1aSopenharmony_ci * common internal api header.
22cabdff1aSopenharmony_ci */
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#ifndef AVCODEC_INTERNAL_H
25cabdff1aSopenharmony_ci#define AVCODEC_INTERNAL_H
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include <stdint.h>
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "libavutil/buffer.h"
30cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
31cabdff1aSopenharmony_ci#include "libavutil/mathematics.h"
32cabdff1aSopenharmony_ci#include "libavutil/pixfmt.h"
33cabdff1aSopenharmony_ci#include "avcodec.h"
34cabdff1aSopenharmony_ci#include "config.h"
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#define FF_SANE_NB_CHANNELS 512U
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#if HAVE_SIMD_ALIGN_64
39cabdff1aSopenharmony_ci#   define STRIDE_ALIGN 64 /* AVX-512 */
40cabdff1aSopenharmony_ci#elif HAVE_SIMD_ALIGN_32
41cabdff1aSopenharmony_ci#   define STRIDE_ALIGN 32
42cabdff1aSopenharmony_ci#elif HAVE_SIMD_ALIGN_16
43cabdff1aSopenharmony_ci#   define STRIDE_ALIGN 16
44cabdff1aSopenharmony_ci#else
45cabdff1aSopenharmony_ci#   define STRIDE_ALIGN 8
46cabdff1aSopenharmony_ci#endif
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_citypedef struct AVCodecInternal {
49cabdff1aSopenharmony_ci    /**
50cabdff1aSopenharmony_ci     * When using frame-threaded decoding, this field is set for the first
51cabdff1aSopenharmony_ci     * worker thread (e.g. to decode extradata just once).
52cabdff1aSopenharmony_ci     */
53cabdff1aSopenharmony_ci    int is_copy;
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_ci    /**
56cabdff1aSopenharmony_ci     * An audio frame with less than required samples has been submitted and
57cabdff1aSopenharmony_ci     * padded with silence. Reject all subsequent frames.
58cabdff1aSopenharmony_ci     */
59cabdff1aSopenharmony_ci    int last_audio_frame;
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci    AVBufferRef *pool;
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci    void *thread_ctx;
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci    /**
66cabdff1aSopenharmony_ci     * This packet is used to hold the packet given to decoders
67cabdff1aSopenharmony_ci     * implementing the .decode API; it is unused by the generic
68cabdff1aSopenharmony_ci     * code for decoders implementing the .receive_frame API and
69cabdff1aSopenharmony_ci     * may be freely used (but not freed) by them with the caveat
70cabdff1aSopenharmony_ci     * that the packet will be unreferenced generically in
71cabdff1aSopenharmony_ci     * avcodec_flush_buffers().
72cabdff1aSopenharmony_ci     */
73cabdff1aSopenharmony_ci    AVPacket *in_pkt;
74cabdff1aSopenharmony_ci    struct AVBSFContext *bsf;
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci    /**
77cabdff1aSopenharmony_ci     * Properties (timestamps+side data) extracted from the last packet passed
78cabdff1aSopenharmony_ci     * for decoding.
79cabdff1aSopenharmony_ci     */
80cabdff1aSopenharmony_ci    AVPacket *last_pkt_props;
81cabdff1aSopenharmony_ci    struct AVFifo *pkt_props;
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci    /**
84cabdff1aSopenharmony_ci     * temporary buffer used for encoders to store their bitstream
85cabdff1aSopenharmony_ci     */
86cabdff1aSopenharmony_ci    uint8_t *byte_buffer;
87cabdff1aSopenharmony_ci    unsigned int byte_buffer_size;
88cabdff1aSopenharmony_ci
89cabdff1aSopenharmony_ci    /**
90cabdff1aSopenharmony_ci     * This is set to AV_PKT_FLAG_KEY for encoders that encode intra-only
91cabdff1aSopenharmony_ci     * formats (i.e. whose codec descriptor has AV_CODEC_PROP_INTRA_ONLY set).
92cabdff1aSopenharmony_ci     * This is used to set said flag generically for said encoders.
93cabdff1aSopenharmony_ci     */
94cabdff1aSopenharmony_ci    int intra_only_flag;
95cabdff1aSopenharmony_ci
96cabdff1aSopenharmony_ci    void *frame_thread_encoder;
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_ci    /**
99cabdff1aSopenharmony_ci     * The input frame is stored here for encoders implementing the simple
100cabdff1aSopenharmony_ci     * encode API.
101cabdff1aSopenharmony_ci     *
102cabdff1aSopenharmony_ci     * Not allocated in other cases.
103cabdff1aSopenharmony_ci     */
104cabdff1aSopenharmony_ci    AVFrame *in_frame;
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci    /**
107cabdff1aSopenharmony_ci     * If this is set, then FFCodec->close (if existing) needs to be called
108cabdff1aSopenharmony_ci     * for the parent AVCodecContext.
109cabdff1aSopenharmony_ci     */
110cabdff1aSopenharmony_ci    int needs_close;
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci    /**
113cabdff1aSopenharmony_ci     * Number of audio samples to skip at the start of the next decoded frame
114cabdff1aSopenharmony_ci     */
115cabdff1aSopenharmony_ci    int skip_samples;
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci    /**
118cabdff1aSopenharmony_ci     * hwaccel-specific private data
119cabdff1aSopenharmony_ci     */
120cabdff1aSopenharmony_ci    void *hwaccel_priv_data;
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ci    /**
123cabdff1aSopenharmony_ci     * checks API usage: after codec draining, flush is required to resume operation
124cabdff1aSopenharmony_ci     */
125cabdff1aSopenharmony_ci    int draining;
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ci    /**
128cabdff1aSopenharmony_ci     * buffers for using new encode/decode API through legacy API
129cabdff1aSopenharmony_ci     */
130cabdff1aSopenharmony_ci    AVPacket *buffer_pkt;
131cabdff1aSopenharmony_ci    AVFrame *buffer_frame;
132cabdff1aSopenharmony_ci    int draining_done;
133cabdff1aSopenharmony_ci
134cabdff1aSopenharmony_ci    int showed_multi_packet_warning;
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci    int skip_samples_multiplier;
137cabdff1aSopenharmony_ci
138cabdff1aSopenharmony_ci    /* to prevent infinite loop on errors when draining */
139cabdff1aSopenharmony_ci    int nb_draining_errors;
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci    /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
142cabdff1aSopenharmony_ci    int changed_frames_dropped;
143cabdff1aSopenharmony_ci    int initial_format;
144cabdff1aSopenharmony_ci    int initial_width, initial_height;
145cabdff1aSopenharmony_ci    int initial_sample_rate;
146cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
147cabdff1aSopenharmony_ci    int initial_channels;
148cabdff1aSopenharmony_ci    uint64_t initial_channel_layout;
149cabdff1aSopenharmony_ci#endif
150cabdff1aSopenharmony_ci    AVChannelLayout initial_ch_layout;
151cabdff1aSopenharmony_ci} AVCodecInternal;
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci/**
154cabdff1aSopenharmony_ci * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
155cabdff1aSopenharmony_ci * If there is no such matching pair then size is returned.
156cabdff1aSopenharmony_ci */
157cabdff1aSopenharmony_ciint ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ciunsigned int ff_toupper4(unsigned int x);
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_civoid ff_color_frame(AVFrame *frame, const int color[4]);
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_ci/**
164cabdff1aSopenharmony_ci * Maximum size in bytes of extradata.
165cabdff1aSopenharmony_ci * This value was chosen such that every bit of the buffer is
166cabdff1aSopenharmony_ci * addressable by a 32-bit signed integer as used by get_bits.
167cabdff1aSopenharmony_ci */
168cabdff1aSopenharmony_ci#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE)
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci/**
171cabdff1aSopenharmony_ci * Rescale from sample rate to AVCodecContext.time_base.
172cabdff1aSopenharmony_ci */
173cabdff1aSopenharmony_cistatic av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx,
174cabdff1aSopenharmony_ci                                                        int64_t samples)
175cabdff1aSopenharmony_ci{
176cabdff1aSopenharmony_ci    if(samples == AV_NOPTS_VALUE)
177cabdff1aSopenharmony_ci        return AV_NOPTS_VALUE;
178cabdff1aSopenharmony_ci    return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate },
179cabdff1aSopenharmony_ci                        avctx->time_base);
180cabdff1aSopenharmony_ci}
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_ci/**
183cabdff1aSopenharmony_ci * 2^(x) for integer x
184cabdff1aSopenharmony_ci * @return correctly rounded float
185cabdff1aSopenharmony_ci */
186cabdff1aSopenharmony_cistatic av_always_inline float ff_exp2fi(int x) {
187cabdff1aSopenharmony_ci    /* Normal range */
188cabdff1aSopenharmony_ci    if (-126 <= x && x <= 128)
189cabdff1aSopenharmony_ci        return av_int2float((x+127) << 23);
190cabdff1aSopenharmony_ci    /* Too large */
191cabdff1aSopenharmony_ci    else if (x > 128)
192cabdff1aSopenharmony_ci        return INFINITY;
193cabdff1aSopenharmony_ci    /* Subnormal numbers */
194cabdff1aSopenharmony_ci    else if (x > -150)
195cabdff1aSopenharmony_ci        return av_int2float(1 << (x+149));
196cabdff1aSopenharmony_ci    /* Negligibly small */
197cabdff1aSopenharmony_ci    else
198cabdff1aSopenharmony_ci        return 0;
199cabdff1aSopenharmony_ci}
200cabdff1aSopenharmony_ci
201cabdff1aSopenharmony_ci/**
202cabdff1aSopenharmony_ci * Get a buffer for a frame. This is a wrapper around
203cabdff1aSopenharmony_ci * AVCodecContext.get_buffer() and should be used instead calling get_buffer()
204cabdff1aSopenharmony_ci * directly.
205cabdff1aSopenharmony_ci */
206cabdff1aSopenharmony_ciint ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
207cabdff1aSopenharmony_ci
208cabdff1aSopenharmony_ci#define FF_REGET_BUFFER_FLAG_READONLY 1 ///< the returned buffer does not need to be writable
209cabdff1aSopenharmony_ci/**
210cabdff1aSopenharmony_ci * Identical in function to ff_get_buffer(), except it reuses the existing buffer
211cabdff1aSopenharmony_ci * if available.
212cabdff1aSopenharmony_ci */
213cabdff1aSopenharmony_ciint ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ciint ff_thread_can_start_frame(AVCodecContext *avctx);
216cabdff1aSopenharmony_ci
217cabdff1aSopenharmony_ciint avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
218cabdff1aSopenharmony_ci
219cabdff1aSopenharmony_ciint avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec);
220cabdff1aSopenharmony_ci
221cabdff1aSopenharmony_ci/**
222cabdff1aSopenharmony_ci * Check that the provided frame dimensions are valid and set them on the codec
223cabdff1aSopenharmony_ci * context.
224cabdff1aSopenharmony_ci */
225cabdff1aSopenharmony_ciint ff_set_dimensions(AVCodecContext *s, int width, int height);
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_ci/**
228cabdff1aSopenharmony_ci * Check that the provided sample aspect ratio is valid and set it on the codec
229cabdff1aSopenharmony_ci * context.
230cabdff1aSopenharmony_ci */
231cabdff1aSopenharmony_ciint ff_set_sar(AVCodecContext *avctx, AVRational sar);
232cabdff1aSopenharmony_ci
233cabdff1aSopenharmony_ci/**
234cabdff1aSopenharmony_ci * Add or update AV_FRAME_DATA_MATRIXENCODING side data.
235cabdff1aSopenharmony_ci */
236cabdff1aSopenharmony_ciint ff_side_data_update_matrix_encoding(AVFrame *frame,
237cabdff1aSopenharmony_ci                                        enum AVMatrixEncoding matrix_encoding);
238cabdff1aSopenharmony_ci
239cabdff1aSopenharmony_ci/**
240cabdff1aSopenharmony_ci * Select the (possibly hardware accelerated) pixel format.
241cabdff1aSopenharmony_ci * This is a wrapper around AVCodecContext.get_format() and should be used
242cabdff1aSopenharmony_ci * instead of calling get_format() directly.
243cabdff1aSopenharmony_ci *
244cabdff1aSopenharmony_ci * The list of pixel formats must contain at least one valid entry, and is
245cabdff1aSopenharmony_ci * terminated with AV_PIX_FMT_NONE.  If it is possible to decode to software,
246cabdff1aSopenharmony_ci * the last entry in the list must be the most accurate software format.
247cabdff1aSopenharmony_ci * If it is not possible to decode to software, AVCodecContext.sw_pix_fmt
248cabdff1aSopenharmony_ci * must be set before calling this function.
249cabdff1aSopenharmony_ci */
250cabdff1aSopenharmony_ciint ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci/**
253cabdff1aSopenharmony_ci * Add a CPB properties side data to an encoding context.
254cabdff1aSopenharmony_ci */
255cabdff1aSopenharmony_ciAVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx);
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci/**
258cabdff1aSopenharmony_ci * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info
259cabdff1aSopenharmony_ci *
260cabdff1aSopenharmony_ci * @param frame      Raw frame to get S12M timecode side data from
261cabdff1aSopenharmony_ci * @param rate       The frame rate
262cabdff1aSopenharmony_ci * @param prefix_len Number of bytes to allocate before SEI message
263cabdff1aSopenharmony_ci * @param data       Pointer to a variable to store allocated memory
264cabdff1aSopenharmony_ci *                   Upon return the variable will hold NULL on error or if frame has no S12M timecode info.
265cabdff1aSopenharmony_ci *                   Otherwise it will point to prefix_len uninitialized bytes followed by
266cabdff1aSopenharmony_ci *                   *sei_size SEI message
267cabdff1aSopenharmony_ci * @param sei_size   Pointer to a variable to store generated SEI message length
268cabdff1aSopenharmony_ci * @return           Zero on success, negative error code on failure
269cabdff1aSopenharmony_ci */
270cabdff1aSopenharmony_ciint ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len,
271cabdff1aSopenharmony_ci                     void **data, size_t *sei_size);
272cabdff1aSopenharmony_ci
273cabdff1aSopenharmony_ci/**
274cabdff1aSopenharmony_ci * Get an estimated video bitrate based on frame size, frame rate and coded
275cabdff1aSopenharmony_ci * bits per pixel.
276cabdff1aSopenharmony_ci */
277cabdff1aSopenharmony_ciint64_t ff_guess_coded_bitrate(AVCodecContext *avctx);
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_ci/**
280cabdff1aSopenharmony_ci * Check if a value is in the list. If not, return the default value
281cabdff1aSopenharmony_ci *
282cabdff1aSopenharmony_ci * @param ctx                Context for the log msg
283cabdff1aSopenharmony_ci * @param val_name           Name of the checked value, for log msg
284cabdff1aSopenharmony_ci * @param array_valid_values Array of valid int, ended with INT_MAX
285cabdff1aSopenharmony_ci * @param default_value      Value return if checked value is not in the array
286cabdff1aSopenharmony_ci * @return                   Value or default_value.
287cabdff1aSopenharmony_ci */
288cabdff1aSopenharmony_ciint ff_int_from_list_or_default(void *ctx, const char * val_name, int val,
289cabdff1aSopenharmony_ci                                const int * array_valid_values, int default_value);
290cabdff1aSopenharmony_ci
291cabdff1aSopenharmony_civoid ff_dvdsub_parse_palette(uint32_t *palette, const char *p);
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci#endif /* AVCODEC_INTERNAL_H */
294