Go to the documentation of this file.
43 #include "config_components.h"
60 #define TL_ADD(t, s) do { \
61 av_assert0(l->nb_tabs < TAB_MAX); \
62 l->tabs[l->nb_tabs].tab = (void**)&fc->tab.t; \
63 l->tabs[l->nb_tabs].size = sizeof(*fc->tab.t) * (s); \
112 const int ctu_size =
sps ? (1 <<
sps->ctb_log2_size_y <<
sps->ctb_log2_size_y) : 0;
113 const int ctu_count =
pps ?
pps->ctb_count : 0;
114 const int changed =
fc->tab.sz.ctu_count != ctu_count ||
fc->tab.sz.ctu_size != ctu_size;
123 TL_ADD(slice_idx, ctu_count);
130 const int pic_size_in_min_cb =
pps ?
pps->min_cb_width *
pps->min_cb_height : 0;
131 const int changed =
fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
138 TL_ADD(cb_width[
i], pic_size_in_min_cb);
144 const int pic_size_in_min_cb =
pps ?
pps->min_cb_width *
pps->min_cb_height : 0;
145 const int changed =
fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
150 TL_ADD(ipm, pic_size_in_min_cb);
153 TL_ADD(cqt_depth[
i], pic_size_in_min_cb);
154 TL_ADD(cb_pos_x[
i], pic_size_in_min_cb);
155 TL_ADD(cb_pos_y[
i], pic_size_in_min_cb);
156 TL_ADD(cb_height[
i], pic_size_in_min_cb);
158 TL_ADD(cpm[
i], pic_size_in_min_cb);
159 TL_ADD(pcmf[
i], pic_size_in_min_cb);
168 const int pic_size_in_min_pu =
pps ?
pps->min_pu_width *
pps->min_pu_height : 0;
169 const int changed =
fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
173 TL_ADD(iaf, pic_size_in_min_pu);
179 const int pic_size_in_min_pu =
pps ?
pps->min_pu_width *
pps->min_pu_height : 0;
180 const int changed =
fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
184 TL_ADD(msf, pic_size_in_min_pu);
185 TL_ADD(mmi, pic_size_in_min_pu);
186 TL_ADD(mvf, pic_size_in_min_pu);
192 const int pic_size_in_min_tu =
pps ?
pps->min_tu_width *
pps->min_tu_height : 0;
193 const int changed =
fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
197 TL_ADD(tu_joint_cbcr_residual_flag, pic_size_in_min_tu);
200 TL_ADD(tu_coded_flag[
i], pic_size_in_min_tu);
202 for (
int vertical = 0; vertical < 2; vertical++)
203 TL_ADD(bs[vertical][
i], pic_size_in_min_tu);
210 const int pic_size_in_min_tu =
pps ?
pps->min_tu_width *
pps->min_tu_height : 0;
211 const int changed =
fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
216 TL_ADD(tb_width[
i], pic_size_in_min_tu);
217 TL_ADD(tb_height[
i], pic_size_in_min_tu);
220 for (
int vertical = 0; vertical < 2; vertical++) {
221 TL_ADD(max_len_p[vertical], pic_size_in_min_tu);
222 TL_ADD(max_len_q[vertical], pic_size_in_min_tu);
227 TL_ADD(qp[
i], pic_size_in_min_tu);
236 const int ctu_width =
pps ?
pps->ctb_width : 0;
237 const int ctu_height =
pps ?
pps->ctb_height : 0;
238 const int chroma_idc =
sps ?
sps->r->sps_chroma_format_idc : 0;
239 const int ps =
sps ?
sps->pixel_shift : 0;
241 const int changed =
fc->tab.sz.chroma_format_idc != chroma_idc ||
243 fc->tab.sz.ctu_width != ctu_width ||
fc->tab.sz.ctu_height != ctu_height ||
244 fc->tab.sz.pixel_shift != ps;
248 for (
int c_idx = 0; c_idx < c_end; c_idx++) {
251 TL_ADD(sao_pixel_buffer_h[c_idx], (
w * 2 * ctu_height) << ps);
252 TL_ADD(sao_pixel_buffer_v[c_idx], (
h * 2 * ctu_width) << ps);
255 for (
int c_idx = 0; c_idx < c_end; c_idx++) {
259 for (
int i = 0;
i < 2;
i++) {
260 TL_ADD(alf_pixel_buffer_h[c_idx][
i], (
w * border_pixels * ctu_height) << ps);
297 const int ctu_height =
pps ?
pps->ctb_height : 0;
298 const int ctu_size =
sps ?
sps->ctb_size_y : 0;
299 const int ps =
sps ?
sps->pixel_shift : 0;
300 const int chroma_idc =
sps ?
sps->r->sps_chroma_format_idc : 0;
301 const int has_ibc =
sps ?
sps->r->sps_ibc_enabled_flag : 0;
302 const int changed =
fc->tab.sz.chroma_format_idc != chroma_idc ||
303 fc->tab.sz.ctu_height != ctu_height ||
304 fc->tab.sz.ctu_size != ctu_size ||
305 fc->tab.sz.pixel_shift != ps;
312 const int hs =
sps ?
sps->hshift[
i] : 0;
313 const int vs =
sps ?
sps->vshift[
i] : 0;
314 TL_ADD(ibc_vir_buf[
i],
fc->tab.sz.ibc_buffer_width * ctu_size * ctu_height << ps >> hs >> vs);
351 for (
int i = 0;
i <
fc->tab.sz.ctu_count;
i++)
363 memset(&
fc->tab.sz, 0,
sizeof(
fc->tab.sz));
370 const int ctu_count =
pps->ctb_count;
371 const int pic_size_in_min_pu =
pps->min_pu_width *
pps->min_pu_height;
381 memset(
fc->tab.cus, 0,
sizeof(*
fc->tab.cus) * ctu_count);
383 memset(
fc->tab.slice_idx, -1,
sizeof(*
fc->tab.slice_idx) * ctu_count);
385 if (
fc->tab.sz.ctu_count != ctu_count) {
388 if (!
fc->rpl_tab_pool)
392 if (
fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu) {
396 if (!
fc->tab_dmvr_mvf_pool)
400 fc->tab.sz.ctu_count =
pps->ctb_count;
401 fc->tab.sz.ctu_size = 1 <<
sps->ctb_log2_size_y <<
sps->ctb_log2_size_y;
402 fc->tab.sz.pic_size_in_min_cb =
pps->min_cb_width *
pps->min_cb_height;
403 fc->tab.sz.pic_size_in_min_pu = pic_size_in_min_pu;
404 fc->tab.sz.pic_size_in_min_tu =
pps->min_tu_width *
pps->min_tu_height;
405 fc->tab.sz.width =
pps->width;
406 fc->tab.sz.height =
pps->height;
407 fc->tab.sz.ctu_width =
pps->ctb_width;
408 fc->tab.sz.ctu_height =
pps->ctb_height;
409 fc->tab.sz.chroma_format_idc =
sps->r->sps_chroma_format_idc;
410 fc->tab.sz.pixel_shift =
sps->pixel_shift;
422 return diff > 0 && (idx < 0 ||
diff < min_diff);
427 return diff < 0 && (idx < 0 || diff > max_diff);
436 const int poc =
fc->ref->poc;
442 if (find(idx,
diff, old_diff)) {
473 for (
int i = 0;
i <
fc->nb_slices_allocated;
i++) {
484 fc->nb_slices_allocated = 0;
491 const int size = (
fc->nb_slices_allocated + 1) * 3 / 2;
493 if (
fc->nb_slices <
fc->nb_slices_allocated)
501 for (
int i =
fc->nb_slices_allocated;
i <
size;
i++) {
503 if (!
fc->slices[
i]) {
504 fc->nb_slices_allocated =
i;
507 fc->slices[
i]->slice_idx =
i;
509 fc->nb_slices_allocated =
size;
515 const H2645NAL *nal,
const int header_size,
const int ep_index)
519 if (ep_index < rsh->num_entry_points) {
523 while (skipped < nal->skipped_bytes && nal->
skipped_bytes_pos[skipped] <= start + header_size) {
526 while (skipped < nal->skipped_bytes && nal->
skipped_bytes_pos[skipped] <= end + header_size) {
561 for (
int c_idx =
LUMA; c_idx <=
CR; c_idx++)
577 if (sc->
nb_eps != nb_eps) {
597 for (
int j = ep->
ctu_start; j < ep->ctu_end; j++) {
611 const int size =
s->nb_fcs;
632 dst->needs_fg =
src->needs_fg;
642 src->hwaccel_picture_private);
643 dst->nb_rpl_elems =
src->nb_rpl_elems;
646 dst->ctb_count =
src->ctb_count;
648 dst->scaling_win =
src->scaling_win;
649 dst->ref_width =
src->ref_width;
650 dst->ref_height =
src->ref_height;
653 dst->sequence =
src->sequence;
684 if (!
fc->output_frame)
689 if (!
fc->DPB[j].frame)
693 if (!
fc->DPB[j].frame_grain)
712 if (
s->nb_frames &&
s->nb_fcs > 1) {
729 s->seq_decode = (
s->seq_decode + 1) & 0xff;
746 for (
int i = 0;
i <
frame->nb_units;
i++) {
762 NULL,
fc->ps.sps->bit_depth,
fc->ps.sps->bit_depth,
fc->ref->poc);
769 fc->ref->needs_fg = (
fc->sei.common.film_grain_characteristics &&
770 fc->sei.common.film_grain_characteristics->present ||
771 fc->sei.common.aom_film_grain.enable) &&
775 if (
fc->ref->needs_fg &&
776 (
fc->sei.common.film_grain_characteristics &&
777 fc->sei.common.film_grain_characteristics->present &&
779 fc->ref->frame->format) ||
782 "Unsupported film grain parameters. Ignoring film grain.\n");
783 fc->ref->needs_fg = 0;
786 if (
fc->ref->needs_fg) {
787 fc->ref->frame_grain->format =
fc->ref->frame->format;
788 fc->ref->frame_grain->width =
fc->ref->frame->width;
789 fc->ref->frame_grain->height =
fc->ref->frame->height;
809 s->poc_tid0 =
ph->poc;
857 if (is_first_slice) {
861 }
else if (
fc->ref) {
866 "Error constructing the reference lists for the current slice.\n");
883 #define HWACCEL_MAX CONFIG_VVC_VAAPI_HWACCEL
887 switch (
sps->pix_fmt) {
889 #if CONFIG_VVC_VAAPI_HWACCEL
894 #if CONFIG_VVC_VAAPI_HWACCEL
900 *fmt++ =
sps->pix_fmt;
913 if (
c->sw_pix_fmt !=
sps->pix_fmt ||
c->coded_width !=
pps->width ||
c->coded_height !=
pps->height) {
914 c->coded_width =
pps->width;
915 c->coded_height =
pps->height;
916 c->sw_pix_fmt =
sps->pix_fmt;
922 c->width =
pps->width - ((
pps->r->pps_conf_win_left_offset +
pps->r->pps_conf_win_right_offset) <<
sps->hshift[
CHROMA]);
923 c->height =
pps->height - ((
pps->r->pps_conf_win_top_offset +
pps->r->pps_conf_win_bottom_offset) <<
sps->vshift[
CHROMA]);
950 const int is_first_slice = !
fc->nb_slices;
956 sc =
fc->slices[
fc->nb_slices];
958 s->vcl_unit_type = nal->
type;
959 if (is_first_slice) {
973 if (
s->avctx->hwaccel) {
974 if (is_first_slice) {
1000 "Decoding of multilayer bitstreams");
1004 switch (unit->
type) {
1047 s->last_eos =
s->eos;
1051 ff_cbs_fragment_reset(
frame);
1052 ret = ff_cbs_read_packet(
s->cbc,
frame, avpkt);
1058 for (
int i = 0;
i <
frame->nb_units;
i++) {
1068 "Error parsing NAL unit #%d.\n",
i);
1086 if (
fc->ref->needs_fg) {
1089 switch (fgp->
type) {
1109 if (
sei->picture_hash.present) {
1117 "Verifying checksum for frame with decoder_order %d: failed\n",
1118 (
int)
fc->decode_order);
1149 if (
s->avctx->hwaccel) {
1152 "Hardware accelerator failed to decode picture\n");
1166 if (
s->nb_delayed >=
s->nb_fcs ||
s->avctx->hwaccel) {
1176 while (
s->nb_delayed) {
1207 fc->decode_order =
s->nb_frames;
1213 if (!
fc->ft || !
fc->ref)
1228 while (
s->nb_delayed)
1236 s->ps.sps_id_used = 0;
1245 ff_cbs_fragment_free(&
s->current_frame);
1249 for (
int i = 0;
i <
s->nb_fcs;
i++)
1255 ff_cbs_close(&
s->cbc);
1265 #define VVC_MAX_DELAYED_FRAMES 16
1282 ret = ff_cbs_read_extradata_from_codec(
s->cbc, &
s->current_frame, avctx);
1292 for (
int i = 0;
i <
s->nb_fcs;
i++) {
1299 if (thread_count == 1)
1327 #if CONFIG_VVC_VAAPI_HWACCEL
#define AV_LOG_WARNING
Something somehow does not look correct.
void * content_ref
If content is reference counted, a RefStruct reference backing content.
uint32_t num_ctus_in_curr_slice
NumCtusInCurrSlice.
AVPixelFormat
Pixel format.
struct AVFrame * output_frame
#define AV_EF_EXPLODE
abort decoding on minor error detection
#define VVC_MAX_DELAYED_FRAMES
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static atomic_int cpu_count
static void min_cb_tl_init(TabList *l, VVCFrameContext *fc)
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
uint32_t entry_point_start_ctu[VVC_MAX_ENTRY_POINTS]
entry point start in ctu_addr
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
static int tl_create(TabList *l)
static int slices_realloc(VVCFrameContext *fc)
void ff_vvc_sei_reset(VVCSEI *s)
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
static av_always_inline int bytestream2_tell(const GetByteContext *g)
void ff_vvc_report_frame_finished(VVCFrame *frame)
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed)
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
VVCFrame DPB[VVC_MAX_DPB_SIZE+1]
static int decode_nal_unit(VVCContext *s, VVCFrameContext *fc, AVBufferRef *buf_ref, const H2645NAL *nal, const CodedBitstreamUnit *unit)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
This structure describes decoded (raw) audio or video data.
static int decode_slice(VVCContext *s, VVCFrameContext *fc, AVBufferRef *buf_ref, const H2645NAL *nal, const CodedBitstreamUnit *unit)
int ff_h274_hash_init(H274HashContext **ctx, const int type)
FFExecutor * ff_vvc_executor_alloc(VVCContext *s, const int thread_count)
#define AV_PIX_FMT_YUV420P10
static void free_cus(VVCFrameContext *fc)
void(* tl_init_fn)(TabList *l, VVCFrameContext *fc)
int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in, const AVFilmGrainParams *params)
const H266RawSliceHeader * r
RefStruct reference.
static void msm_tl_init(TabList *l, VVCFrameContext *fc)
CodedBitstreamUnitType type
Codec-specific type of this unit.
#define FF_HW_SIMPLE_CALL(avctx, function)
static void ctu_nz_tl_init(TabList *l, VVCFrameContext *fc)
int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
void ff_h274_hash_freep(H274HashContext **ctx)
static void min_pu_tl_init(TabList *l, VVCFrameContext *fc)
Coded bitstream unit structure.
static void pixel_buffer_nz_tl_init(TabList *l, VVCFrameContext *fc)
static av_cold void close(AVCodecParserContext *s)
static int set_side_data(VVCContext *s, VVCFrameContext *fc)
AVCodec p
The public AVCodec.
static int decode_nal_units(VVCContext *s, VVCFrameContext *fc, AVPacket *avpkt)
#define AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME
If this flag is set, the entries will be zeroed before being returned to the user (after the init or ...
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
static int ep_init(EntryPoint *ep, const int ctu_addr, const int ctu_end, GetByteContext *gb, const int size)
int ff_vvc_decode_sh(VVCSH *sh, const VVCFrameParamSets *fps, const CodedBitstreamUnit *unit)
const AVFilmGrainParams * av_film_grain_params_select(const AVFrame *frame)
Select the most appropriate film grain parameters set for the frame, taking into account the frame's ...
int flags
AV_CODEC_FLAG_*.
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
static int tl_zero(TabList *l)
void ff_vvc_executor_free(FFExecutor **e)
void ff_vvc_frame_ps_free(VVCFrameParamSets *fps)
int ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc)
#define GDR_SET_RECOVERED(s)
static int frame_context_setup(VVCFrameContext *fc, VVCContext *s)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static int vvc_decode_frame(AVCodecContext *avctx, AVFrame *output, int *got_output, AVPacket *avpkt)
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
static av_cold int vvc_decode_init(AVCodecContext *avctx)
VVCRefPic refs[VVC_MAX_REF_ENTRIES]
int(* smvd_find_fxn)(const int idx, const int diff, const int old_diff)
void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags)
int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc)
Coded bitstream fragment structure, combining one or more units.
#define FF_CODEC_DECODE_CB(func)
const FFCodec ff_vvc_decoder
#define AV_CEIL_RSHIFT(a, b)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
static int frame_context_for_each_tl(VVCFrameContext *fc, int(*unary_fn)(TabList *l))
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
#define fc(width, name, range_min, range_max)
static int pic_arrays_init(VVCContext *s, VVCFrameContext *fc)
static av_cold int vvc_decode_free(AVCodecContext *avctx)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static enum AVPixelFormat pix_fmts[]
static void pic_arrays_free(VVCFrameContext *fc)
static int slice_init_entry_points(SliceContext *sc, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
void ff_vvc_clear_refs(VVCFrameContext *fc)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
uint8_t ff_vvc_default_scale_m[64 *64]
@ AV_FILM_GRAIN_PARAMS_NONE
static void min_tu_tl_init(TabList *l, VVCFrameContext *fc)
static VVCFrameContext * get_frame_context(const VVCContext *s, const VVCFrameContext *fc, const int delta)
static av_cold void frame_context_free(VVCFrameContext *fc)
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
int ff_vvc_frame_thread_init(VVCFrameContext *fc)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
int8_t ref_idx_sym[2]
RefIdxSymL0, RefIdxSymL1.
static int frame_setup(VVCFrameContext *fc, VVCContext *s)
static int frame_end(VVCContext *s, VVCFrameContext *fc)
CodedBitstreamH2645Context common
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
static int FUNC() sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int check_film_grain(VVCContext *s, VVCFrameContext *fc)
void ff_vvc_flush_dpb(VVCFrameContext *fc)
static int export_frame_params(VVCContext *s, const VVCFrameContext *fc)
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static void min_cb_nz_tl_init(TabList *l, VVCFrameContext *fc)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static av_cold void vvc_decode_flush(AVCodecContext *avctx)
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
void ff_vvc_frame_thread_free(VVCFrameContext *fc)
static int max_negtive(const int idx, const int diff, const int max_diff)
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
static void min_tu_nz_tl_init(TabList *l, VVCFrameContext *fc)
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
This structure describes how to handle film grain synthesis in video for specific codecs.
void * ref
RefStruct reference, backing slice data.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
void ff_vvc_dsp_init(VVCDSPContext *vvcdsp, int bit_depth)
#define MAX_CONTROL_POINTS
const uint32_t * ctb_addr_in_curr_slice
CtbAddrInCurrSlice.
static int frame_start(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *out, const int no_output_of_prior_pics_flag, int flush)
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
int ff_vvc_sei_decode(VVCSEI *s, const H266RawSEI *sei, const struct VVCFrameContext *fc)
int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, H274FilmGrainDatabase *database, const AVFilmGrainParams *params)
#define i(width, name, range_min, range_max)
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
static int ep_init_cabac_decoder(EntryPoint *ep, GetByteContext *gb, const int size)
int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit)
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
void * av_calloc(size_t nmemb, size_t size)
Palette pp[VVC_MAX_SAMPLE_ARRAYS]
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
void ff_vvc_ps_uninit(VVCParamSets *ps)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static void ibc_tl_init(TabList *l, VVCFrameContext *fc)
int ff_vvc_sei_replace(VVCSEI *dst, const VVCSEI *src)
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
static void ispmf_tl_init(TabList *l, VVCFrameContext *fc)
static void slices_free(VVCFrameContext *fc)
main external API structure.
static void eps_free(SliceContext *slice)
@ AV_FILM_GRAIN_PARAMS_H274
The union is valid when interpreted as AVFilmGrainH274Params (codec.h274)
static int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
Check whether ff_h274_apply_film_grain() supports the given parameter combination.
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
#define FF_HW_CALL(avctx, function,...)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps)
int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, AVFrame **frame)
static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
static av_cold int frame_context_init(VVCFrameContext *fc, AVCodecContext *avctx)
#define ALF_BORDER_CHROMA
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
int ff_h274_hash_verify(H274HashContext *c, const H274SEIPictureHash *hash, const AVFrame *frame, const int coded_width, const int coded_height)
int ff_vvc_frame_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
const AVProfile ff_vvc_profiles[]
A reference to a data buffer.
static av_cold void init_default_scale_m(void)
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
static void min_pu_nz_tl_init(TabList *l, VVCFrameContext *fc)
This structure stores compressed data.
#define HWACCEL_VAAPI(codec)
static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int tl_free(TabList *l)
static void tl_init(TabList *l, const int zero, const int realloc)
int ff_vvc_per_frame_init(VVCFrameContext *fc)
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
static int min_positive(const int idx, const int diff, const int min_diff)
static void decode_prefix_sei(VVCFrameContext *fc, VVCContext *s)
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc)
static int get_ep_size(const H266RawSliceHeader *rsh, const GetByteContext *gb, const H2645NAL *nal, const int header_size, const int ep_index)
void ff_vvc_ctu_free_cus(CodingUnit **cus)