snowdec.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/intmath.h"
22 #include "libavutil/log.h"
23 #include "libavutil/opt.h"
24 #include "avcodec.h"
25 #include "dsputil.h"
26 #include "snow_dwt.h"
27 #include "internal.h"
28 #include "snow.h"
29 
30 #include "rangecoder.h"
31 #include "mathops.h"
32 
33 #include "mpegvideo.h"
34 #include "h263.h"
35 
36 #undef NDEBUG
37 #include <assert.h>
38 
39 static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, IDWTELEM * old_buffer, int plane_index, int add, int mb_y){
40  Plane *p= &s->plane[plane_index];
41  const int mb_w= s->b_width << s->block_max_depth;
42  const int mb_h= s->b_height << s->block_max_depth;
43  int x, y, mb_x;
44  int block_size = MB_SIZE >> s->block_max_depth;
45  int block_w = plane_index ? block_size>>s->chroma_h_shift : block_size;
46  int block_h = plane_index ? block_size>>s->chroma_v_shift : block_size;
47  const uint8_t *obmc = plane_index ? ff_obmc_tab[s->block_max_depth+s->chroma_h_shift] : ff_obmc_tab[s->block_max_depth];
48  int obmc_stride= plane_index ? (2*block_size)>>s->chroma_h_shift : 2*block_size;
49  int ref_stride= s->current_picture.linesize[plane_index];
50  uint8_t *dst8= s->current_picture.data[plane_index];
51  int w= p->width;
52  int h= p->height;
53 
54  if(s->keyframe || (s->avctx->debug&512)){
55  if(mb_y==mb_h)
56  return;
57 
58  if(add){
59  for(y=block_h*mb_y; y<FFMIN(h,block_h*(mb_y+1)); y++){
60 // DWTELEM * line = slice_buffer_get_line(sb, y);
61  IDWTELEM * line = sb->line[y];
62  for(x=0; x<w; x++){
63 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
64  int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
65  v >>= FRAC_BITS;
66  if(v&(~255)) v= ~(v>>31);
67  dst8[x + y*ref_stride]= v;
68  }
69  }
70  }else{
71  for(y=block_h*mb_y; y<FFMIN(h,block_h*(mb_y+1)); y++){
72 // DWTELEM * line = slice_buffer_get_line(sb, y);
73  IDWTELEM * line = sb->line[y];
74  for(x=0; x<w; x++){
75  line[x] -= 128 << FRAC_BITS;
76 // buf[x + y*w]-= 128<<FRAC_BITS;
77  }
78  }
79  }
80 
81  return;
82  }
83 
84  for(mb_x=0; mb_x<=mb_w; mb_x++){
85  add_yblock(s, 1, sb, old_buffer, dst8, obmc,
86  block_w*mb_x - block_w/2,
87  block_h*mb_y - block_h/2,
88  block_w, block_h,
89  w, h,
90  w, ref_stride, obmc_stride,
91  mb_x - 1, mb_y - 1,
92  add, 0, plane_index);
93  }
94 }
95 
96 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
97  const int w= b->width;
98  int y;
99  const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16);
100  int qmul= ff_qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
101  int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
102  int new_index = 0;
103 
104  if(b->ibuf == s->spatial_idwt_buffer || s->qlog == LOSSLESS_QLOG){
105  qadd= 0;
106  qmul= 1<<QEXPSHIFT;
107  }
108 
109  /* If we are on the second or later slice, restore our index. */
110  if (start_y != 0)
111  new_index = save_state[0];
112 
113 
114  for(y=start_y; y<h; y++){
115  int x = 0;
116  int v;
118  memset(line, 0, b->width*sizeof(IDWTELEM));
119  v = b->x_coeff[new_index].coeff;
120  x = b->x_coeff[new_index++].x;
121  while(x < w){
122  register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
123  register int u= -(v&1);
124  line[x] = (t^u) - u;
125 
126  v = b->x_coeff[new_index].coeff;
127  x = b->x_coeff[new_index++].x;
128  }
129  }
130 
131  /* Save our variables for the next slice. */
132  save_state[0] = new_index;
133 
134  return;
135 }
136 
137 static int decode_q_branch(SnowContext *s, int level, int x, int y){
138  const int w= s->b_width << s->block_max_depth;
139  const int rem_depth= s->block_max_depth - level;
140  const int index= (x + y*w) << rem_depth;
141  int trx= (x+1)<<rem_depth;
142  const BlockNode *left = x ? &s->block[index-1] : &null_block;
143  const BlockNode *top = y ? &s->block[index-w] : &null_block;
144  const BlockNode *tl = y && x ? &s->block[index-w-1] : left;
145  const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
146  int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
147  int res;
148 
149  if(s->keyframe){
151  return 0;
152  }
153 
154  if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
155  int type, mx, my;
156  int l = left->color[0];
157  int cb= left->color[1];
158  int cr= left->color[2];
159  int ref = 0;
160  int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
161  int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx));
162  int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my));
163 
164  type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
165 
166  if(type){
167  pred_mv(s, &mx, &my, 0, left, top, tr);
168  l += get_symbol(&s->c, &s->block_state[32], 1);
169  cb+= get_symbol(&s->c, &s->block_state[64], 1);
170  cr+= get_symbol(&s->c, &s->block_state[96], 1);
171  }else{
172  if(s->ref_frames > 1)
173  ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0);
174  if (ref >= s->ref_frames) {
175  av_log(s->avctx, AV_LOG_ERROR, "Invalid ref\n");
176  return AVERROR_INVALIDDATA;
177  }
178  pred_mv(s, &mx, &my, ref, left, top, tr);
179  mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1);
180  my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1);
181  }
182  set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type);
183  }else{
184  if ((res = decode_q_branch(s, level+1, 2*x+0, 2*y+0)) < 0 ||
185  (res = decode_q_branch(s, level+1, 2*x+1, 2*y+0)) < 0 ||
186  (res = decode_q_branch(s, level+1, 2*x+0, 2*y+1)) < 0 ||
187  (res = decode_q_branch(s, level+1, 2*x+1, 2*y+1)) < 0)
188  return res;
189  }
190  return 0;
191 }
192 
193 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int start_y, int end_y){
194  const int w= b->width;
195  const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16);
196  const int qmul= ff_qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
197  const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
198  int x,y;
199 
200  if(s->qlog == LOSSLESS_QLOG) return;
201 
202  for(y=start_y; y<end_y; y++){
203 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
205  for(x=0; x<w; x++){
206  int i= line[x];
207  if(i<0){
208  line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
209  }else if(i>0){
210  line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
211  }
212  }
213  }
214 }
215 
216 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
217  const int w= b->width;
218  int x,y;
219 
220  IDWTELEM * line=0; // silence silly "could be used without having been initialized" warning
221  IDWTELEM * prev;
222 
223  if (start_y != 0)
224  line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
225 
226  for(y=start_y; y<end_y; y++){
227  prev = line;
228 // line = slice_buffer_get_line_from_address(sb, src + (y * stride));
229  line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
230  for(x=0; x<w; x++){
231  if(x){
232  if(use_median){
233  if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
234  else line[x] += line[x - 1];
235  }else{
236  if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
237  else line[x] += line[x - 1];
238  }
239  }else{
240  if(y) line[x] += prev[x];
241  }
242  }
243  }
244 }
245 
246 static void decode_qlogs(SnowContext *s){
247  int plane_index, level, orientation;
248 
249  for(plane_index=0; plane_index<3; plane_index++){
250  for(level=0; level<s->spatial_decomposition_count; level++){
251  for(orientation=level ? 1:0; orientation<4; orientation++){
252  int q;
253  if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
254  else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
255  else q= get_symbol(&s->c, s->header_state, 1);
256  s->plane[plane_index].band[level][orientation].qlog= q;
257  }
258  }
259  }
260 }
261 
262 #define GET_S(dst, check) \
263  tmp= get_symbol(&s->c, s->header_state, 0);\
264  if(!(check)){\
265  av_log(s->avctx, AV_LOG_ERROR, "Error " #dst " is %d\n", tmp);\
266  return -1;\
267  }\
268  dst= tmp;
269 
271  int plane_index, tmp;
272  uint8_t kstate[32];
273 
274  memset(kstate, MID_STATE, sizeof(kstate));
275 
276  s->keyframe= get_rac(&s->c, kstate);
277  if(s->keyframe || s->always_reset){
280  s->qlog=
281  s->qbias=
282  s->mv_scale=
283  s->block_max_depth= 0;
284  }
285  if(s->keyframe){
286  GET_S(s->version, tmp <= 0U)
287  s->always_reset= get_rac(&s->c, s->header_state);
291  s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
292  s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
293  s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
294 
295  if(s->chroma_h_shift == 1 && s->chroma_v_shift==1){
297  }else if(s->chroma_h_shift == 0 && s->chroma_v_shift==0){
299  }else if(s->chroma_h_shift == 2 && s->chroma_v_shift==2){
301  } else {
302  av_log(s, AV_LOG_ERROR, "unsupported color subsample mode %d %d\n", s->chroma_h_shift, s->chroma_v_shift);
303  s->chroma_h_shift = s->chroma_v_shift = 1;
305  return AVERROR_INVALIDDATA;
306  }
307 
309 // s->rate_scalability= get_rac(&s->c, s->header_state);
310  GET_S(s->max_ref_frames, tmp < (unsigned)MAX_REF_FRAMES)
311  s->max_ref_frames++;
312 
313  decode_qlogs(s);
314  }
315 
316  if(!s->keyframe){
317  if(get_rac(&s->c, s->header_state)){
318  for(plane_index=0; plane_index<2; plane_index++){
319  int htaps, i, sum=0;
320  Plane *p= &s->plane[plane_index];
321  p->diag_mc= get_rac(&s->c, s->header_state);
322  htaps= get_symbol(&s->c, s->header_state, 0)*2 + 2;
323  if((unsigned)htaps > HTAPS_MAX || htaps==0)
324  return -1;
325  p->htaps= htaps;
326  for(i= htaps/2; i; i--){
327  p->hcoeff[i]= get_symbol(&s->c, s->header_state, 0) * (1-2*(i&1));
328  sum += p->hcoeff[i];
329  }
330  p->hcoeff[0]= 32-sum;
331  }
332  s->plane[2].diag_mc= s->plane[1].diag_mc;
333  s->plane[2].htaps = s->plane[1].htaps;
334  memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff));
335  }
336  if(get_rac(&s->c, s->header_state)){
338  decode_qlogs(s);
339  }
340  }
341 
343  if(s->spatial_decomposition_type > 1U){
344  av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported\n", s->spatial_decomposition_type);
345  return -1;
346  }
347  if(FFMIN(s->avctx-> width>>s->chroma_h_shift,
348  s->avctx->height>>s->chroma_v_shift) >> (s->spatial_decomposition_count-1) <= 1){
349  av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_count %d too large for size\n", s->spatial_decomposition_count);
350  return -1;
351  }
352 
353 
354  s->qlog += get_symbol(&s->c, s->header_state, 1);
355  s->mv_scale += get_symbol(&s->c, s->header_state, 1);
356  s->qbias += get_symbol(&s->c, s->header_state, 1);
357  s->block_max_depth+= get_symbol(&s->c, s->header_state, 1);
358  if(s->block_max_depth > 1 || s->block_max_depth < 0){
359  av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large\n", s->block_max_depth);
360  s->block_max_depth= 0;
361  return -1;
362  }
363 
364  return 0;
365 }
366 
368 {
369  int ret;
370 
371  if ((ret = ff_snow_common_init(avctx)) < 0) {
373  return ret;
374  }
375 
376  return 0;
377 }
378 
380  int x, y;
381  int w= s->b_width;
382  int h= s->b_height;
383  int res;
384 
385  for(y=0; y<h; y++){
386  for(x=0; x<w; x++){
387  if ((res = decode_q_branch(s, 0, x, y)) < 0)
388  return res;
389  }
390  }
391  return 0;
392 }
393 
394 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
395  AVPacket *avpkt)
396 {
397  const uint8_t *buf = avpkt->data;
398  int buf_size = avpkt->size;
399  SnowContext *s = avctx->priv_data;
400  RangeCoder * const c= &s->c;
401  int bytes_read;
402  AVFrame *picture = data;
403  int level, orientation, plane_index;
404  int res;
405 
406  ff_init_range_decoder(c, buf, buf_size);
407  ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
408 
409  s->current_picture.pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
410  if(decode_header(s)<0)
411  return -1;
412  if ((res=ff_snow_common_init_after_header(avctx)) < 0)
413  return res;
414 
415  // realloc slice buffer for the case that spatial_decomposition_count changed
417  if ((res = ff_slice_buffer_init(&s->sb, s->plane[0].height,
418  (MB_SIZE >> s->block_max_depth) +
419  s->spatial_decomposition_count * 11 + 1,
420  s->plane[0].width,
421  s->spatial_idwt_buffer)) < 0)
422  return res;
423 
424  for(plane_index=0; plane_index<3; plane_index++){
425  Plane *p= &s->plane[plane_index];
426  p->fast_mc= p->diag_mc && p->htaps==6 && p->hcoeff[0]==40
427  && p->hcoeff[1]==-10
428  && p->hcoeff[2]==2;
429  }
430 
432 
433  if(ff_snow_frame_start(s) < 0)
434  return -1;
435  //keyframe flag duplication mess FIXME
436  if(avctx->debug&FF_DEBUG_PICT_INFO)
437  av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
438 
439  if ((res = decode_blocks(s)) < 0)
440  return res;
441 
442  for(plane_index=0; plane_index<3; plane_index++){
443  Plane *p= &s->plane[plane_index];
444  int w= p->width;
445  int h= p->height;
446  int x, y;
447  int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
448 
449  if(s->avctx->debug&2048){
450  memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
451  predict_plane(s, s->spatial_idwt_buffer, plane_index, 1);
452 
453  for(y=0; y<h; y++){
454  for(x=0; x<w; x++){
455  int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
456  s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
457  }
458  }
459  }
460 
461  {
462  for(level=0; level<s->spatial_decomposition_count; level++){
463  for(orientation=level ? 1 : 0; orientation<4; orientation++){
464  SubBand *b= &p->band[level][orientation];
465  unpack_coeffs(s, b, b->parent, orientation);
466  }
467  }
468  }
469 
470  {
471  const int mb_h= s->b_height << s->block_max_depth;
472  const int block_size = MB_SIZE >> s->block_max_depth;
473  const int block_h = plane_index ? block_size>>s->chroma_v_shift : block_size;
474  int mb_y;
476  int yd=0, yq=0;
477  int y;
478  int end_y;
479 
481  for(mb_y=0; mb_y<=mb_h; mb_y++){
482 
483  int slice_starty = block_h*mb_y;
484  int slice_h = block_h*(mb_y+1);
485 
486  if (!(s->keyframe || s->avctx->debug&512)){
487  slice_starty = FFMAX(0, slice_starty - (block_h >> 1));
488  slice_h -= (block_h >> 1);
489  }
490 
491  for(level=0; level<s->spatial_decomposition_count; level++){
492  for(orientation=level ? 1 : 0; orientation<4; orientation++){
493  SubBand *b= &p->band[level][orientation];
494  int start_y;
495  int end_y;
496  int our_mb_start = mb_y;
497  int our_mb_end = (mb_y + 1);
498  const int extra= 3;
499  start_y = (mb_y ? ((block_h * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra: 0);
500  end_y = (((block_h * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra);
501  if (!(s->keyframe || s->avctx->debug&512)){
502  start_y = FFMAX(0, start_y - (block_h >> (1+s->spatial_decomposition_count - level)));
503  end_y = FFMAX(0, end_y - (block_h >> (1+s->spatial_decomposition_count - level)));
504  }
505  start_y = FFMIN(b->height, start_y);
506  end_y = FFMIN(b->height, end_y);
507 
508  if (start_y != end_y){
509  if (orientation == 0){
510  SubBand * correlate_band = &p->band[0][0];
511  int correlate_end_y = FFMIN(b->height, end_y + 1);
512  int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
513  decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
514  correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
515  dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, start_y, end_y);
516  }
517  else
518  decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
519  }
520  }
521  }
522 
523  for(; yd<slice_h; yd+=4){
525  }
526 
527  if(s->qlog == LOSSLESS_QLOG){
528  for(; yq<slice_h && yq<h; yq++){
529  IDWTELEM * line = slice_buffer_get_line(&s->sb, yq);
530  for(x=0; x<w; x++){
531  line[x] <<= FRAC_BITS;
532  }
533  }
534  }
535 
536  predict_slice_buffered(s, &s->sb, s->spatial_idwt_buffer, plane_index, 1, mb_y);
537 
538  y = FFMIN(p->height, slice_starty);
539  end_y = FFMIN(p->height, slice_h);
540  while(y < end_y)
541  ff_slice_buffer_release(&s->sb, y++);
542  }
543 
545  }
546 
547  }
548 
549  emms_c();
550 
551  ff_snow_release_buffer(avctx);
552 
553  if(!(s->avctx->debug&2048))
554  av_frame_ref(picture, &s->current_picture);
555  else
556  av_frame_ref(picture, &s->mconly_picture);
557 
558  *got_frame = 1;
559 
560  bytes_read= c->bytestream - c->bytestream_start;
561  if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
562 
563  return bytes_read;
564 }
565 
567 {
568  SnowContext *s = avctx->priv_data;
569 
571 
573 
574  return 0;
575 }
576 
578  .name = "snow",
579  .type = AVMEDIA_TYPE_VIDEO,
580  .id = AV_CODEC_ID_SNOW,
581  .priv_data_size = sizeof(SnowContext),
582  .init = decode_init,
583  .close = decode_end,
584  .decode = decode_frame,
585  .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
586  .long_name = NULL_IF_CONFIG_SMALL("Snow"),
587 };
int version
Definition: snow.h:128
int mv_scale
Definition: snow.h:153
static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add)
Definition: snow.h:458
int ff_snow_frame_start(SnowContext *s)
Definition: snow.c:599
#define QSHIFT
Definition: snow.h:37
float v
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVCodecContext * avctx
Definition: snow.h:110
int block_max_depth
Definition: snow.h:160
int chroma_v_shift
Definition: snow.h:146
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
FIXME Range Coding of cr are ref
Definition: snow.txt:367
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:73
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
int always_reset
Definition: snow.h:127
#define BLOCK_INTRA
Definition: snow.h:52
void ff_slice_buffer_destroy(slice_buffer *buf)
Definition: snow_dwt.c:99
Range coder.
static av_cold int decode_end(AVCodecContext *avctx)
Definition: snowdec.c:566
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int max_ref_frames
Definition: snow.h:135
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: snowdec.c:394
mpegvideo header.
int ff_snow_common_init_after_header(AVCodecContext *avctx)
Definition: snow.c:472
void ff_spatial_idwt_buffered_slice(SnowDWTContext *dsp, DWTCompose *cs, slice_buffer *slice_buf, IDWTELEM *temp, int width, int height, int stride_line, int type, int decomposition_count, int y)
Definition: snow_dwt.c:663
int keyframe
Definition: snow.h:126
int stride
Definition: mace.c:144
void ff_snow_reset_contexts(SnowContext *s)
Definition: snow.c:69
static 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)
Definition: snow.h:465
IDWTELEM ** line
For use by idwt and predict_slices.
Definition: snow_dwt.h:42
short IDWTELEM
Definition: dirac_dwt.h:27
output residual component w
int qlog
log(qscale)/log[2^(1/6)]
Definition: snow.h:82
Definition: snow.h:45
#define HTAPS_MAX
Definition: snow.h:70
uint8_t level
Definition: snow.h:55
uint8_t ref
Definition: snow.h:48
int b_height
Definition: snow.h:159
uint8_t
int16_t mx
Definition: snow.h:46
#define av_cold
Definition: attributes.h:78
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:115
#define FRAC_BITS
AVOptions.
#define b
Definition: input.c:42
#define MB_SIZE
Definition: snow.h:68
#define emms_c()
AVFrame current_picture
Definition: snow.h:119
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int16_t my
Definition: snow.h:47
uint8_t * data
static const BlockNode null_block
Definition: snow.h:58
void ff_snow_release_buffer(AVCodecContext *avctx)
Definition: snow.c:586
#define QEXPSHIFT
Definition: snow.h:510
BlockNode * block
Definition: snow.h:163
Discrete Time axis x
#define U(x)
SnowDWTContext dwt
Definition: snow.h:116
Used to minimize the amount of memory used in order to optimize cache performance.
Definition: snow_dwt.h:41
void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, int height, int stride_line, int type, int decomposition_count)
Definition: snow_dwt.c:644
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int diag_mc
Definition: snow.h:100
Spectrum Plot time data
static void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
const uint8_t *const ff_obmc_tab[4]
Definition: snowdata.h:123
Definition: graph2dot.c:48
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define FFMAX(a, b)
Definition: common.h:56
external API header
uint8_t * bytestream
Definition: rangecoder.h:43
uint8_t color[3]
Definition: snow.h:49
int ref_frames
Definition: snow.h:136
x_and_coeff * x_coeff
Definition: snow.h:88
int htaps
Definition: snow.h:98
static av_cold int decode_init(AVCodecContext *avctx)
Definition: snowdec.c:367
int qlog
Definition: snow.h:148
void ff_slice_buffer_flush(slice_buffer *buf)
Definition: snow_dwt.c:91
static av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1dec.c:63
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
#define FFMIN(a, b)
Definition: common.h:58
static void unpack_coeffs(SnowContext *s, SubBand *b, SubBand *parent, int orientation)
Definition: snow.h:603
#define LOSSLESS_QLOG
Definition: snow.h:39
ret
Definition: avfilter.c:821
int16_t x
Definition: snow.h:73
t
Definition: genspecsines3.m:6
Plane plane[MAX_PLANES]
Definition: snow.h:162
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)
Definition: snow.h:285
int b_width
Definition: snow.h:158
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition: rangecoder.c:60
#define FFABS(a)
Definition: common.h:53
float u
struct SnowContext SnowContext
FIXME Range Coding of cr are level
Definition: snow.txt:367
int chroma_h_shift
Definition: snow.h:145
static void correlate_slice_buffered(SnowContext *s, slice_buffer *sb, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y)
Definition: snowdec.c:216
static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer *sb, IDWTELEM *old_buffer, int plane_index, int add, int mb_y)
Definition: snowdec.c:39
SubBand band[MAX_DWT_LEVELS][4]
uint8_t block_state[128+32 *128]
Definition: snow.h:125
int qbias
Definition: snow.h:155
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
int spatial_decomposition_count
Definition: snow.h:132
int DWTELEM
Definition: dirac_dwt.h:26
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
FIXME Range Coding of cb
Definition: snow.txt:367
int ff_slice_buffer_init(slice_buffer *buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM *base_buffer)
Definition: snow_dwt.c:28
main external API structure.
int8_t hcoeff[HTAPS_MAX/2]
Definition: snow.h:99
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#define QROOT
Definition: snow.h:38
int ff_snow_alloc_blocks(SnowContext *s)
Definition: snow.c:83
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer *sb, int start_y, int h, int save_state[1])
Definition: snowdec.c:96
struct SubBand * parent
void * buf
Definition: avisynth_c.h:594
AVCodec ff_snow_decoder
Definition: snowdec.c:577
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:74
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
#define mid_pred
Definition: mathops.h:94
int buf_y_offset
Definition: snow.h:86
void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: rangecoder.c:52
uint8_t header_state[32]
Definition: snow.h:124
#define type
static void decode_qlogs(SnowContext *s)
Definition: snowdec.c:246
int spatial_scalability
Definition: snow.h:147
int ff_snow_common_init(AVCodecContext *avctx)
static int decode_header(SnowContext *s)
Definition: snowdec.c:270
uint16_t coeff
Definition: snow.h:74
int av_frame_ref(AVFrame *dst, AVFrame *src)
Setup a new reference to the data described by an given frame.
Definition: frame.c:228
int spatial_decomposition_type
Definition: snow.h:129
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define FF_DEBUG_PICT_INFO
#define MAX_DECOMPOSITIONS
Definition: dirac_dwt.h:30
AVFrame mconly_picture
Definition: snow.h:122
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
#define MID_STATE
Definition: snow.h:34
int temporal_decomposition_type
Definition: snow.h:131
#define QBIAS_SHIFT
Definition: snow.h:157
common internal api header.
IDWTELEM * temp_idwt_buffer
Definition: snow.h:142
#define slice_buffer_get_line(slice_buf, line_num)
Definition: snow_dwt.h:86
static double c[64]
DWTELEM * spatial_dwt_buffer
Definition: snow.h:139
function y
Definition: D.m:1
IDWTELEM * spatial_idwt_buffer
Definition: snow.h:141
DSP utils.
uint8_t * bytestream_start
Definition: rangecoder.h:42
static void dequantize_slice_buffered(SnowContext *s, slice_buffer *sb, SubBand *b, IDWTELEM *src, int stride, int start_y, int end_y)
Definition: snowdec.c:193
int buf_x_offset
Definition: snow.h:85
int colorspace_type
Definition: snow.h:144
#define av_log2
Definition: intmath.h:89
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip please avoid problems through this extra level of scrutiny For cosmetics only commits you should e g by running git config global user name My Name git config global user email my email which is either set in your personal configuration file through git config core editor or set by one of the following environment VISUAL or EDITOR Log messages should be concise but descriptive Explain why you made a what you did will be obvious from the changes themselves most of the time Saying just bug fix or is bad Remember that people of varying skill levels look at and educate themselves while reading through your code Don t include filenames in log Git provides that information Possibly make the commit message have a descriptive first line
Definition: git-howto.txt:153
slice_buffer sb
Definition: snow.h:167
IDWTELEM * ibuf
int fast_mc
Definition: snow.h:101
av_cold void ff_snow_common_end(SnowContext *s)
Definition: snow.c:650
RangeCoder c
Definition: snow.h:111
uint8_t ff_qexp[QROOT]
Definition: snowdata.h:128
static int decode_blocks(SnowContext *s)
Definition: snowdec.c:379
#define MAX_REF_FRAMES
Definition: snow.h:41
void ff_slice_buffer_release(slice_buffer *buf, int line)
Definition: snow_dwt.c:78
#define av_always_inline
Definition: attributes.h:41
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
static uint32_t inverse(uint32_t v)
find multiplicative inverse modulo 2 ^ 32
Definition: asfcrypt.c:35
uint8_t type
Definition: snow.h:50
static double cr(void *priv, double x, double y)
Definition: vf_geq.c:85
int temporal_decomposition_count
Definition: snow.h:134
This structure stores compressed data.
static int decode_q_branch(SnowContext *s, int level, int x, int y)
Definition: snowdec.c:137
#define GET_S(dst, check)
Definition: snowdec.c:262
int stride_line
Stride measured in lines, not pixels.
Definition: snow.h:87