X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcavs.h;h=cb549f161ec3c5eec5612cccf80438e2fb9d36e6;hb=83678dbbae64ad8c501e0c732c1117e642c25dae;hp=c0f4f9ca8e8ef2fbf7d985cf88f898a5e601b46c;hpb=2a3cc9730f804bc476bf316b75a54b15c90f3253;p=ffmpeg diff --git a/libavcodec/cavs.h b/libavcodec/cavs.h index c0f4f9ca8e8..cb549f161ec 100644 --- a/libavcodec/cavs.h +++ b/libavcodec/cavs.h @@ -2,30 +2,33 @@ * Chinese AVS video (AVS1-P2, JiZhun profile) decoder. * Copyright (c) 2006 Stefan Gehrer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * 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. * - * FFmpeg is distributed in the hope that it will be useful, + * 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 FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CAVS_H -#define CAVS_H +#ifndef AVCODEC_CAVS_H +#define AVCODEC_CAVS_H -#include "dsputil.h" -#include "mpegvideo.h" +#include "bitstream.h" +#include "cavsdsp.h" +#include "blockdsp.h" +#include "h264chroma.h" +#include "idctdsp.h" +#include "videodsp.h" -#define SLICE_MIN_START_CODE 0x00000101 #define SLICE_MAX_START_CODE 0x000001af #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 @@ -55,7 +58,7 @@ #define MV_BWD_OFFS 12 #define MV_STRIDE 4 -enum mb_t { +enum cavs_mb { I_8X8 = 0, P_SKIP, P_16X16, @@ -70,14 +73,14 @@ enum mb_t { B_8X8 = 29 }; -enum sub_mb_t { +enum cavs_sub_mb { B_SUB_DIRECT, B_SUB_FWD, B_SUB_BWD, B_SUB_SYM }; -enum intra_luma_t { +enum cavs_intra_luma { INTRA_L_VERT, INTRA_L_HORIZ, INTRA_L_LP, @@ -88,7 +91,7 @@ enum intra_luma_t { INTRA_L_DC_128 }; -enum intra_chroma_t { +enum cavs_intra_chroma { INTRA_C_LP, INTRA_C_HORIZ, INTRA_C_VERT, @@ -98,7 +101,7 @@ enum intra_chroma_t { INTRA_C_DC_128, }; -enum mv_pred_t { +enum cavs_mv_pred { MV_PRED_MEDIAN, MV_PRED_LEFT, MV_PRED_TOP, @@ -107,14 +110,14 @@ enum mv_pred_t { MV_PRED_BSKIP }; -enum block_t { +enum cavs_block { BLK_16X16, BLK_16X8, BLK_8X16, BLK_8X8 }; -enum mv_loc_t { +enum cavs_mv_loc { MV_FWD_D3 = 0, MV_FWD_B2, MV_FWD_B3, @@ -137,37 +140,50 @@ enum mv_loc_t { MV_BWD_X3 }; -DECLARE_ALIGNED_8(typedef, struct) { +DECLARE_ALIGNED(8, typedef, struct) { int16_t x; int16_t y; int16_t dist; int16_t ref; -} vector_t; +} cavs_vector; -typedef struct residual_vlc_t { +struct dec_2dvlc { int8_t rltab[59][3]; int8_t level_add[27]; int8_t golomb_order; int inc_limit; int8_t max_run; -} residual_vlc_t; +}; + +typedef struct AVSFrame { + AVFrame *f; + int poc; +} AVSFrame; -typedef struct { - MpegEncContext s; - Picture picture; ///< currently decoded frame - Picture DPB[2]; ///< reference frames +typedef struct AVSContext { + AVCodecContext *avctx; + BlockDSPContext bdsp; + H264ChromaContext h264chroma; + IDCTDSPContext idsp; + VideoDSPContext vdsp; + CAVSDSPContext cdsp; + BitstreamContext bc; + AVSFrame cur; ///< currently decoded frame + AVSFrame DPB[2]; ///< reference frames int dist[2]; ///< temporal distances from current frame to ref frames + int low_delay; int profile, level; int aspect_ratio; int mb_width, mb_height; - int pic_type; + int width, height; + int stream_revision; ///<0 for samples from 2006, 1 for rm52j encoder int progressive; int pic_structure; int skip_mode_flag; ///< select between skip_count or one skip_flag per MB int loop_filter_disable; int alpha_offset, beta_offset; int ref_flag; - int mbx, mby; ///< macroblock coordinates + int mbx, mby, mbidx; ///< macroblock coordinates int flags; ///< availability flags of neighbouring macroblocks int stc; ///< last start code uint8_t *cy, *cu, *cv; ///< current MB sample pointers @@ -186,9 +202,9 @@ typedef struct { D is the macroblock to the top-left (0) the same is repeated for backward motion vectors */ - vector_t mv[2*4*3]; - vector_t *top_mv[2]; - vector_t *col_mv; + cavs_vector mv[2*4*3]; + cavs_vector *top_mv[2]; + cavs_vector *col_mv; /** luma pred mode cache 0: -- B2 B3 @@ -196,7 +212,7 @@ typedef struct { 6: A3 X2 X3 */ int pred_mode_Y[3*3]; int *top_pred_Y; - int l_stride, c_stride; + ptrdiff_t l_stride, c_stride; int luma_scan[4]; int qp; int qp_fixed; @@ -210,18 +226,52 @@ typedef struct { uint8_t intern_border_y[26]; uint8_t topleft_border_y, topleft_border_u, topleft_border_v; - void (*intra_pred_l[8])(uint8_t *d,uint8_t *top,uint8_t *left,int stride); - void (*intra_pred_c[7])(uint8_t *d,uint8_t *top,uint8_t *left,int stride); + void (*intra_pred_l[8])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride); + void (*intra_pred_c[7])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride); uint8_t *col_type_base; - uint8_t *col_type; /* scaling factors for MV prediction */ int sym_factor; ///< for scaling in symmetrical B block int direct_den[2]; ///< for scaling in direct B block int scale_den[2]; ///< for scaling neighbouring MVs + uint8_t *edge_emu_buffer; + int got_keyframe; - DCTELEM *block; + int16_t *block; } AVSContext; -#endif /* CAVS_H */ +extern const uint8_t ff_cavs_partition_flags[30]; +extern const cavs_vector ff_cavs_intra_mv; +extern const cavs_vector ff_cavs_dir_mv; + +static inline void set_mvs(cavs_vector *mv, enum cavs_block size) { + switch(size) { + case BLK_16X16: + mv[MV_STRIDE ] = mv[0]; + mv[MV_STRIDE+1] = mv[0]; + case BLK_16X8: + mv[1] = mv[0]; + break; + case BLK_8X16: + mv[MV_STRIDE] = mv[0]; + break; + } +} + +void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type); +void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, + int block); +void ff_cavs_load_intra_pred_chroma(AVSContext *h); +void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv); +void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type); +void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, + enum cavs_mv_pred mode, enum cavs_block size, int ref); +void ff_cavs_init_mb(AVSContext *h); +int ff_cavs_next_mb(AVSContext *h); +void ff_cavs_init_pic(AVSContext *h); +void ff_cavs_init_top_lines(AVSContext *h); +int ff_cavs_init(AVCodecContext *avctx); +int ff_cavs_end (AVCodecContext *avctx); + +#endif /* AVCODEC_CAVS_H */