Co-authored-by: Xu Mu <toxumu@outlook.com> Co-authored-by: Frank Plowman <post@frankplowman.com> Co-authored-by: Shaun Loo <shaunloo10@gmail.com> Co-authored-by: Wu Jianhua <toqsxw@outlook.com>
		
			
				
	
	
		
			227 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * VVC video decoder
 | 
						|
 *
 | 
						|
 * Copyright (C) 2021 Nuo Mi
 | 
						|
 * Copyright (C) 2022 Xu Mu
 | 
						|
 *
 | 
						|
 * This file is part of FFmpeg.
 | 
						|
 *
 | 
						|
 * FFmpeg 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.
 | 
						|
 *
 | 
						|
 * FFmpeg 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 FFmpeg; if not, write to the Free Software
 | 
						|
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef AVCODEC_VVC_VVCDEC_H
 | 
						|
#define AVCODEC_VVC_VVCDEC_H
 | 
						|
 | 
						|
#include "libavcodec/videodsp.h"
 | 
						|
#include "libavcodec/vvc.h"
 | 
						|
 | 
						|
#include "vvc_ps.h"
 | 
						|
#include "vvcdsp.h"
 | 
						|
 | 
						|
#define LUMA                    0
 | 
						|
#define CHROMA                  1
 | 
						|
#define CB                      1
 | 
						|
#define CR                      2
 | 
						|
#define JCBCR                   3
 | 
						|
 | 
						|
#define MIN_TU_LOG2             2                       ///< MinTbLog2SizeY
 | 
						|
#define MIN_PU_LOG2             2
 | 
						|
 | 
						|
#define L0                      0
 | 
						|
#define L1                      1
 | 
						|
 | 
						|
typedef struct RefPicList {
 | 
						|
    struct VVCFrame *ref[VVC_MAX_REF_ENTRIES];
 | 
						|
    int list[VVC_MAX_REF_ENTRIES];
 | 
						|
    int isLongTerm[VVC_MAX_REF_ENTRIES];
 | 
						|
    int nb_refs;
 | 
						|
} RefPicList;
 | 
						|
 | 
						|
typedef struct RefPicListTab {
 | 
						|
    RefPicList refPicList[2];
 | 
						|
} RefPicListTab;
 | 
						|
 | 
						|
typedef struct VVCFrame {
 | 
						|
    struct AVFrame *frame;
 | 
						|
 | 
						|
    struct MvField *tab_dmvr_mvf;               ///< RefStruct reference
 | 
						|
    RefPicListTab **rpl_tab;                    ///< RefStruct reference
 | 
						|
    RefPicListTab  *rpl;                        ///< RefStruct reference
 | 
						|
    int nb_rpl_elems;
 | 
						|
 | 
						|
    int ctb_count;
 | 
						|
 | 
						|
    int poc;
 | 
						|
 | 
						|
    struct VVCFrame *collocated_ref;
 | 
						|
 | 
						|
    struct FrameProgress *progress;             ///< RefStruct reference
 | 
						|
 | 
						|
    /**
 | 
						|
     * A sequence counter, so that old frames are output first
 | 
						|
     * after a POC reset
 | 
						|
     */
 | 
						|
    uint16_t sequence;
 | 
						|
    /**
 | 
						|
     * A combination of VVC_FRAME_FLAG_*
 | 
						|
     */
 | 
						|
    uint8_t flags;
 | 
						|
} VVCFrame;
 | 
						|
 | 
						|
typedef struct SliceContext {
 | 
						|
    int slice_idx;
 | 
						|
    VVCSH sh;
 | 
						|
    struct EntryPoint *eps;
 | 
						|
    int nb_eps;
 | 
						|
    RefPicList *rpl;
 | 
						|
    void *ref;                      ///< RefStruct reference, backing slice data
 | 
						|
} SliceContext;
 | 
						|
 | 
						|
