aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/rv34.h
blob: ef19813cf80818511c9680134d9303f3bb0684dc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * RV30/40 decoder common data declarations
 * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov
 *
 * This file is part of Libav.
 *
 * 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.
 *
 * 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 Libav; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * RV30 and RV40 decoder common data declarations
 */

#ifndef AVCODEC_RV34_H
#define AVCODEC_RV34_H

#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"

#include "h264pred.h"
#include "rv34dsp.h"

#define MB_TYPE_SEPARATE_DC 0x01000000
#define IS_SEPARATE_DC(a)   ((a) & MB_TYPE_SEPARATE_DC)

/**
 * RV30 and RV40 Macroblock types
 */
enum RV40BlockTypes{
    RV34_MB_TYPE_INTRA,      ///< Intra macroblock
    RV34_MB_TYPE_INTRA16x16, ///< Intra macroblock with DCs in a separate 4x4 block
    RV34_MB_P_16x16,         ///< P-frame macroblock, one motion frame
    RV34_MB_P_8x8,           ///< P-frame macroblock, 8x8 motion compensation partitions
    RV34_MB_B_FORWARD,       ///< B-frame macroblock, forward prediction
    RV34_MB_B_BACKWARD,      ///< B-frame macroblock, backward prediction
    RV34_MB_SKIP,            ///< Skipped block
    RV34_MB_B_DIRECT,        ///< Bidirectionally predicted B-frame macroblock, no motion vectors
    RV34_MB_P_16x8,          ///< P-frame macroblock, 16x8 motion compensation partitions
    RV34_MB_P_8x16,          ///< P-frame macroblock, 8x16 motion compensation partitions
    RV34_MB_B_BIDIR,         ///< Bidirectionally predicted B-frame macroblock, two motion vectors
    RV34_MB_P_MIX16x16,      ///< P-frame macroblock with DCs in a separate 4x4 block, one motion vector
    RV34_MB_TYPES
};

/**
 * VLC tables used by the decoder
 *
 * Intra frame VLC sets do not contain some of those tables.
 */
typedef struct RV34VLC{
    VLC cbppattern[2];     ///< VLCs used for pattern of coded block patterns decoding
    VLC cbp[2][4];         ///< VLCs used for coded block patterns decoding
    VLC first_pattern[4];  ///< VLCs used for decoding coefficients in the first subblock
    VLC second_pattern[2]; ///< VLCs used for decoding coefficients in the subblocks 2 and 3
    VLC third_pattern[2];  ///< VLCs used for decoding coefficients in the last subblock
    VLC coefficient;       ///< VLCs used for decoding big coefficients
}RV34VLC;

/** essential slice information */
typedef struct SliceInfo{
    int type;              ///< slice type (intra, inter)
    int quant;             ///< quantizer used for this slice
    int vlc_set;           ///< VLCs used for this slice
    int start, end;        ///< start and end macroblocks of the slice
    int width;             ///< coded width
    int height;            ///< coded height
    int pts;               ///< frame timestamp
}SliceInfo;

/** decoder context */
typedef struct RV34DecContext{
    MpegEncContext s;
    RV34DSPContext rdsp;
    int8_t *intra_types_hist;///< old block types, used for prediction
    int8_t *intra_types;     ///< block types
    int    intra_types_stride;///< block types array stride
    const uint8_t *luma_dc_quant_i;///< luma subblock DC quantizer for intraframes
    const uint8_t *luma_dc_quant_p;///< luma subblock DC quantizer for interframes

    RV34VLC *cur_vlcs;       ///< VLC set used for current frame decoding
    int bits;                ///< slice size in bits
    H264PredContext h;       ///< functions for 4x4 and 16x16 intra block prediction
    SliceInfo si;            ///< current slice information

    int *mb_type;            ///< internal macroblock types
    int block_type;          ///< current block type
    int luma_vlc;            ///< which VLC set will be used for decoding of luma blocks
    int chroma_vlc;          ///< which VLC set will be used for decoding of chroma blocks
    int is16;                ///< current block has additional 16x16 specific features or not
    int dmv[4][2];           ///< differential motion vectors for the current macroblock

    int rv30;                ///< indicates which RV variasnt is currently decoded
    int rpr;                 ///< one field size in RV30 slice header

    int cur_pts, last_pts, next_pts;
    int weight1, weight2;    ///< B frame distance fractions (0.14) used in motion compensation

    uint16_t *cbp_luma;      ///< CBP values for luma subblocks
    uint8_t  *cbp_chroma;    ///< CBP values for chroma subblocks
    int      *deblock_coefs; ///< deblock coefficients for each macroblock

    /** 8x8 block available flags (for MV prediction) */
    DECLARE_ALIGNED(8, uint32_t, avail_cache)[3*4];

    int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si);
    int (*decode_mb_info)(struct RV34DecContext *r);
    int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst);
    void (*loop_filter)(struct RV34DecContext *r, int row);
}RV34DecContext;

/**
 * common decoding functions
 */
int ff_rv34_get_start_offset(GetBitContext *gb, int blocks);
int ff_rv34_decode_init(AVCodecContext *avctx);
int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt);
int ff_rv34_decode_end(AVCodecContext *avctx);

#endif /* AVCODEC_RV34_H */