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