typedef struct VVCFrameContext {
 | 
						|
    void *log_ctx;
 | 
						|
 | 
						|
    // +1 for the current frame
 | 
						|
    VVCFrame DPB[VVC_MAX_DPB_SIZE + 1];
 | 
						|
 | 
						|
    struct AVFrame *frame;
 | 
						|
    struct AVFrame *output_frame;
 | 
						|
 | 
						|
    VVCFrameParamSets ps;
 | 
						|
 | 
						|
    SliceContext  **slices;
 | 
						|
    int nb_slices;
 | 
						|
    int nb_slices_allocated;
 | 
						|
 | 
						|
    VVCFrame *ref;
 | 
						|
 | 
						|
    VVCDSPContext vvcdsp;
 | 
						|
    VideoDSPContext vdsp;
 | 
						|
 | 
						|
    struct VVCFrameThread *ft;
 | 
						|
 | 
						|
    uint64_t decode_order;
 | 
						|
 | 
						|
    struct FFRefStructPool *tab_dmvr_mvf_pool;
 | 
						|
    struct FFRefStructPool *rpl_tab_pool;
 | 
						|
 | 
						|
    struct FFRefStructPool *cu_pool;
 | 
						|
    struct FFRefStructPool *tu_pool;
 | 
						|
 | 
						|
    struct {
 | 
						|
        int16_t *slice_idx;
 | 
						|
 | 
						|
        DBParams  *deblock;
 | 
						|
        struct SAOParams *sao;
 | 
						|
        struct ALFParams *alf;
 | 
						|
 | 
						|
        int     *cb_pos_x[2];                           ///< CbPosX[][][]
 | 
						|
        int     *cb_pos_y[2];                           ///< CbPosY[][][]
 | 
						|
        uint8_t *cb_width[2];                           ///< CbWidth[][][]
 | 
						|
        uint8_t *cb_height[2];                          ///< CbHeight[][][]
 | 
						|
        uint8_t *cqt_depth[2];                          ///< CqtDepth[][][]
 | 
						|
        int8_t  *qp[VVC_MAX_SAMPLE_ARRAYS];
 | 
						|
 | 
						|
        uint8_t *skip;                                  ///< CuSkipFlag[][]
 | 
						|
        uint8_t *ispmf;                                 ///< intra_sub_partitions_mode_flag
 | 
						|
        uint8_t *msm[2];                                ///< MttSplitMode[][][] in 32 pixels
 | 
						|
        uint8_t *imf;                                   ///< IntraMipFlag[][]
 | 
						|
        uint8_t *imtf;                                  ///< intra_mip_transposed_flag[][]
 | 
						|
        uint8_t *imm;                                   ///< intra_mip_mode[][]
 | 
						|
        uint8_t *ipm;                                   ///< IntraPredModeY[][]
 | 
						|
        uint8_t *cpm[2];                                ///< CuPredMode[][][]
 | 
						|
        uint8_t *msf;                                   ///< MergeSubblockFlag[][]
 | 
						|
        uint8_t *iaf;                                   ///< InterAffineFlag[][]
 | 
						|
        uint8_t *mmi;                                   ///< MotionModelIdc[][]
 | 
						|
        struct Mv      *cp_mv[2];                       ///< CpMvLX[][][][MAX_CONTROL_POINTS];
 | 
						|
        struct MvField *mvf;                            ///< MvDmvrL0, MvDmvrL1
 | 
						|
 | 
						|
        uint8_t *tu_coded_flag[VVC_MAX_SAMPLE_ARRAYS];  ///< tu_y_coded_flag[][],  tu_cb_coded_flag[][],  tu_cr_coded_flag[][]
 | 
						|
        uint8_t *tu_joint_cbcr_residual_flag;           ///< tu_joint_cbcr_residual_flag[][]
 | 
						|
        int     *tb_pos_x0[2];
 | 
						|
        int     *tb_pos_y0[2];
 | 
						|
        uint8_t *tb_width[2];
 | 
						|
        uint8_t *tb_height[2];
 | 
						|
        uint8_t *pcmf[2];
 | 
						|
 | 
						|
        uint8_t *horizontal_bs[VVC_MAX_SAMPLE_ARRAYS];
 | 
						|
        uint8_t *vertical_bs[VVC_MAX_SAMPLE_ARRAYS];
 | 
						|
        uint8_t *horizontal_p;                          ///< horizontal maxFilterLengthPs for luma
 | 
						|
        uint8_t *horizontal_q;                          ///< horizontal maxFilterLengthQs for luma
 | 
						|
        uint8_t *vertical_p;                            ///< vertical   maxFilterLengthPs for luma
 | 
						|
        uint8_t *vertical_q;                            ///< vertical   maxFilterLengthQs for luma
 | 
						|
 | 
						|
        uint8_t *sao_pixel_buffer_h[VVC_MAX_SAMPLE_ARRAYS];
 | 
						|
        uint8_t *sao_pixel_buffer_v[VVC_MAX_SAMPLE_ARRAYS];
 | 
						|
        uint8_t *alf_pixel_buffer_h[VVC_MAX_SAMPLE_ARRAYS][2];
 | 
						|
        uint8_t *alf_pixel_buffer_v[VVC_MAX_SAMPLE_ARRAYS][2];
 | 
						|
 | 
						|
        int         *coeffs;
 | 
						|
        struct CTU  *ctus;
 | 
						|
 | 
						|
        //used in arrays_init only
 | 
						|
        struct {
 | 
						|
            int ctu_count;
 | 
						|
            int ctu_size;
 | 
						|
            int pic_size_in_min_cb;
 | 
						|
            int pic_size_in_min_pu;
 | 
						|
            int pic_size_in_min_tu;
 | 
						|
            int ctu_width;
 | 
						|
            int ctu_height;
 | 
						|
            int width;
 | 
						|
            int height;
 | 
						|
            int chroma_format_idc;
 | 
						|
            int pixel_shift;
 | 
						|
            int bs_width;
 | 
						|
            int bs_height;
 | 
						|
        } sz;
 | 
						|
    } tab;
 | 
						|
} VVCFrameContext;
 | 
						|
 | 
						|
