| 1 | /* |
| 2 | * RV30/40 decoder common data declarations |
| 3 | * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov |
| 4 | * |
| 5 | * This file is part of FFmpeg. |
| 6 | * |
| 7 | * FFmpeg is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU Lesser General Public |
| 9 | * License as published by the Free Software Foundation; either |
| 10 | * version 2.1 of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * FFmpeg is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | * Lesser General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU Lesser General Public |
| 18 | * License along with FFmpeg; if not, write to the Free Software |
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 20 | */ |
| 21 | |
| 22 | /** |
| 23 | * @file |
| 24 | * RV30 and RV40 decoder common data declarations |
| 25 | */ |
| 26 | |
| 27 | #ifndef AVCODEC_RV34_H |
| 28 | #define AVCODEC_RV34_H |
| 29 | |
| 30 | #include "avcodec.h" |
| 31 | #include "mpegvideo.h" |
| 32 | |
| 33 | #include "h264pred.h" |
| 34 | #include "rv34dsp.h" |
| 35 | |
| 36 | #define MB_TYPE_SEPARATE_DC 0x01000000 |
| 37 | #define IS_SEPARATE_DC(a) ((a) & MB_TYPE_SEPARATE_DC) |
| 38 | |
| 39 | /** |
| 40 | * RV30 and RV40 Macroblock types |
| 41 | */ |
| 42 | enum RV40BlockTypes{ |
| 43 | RV34_MB_TYPE_INTRA, ///< Intra macroblock |
| 44 | RV34_MB_TYPE_INTRA16x16, ///< Intra macroblock with DCs in a separate 4x4 block |
| 45 | RV34_MB_P_16x16, ///< P-frame macroblock, one motion frame |
| 46 | RV34_MB_P_8x8, ///< P-frame macroblock, 8x8 motion compensation partitions |
| 47 | RV34_MB_B_FORWARD, ///< B-frame macroblock, forward prediction |
| 48 | RV34_MB_B_BACKWARD, ///< B-frame macroblock, backward prediction |
| 49 | RV34_MB_SKIP, ///< Skipped block |
| 50 | RV34_MB_B_DIRECT, ///< Bidirectionally predicted B-frame macroblock, no motion vectors |
| 51 | RV34_MB_P_16x8, ///< P-frame macroblock, 16x8 motion compensation partitions |
| 52 | RV34_MB_P_8x16, ///< P-frame macroblock, 8x16 motion compensation partitions |
| 53 | RV34_MB_B_BIDIR, ///< Bidirectionally predicted B-frame macroblock, two motion vectors |
| 54 | RV34_MB_P_MIX16x16, ///< P-frame macroblock with DCs in a separate 4x4 block, one motion vector |
| 55 | RV34_MB_TYPES |
| 56 | }; |
| 57 | |
| 58 | /** |
| 59 | * VLC tables used by the decoder |
| 60 | * |
| 61 | * Intra frame VLC sets do not contain some of those tables. |
| 62 | */ |
| 63 | typedef struct RV34VLC{ |
| 64 | VLC cbppattern[2]; ///< VLCs used for pattern of coded block patterns decoding |
| 65 | VLC cbp[2][4]; ///< VLCs used for coded block patterns decoding |
| 66 | VLC first_pattern[4]; ///< VLCs used for decoding coefficients in the first subblock |
| 67 | VLC second_pattern[2]; ///< VLCs used for decoding coefficients in the subblocks 2 and 3 |
| 68 | VLC third_pattern[2]; ///< VLCs used for decoding coefficients in the last subblock |
| 69 | VLC coefficient; ///< VLCs used for decoding big coefficients |
| 70 | }RV34VLC; |
| 71 | |
| 72 | /** essential slice information */ |
| 73 | typedef struct SliceInfo{ |
| 74 | int type; ///< slice type (intra, inter) |
| 75 | int quant; ///< quantizer used for this slice |
| 76 | int vlc_set; ///< VLCs used for this slice |
| 77 | int start, end; ///< start and end macroblocks of the slice |
| 78 | int width; ///< coded width |
| 79 | int height; ///< coded height |
| 80 | int pts; ///< frame timestamp |
| 81 | }SliceInfo; |
| 82 | |
| 83 | /** decoder context */ |
| 84 | typedef struct RV34DecContext{ |
| 85 | MpegEncContext s; |
| 86 | RV34DSPContext rdsp; |
| 87 | int8_t *intra_types_hist;///< old block types, used for prediction |
| 88 | int8_t *intra_types; ///< block types |
| 89 | int intra_types_stride;///< block types array stride |
| 90 | const uint8_t *luma_dc_quant_i;///< luma subblock DC quantizer for intraframes |
| 91 | const uint8_t *luma_dc_quant_p;///< luma subblock DC quantizer for interframes |
| 92 | |
| 93 | RV34VLC *cur_vlcs; ///< VLC set used for current frame decoding |
| 94 | H264PredContext h; ///< functions for 4x4 and 16x16 intra block prediction |
| 95 | SliceInfo si; ///< current slice information |
| 96 | |
| 97 | int *mb_type; ///< internal macroblock types |
| 98 | int block_type; ///< current block type |
| 99 | int luma_vlc; ///< which VLC set will be used for decoding of luma blocks |
| 100 | int chroma_vlc; ///< which VLC set will be used for decoding of chroma blocks |
| 101 | int is16; ///< current block has additional 16x16 specific features or not |
| 102 | int dmv[4][2]; ///< differential motion vectors for the current macroblock |
| 103 | |
| 104 | int rv30; ///< indicates which RV variasnt is currently decoded |
| 105 | int max_rpr; |
| 106 | |
| 107 | int cur_pts, last_pts, next_pts; |
| 108 | int scaled_weight; |
| 109 | int weight1, weight2; ///< B frame distance fractions (0.14) used in motion compensation |
| 110 | int mv_weight1, mv_weight2; |
| 111 | |
| 112 | uint16_t *cbp_luma; ///< CBP values for luma subblocks |
| 113 | uint8_t *cbp_chroma; ///< CBP values for chroma subblocks |
| 114 | uint16_t *deblock_coefs; ///< deblock coefficients for each macroblock |
| 115 | |
| 116 | /** 8x8 block available flags (for MV prediction) */ |
| 117 | DECLARE_ALIGNED(8, uint32_t, avail_cache)[3*4]; |
| 118 | |
| 119 | /** temporary blocks for RV4 weighted MC */ |
| 120 | uint8_t *tmp_b_block_y[2]; |
| 121 | uint8_t *tmp_b_block_uv[4]; |
| 122 | uint8_t *tmp_b_block_base; |
| 123 | |
| 124 | int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si); |
| 125 | int (*decode_mb_info)(struct RV34DecContext *r); |
| 126 | int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst); |
| 127 | void (*loop_filter)(struct RV34DecContext *r, int row); |
| 128 | }RV34DecContext; |
| 129 | |
| 130 | /** |
| 131 | * common decoding functions |
| 132 | */ |
| 133 | int ff_rv34_get_start_offset(GetBitContext *gb, int blocks); |
| 134 | int ff_rv34_decode_init(AVCodecContext *avctx); |
| 135 | int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt); |
| 136 | int ff_rv34_decode_end(AVCodecContext *avctx); |
| 137 | int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx); |
| 138 | int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src); |
| 139 | |
| 140 | #endif /* AVCODEC_RV34_H */ |