rv30.c
Go to the documentation of this file.
1 /*
2  * RV30 decoder
3  * Copyright (c) 2007 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 decoder
25  */
26 
27 #include "avcodec.h"
28 #include "mpegvideo.h"
29 #include "golomb.h"
30 
31 #include "rv34.h"
32 #include "rv30data.h"
33 
34 
36 {
37  int mb_bits;
38  int w = r->s.width, h = r->s.height;
39  int mb_size;
40  int rpr;
41 
42  memset(si, 0, sizeof(SliceInfo));
43  if(get_bits(gb, 3))
44  return -1;
45  si->type = get_bits(gb, 2);
46  if(si->type == 1) si->type = 0;
47  if(get_bits1(gb))
48  return -1;
49  si->quant = get_bits(gb, 5);
50  skip_bits1(gb);
51  si->pts = get_bits(gb, 13);
52  rpr = get_bits(gb, r->rpr);
53  if (r->s.avctx->extradata_size < 8 + rpr*2) {
55  "Extradata does not contain selected resolution\n");
56  rpr = 0;
57  }
58  if(rpr){
59  w = r->s.avctx->extradata[6 + rpr*2] << 2;
60  h = r->s.avctx->extradata[7 + rpr*2] << 2;
61  }
62  si->width = w;
63  si->height = h;
64  mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
65  mb_bits = ff_rv34_get_start_offset(gb, mb_size);
66  si->start = get_bits(gb, mb_bits);
67  skip_bits1(gb);
68  return 0;
69 }
70 
71 /**
72  * Decode 4x4 intra types array.
73  */
75 {
76  int i, j, k;
77 
78  for(i = 0; i < 4; i++, dst += r->intra_types_stride - 4){
79  for(j = 0; j < 4; j+= 2){
80  unsigned code = svq3_get_ue_golomb(gb) << 1;
81  if (code > 80U*2U) {
82  av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");
83  return -1;
84  }
85  for(k = 0; k < 2; k++){
86  int A = dst[-r->intra_types_stride] + 1;
87  int B = dst[-1] + 1;
88  *dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]];
89  if(dst[-1] == 9){
90  av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");
91  return -1;
92  }
93  }
94  }
95  }
96  return 0;
97 }
98 
99 /**
100  * Decode macroblock information.
101  */
103 {
104  static const int rv30_p_types[6] = { RV34_MB_SKIP, RV34_MB_P_16x16, RV34_MB_P_8x8, -1, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 };
105  static const int rv30_b_types[6] = { RV34_MB_SKIP, RV34_MB_B_DIRECT, RV34_MB_B_FORWARD, RV34_MB_B_BACKWARD, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 };
106  MpegEncContext *s = &r->s;
107  GetBitContext *gb = &s->gb;
108  unsigned code = svq3_get_ue_golomb(gb);
109 
110  if (code > 11) {
111  av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
112  return -1;
113  }
114  if(code > 5){
115  av_log(s->avctx, AV_LOG_ERROR, "dquant needed\n");
116  code -= 6;
117  }
118  if(s->pict_type != AV_PICTURE_TYPE_B)
119  return rv30_p_types[code];
120  else
121  return rv30_b_types[code];
122 }
123 
124 static inline void rv30_weak_loop_filter(uint8_t *src, const int step,
125  const int stride, const int lim)
126 {
127  const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
128  int i, diff;
129 
130  for(i = 0; i < 4; i++){
131  diff = ((src[-2*step] - src[1*step]) - (src[-1*step] - src[0*step])*4) >> 3;
132  diff = av_clip(diff, -lim, lim);
133  src[-1*step] = cm[src[-1*step] + diff];
134  src[ 0*step] = cm[src[ 0*step] - diff];
135  src += stride;
136  }
137 }
138 
139 static void rv30_loop_filter(RV34DecContext *r, int row)
140 {
141  MpegEncContext *s = &r->s;
142  int mb_pos, mb_x;
143  int i, j, k;
144  uint8_t *Y, *C;
145  int loc_lim, cur_lim, left_lim = 0, top_lim = 0;
146 
147  mb_pos = row * s->mb_stride;
148  for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
149  int mbtype = s->current_picture_ptr->mb_type[mb_pos];
150  if(IS_INTRA(mbtype) || IS_SEPARATE_DC(mbtype))
151  r->deblock_coefs[mb_pos] = 0xFFFF;
152  if(IS_INTRA(mbtype))
153  r->cbp_chroma[mb_pos] = 0xFF;
154  }
155 
156  /* all vertical edges are filtered first
157  * and horizontal edges are filtered on the next iteration
158  */
159  mb_pos = row * s->mb_stride;
160  for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
161  cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
162  if(mb_x)
163  left_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - 1]];
164  for(j = 0; j < 16; j += 4){
165  Y = s->current_picture_ptr->f.data[0] + mb_x*16 + (row*16 + j) * s->linesize + 4 * !mb_x;
166  for(i = !mb_x; i < 4; i++, Y += 4){
167  int ij = i + j;
168  loc_lim = 0;
169  if(r->deblock_coefs[mb_pos] & (1 << ij))
170  loc_lim = cur_lim;
171  else if(!i && r->deblock_coefs[mb_pos - 1] & (1 << (ij + 3)))
172  loc_lim = left_lim;
173  else if( i && r->deblock_coefs[mb_pos] & (1 << (ij - 1)))
174  loc_lim = cur_lim;
175  if(loc_lim)
176  rv30_weak_loop_filter(Y, 1, s->linesize, loc_lim);
177  }
178  }
179  for(k = 0; k < 2; k++){
180  int cur_cbp, left_cbp = 0;
181  cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
182  if(mb_x)
183  left_cbp = (r->cbp_chroma[mb_pos - 1] >> (k*4)) & 0xF;
184  for(j = 0; j < 8; j += 4){
185  C = s->current_picture_ptr->f.data[k + 1] + mb_x*8 + (row*8 + j) * s->uvlinesize + 4 * !mb_x;
186  for(i = !mb_x; i < 2; i++, C += 4){
187  int ij = i + (j >> 1);
188  loc_lim = 0;
189  if (cur_cbp & (1 << ij))
190  loc_lim = cur_lim;
191  else if(!i && left_cbp & (1 << (ij + 1)))
192  loc_lim = left_lim;
193  else if( i && cur_cbp & (1 << (ij - 1)))
194  loc_lim = cur_lim;
195  if(loc_lim)
196  rv30_weak_loop_filter(C, 1, s->uvlinesize, loc_lim);
197  }
198  }
199  }
200  }
201  mb_pos = row * s->mb_stride;
202  for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
203  cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
204  if(row)
205  top_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - s->mb_stride]];
206  for(j = 4*!row; j < 16; j += 4){
207  Y = s->current_picture_ptr->f.data[0] + mb_x*16 + (row*16 + j) * s->linesize;
208  for(i = 0; i < 4; i++, Y += 4){
209  int ij = i + j;
210  loc_lim = 0;
211  if(r->deblock_coefs[mb_pos] & (1 << ij))
212  loc_lim = cur_lim;
213  else if(!j && r->deblock_coefs[mb_pos - s->mb_stride] & (1 << (ij + 12)))
214  loc_lim = top_lim;
215  else if( j && r->deblock_coefs[mb_pos] & (1 << (ij - 4)))
216  loc_lim = cur_lim;
217  if(loc_lim)
218  rv30_weak_loop_filter(Y, s->linesize, 1, loc_lim);
219  }
220  }
221  for(k = 0; k < 2; k++){
222  int cur_cbp, top_cbp = 0;
223  cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
224  if(row)
225  top_cbp = (r->cbp_chroma[mb_pos - s->mb_stride] >> (k*4)) & 0xF;
226  for(j = 4*!row; j < 8; j += 4){
227  C = s->current_picture_ptr->f.data[k+1] + mb_x*8 + (row*8 + j) * s->uvlinesize;
228  for(i = 0; i < 2; i++, C += 4){
229  int ij = i + (j >> 1);
230  loc_lim = 0;
231  if (r->cbp_chroma[mb_pos] & (1 << ij))
232  loc_lim = cur_lim;
233  else if(!j && top_cbp & (1 << (ij + 2)))
234  loc_lim = top_lim;
235  else if( j && cur_cbp & (1 << (ij - 2)))
236  loc_lim = cur_lim;
237  if(loc_lim)
238  rv30_weak_loop_filter(C, s->uvlinesize, 1, loc_lim);
239  }
240  }
241  }
242  }
243 }
244 
245 /**
246  * Initialize decoder.
247  */
249 {
250  RV34DecContext *r = avctx->priv_data;
251 
252  r->rv30 = 1;
253  ff_rv34_decode_init(avctx);
254  if(avctx->extradata_size < 2){
255  av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
256  return -1;
257  }
258  r->rpr = (avctx->extradata[1] & 7) >> 1;
259  r->rpr = FFMIN(r->rpr + 1, 3);
260  if(avctx->extradata_size - 8 < (r->rpr - 1) * 2){
261  av_log(avctx, AV_LOG_ERROR, "Insufficient extradata - need at least %d bytes, got %d\n",
262  6 + r->rpr * 2, avctx->extradata_size);
263  }
270  return 0;
271 }
272 
274  .name = "rv30",
275  .type = AVMEDIA_TYPE_VIDEO,
276  .id = AV_CODEC_ID_RV30,
277  .priv_data_size = sizeof(RV34DecContext),
281  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
283  .flush = ff_mpeg_flush,
284  .long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"),
285  .pix_fmts = ff_pixfmt_list_420,
288 };
static const uint8_t rv30_luma_dc_quant[32]
DC quantizer mapping for RV30.
Definition: rv30data.h:33
const char * s
Definition: avisynth_c.h:668
#define ff_cropTbl
#define C
#define B
Definition: dsputil.c:2025
#define IS_SEPARATE_DC(a)
Definition: rv34.h:37
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
B-frame macroblock, forward prediction.
Definition: rv34.h:47
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
MpegEncContext s
Definition: rv34.h:85
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static const uint8_t rv30_loop_filt_lim[32]
Loop filter limits are taken from this table.
Definition: rv30data.h:178
int height
coded height
Definition: rv34.h:79
#define MAX_NEG_CROP
Definition: dsputil.h:47
Bidirectionally predicted B-frame macroblock, no motion vectors.
Definition: rv34.h:50
static unsigned svq3_get_ue_golomb(GetBitContext *gb)
Definition: golomb.h:114
AVCodec ff_rv30_decoder
Definition: rv30.c:273
mpegvideo header.
static av_cold int rv30_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: rv30.c:248
RV30 and RV40 decoder common data declarations.
int start
Definition: rv34.h:77
int stride
Definition: mace.c:144
const uint8_t * luma_dc_quant_p
luma subblock DC quantizer for interframes
Definition: rv34.h:91
static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
Decode 4x4 intra types array.
Definition: rv30.c:74
output residual component w
uint8_t
#define av_cold
Definition: attributes.h:78
#define Y
Definition: vf_boxblur.c:76
int width
coded width
Definition: rv34.h:78
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
uint16_t * deblock_coefs
deblock coefficients for each macroblock
Definition: rv34.h:114
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int rv30_decode_mb_info(RV34DecContext *r)
Decode macroblock information.
Definition: rv30.c:102
Skipped block.
Definition: rv34.h:49
enum AVPixelFormat ff_pixfmt_list_420[]
Definition: mpegvideo.c:127
#define A(x)
#define cm
Definition: dvbsubdec.c:34
#define U(x)
int quant
quantizer used for this slice
Definition: rv34.h:75
static const uint8_t rv30_itype_from_context[900]
This table is used for retrieving the current intra type based on its neighbors and adjustment provid...
Definition: rv30data.h:63
#define CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * r
Definition: vf_curves.c:94
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define IS_INTRA(a)
Definition: mpegvideo.h:138
GetBitContext gb
Definition: mpegvideo.h:649
external API header
void ff_mpeg_flush(AVCodecContext *avctx)
Definition: mpegvideo.c:3066
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
int(* parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
Definition: rv34.h:124
Intra macroblock with DCs in a separate 4x4 block.
Definition: rv34.h:44
#define FFMIN(a, b)
Definition: common.h:58
Picture * current_picture_ptr
pointer to the current picture
Definition: mpegvideo.h:347
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
static const uint8_t rv30_itype_code[9 *9 *2]
This table is used for storing the differences between the predicted and the real intra type...
Definition: rv30data.h:42
static void flush(AVCodecContext *avctx)
int(* decode_mb_info)(struct RV34DecContext *r)
Definition: rv34.h:125
for k
int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx)
Definition: rv34.c:1516
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
AVS_Value src
Definition: avisynth_c.h:523
essential slice information
Definition: rv34.h:73
static void rv30_loop_filter(RV34DecContext *r, int row)
Definition: rv30.c:139
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int height
picture size. must be a multiple of 16
Definition: mpegvideo.h:245
static void rv30_weak_loop_filter(uint8_t *src, const int step, const int stride, const int lim)
Definition: rv30.c:124
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
P-frame macroblock, 8x8 motion compensation partitions.
Definition: rv34.h:46
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:298
synthesis window for stochastic i
av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: rv34.c:1470
int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_picture_ptr, AVPacket *avpkt)
Definition: rv34.c:1610
int intra_types_stride
block types array stride
Definition: rv34.h:89
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:377
int(* decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst)
Definition: rv34.h:126
P-frame macroblock, one motion frame.
Definition: rv34.h:45
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
MpegEncContext.
Definition: mpegvideo.h:241
av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
Definition: rv34.c:1813
int8_t * qscale_table
Definition: mpegvideo.h:102
struct AVCodecContext * avctx
Definition: mpegvideo.h:243
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
Definition: mpegvideo.h:278
#define CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
B-frame macroblock, backward prediction.
Definition: rv34.h:48
int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Definition: rv34.c:1534
Bi-dir predicted.
Definition: avutil.h:218
int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
Decode starting slice position.
Definition: rv34.c:329
decoder context
Definition: rv34.h:84
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
Definition: rv30.c:35
int linesize
line size, in bytes, may be different from width
Definition: mpegvideo.h:283
const uint8_t * luma_dc_quant_i
luma subblock DC quantizer for intraframes
Definition: rv34.h:90
struct AVFrame f
Definition: mpegvideo.h:98
int rpr
one field size in RV30 slice header
Definition: rv34.h:105
uint32_t * mb_type
Definition: mpegvideo.h:108
int type
slice type (intra, inter)
Definition: rv34.h:74
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
miscellaneous RV30 tables
int rv30
indicates which RV variasnt is currently decoded
Definition: rv34.h:104
exp golomb vlc stuff
int uvlinesize
line size, for chroma in bytes, may be different from width
Definition: mpegvideo.h:284
Intra macroblock.
Definition: rv34.h:43
void(* loop_filter)(struct RV34DecContext *r, int row)
Definition: rv34.h:127
struct RV34DecContext RV34DecContext
decoder context
int pts
frame timestamp
Definition: rv34.h:80
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
uint8_t * cbp_chroma
CBP values for chroma subblocks.
Definition: rv34.h:113