} RefPicListTab;
typedef struct HEVCWindow {
- int left_offset;
- int right_offset;
- int top_offset;
- int bottom_offset;
+ unsigned int left_offset;
+ unsigned int right_offset;
+ unsigned int top_offset;
+ unsigned int bottom_offset;
} HEVCWindow;
typedef struct VUI {
int *min_tb_addr_zs; ///< MinTbAddrZS
} HEVCPPS;
+typedef struct HEVCParamSets {
+ AVBufferRef *vps_list[MAX_VPS_COUNT];
+ AVBufferRef *sps_list[MAX_SPS_COUNT];
+ AVBufferRef *pps_list[MAX_PPS_COUNT];
+
+ /* currently active parameter sets */
+ const HEVCVPS *vps;
+ const HEVCSPS *sps;
+ const HEVCPPS *pps;
+} HEVCParamSets;
+
typedef struct SliceHeader {
unsigned int pps_id;
uint8_t colour_plane_id;
///< RPS coded in the slice header itself is stored here
+ int short_term_ref_pic_set_sps_flag;
+ int short_term_ref_pic_set_size;
ShortTermRPS slice_rps;
const ShortTermRPS *short_term_rps;
LongTermRPS long_term_rps;
enum PredMode pred_mode; ///< PredMode
enum PartMode part_mode; ///< PartMode
- uint8_t rqt_root_cbf;
-
- uint8_t pcm_flag;
-
// Inferred parameters
uint8_t intra_split_flag; ///< IntraSplitFlag
uint8_t max_trafo_depth; ///< MaxTrafoDepth
} Mv;
typedef struct MvField {
- Mv mv[2];
+ DECLARE_ALIGNED(4, Mv, mv)[2];
int8_t ref_idx[2];
int8_t pred_flag[2];
uint8_t is_intra;
AVBufferRef *rpl_tab_buf;
AVBufferRef *rpl_buf;
+ AVBufferRef *hwaccel_priv_buf;
+ void *hwaccel_picture_private;
+
/**
* A sequence counter, so that old frames are output first
* after a POC reset
int size;
const uint8_t *data;
+
+ int raw_size;
+ const uint8_t *raw_data;
+
+ GetBitContext gb;
+
+ enum NALUnitType type;
+ int temporal_id;
} HEVCNAL;
+/* an input packet split into unescaped NAL units */
+typedef struct HEVCPacket {
+ HEVCNAL *nals;
+ int nb_nals;
+ int nals_allocated;
+} HEVCPacket;
+
struct HEVCContext;
typedef struct HEVCPredContext {
AVFrame *tmp_frame;
AVFrame *output_frame;
- const HEVCVPS *vps;
- const HEVCSPS *sps;
- const HEVCPPS *pps;
- AVBufferRef *vps_list[MAX_VPS_COUNT];
- AVBufferRef *sps_list[MAX_SPS_COUNT];
- AVBufferRef *pps_list[MAX_PPS_COUNT];
+ HEVCParamSets ps;
AVBufferPool *tab_mvf_pool;
AVBufferPool *rpl_tab_pool;
uint16_t seq_decode;
uint16_t seq_output;
- HEVCNAL *nals;
- int nb_nals;
- int nals_allocated;
+ HEVCPacket pkt;
// type of the first VCL NAL of the current frame
enum NALUnitType first_nal_type;
int sei_hflip, sei_vflip;
} HEVCContext;
-int ff_hevc_decode_short_term_rps(HEVCContext *s, ShortTermRPS *rps,
- const HEVCSPS *sps, int is_slice_header);
-int ff_hevc_decode_nal_vps(HEVCContext *s);
-int ff_hevc_decode_nal_sps(HEVCContext *s);
-int ff_hevc_decode_nal_pps(HEVCContext *s);
+int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
+ ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header);
+
+/**
+ * Parse the SPS from the bitstream into the provided HEVCSPS struct.
+ *
+ * @param sps_id the SPS id will be written here
+ * @param apply_defdispwin if set 1, the default display window from the VUI
+ * will be applied to the video dimensions
+ * @param vps_list if non-NULL, this function will validate that the SPS refers
+ * to an existing VPS
+ */
+int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
+ int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx);
+
+int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx,
+ HEVCParamSets *ps);
+int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx,
+ HEVCParamSets *ps, int apply_defdispwin);
+int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx,
+ HEVCParamSets *ps);
int ff_hevc_decode_nal_sei(HEVCContext *s);
/**
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth);
+/**
+ * Extract the raw (unescaped) HEVC bitstream.
+ */
+int ff_hevc_extract_rbsp(const uint8_t *src, int length,
+ HEVCNAL *nal);
+
+/**
+ * Split an input packet into NAL units.
+ */
+int ff_hevc_split_packet(HEVCPacket *pkt, const uint8_t *buf, int length,
+ AVCodecContext *avctx, int is_nalff, int nal_length_size);
+
+int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id,
+ uint8_t *buf, int buf_size);
+
extern const uint8_t ff_hevc_qpel_extra_before[4];
extern const uint8_t ff_hevc_qpel_extra_after[4];
extern const uint8_t ff_hevc_qpel_extra[4];