#include <stdint.h>
#include <string.h>
#include "config.h"
#if CONFIG_ICONV
# include <iconv.h>
#endif
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/emms.h"
#include "libavutil/frame.h"
#include "libavutil/hwcontext.h"
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/mastering_display_metadata.h"
#include "libavutil/mem.h"
#include "avcodec.h"
#include "avcodec_internal.h"
#include "bytestream.h"
#include "bsf.h"
#include "codec_desc.h"
#include "codec_internal.h"
#include "decode.h"
#include "hwaccel_internal.h"
#include "hwconfig.h"
#include "internal.h"
#include "packet_internal.h"
#include "progressframe.h"
#include "refstruct.h"
#include "thread.h"
#include "threadprogress.h"
DecodeContext;
static DecodeContext *decode_ctx(AVCodecInternal *avci)
{ … }
static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
{ … }
static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
{ … }
static int decode_bsfs_init(AVCodecContext *avctx)
{ … }
static int decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
{ … }
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
{ … }
static int64_t guess_correct_pts(DecodeContext *dc,
int64_t reordered_pts, int64_t dts)
{ … }
static int discard_samples(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
{ … }
static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
{ … }
#if CONFIG_LCMS2
static int detect_colorspace(AVCodecContext *avctx, AVFrame *frame)
{
AVCodecInternal *avci = avctx->internal;
enum AVColorTransferCharacteristic trc;
AVColorPrimariesDesc coeffs;
enum AVColorPrimaries prim;
cmsHPROFILE profile;
AVFrameSideData *sd;
int ret;
if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES))
return 0;
sd = av_frame_get_side_data(frame, AV_FRAME_DATA_ICC_PROFILE);
if (!sd || !sd->size)
return 0;
if (!avci->icc.avctx) {
ret = ff_icc_context_init(&avci->icc, avctx);
if (ret < 0)
return ret;
}
profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size);
if (!profile)
return AVERROR_INVALIDDATA;
ret = ff_icc_profile_sanitize(&avci->icc, profile);
if (!ret)
ret = ff_icc_profile_read_primaries(&avci->icc, profile, &coeffs);
if (!ret)
ret = ff_icc_profile_detect_transfer(&avci->icc, profile, &trc);
cmsCloseProfile(profile);
if (ret < 0)
return ret;
prim = av_csp_primaries_id_from_desc(&coeffs);
if (prim != AVCOL_PRI_UNSPECIFIED)
frame->color_primaries = prim;
if (trc != AVCOL_TRC_UNSPECIFIED)
frame->color_trc = trc;
return 0;
}
#else
static int detect_colorspace(av_unused AVCodecContext *c, av_unused AVFrame *f)
{ … }
#endif
static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame)
{ … }
static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{ … }
static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
{ … }
int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
{ … }
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
{ … }
static int frame_validate(AVCodecContext *avctx, AVFrame *frame)
{ … }
int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{ … }
static void get_subtitle_defaults(AVSubtitle *sub)
{ … }
#define UTF8_MAX_BYTES …
static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt,
const AVPacket *inpkt, AVPacket *buf_pkt)
{ … }
static int utf8_check(const uint8_t *str)
{ … }
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
int *got_sub_ptr, const AVPacket *avpkt)
{ … }
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *avctx,
const enum AVPixelFormat *fmt)
{ … }
int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx,
enum AVHWDeviceType dev_type)
{ … }
int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
AVBufferRef *device_ref,
enum AVPixelFormat hw_pix_fmt,
AVBufferRef **out_frames_ref)
{ … }
static int hwaccel_init(AVCodecContext *avctx,
const FFHWAccel *hwaccel)
{ … }
void ff_hwaccel_uninit(AVCodecContext *avctx)
{ … }
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
{ … }
const AVPacketSideData *ff_get_coded_side_data(const AVCodecContext *avctx,
enum AVPacketSideDataType type)
{ … }
static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
{ … }
int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
AVFrame *frame, const AVPacket *pkt)
{ … }
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
{ … }
static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
{ … }
static void decode_data_free(void *opaque, uint8_t *data)
{ … }
int ff_attach_decode_data(AVFrame *frame)
{ … }
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{ … }
static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
{ … }
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{ … }
ProgressInternal;
static void check_progress_consistency(const ProgressFrame *f)
{ … }
static int progress_frame_get(AVCodecContext *avctx, ProgressFrame *f)
{ … }
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
{ … }
void ff_progress_frame_ref(ProgressFrame *dst, const ProgressFrame *src)
{ … }
void ff_progress_frame_unref(ProgressFrame *f)
{ … }
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
{ … }
void ff_progress_frame_report(ProgressFrame *f, int n)
{ … }
void ff_progress_frame_await(const ProgressFrame *f, int n)
{ … }
#if !HAVE_THREADS
enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset)
{
return FF_THREAD_NO_FRAME_THREADING;
}
#endif
static av_cold int progress_frame_pool_init_cb(FFRefStructOpaque opaque, void *obj)
{ … }
static void progress_frame_pool_reset_cb(FFRefStructOpaque unused, void *obj)
{ … }
static av_cold void progress_frame_pool_free_entry_cb(FFRefStructOpaque opaque, void *obj)
{ … }
int ff_decode_preinit(AVCodecContext *avctx)
{ … }
static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd,
int *nb_sd, enum AVFrameSideDataType type)
{ … }
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
enum AVFrameSideDataType type, size_t size,
AVFrameSideData **psd)
{ … }
int ff_frame_new_side_data_from_buf_ext(const AVCodecContext *avctx,
AVFrameSideData ***sd, int *nb_sd,
enum AVFrameSideDataType type,
AVBufferRef **buf)
{ … }
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx,
AVFrame *frame, enum AVFrameSideDataType type,
AVBufferRef **buf, AVFrameSideData **psd)
{ … }
int ff_decode_mastering_display_new_ext(const AVCodecContext *avctx,
AVFrameSideData ***sd, int *nb_sd,
struct AVMasteringDisplayMetadata **mdm)
{ … }
int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame,
AVMasteringDisplayMetadata **mdm)
{ … }
int ff_decode_content_light_new_ext(const AVCodecContext *avctx,
AVFrameSideData ***sd, int *nb_sd,
AVContentLightMetadata **clm)
{ … }
int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame,
AVContentLightMetadata **clm)
{ … }
int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
{ … }
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
{ … }
void ff_decode_flush_buffers(AVCodecContext *avctx)
{ … }
AVCodecInternal *ff_decode_internal_alloc(void)
{ … }