typedef struct VVCContext {
 | 
						|
    struct AVCodecContext *avctx;
 | 
						|
 | 
						|
    CodedBitstreamContext *cbc;
 | 
						|
    CodedBitstreamFragment current_frame;
 | 
						|
 | 
						|
    VVCParamSets ps;
 | 
						|
 | 
						|
    int temporal_id;        ///< temporal_id_plus1 - 1
 | 
						|
    int poc_tid0;
 | 
						|
 | 
						|
    int eos;                ///< current packet contains an EOS/EOB NAL
 | 
						|
    int last_eos;           ///< last packet contains an EOS/EOB NAL
 | 
						|
 | 
						|
    enum VVCNALUnitType vcl_unit_type;
 | 
						|
    int no_output_before_recovery_flag; ///< NoOutputBeforeRecoveryFlag
 | 
						|
    int gdr_recovery_point_poc;         ///< recoveryPointPocVal
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sequence counters for decoded and output frames, so that old
 | 
						|
     * frames are output first after a POC reset
 | 
						|
     */
 | 
						|
    uint16_t seq_decode;
 | 
						|
    uint16_t seq_output;
 | 
						|
 | 
						|
    struct AVExecutor *executor;
 | 
						|
 | 
						|
    VVCFrameContext *fcs;
 | 
						|
    int nb_fcs;
 | 
						|
 | 
						|
    uint64_t nb_frames;     ///< processed frames
 | 
						|
    int nb_delayed;         ///< delayed frames
 | 
						|
}  VVCContext ;
 | 
						|
 | 
						|
#endif /* AVCODEC_VVC_VVCDEC_H */
 |