Go to the documentation of this file. 1 /*
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3 * Copyright (C) 2006 Robert Edele <yartrebo@earthlink.net>
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 #ifndef AVCODEC_SNOW_H
23 #define AVCODEC_SNOW_H
24
26
30
33
36
37 #define SNOW_MAX_PLANES 4
38
40
43 #define QROOT (1<<QSHIFT)
44 #define LOSSLESS_QLOG -128
46 #define MAX_REF_FRAMES 8
47
48 #define LOG2_OBMC_MAX 8
49 #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
51 int16_t
mx;
///< Motion vector component X, see mv_scale
52 int16_t
my;
///< Motion vector component Y, see mv_scale
53 uint8_t
ref;
///< Reference frame index
54 uint8_t
color[3];
///< Color for intra
55 uint8_t
type;
///< Bitfield of BLOCK_*
56 //#define TYPE_SPLIT 1
57 #define BLOCK_INTRA 1 ///< Intra block, inter otherwise
58 #define BLOCK_OPT 2
///< Block needs no checks in this round of iterative motion estiation
59 //#define TYPE_NOCOLOR 4
60 uint8_t
level;
//FIXME merge into type?
62
64 .
color= {128,128,128},
65 .mx= 0,
66 .my= 0,
67 .ref= 0,
68 .type= 0,
69 .level= 0,
70 };
71
72 #define LOG2_MB_SIZE 4
73 #define MB_SIZE (1<<LOG2_MB_SIZE)
74 #define ENCODER_EXTRA_BITS 4
76
81
87 int qlog;
///< log(qscale)/log[2^(1/6)]
95 uint8_t
state[
/*7*2*/ 7 + 512][32];
97
102
107
112
119 union {
120 /// everything except size 2 are from H.264
123 };
129 // uint8_t q_context[16];
160 #define QBIAS_SHIFT 3
169
172
177
178 /* Tables */
182
183 /* common code */
184
193 int plane_index,
int w,
int h);
194 /* common inline functions */
195 //XXX doublecheck all of them should stay inlined
196
199 if(
s->ref_frames == 1){
202 }else{
210 }
211 }
212
215 return !((
a->color[0] -
b->color[0]) | (
a->color[1] -
b->color[1]) | (
a->color[2] -
b->color[2]));
216 }else{
217 return !((
a->mx -
b->mx) | (
a->my -
b->my) | (
a->ref -
b->ref) | ((
a->type ^
b->type)&
BLOCK_INTRA));
218 }
219 }
220
221 //FIXME name cleanup (b_w, block_w, b_width stuff)
222 //XXX should we really inline it?
223 static av_always_inline void add_yblock(
SnowContext *
s,
int sliced, slice_buffer *sb,
IDWTELEM *
dst, uint8_t *dst8,
const uint8_t *obmc,
int src_x,
int src_y,
int b_w,
int b_h,
int w,
int h,
int dst_stride,
int src_stride,
int obmc_stride,
int b_x,
int b_y,
int add,
int offset_dst,
int plane_index){
224 const int b_width =
s->b_width <<
s->block_max_depth;
225 const int b_height=
s->b_height <<
s->block_max_depth;
226 const int b_stride= b_width;
232 // When src_stride is large enough, it is possible to interleave the blocks.
233 // Otherwise the blocks are written sequentially in the tmp buffer.
235 uint8_t *
tmp =
s->scratchbuf;
236 uint8_t *ptmp;
237 int x,y;
238
239 if(b_x<0){
240 lt= rt;
241 lb= rb;
242 }else if(b_x + 1 >= b_width){
243 rt= lt;
244 rb= lb;
245 }
246 if(b_y<0){
247 lt= lb;
248 rt= rb;
249 }else if(b_y + 1 >= b_height){
250 lb= lt;
251 rb= rt;
252 }
253
254 if(src_x<0){ //FIXME merge with prev & always round internal width up to *16
255 obmc -= src_x;
256 b_w += src_x;
257 if(!sliced && !offset_dst)
259 src_x=0;
260 }
263 }
264 if(src_y<0){
265 obmc -= src_y*obmc_stride;
266 b_h += src_y;
267 if(!sliced && !offset_dst)
268 dst -= src_y*dst_stride;
269 src_y=0;
270 }
273 }
274
275 if(b_w<=0 || b_h<=0) return;
276
277 if(!sliced && offset_dst)
278 dst += src_x + src_y*dst_stride;
279 if (sliced || add)
280 dst8+= src_x + src_y*src_stride;
281 // src += src_x + src_y*src_stride;
282
283 ptmp=
tmp + 3*tmp_step;
285 ptmp+=tmp_step;
286 ff_snow_pred_block(
s,
block[0],
tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index,
w,
h);
287
290 }else{
292 ptmp+=tmp_step;
293 ff_snow_pred_block(
s,
block[1],
tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index,
w,
h);
294 }
295
300 }else{
302 ptmp+=tmp_step;
303 ff_snow_pred_block(
s,
block[2],
tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index,
w,
h);
304 }
305
312 }else{
314 ff_snow_pred_block(
s,
block[3],
tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index,
w,
h);
315 }
316 if(sliced){
317 s->dwt.inner_add_yblock(obmc, obmc_stride,
block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8);
318 }else{
319 for(y=0; y<b_h; y++){
320 //FIXME ugly misuse of obmc_stride
321 const uint8_t *obmc1= obmc + y*obmc_stride;
322 const uint8_t *obmc2= obmc1+ (obmc_stride>>1);
323 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
324 const uint8_t *
obmc4= obmc3+ (obmc_stride>>1);
325 for(x=0; x<b_w; x++){
326 int v= obmc1[x] *
block[3][x + y*src_stride]
327 +obmc2[x] *
block[2][x + y*src_stride]
328 +obmc3[x] *
block[1][x + y*src_stride]
330
334 }
335 if(add){
336 v +=
dst[x + y*dst_stride];
338 if(v&(~255)) v= ~(v>>31);
339 dst8[x + y*src_stride] = v;
340 }else{
341 dst[x + y*dst_stride] -= v;
342 }
343 }
344 }
345 }
346 }
347
349 Plane *
p= &
s->plane[plane_index];
350 const int mb_w=
s->b_width <<
s->block_max_depth;
351 const int mb_h=
s->b_height <<
s->block_max_depth;
352 int x, y, mb_x;
353 int block_size =
MB_SIZE >>
s->block_max_depth;
354 int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
355 int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
357 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
358 int ref_stride=
s->current_picture->linesize[plane_index];
359 uint8_t *dst8=
s->current_picture->data[plane_index];
362 av_assert2(
s->chroma_h_shift ==
s->chroma_v_shift);
// obmc params assume squares
363 if(
s->keyframe || (
s->avctx->debug&512)){
364 if(mb_y==mb_h)
365 return;
366
367 if(add){
368 for(y=block_h*mb_y; y<
FFMIN(
h,block_h*(mb_y+1)); y++){
372 if(v&(~255)) v= ~(v>>31);
373 dst8[x + y*ref_stride]= v;
374 }
375 }
376 }else{
377 for(y=block_h*mb_y; y<
FFMIN(
h,block_h*(mb_y+1)); y++){
380 }
381 }
382 }
383
384 return;
385 }
386
387 for(mb_x=0; mb_x<=mb_w; mb_x++){
389 block_w*mb_x - block_w/2,
390 block_h*mb_y - block_h/2,
391 block_w, block_h,
393 w, ref_stride, obmc_stride,
394 mb_x - 1, mb_y - 1,
395 add, 1, plane_index);
396 }
397 }
398
400 const int mb_h=
s->b_height <<
s->block_max_depth;
401 int mb_y;
402 for(mb_y=0; mb_y<=mb_h; mb_y++)
404 }
405
406 static inline void set_blocks(
SnowContext *
s,
int level,
int x,
int y,
int l,
int cb,
int cr,
int mx,
int my,
int ref,
int type){
407 const int w=
s->b_width <<
s->block_max_depth;
408 const int rem_depth=
s->block_max_depth -
level;
409 const int index= (x + y*
w) << rem_depth;
410 const int block_w= 1<<rem_depth;
411 const int block_h= 1<<rem_depth; //FIXME "w!=h"
414
423
424 for(j=0; j<block_h; j++){
425 for(
i=0;
i<block_w;
i++){
427 }
428 }
429 }
430
432
433 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
434
435 #endif /* AVCODEC_SNOW_H */
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left