|
|
|
/*
|
|
|
|
* This file is part of Libav.
|
|
|
|
*
|
|
|
|
* Libav is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Libav is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with Libav; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* common internal api header.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef AVCODEC_INTERNAL_H
|
|
|
|
#define AVCODEC_INTERNAL_H
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include "libavutil/buffer.h"
|
|
|
|
#include "libavutil/channel_layout.h"
|
|
|
|
#include "libavutil/mathematics.h"
|
|
|
|
#include "libavutil/pixfmt.h"
|
|
|
|
#include "avcodec.h"
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
/**
|
|
|
|
* The decoder sets the cropping fields in the output frames manually.
|
|
|
|
* If this cap is set, the generic code will initialize output frame
|
|
|
|
* dimensions to coded rather than display values.
|
|
|
|
*/
|
|
|
|
#define FF_CODEC_CAP_EXPORTS_CROPPING (1 << 3)
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
# define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__)
|
|
|
|
#else
|
|
|
|
# define ff_dlog(ctx, ...) do { } while (0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TRACE
|
|
|
|
# define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__)
|
|
|
|
#else
|
|
|
|
# define ff_tlog(ctx, ...) do { } while (0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#define FF_DEFAULT_QUANT_BIAS 999999
|
|
|
|
|
|
|
|
#define FF_SANE_NB_CHANNELS 63U
|
|
|
|
|
|
|
|
#define FF_SIGNBIT(x) (x >> CHAR_BIT * sizeof(x) - 1)
|
|
|
|
|
|
|
|
typedef struct FramePool {
|
|
|
|
/**
|
|
|
|
* Pools for each data plane. For audio all the planes have the same size,
|
|
|
|
* so only pools[0] is used.
|
|
|
|
*/
|
|
|
|
AVBufferPool *pools[4];
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Pool parameters
|
|
|
|
*/
|
|
|
|
int format;
|
|
|
|
int width, height;
|
|
|
|
int stride_align[AV_NUM_DATA_POINTERS];
|
|
|
|
int linesize[4];
|
|
|
|
int planes;
|
|
|
|
int channels;
|
|
|
|
int samples;
|
|
|
|
} FramePool;
|
|
|
|
|
decode: restructure the core decoding code
Currently, the new decoding API is pretty much just a wrapper around the
old deprecated one. This is problematic, since it interferes with making
full use of the flexibility added by the new API. The old API should
also be removed at some future point.
Reorganize the code so that the new send_packet/receive_frame functions
call the actual decoding directly and change the old deprecated
avcodec_decode_* functions into wrappers around the new API.
The new internal API for decoders is now changing as well. Before this
commit, it mirrors the public API, so the decoders need to implement
send_packet() and receive_frame() callbacks. This turns out to require
awkward constructs in both the decoders and the generic code. After this
commit, the decoders only implement the receive_frame() callback and
call a new internal function, ff_decode_get_packet() to obtain input
data, in the same manner to how the bitstream filters now work.
avcodec will now always make a reference to the input packet, which means
that non-refcounted input packets will be copied. Keeping the previous
behaviour, where this copy could sometimes be avoided, would make the
code significantly more complex and fragile for only dubious gains,
since packets are typically small and everyone who cares about
performance should use refcounted packets anyway.
8 years ago
|
|
|
typedef struct DecodeSimpleContext {
|
|
|
|
AVPacket *in_pkt;
|
|
|
|
AVFrame *out_frame;
|
|
|
|
} DecodeSimpleContext;
|
|
|
|
|
|
|
|
typedef struct DecodeFilterContext {
|
|
|
|
AVBSFContext **bsfs;
|
|
|
|
int nb_bsfs;
|
|
|
|
} DecodeFilterContext;
|
|
|
|
|
|
|
|
typedef struct AVCodecInternal {
|
|
|
|
/**
|
|
|
|
* Whether the parent AVCodecContext is a copy of the context which had
|
|
|
|
* init() called on it.
|
|
|
|
* This is used by multithreading - shared tables and picture pointers
|
|
|
|
* 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;
|
|
|
|
|
decode: restructure the core decoding code
Currently, the new decoding API is pretty much just a wrapper around the
old deprecated one. This is problematic, since it interferes with making
full use of the flexibility added by the new API. The old API should
also be removed at some future point.
Reorganize the code so that the new send_packet/receive_frame functions
call the actual decoding directly and change the old deprecated
avcodec_decode_* functions into wrappers around the new API.
The new internal API for decoders is now changing as well. Before this
commit, it mirrors the public API, so the decoders need to implement
send_packet() and receive_frame() callbacks. This turns out to require
awkward constructs in both the decoders and the generic code. After this
commit, the decoders only implement the receive_frame() callback and
call a new internal function, ff_decode_get_packet() to obtain input
data, in the same manner to how the bitstream filters now work.
avcodec will now always make a reference to the input packet, which means
that non-refcounted input packets will be copied. Keeping the previous
behaviour, where this copy could sometimes be avoided, would make the
code significantly more complex and fragile for only dubious gains,
since packets are typically small and everyone who cares about
performance should use refcounted packets anyway.
8 years ago
|
|
|
DecodeSimpleContext ds;
|
|
|
|
DecodeFilterContext filter;
|
decode: restructure the core decoding code
Currently, the new decoding API is pretty much just a wrapper around the
old deprecated one. This is problematic, since it interferes with making
full use of the flexibility added by the new API. The old API should
also be removed at some future point.
Reorganize the code so that the new send_packet/receive_frame functions
call the actual decoding directly and change the old deprecated
avcodec_decode_* functions into wrappers around the new API.
The new internal API for decoders is now changing as well. Before this
commit, it mirrors the public API, so the decoders need to implement
send_packet() and receive_frame() callbacks. This turns out to require
awkward constructs in both the decoders and the generic code. After this
commit, the decoders only implement the receive_frame() callback and
call a new internal function, ff_decode_get_packet() to obtain input
data, in the same manner to how the bitstream filters now work.
avcodec will now always make a reference to the input packet, which means
that non-refcounted input packets will be copied. Keeping the previous
behaviour, where this copy could sometimes be avoided, would make the
code significantly more complex and fragile for only dubious gains,
since packets are typically small and everyone who cares about
performance should use refcounted packets anyway.
8 years ago
|
|
|
|
|
|
|
/**
|
|
|
|
* Properties (timestamps+side data) extracted from the last packet passed
|
|
|
|
* for decoding.
|
|
|
|
*/
|
|
|
|
AVPacket *last_pkt_props;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* hwaccel-specific private data
|
|
|
|
*/
|
|
|
|
void *hwaccel_priv_data;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* checks API usage: after codec draining, flush is required to resume operation
|
|
|
|
*/
|
|
|
|
int draining;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* buffers for using new encode/decode API through legacy API
|
|
|
|
*/
|
|
|
|
AVPacket *buffer_pkt;
|
|
|
|
int buffer_pkt_valid; // encoding: packet without data can be valid
|
|
|
|
AVFrame *buffer_frame;
|
|
|
|
int draining_done;
|
decode: restructure the core decoding code
Currently, the new decoding API is pretty much just a wrapper around the
old deprecated one. This is problematic, since it interferes with making
full use of the flexibility added by the new API. The old API should
also be removed at some future point.
Reorganize the code so that the new send_packet/receive_frame functions
call the actual decoding directly and change the old deprecated
avcodec_decode_* functions into wrappers around the new API.
The new internal API for decoders is now changing as well. Before this
commit, it mirrors the public API, so the decoders need to implement
send_packet() and receive_frame() callbacks. This turns out to require
awkward constructs in both the decoders and the generic code. After this
commit, the decoders only implement the receive_frame() callback and
call a new internal function, ff_decode_get_packet() to obtain input
data, in the same manner to how the bitstream filters now work.
avcodec will now always make a reference to the input packet, which means
that non-refcounted input packets will be copied. Keeping the previous
behaviour, where this copy could sometimes be avoided, would make the
code significantly more complex and fragile for only dubious gains,
since packets are typically small and everyone who cares about
performance should use refcounted packets anyway.
8 years ago
|
|
|
/* set to 1 when the caller is using the old decoding API */
|
|
|
|
int compat_decode;
|
|
|
|
int compat_decode_warned;
|
|
|
|
/* this variable is set by the decoder internals to signal to the old
|
|
|
|
* API compat wrappers the amount of data consumed from the last packet */
|
|
|
|
size_t compat_decode_consumed;
|
|
|
|
/* when a partial packet has been consumed, this stores the remaining size
|
|
|
|
* of the packet (that should be submitted in the next decode call */
|
|
|
|
size_t compat_decode_partial_size;
|
|
|
|
AVFrame *compat_decode_frame;
|
|
|
|
} AVCodecInternal;
|
|
|
|
|
|
|
|
struct AVCodecDefault {
|
|
|
|
const uint8_t *key;
|
|
|
|
const uint8_t *value;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
|
|
|
|
|
|
|
|
unsigned int avpriv_toupper4(unsigned int x);
|
|
|
|
|
|
|
|
int avpriv_lock_avformat(void);
|
|
|
|
int avpriv_unlock_avformat(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Maximum size in bytes of extradata.
|
|
|
|
* 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) - 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);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a CPB properties side data to an encoding context.
|
|
|
|
*/
|
|
|
|
AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx);
|
|
|
|
|
|
|
|
#endif /* AVCODEC_INTERNAL_H */
|