Mercurial > libavcodec.hg
annotate rv34.h @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 34a65026fa06 |
children | 98970e51365a |
rev | line source |
---|---|
6026 | 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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8242
diff
changeset
|
23 * @file libavcodec/rv34.h |
6026 | 24 * RV30 and RV40 decoder common data declarations |
25 */ | |
26 | |
7760 | 27 #ifndef AVCODEC_RV34_H |
28 #define AVCODEC_RV34_H | |
6026 | 29 |
30 #include "avcodec.h" | |
31 #include "dsputil.h" | |
32 #include "mpegvideo.h" | |
33 | |
34 #include "h264pred.h" | |
35 | |
7999
582e4aae5d16
Register RV-[34] block specific feature for long future loop filter
kostya
parents:
7760
diff
changeset
|
36 #define MB_TYPE_SEPARATE_DC 0x01000000 |
582e4aae5d16
Register RV-[34] block specific feature for long future loop filter
kostya
parents:
7760
diff
changeset
|
37 #define IS_SEPARATE_DC(a) ((a) & MB_TYPE_SEPARATE_DC) |
582e4aae5d16
Register RV-[34] block specific feature for long future loop filter
kostya
parents:
7760
diff
changeset
|
38 |
6026 | 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 | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6326
diff
changeset
|
80 int pts; ///< frame timestamp |
6026 | 81 }SliceInfo; |
82 | |
83 /** decoder context */ | |
84 typedef struct RV34DecContext{ | |
85 MpegEncContext s; | |
86 int8_t *intra_types_hist;///< old block types, used for prediction | |
87 int8_t *intra_types; ///< block types | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9355
diff
changeset
|
88 int intra_types_stride;///< block types array stride |
6326
0e5d68320488
Make luma_dc_quant_i and luma_dc_quant_p const, fixes a couple of
diego
parents:
6155
diff
changeset
|
89 const uint8_t *luma_dc_quant_i;///< luma subblock DC quantizer for intraframes |
0e5d68320488
Make luma_dc_quant_i and luma_dc_quant_p const, fixes a couple of
diego
parents:
6155
diff
changeset
|
90 const uint8_t *luma_dc_quant_p;///< luma subblock DC quantizer for interframes |
6026 | 91 |
92 RV34VLC *cur_vlcs; ///< VLC set used for current frame decoding | |
93 int bits; ///< slice size in bits | |
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 rpr; ///< one field size in RV30 slice header | |
106 | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6326
diff
changeset
|
107 int cur_pts, last_pts, next_pts; |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6326
diff
changeset
|
108 |
6155
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6026
diff
changeset
|
109 uint16_t *cbp_luma; ///< CBP values for luma subblocks |
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6026
diff
changeset
|
110 uint8_t *cbp_chroma; ///< CBP values for chroma subblocks |
8037
b6d93bef844a
RV3 and RV4 decoders set some deblocking coefs for each macroblock,
kostya
parents:
7999
diff
changeset
|
111 int *deblock_coefs; ///< deblock coefficients for each macroblock |
6155
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6026
diff
changeset
|
112 |
6026 | 113 /** 8x8 block available flags (for MV prediction) */ |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
9903
diff
changeset
|
114 DECLARE_ALIGNED_8(uint32_t, avail_cache)[3*4]; |
6026 | 115 |
116 int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si); | |
117 int (*decode_mb_info)(struct RV34DecContext *r); | |
118 int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst); | |
8224
6771b3544991
Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents:
8116
diff
changeset
|
119 void (*loop_filter)(struct RV34DecContext *r, int row); |
6026 | 120 }RV34DecContext; |
121 | |
122 /** | |
123 * common decoding functions | |
124 */ | |
125 int ff_rv34_get_start_offset(GetBitContext *gb, int blocks); | |
126 int ff_rv34_decode_init(AVCodecContext *avctx); | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
127 int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt); |
6026 | 128 int ff_rv34_decode_end(AVCodecContext *avctx); |
129 | |
7760 | 130 #endif /* AVCODEC_RV34_H */ |