X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Finternal.h;h=500511dadaab0a88a0af884592452e2085a49523;hb=bfe1cd80ebeab58cbc1c91ac766a96fce8e4ec1e;hp=1c2d0daaef2e47476baf94b4c39fa49168812bf0;hpb=4df30f71147b7bedd4457bcfa0e4efe01085af9f;p=ffmpeg diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 1c2d0daaef2..500511dadaa 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -26,34 +26,75 @@ #include +#include "libavutil/buffer.h" +#include "libavutil/channel_layout.h" +#include "libavutil/mathematics.h" #include "libavutil/pixfmt.h" #include "avcodec.h" +#include "config.h" -typedef struct InternalBuffer { - uint8_t *base[AV_NUM_DATA_POINTERS]; - uint8_t *data[AV_NUM_DATA_POINTERS]; - int linesize[AV_NUM_DATA_POINTERS]; - int width; - int height; - enum PixelFormat pix_fmt; - uint8_t **extended_data; - int audio_data_size; - int nb_channels; -} InternalBuffer; +/** + * The codec does not modify any global variables in the init function, + * allowing to call the init function without locking any global mutexes. + */ +#define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0) +/** + * The codec allows calling the close function for deallocation even if + * the init function returned a failure. Without this capability flag, a + * codec does such cleanup internally when returning failures from the + * init function and does not expect the close function to be called at + * all. + */ +#define FF_CODEC_CAP_INIT_CLEANUP (1 << 1) +/** + * Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set + * AVFrame.pkt_dts manually. If the flag is set, utils.c won't overwrite + * this field. If it's unset, utils.c tries to guess the pkt_dts field + * from the input AVPacket. + */ +#define FF_CODEC_CAP_SETS_PKT_DTS (1 << 2) -typedef struct AVCodecInternal { +#ifdef DEBUG +# define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__) +#else +# define ff_dlog(ctx, ...) while(0) +#endif + +#ifdef TRACE +# define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__) +#else +# define ff_tlog(ctx, ...) while(0) +#endif + + +#if !FF_API_QUANT_BIAS +#define FF_DEFAULT_QUANT_BIAS 999999 +#endif + +#define FF_SANE_NB_CHANNELS 63U + +#define FF_SIGNBIT(x) (x >> CHAR_BIT * sizeof(x) - 1) + +typedef struct FramePool { /** - * internal buffer count - * used by default get/release/reget_buffer(). + * Pools for each data plane. For audio all the planes have the same size, + * so only pools[0] is used. */ - int buffer_count; + AVBufferPool *pools[4]; - /** - * internal buffers - * used by default get/release/reget_buffer(). + /* + * Pool parameters */ - InternalBuffer *buffer; + int format; + int width, height; + int stride_align[AV_NUM_DATA_POINTERS]; + int linesize[4]; + int planes; + int channels; + int samples; +} FramePool; +typedef struct AVCodecInternal { /** * Whether the parent AVCodecContext is a copy of the context which had * init() called on it. @@ -61,6 +102,44 @@ typedef struct AVCodecInternal { * should be freed from the original context only. */ int is_copy; + + /** + * Whether to allocate progress for frame threading. + * + * The codec must set it to 1 if it uses ff_thread_await/report_progress(), + * then progress will be allocated in ff_thread_get_buffer(). The frames + * then MUST be freed with ff_thread_release_buffer(). + * + * If the codec does not need to call the progress functions (there are no + * dependencies between the frames), it should leave this at 0. Then it can + * decode straight to the user-provided frames (which the user will then + * free with av_frame_unref()), there is no need to call + * ff_thread_release_buffer(). + */ + int allocate_progress; + + /** + * An audio frame with less than required samples has been submitted and + * padded with silence. Reject all subsequent frames. + */ + int last_audio_frame; + + AVFrame *to_free; + + FramePool *pool; + + void *thread_ctx; + + /** + * Current packet as passed into the decoder, to avoid having to pass the + * packet into every function. + */ + AVPacket *pkt; + + /** + * hwaccel-specific private data + */ + void *hwaccel_priv_data; } AVCodecInternal; struct AVCodecDefault { @@ -68,21 +147,6 @@ struct AVCodecDefault { const uint8_t *value; }; -/** - * Determine whether pix_fmt is a hardware accelerated format. - */ -int ff_is_hwaccel_pix_fmt(enum PixelFormat pix_fmt); - -/** - * Return the hardware accelerated codec for codec codec_id and - * pixel format pix_fmt. - * - * @param codec_id the codec to match - * @param pix_fmt the pixel format to match - * @return the hardware accelerated codec, or NULL if none was found. - */ -AVHWAccel *ff_find_hwaccel(enum CodecID codec_id, enum PixelFormat pix_fmt); - /** * Return the index into tab at which {a,b} match elements {[0],[1]} of tab. * If there is no such matching pair then size is returned. @@ -99,6 +163,81 @@ int avpriv_unlock_avformat(void); * This value was chosen such that every bit of the buffer is * addressable by a 32-bit signed integer as used by get_bits. */ -#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE) +#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE) + +/** + * Check AVPacket size and/or allocate data. + * + * Encoders supporting AVCodec.encode2() can use this as a convenience to + * ensure the output packet data is large enough, whether provided by the user + * or allocated in this function. + * + * @param avpkt the AVPacket + * If avpkt->data is already set, avpkt->size is checked + * to ensure it is large enough. + * If avpkt->data is NULL, a new buffer is allocated. + * avpkt->size is set to the specified size. + * All other AVPacket fields will be reset with av_init_packet(). + * @param size the minimum required packet size + * @return 0 on success, negative error code on failure + */ +int ff_alloc_packet(AVPacket *avpkt, int size); + +/** + * Rescale from sample rate to AVCodecContext.time_base. + */ +static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, + int64_t samples) +{ + return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate }, + avctx->time_base); +} + +/** + * Get a buffer for a frame. This is a wrapper around + * AVCodecContext.get_buffer() and should be used instead calling get_buffer() + * directly. + */ +int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags); + +/** + * Identical in function to av_frame_make_writable(), except it uses + * ff_get_buffer() to allocate the buffer when needed. + */ +int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame); + +const uint8_t *avpriv_find_start_code(const uint8_t *restrict p, + const uint8_t *end, + uint32_t *restrict state); + +/** + * Check that the provided frame dimensions are valid and set them on the codec + * context. + */ +int ff_set_dimensions(AVCodecContext *s, int width, int height); + +/** + * Check that the provided sample aspect ratio is valid and set it on the codec + * context. + */ +int ff_set_sar(AVCodecContext *avctx, AVRational sar); + +/** + * Add or update AV_FRAME_DATA_MATRIXENCODING side data. + */ +int ff_side_data_update_matrix_encoding(AVFrame *frame, + enum AVMatrixEncoding matrix_encoding); + +/** + * Select the (possibly hardware accelerated) pixel format. + * This is a wrapper around AVCodecContext.get_format() and should be used + * instead of calling get_format() directly. + */ +int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt); + +/** + * Set various frame properties from the codec context / packet data. + */ +int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame); #endif /* AVCODEC_INTERNAL_H */