~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/snowenc.c

  • Committer: Gauvain Pocentek
  • Date: 2012-03-06 11:59:12 UTC
  • mfrom: (66.1.15 precise)
  • Revision ID: gauvain@pocentek.net-20120306115912-h9d6kt9j0l532oo5
* Merge from Ubuntu:
  - put back faac support
  - recommends apport-hooks-medibuntu
  - change Maintainer, Uploaders & Vcs-* fields.
* New upstream snapshot
* upload to unstable
* Build against external libmpeg2
* drop 51_FTBFS_arm.patch again
* no longer build depend on libcdparanoia-dev on the Hurd
* Fix FTBFS on the hurd.
  Thanks to Samuel Thibault <sthibault@debian.org> (Closes: #654974)
* Fix FTBFS on arm
* New upstream snapshot, Closes: #650339, #643621, #481807
* Imported Upstream version 1.0~rc4+svn34492
* Bump standards version
* Bump dependency on libav >= 4:0.8~, Closes: #653887
* Fix build-indep
* Build mplayer-gui again, Closes: #568514
* Drop debian/all-lang-config-mak.sh, no longer needed
* include .dfsg1 in version number
* remove get-orig-source target
* no longer prune compiler flags from the environment
* No longer advertise nor build 3fdx, mga and dxr3 backends,
  Closes: #496106, #442181, #533546
* beautify mplayer version identification string
* Brown paperbag upload.
* Next try to fix build failure on sparce after recent binutils change.
* Brown paperbag upload.
* Really fix build failure on sparc after recent binutils change.
* Properly set Replaces/Conflicts on mplayer2{,-dbg} to avoid
  file overwrite errors.
* Adjust versioning of mplayer listed in the mplayer-dbg's Depends field.
* Fix build failure on sparc after recent binutils change.
* Urgency medium bumped because of RC-level bugfix
  and speeding up x264 transition.
* Update to my @debian.org email.
* Upload to unstable
* Enable joystick support on Linux only, Closes: #638408
* Rebuild fixes toolchain issue on arm, Closes: #637077
* New upstream snapshot
* following the discussion started by Diego Biurrun <diego@biurrun.de>
  in debian-devel, I have prepared a new packaging of 'mplayer'
  (with code that comes from CVS)
* the upstream tar.bz cannot be distributed by Debian, since it contains
   CSS code; so I am repackaging it 
* I have tried my best to address all known issues:
  - the package contains the detailed Copyright made by Diego Biurrun 
  - the package does not contain CSS code, or  AFAIK other code on which 
     there is active patent enforcement
  - there is a script  debian/cvs-changelog.sh  that shows all changes
     done to files included in this source.
    This should comply with GPLv2 sec 2.a  (in spirit if not in letter)
    For this reason, the source code contains CVS directories.
* needs   make (>= 3.80) for 'html-chunked-$(1)' in DOCS/xml/Makefile

* some corrections, as suggested Diego Biurrun
  - binary codecs should go into /usr/lib/codecs (upstream default)
  - better template 'mplayer/install_codecs'
  - an empty 'font=' in mplayer.conf breaks mplayer: postinst corrected
* correction in 'mplayer/cfgnote'
* better mplayer.postinst and mplayer.config

* New upstream release
* better debian/copyright file
* do not ship a skin
* New upstream release
* changed DEB_BUILD_OPTIONS to DEB_BUILD_CONFIGURE ,
  DEB_BUILD_OPTIONS is used as in debian policy
* use gcc-3.4
* changed xlibs-dev to a long list of dependencies, for Debian/etch
* try to adhere to  http://www.mplayerhq.hu/DOCS/tech/binary-packaging.txt
  (see README.Debian for details)
* removed dependency on xlibmesa-dev, disabled opengl
* New upstream release
* Simon McVittie <hacks@pseudorandom.co.uk> wonderful work:
- Work around Debian bug #267442 (glibc's sys/uio.h and gcc's altivec.h have
  conflicting uses for __vector) by re-ordering #includes
- Fix potential symlink attack in ./configure
- Disable support for binary codecs on platforms for which those codecs
  aren't available; also disable the corresponding Debconf note when it's
  inappropriate
- Changed Build-Depends: so it works in pbuilder
- Explicitly build-depend on libjpeg62-dev, libfontconfig1-dev,
  libungif4-dev 
- Tweak debian/rules to avoid certain errors being ignored
- Use --language=all
* provide a target  'debian/rules get-orig-source' 
  that recreates the orig.tar.gz ; then use the above orig.tar.gz
* rewrote some parts of debian/rules
* don't clean and recompile docs if upstream ships them
* mplayer-doc was shipping too much stuff
* translated man pages where not installed properly
* compile with libdv4-dev
* correct README.Debian
* Forgot build-dep on libtheora
* Must not depend on libxvidcore
* New upstream release
* new release.
* rc1 to become 0.90
* new pre-release
* new pre-release
* gtk bug fixed.
* new release.
* version bumped
* 0.60 pre2 release
* 0.60 pre-release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
 
3
 *
 
4
 * This file is part of Libav.
 
5
 *
 
6
 * Libav 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
 * Libav 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 Libav; 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 "dwt.h"
 
27
#include "snow.h"
 
28
 
 
29
#include "rangecoder.h"
 
30
#include "mathops.h"
 
31
 
 
32
#include "mpegvideo.h"
 
33
#include "h263.h"
 
34
 
 
35
#undef NDEBUG
 
36
#include <assert.h>
 
37
 
 
38
#define QUANTIZE2 0
 
39
 
 
40
#if QUANTIZE2==1
 
41
#define Q2_STEP 8
 
42
 
 
43
static void find_sse(SnowContext *s, Plane *p, int *score, int score_stride, IDWTELEM *r0, IDWTELEM *r1, int level, int orientation){
 
44
    SubBand *b= &p->band[level][orientation];
 
45
    int x, y;
 
46
    int xo=0;
 
47
    int yo=0;
 
48
    int step= 1 << (s->spatial_decomposition_count - level);
 
49
 
 
50
    if(orientation&1)
 
51
        xo= step>>1;
 
52
    if(orientation&2)
 
53
        yo= step>>1;
 
54
 
 
55
    //FIXME bias for nonzero ?
 
56
    //FIXME optimize
 
57
    memset(score, 0, sizeof(*score)*score_stride*((p->height + Q2_STEP-1)/Q2_STEP));
 
58
    for(y=0; y<p->height; y++){
 
59
        for(x=0; x<p->width; x++){
 
60
            int sx= (x-xo + step/2) / step / Q2_STEP;
 
61
            int sy= (y-yo + step/2) / step / Q2_STEP;
 
62
            int v= r0[x + y*p->width] - r1[x + y*p->width];
 
63
            assert(sx>=0 && sy>=0 && sx < score_stride);
 
64
            v= ((v+8)>>4)<<4;
 
65
            score[sx + sy*score_stride] += v*v;
 
66
            assert(score[sx + sy*score_stride] >= 0);
 
67
        }
 
68
    }
 
69
}
 
70
 
 
71
static void dequantize_all(SnowContext *s, Plane *p, IDWTELEM *buffer, int width, int height){
 
72
    int level, orientation;
 
73
 
 
74
    for(level=0; level<s->spatial_decomposition_count; level++){
 
75
        for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
76
            SubBand *b= &p->band[level][orientation];
 
77
            IDWTELEM *dst= buffer + (b->ibuf - s->spatial_idwt_buffer);
 
78
 
 
79
            dequantize(s, b, dst, b->stride);
 
80
        }
 
81
    }
 
82
}
 
83
 
 
84
static void dwt_quantize(SnowContext *s, Plane *p, DWTELEM *buffer, int width, int height, int stride, int type){
 
85
    int level, orientation, ys, xs, x, y, pass;
 
86
    IDWTELEM best_dequant[height * stride];
 
87
    IDWTELEM idwt2_buffer[height * stride];
 
88
    const int score_stride= (width + 10)/Q2_STEP;
 
89
    int best_score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size
 
90
    int score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size
 
91
    int threshold= (s->m.lambda * s->m.lambda) >> 6;
 
92
 
 
93
    //FIXME pass the copy cleanly ?
 
94
 
 
95
//    memcpy(dwt_buffer, buffer, height * stride * sizeof(DWTELEM));
 
96
    ff_spatial_dwt(buffer, width, height, stride, type, s->spatial_decomposition_count);
 
97
 
 
98
    for(level=0; level<s->spatial_decomposition_count; level++){
 
99
        for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
100
            SubBand *b= &p->band[level][orientation];
 
101
            IDWTELEM *dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer);
 
102
             DWTELEM *src=       buffer + (b-> buf - s->spatial_dwt_buffer);
 
103
            assert(src == b->buf); // code does not depend on this but it is true currently
 
104
 
 
105
            quantize(s, b, dst, src, b->stride, s->qbias);
 
106
        }
 
107
    }
 
108
    for(pass=0; pass<1; pass++){
 
109
        if(s->qbias == 0) //keyframe
 
110
            continue;
 
111
        for(level=0; level<s->spatial_decomposition_count; level++){
 
112
            for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
113
                SubBand *b= &p->band[level][orientation];
 
114
                IDWTELEM *dst= idwt2_buffer + (b->ibuf - s->spatial_idwt_buffer);
 
115
                IDWTELEM *best_dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer);
 
116
 
 
117
                for(ys= 0; ys<Q2_STEP; ys++){
 
118
                    for(xs= 0; xs<Q2_STEP; xs++){
 
119
                        memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM));
 
120
                        dequantize_all(s, p, idwt2_buffer, width, height);
 
121
                        ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count);
 
122
                        find_sse(s, p, best_score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation);
 
123
                        memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM));
 
124
                        for(y=ys; y<b->height; y+= Q2_STEP){
 
125
                            for(x=xs; x<b->width; x+= Q2_STEP){
 
126
                                if(dst[x + y*b->stride]<0) dst[x + y*b->stride]++;
 
127
                                if(dst[x + y*b->stride]>0) dst[x + y*b->stride]--;
 
128
                                //FIXME try more than just --
 
129
                            }
 
130
                        }
 
131
                        dequantize_all(s, p, idwt2_buffer, width, height);
 
132
                        ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count);
 
133
                        find_sse(s, p, score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation);
 
134
                        for(y=ys; y<b->height; y+= Q2_STEP){
 
135
                            for(x=xs; x<b->width; x+= Q2_STEP){
 
136
                                int score_idx= x/Q2_STEP + (y/Q2_STEP)*score_stride;
 
137
                                if(score[score_idx] <= best_score[score_idx] + threshold){
 
138
                                    best_score[score_idx]= score[score_idx];
 
139
                                    if(best_dst[x + y*b->stride]<0) best_dst[x + y*b->stride]++;
 
140
                                    if(best_dst[x + y*b->stride]>0) best_dst[x + y*b->stride]--;
 
141
                                    //FIXME copy instead
 
142
                                }
 
143
                            }
 
144
                        }
 
145
                    }
 
146
                }
 
147
            }
 
148
        }
 
149
    }
 
150
    memcpy(s->spatial_idwt_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); //FIXME work with that directly instead of copy at the end
 
151
}
 
152
 
 
153
#endif /* QUANTIZE2==1 */
 
154
 
 
155
#if CONFIG_SNOW_ENCODER
 
156
static av_cold int encode_init(AVCodecContext *avctx)
 
157
{
 
158
    SnowContext *s = avctx->priv_data;
 
159
    int plane_index;
 
160
 
 
161
    if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
 
162
        av_log(avctx, AV_LOG_ERROR, "This codec is under development, files encoded with it may not be decodable with future versions!!!\n"
 
163
               "Use vstrict=-2 / -strict -2 to use it anyway.\n");
 
164
        return -1;
 
165
    }
 
166
 
 
167
    if(avctx->prediction_method == DWT_97
 
168
       && (avctx->flags & CODEC_FLAG_QSCALE)
 
169
       && avctx->global_quality == 0){
 
170
        av_log(avctx, AV_LOG_ERROR, "The 9/7 wavelet is incompatible with lossless mode.\n");
 
171
        return -1;
 
172
    }
 
173
 
 
174
    s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
 
175
 
 
176
    s->mv_scale       = (avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
 
177
    s->block_max_depth= (avctx->flags & CODEC_FLAG_4MV ) ? 1 : 0;
 
178
 
 
179
    for(plane_index=0; plane_index<3; plane_index++){
 
180
        s->plane[plane_index].diag_mc= 1;
 
181
        s->plane[plane_index].htaps= 6;
 
182
        s->plane[plane_index].hcoeff[0]=  40;
 
183
        s->plane[plane_index].hcoeff[1]= -10;
 
184
        s->plane[plane_index].hcoeff[2]=   2;
 
185
        s->plane[plane_index].fast_mc= 1;
 
186
    }
 
187
 
 
188
    ff_snow_common_init(avctx);
 
189
    ff_snow_alloc_blocks(s);
 
190
 
 
191
    s->version=0;
 
192
 
 
193
    s->m.avctx   = avctx;
 
194
    s->m.flags   = avctx->flags;
 
195
    s->m.bit_rate= avctx->bit_rate;
 
196
 
 
197
    s->m.me.temp      =
 
198
    s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
 
199
    s->m.me.map       = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
 
200
    s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
 
201
    s->m.obmc_scratchpad= av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t));
 
202
    h263_encode_init(&s->m); //mv_penalty
 
203
 
 
204
    s->max_ref_frames = FFMAX(FFMIN(avctx->refs, MAX_REF_FRAMES), 1);
 
205
 
 
206
    if(avctx->flags&CODEC_FLAG_PASS1){
 
207
        if(!avctx->stats_out)
 
208
            avctx->stats_out = av_mallocz(256);
 
209
    }
 
210
    if((avctx->flags&CODEC_FLAG_PASS2) || !(avctx->flags&CODEC_FLAG_QSCALE)){
 
211
        if(ff_rate_control_init(&s->m) < 0)
 
212
            return -1;
 
213
    }
 
214
    s->pass1_rc= !(avctx->flags & (CODEC_FLAG_QSCALE|CODEC_FLAG_PASS2));
 
215
 
 
216
    avctx->coded_frame= &s->current_picture;
 
217
    switch(avctx->pix_fmt){
 
218
//    case PIX_FMT_YUV444P:
 
219
//    case PIX_FMT_YUV422P:
 
220
    case PIX_FMT_YUV420P:
 
221
    case PIX_FMT_GRAY8:
 
222
//    case PIX_FMT_YUV411P:
 
223
//    case PIX_FMT_YUV410P:
 
224
        s->colorspace_type= 0;
 
225
        break;
 
226
/*    case PIX_FMT_RGB32:
 
227
        s->colorspace= 1;
 
228
        break;*/
 
229
    default:
 
230
        av_log(avctx, AV_LOG_ERROR, "pixel format not supported\n");
 
231
        return -1;
 
232
    }
 
233
//    avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
 
234
    s->chroma_h_shift= 1;
 
235
    s->chroma_v_shift= 1;
 
236
 
 
237
    ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp);
 
238
    ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp);
 
239
 
 
240
    s->avctx->get_buffer(s->avctx, &s->input_picture);
 
241
 
 
242
    if(s->avctx->me_method == ME_ITER){
 
243
        int i;
 
244
        int size= s->b_width * s->b_height << 2*s->block_max_depth;
 
245
        for(i=0; i<s->max_ref_frames; i++){
 
246
            s->ref_mvs[i]= av_mallocz(size*sizeof(int16_t[2]));
 
247
            s->ref_scores[i]= av_mallocz(size*sizeof(uint32_t));
 
248
        }
 
249
    }
 
250
 
 
251
    return 0;
 
252
}
 
253
 
 
254
//near copy & paste from dsputil, FIXME
 
255
static int pix_sum(uint8_t * pix, int line_size, int w)
 
256
{
 
257
    int s, i, j;
 
258
 
 
259
    s = 0;
 
260
    for (i = 0; i < w; i++) {
 
261
        for (j = 0; j < w; j++) {
 
262
            s += pix[0];
 
263
            pix ++;
 
264
        }
 
265
        pix += line_size - w;
 
266
    }
 
267
    return s;
 
268
}
 
269
 
 
270
//near copy & paste from dsputil, FIXME
 
271
static int pix_norm1(uint8_t * pix, int line_size, int w)
 
272
{
 
273
    int s, i, j;
 
274
    uint32_t *sq = ff_squareTbl + 256;
 
275
 
 
276
    s = 0;
 
277
    for (i = 0; i < w; i++) {
 
278
        for (j = 0; j < w; j ++) {
 
279
            s += sq[pix[0]];
 
280
            pix ++;
 
281
        }
 
282
        pix += line_size - w;
 
283
    }
 
284
    return s;
 
285
}
 
286
 
 
287
//FIXME copy&paste
 
288
#define P_LEFT P[1]
 
289
#define P_TOP P[2]
 
290
#define P_TOPRIGHT P[3]
 
291
#define P_MEDIAN P[4]
 
292
#define P_MV1 P[9]
 
293
#define FLAG_QPEL   1 //must be 1
 
294
 
 
295
static int encode_q_branch(SnowContext *s, int level, int x, int y){
 
296
    uint8_t p_buffer[1024];
 
297
    uint8_t i_buffer[1024];
 
298
    uint8_t p_state[sizeof(s->block_state)];
 
299
    uint8_t i_state[sizeof(s->block_state)];
 
300
    RangeCoder pc, ic;
 
301
    uint8_t *pbbak= s->c.bytestream;
 
302
    uint8_t *pbbak_start= s->c.bytestream_start;
 
303
    int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
 
304
    const int w= s->b_width  << s->block_max_depth;
 
305
    const int h= s->b_height << s->block_max_depth;
 
306
    const int rem_depth= s->block_max_depth - level;
 
307
    const int index= (x + y*w) << rem_depth;
 
308
    const int block_w= 1<<(LOG2_MB_SIZE - level);
 
309
    int trx= (x+1)<<rem_depth;
 
310
    int try= (y+1)<<rem_depth;
 
311
    const BlockNode *left  = x ? &s->block[index-1] : &null_block;
 
312
    const BlockNode *top   = y ? &s->block[index-w] : &null_block;
 
313
    const BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
 
314
    const BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
 
315
    const BlockNode *tl    = y && x ? &s->block[index-w-1] : left;
 
316
    const BlockNode *tr    = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
 
317
    int pl = left->color[0];
 
318
    int pcb= left->color[1];
 
319
    int pcr= left->color[2];
 
320
    int pmx, pmy;
 
321
    int mx=0, my=0;
 
322
    int l,cr,cb;
 
323
    const int stride= s->current_picture.linesize[0];
 
324
    const int uvstride= s->current_picture.linesize[1];
 
325
    uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y*  stride)*block_w,
 
326
                                s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
 
327
                                s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
 
328
    int P[10][2];
 
329
    int16_t last_mv[3][2];
 
330
    int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
 
331
    const int shift= 1+qpel;
 
332
    MotionEstContext *c= &s->m.me;
 
333
    int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
 
334
    int mx_context= av_log2(2*FFABS(left->mx - top->mx));
 
335
    int my_context= av_log2(2*FFABS(left->my - top->my));
 
336
    int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
 
337
    int ref, best_ref, ref_score, ref_mx, ref_my;
 
338
 
 
339
    assert(sizeof(s->block_state) >= 256);
 
340
    if(s->keyframe){
 
341
        set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
 
342
        return 0;
 
343
    }
 
344
 
 
345
//    clip predictors / edge ?
 
346
 
 
347
    P_LEFT[0]= left->mx;
 
348
    P_LEFT[1]= left->my;
 
349
    P_TOP [0]= top->mx;
 
350
    P_TOP [1]= top->my;
 
351
    P_TOPRIGHT[0]= tr->mx;
 
352
    P_TOPRIGHT[1]= tr->my;
 
353
 
 
354
    last_mv[0][0]= s->block[index].mx;
 
355
    last_mv[0][1]= s->block[index].my;
 
356
    last_mv[1][0]= right->mx;
 
357
    last_mv[1][1]= right->my;
 
358
    last_mv[2][0]= bottom->mx;
 
359
    last_mv[2][1]= bottom->my;
 
360
 
 
361
    s->m.mb_stride=2;
 
362
    s->m.mb_x=
 
363
    s->m.mb_y= 0;
 
364
    c->skip= 0;
 
365
 
 
366
    assert(c->  stride ==   stride);
 
367
    assert(c->uvstride == uvstride);
 
368
 
 
369
    c->penalty_factor    = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
 
370
    c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
 
371
    c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
 
372
    c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
 
373
 
 
374
    c->xmin = - x*block_w - 16+3;
 
375
    c->ymin = - y*block_w - 16+3;
 
376
    c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3;
 
377
    c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3;
 
378
 
 
379
    if(P_LEFT[0]     > (c->xmax<<shift)) P_LEFT[0]    = (c->xmax<<shift);
 
380
    if(P_LEFT[1]     > (c->ymax<<shift)) P_LEFT[1]    = (c->ymax<<shift);
 
381
    if(P_TOP[0]      > (c->xmax<<shift)) P_TOP[0]     = (c->xmax<<shift);
 
382
    if(P_TOP[1]      > (c->ymax<<shift)) P_TOP[1]     = (c->ymax<<shift);
 
383
    if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
 
384
    if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
 
385
    if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
 
386
 
 
387
    P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
 
388
    P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
 
389
 
 
390
    if (!y) {
 
391
        c->pred_x= P_LEFT[0];
 
392
        c->pred_y= P_LEFT[1];
 
393
    } else {
 
394
        c->pred_x = P_MEDIAN[0];
 
395
        c->pred_y = P_MEDIAN[1];
 
396
    }
 
397
 
 
398
    score= INT_MAX;
 
399
    best_ref= 0;
 
400
    for(ref=0; ref<s->ref_frames; ref++){
 
401
        init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0);
 
402
 
 
403
        ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv,
 
404
                                         (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
 
405
 
 
406
        assert(ref_mx >= c->xmin);
 
407
        assert(ref_mx <= c->xmax);
 
408
        assert(ref_my >= c->ymin);
 
409
        assert(ref_my <= c->ymax);
 
410
 
 
411
        ref_score= c->sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
 
412
        ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
 
413
        ref_score+= 2*av_log2(2*ref)*c->penalty_factor;
 
414
        if(s->ref_mvs[ref]){
 
415
            s->ref_mvs[ref][index][0]= ref_mx;
 
416
            s->ref_mvs[ref][index][1]= ref_my;
 
417
            s->ref_scores[ref][index]= ref_score;
 
418
        }
 
419
        if(score > ref_score){
 
420
            score= ref_score;
 
421
            best_ref= ref;
 
422
            mx= ref_mx;
 
423
            my= ref_my;
 
424
        }
 
425
    }
 
426
    //FIXME if mb_cmp != SSE then intra cannot be compared currently and mb_penalty vs. lambda2
 
427
 
 
428
  //  subpel search
 
429
    base_bits= get_rac_count(&s->c) - 8*(s->c.bytestream - s->c.bytestream_start);
 
430
    pc= s->c;
 
431
    pc.bytestream_start=
 
432
    pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
 
433
    memcpy(p_state, s->block_state, sizeof(s->block_state));
 
434
 
 
435
    if(level!=s->block_max_depth)
 
436
        put_rac(&pc, &p_state[4 + s_context], 1);
 
437
    put_rac(&pc, &p_state[1 + left->type + top->type], 0);
 
438
    if(s->ref_frames > 1)
 
439
        put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
 
440
    pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
 
441
    put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
 
442
    put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
 
443
    p_len= pc.bytestream - pc.bytestream_start;
 
444
    score += (s->lambda2*(get_rac_count(&pc)-base_bits))>>FF_LAMBDA_SHIFT;
 
445
 
 
446
    block_s= block_w*block_w;
 
447
    sum = pix_sum(current_data[0], stride, block_w);
 
448
    l= (sum + block_s/2)/block_s;
 
449
    iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
 
450
 
 
451
    block_s= block_w*block_w>>2;
 
452
    sum = pix_sum(current_data[1], uvstride, block_w>>1);
 
453
    cb= (sum + block_s/2)/block_s;
 
454
//    iscore += pix_norm1(&current_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
 
455
    sum = pix_sum(current_data[2], uvstride, block_w>>1);
 
456
    cr= (sum + block_s/2)/block_s;
 
457
//    iscore += pix_norm1(&current_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
 
458
 
 
459
    ic= s->c;
 
460
    ic.bytestream_start=
 
461
    ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
 
462
    memcpy(i_state, s->block_state, sizeof(s->block_state));
 
463
    if(level!=s->block_max_depth)
 
464
        put_rac(&ic, &i_state[4 + s_context], 1);
 
465
    put_rac(&ic, &i_state[1 + left->type + top->type], 1);
 
466
    put_symbol(&ic, &i_state[32],  l-pl , 1);
 
467
    put_symbol(&ic, &i_state[64], cb-pcb, 1);
 
468
    put_symbol(&ic, &i_state[96], cr-pcr, 1);
 
469
    i_len= ic.bytestream - ic.bytestream_start;
 
470
    iscore += (s->lambda2*(get_rac_count(&ic)-base_bits))>>FF_LAMBDA_SHIFT;
 
471
 
 
472
//    assert(score==256*256*256*64-1);
 
473
    assert(iscore < 255*255*256 + s->lambda2*10);
 
474
    assert(iscore >= 0);
 
475
    assert(l>=0 && l<=255);
 
476
    assert(pl>=0 && pl<=255);
 
477
 
 
478
    if(level==0){
 
479
        int varc= iscore >> 8;
 
480
        int vard= score >> 8;
 
481
        if (vard <= 64 || vard < varc)
 
482
            c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
 
483
        else
 
484
            c->scene_change_score+= s->m.qscale;
 
485
    }
 
486
 
 
487
    if(level!=s->block_max_depth){
 
488
        put_rac(&s->c, &s->block_state[4 + s_context], 0);
 
489
        score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
 
490
        score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
 
491
        score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
 
492
        score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
 
493
        score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
 
494
 
 
495
        if(score2 < score && score2 < iscore)
 
496
            return score2;
 
497
    }
 
498
 
 
499
    if(iscore < score){
 
500
        pred_mv(s, &pmx, &pmy, 0, left, top, tr);
 
501
        memcpy(pbbak, i_buffer, i_len);
 
502
        s->c= ic;
 
503
        s->c.bytestream_start= pbbak_start;
 
504
        s->c.bytestream= pbbak + i_len;
 
505
        set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA);
 
506
        memcpy(s->block_state, i_state, sizeof(s->block_state));
 
507
        return iscore;
 
508
    }else{
 
509
        memcpy(pbbak, p_buffer, p_len);
 
510
        s->c= pc;
 
511
        s->c.bytestream_start= pbbak_start;
 
512
        s->c.bytestream= pbbak + p_len;
 
513
        set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
 
514
        memcpy(s->block_state, p_state, sizeof(s->block_state));
 
515
        return score;
 
516
    }
 
517
}
 
518
 
 
519
static void encode_q_branch2(SnowContext *s, int level, int x, int y){
 
520
    const int w= s->b_width  << s->block_max_depth;
 
521
    const int rem_depth= s->block_max_depth - level;
 
522
    const int index= (x + y*w) << rem_depth;
 
523
    int trx= (x+1)<<rem_depth;
 
524
    BlockNode *b= &s->block[index];
 
525
    const BlockNode *left  = x ? &s->block[index-1] : &null_block;
 
526
    const BlockNode *top   = y ? &s->block[index-w] : &null_block;
 
527
    const BlockNode *tl    = y && x ? &s->block[index-w-1] : left;
 
528
    const BlockNode *tr    = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
 
529
    int pl = left->color[0];
 
530
    int pcb= left->color[1];
 
531
    int pcr= left->color[2];
 
532
    int pmx, pmy;
 
533
    int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
 
534
    int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref;
 
535
    int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref;
 
536
    int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
 
537
 
 
538
    if(s->keyframe){
 
539
        set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
 
540
        return;
 
541
    }
 
542
 
 
543
    if(level!=s->block_max_depth){
 
544
        if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){
 
545
            put_rac(&s->c, &s->block_state[4 + s_context], 1);
 
546
        }else{
 
547
            put_rac(&s->c, &s->block_state[4 + s_context], 0);
 
548
            encode_q_branch2(s, level+1, 2*x+0, 2*y+0);
 
549
            encode_q_branch2(s, level+1, 2*x+1, 2*y+0);
 
550
            encode_q_branch2(s, level+1, 2*x+0, 2*y+1);
 
551
            encode_q_branch2(s, level+1, 2*x+1, 2*y+1);
 
552
            return;
 
553
        }
 
554
    }
 
555
    if(b->type & BLOCK_INTRA){
 
556
        pred_mv(s, &pmx, &pmy, 0, left, top, tr);
 
557
        put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1);
 
558
        put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1);
 
559
        put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1);
 
560
        put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1);
 
561
        set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA);
 
562
    }else{
 
563
        pred_mv(s, &pmx, &pmy, b->ref, left, top, tr);
 
564
        put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0);
 
565
        if(s->ref_frames > 1)
 
566
            put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0);
 
567
        put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1);
 
568
        put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1);
 
569
        set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0);
 
570
    }
 
571
}
 
572
 
 
573
static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){
 
574
    int i, x2, y2;
 
575
    Plane *p= &s->plane[plane_index];
 
576
    const int block_size = MB_SIZE >> s->block_max_depth;
 
577
    const int block_w    = plane_index ? block_size/2 : block_size;
 
578
    const uint8_t *obmc  = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
 
579
    const int obmc_stride= plane_index ? block_size : 2*block_size;
 
580
    const int ref_stride= s->current_picture.linesize[plane_index];
 
581
    uint8_t *src= s-> input_picture.data[plane_index];
 
582
    IDWTELEM *dst= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; //FIXME change to unsigned
 
583
    const int b_stride = s->b_width << s->block_max_depth;
 
584
    const int w= p->width;
 
585
    const int h= p->height;
 
586
    int index= mb_x + mb_y*b_stride;
 
587
    BlockNode *b= &s->block[index];
 
588
    BlockNode backup= *b;
 
589
    int ab=0;
 
590
    int aa=0;
 
591
 
 
592
    b->type|= BLOCK_INTRA;
 
593
    b->color[plane_index]= 0;
 
594
    memset(dst, 0, obmc_stride*obmc_stride*sizeof(IDWTELEM));
 
595
 
 
596
    for(i=0; i<4; i++){
 
597
        int mb_x2= mb_x + (i &1) - 1;
 
598
        int mb_y2= mb_y + (i>>1) - 1;
 
599
        int x= block_w*mb_x2 + block_w/2;
 
600
        int y= block_w*mb_y2 + block_w/2;
 
601
 
 
602
        add_yblock(s, 0, NULL, dst + ((i&1)+(i>>1)*obmc_stride)*block_w, NULL, obmc,
 
603
                    x, y, block_w, block_w, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
 
604
 
 
605
        for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){
 
606
            for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
 
607
                int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride;
 
608
                int obmc_v= obmc[index];
 
609
                int d;
 
610
                if(y<0) obmc_v += obmc[index + block_w*obmc_stride];
 
611
                if(x<0) obmc_v += obmc[index + block_w];
 
612
                if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride];
 
613
                if(x+block_w>w) obmc_v += obmc[index - block_w];
 
614
                //FIXME precalculate this or simplify it somehow else
 
615
 
 
616
                d = -dst[index] + (1<<(FRAC_BITS-1));
 
617
                dst[index] = d;
 
618
                ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v;
 
619
                aa += obmc_v * obmc_v; //FIXME precalculate this
 
620
            }
 
621
        }
 
622
    }
 
623
    *b= backup;
 
624
 
 
625
    return av_clip(((ab<<LOG2_OBMC_MAX) + aa/2)/aa, 0, 255); //FIXME we should not need clipping
 
626
}
 
627
 
 
628
static inline int get_block_bits(SnowContext *s, int x, int y, int w){
 
629
    const int b_stride = s->b_width << s->block_max_depth;
 
630
    const int b_height = s->b_height<< s->block_max_depth;
 
631
    int index= x + y*b_stride;
 
632
    const BlockNode *b     = &s->block[index];
 
633
    const BlockNode *left  = x ? &s->block[index-1] : &null_block;
 
634
    const BlockNode *top   = y ? &s->block[index-b_stride] : &null_block;
 
635
    const BlockNode *tl    = y && x ? &s->block[index-b_stride-1] : left;
 
636
    const BlockNode *tr    = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl;
 
637
    int dmx, dmy;
 
638
//  int mx_context= av_log2(2*FFABS(left->mx - top->mx));
 
639
//  int my_context= av_log2(2*FFABS(left->my - top->my));
 
640
 
 
641
    if(x<0 || x>=b_stride || y>=b_height)
 
642
        return 0;
 
643
/*
 
644
1            0      0
 
645
01X          1-2    1
 
646
001XX        3-6    2-3
 
647
0001XXX      7-14   4-7
 
648
00001XXXX   15-30   8-15
 
649
*/
 
650
//FIXME try accurate rate
 
651
//FIXME intra and inter predictors if surrounding blocks are not the same type
 
652
    if(b->type & BLOCK_INTRA){
 
653
        return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0]))
 
654
                   + av_log2(2*FFABS(left->color[1] - b->color[1]))
 
655
                   + av_log2(2*FFABS(left->color[2] - b->color[2])));
 
656
    }else{
 
657
        pred_mv(s, &dmx, &dmy, b->ref, left, top, tr);
 
658
        dmx-= b->mx;
 
659
        dmy-= b->my;
 
660
        return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda
 
661
                    + av_log2(2*FFABS(dmy))
 
662
                    + av_log2(2*b->ref));
 
663
    }
 
664
}
 
665
 
 
666
static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, const uint8_t *obmc_edged){
 
667
    Plane *p= &s->plane[plane_index];
 
668
    const int block_size = MB_SIZE >> s->block_max_depth;
 
669
    const int block_w    = plane_index ? block_size/2 : block_size;
 
670
    const int obmc_stride= plane_index ? block_size : 2*block_size;
 
671
    const int ref_stride= s->current_picture.linesize[plane_index];
 
672
    uint8_t *dst= s->current_picture.data[plane_index];
 
673
    uint8_t *src= s->  input_picture.data[plane_index];
 
674
    IDWTELEM *pred= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4;
 
675
    uint8_t *cur = s->scratchbuf;
 
676
    uint8_t tmp[ref_stride*(2*MB_SIZE+HTAPS_MAX-1)];
 
677
    const int b_stride = s->b_width << s->block_max_depth;
 
678
    const int b_height = s->b_height<< s->block_max_depth;
 
679
    const int w= p->width;
 
680
    const int h= p->height;
 
681
    int distortion;
 
682
    int rate= 0;
 
683
    const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
 
684
    int sx= block_w*mb_x - block_w/2;
 
685
    int sy= block_w*mb_y - block_w/2;
 
686
    int x0= FFMAX(0,-sx);
 
687
    int y0= FFMAX(0,-sy);
 
688
    int x1= FFMIN(block_w*2, w-sx);
 
689
    int y1= FFMIN(block_w*2, h-sy);
 
690
    int i,x,y;
 
691
 
 
692
    ff_snow_pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_w*2, &s->block[mb_x + mb_y*b_stride], plane_index, w, h);
 
693
 
 
694
    for(y=y0; y<y1; y++){
 
695
        const uint8_t *obmc1= obmc_edged + y*obmc_stride;
 
696
        const IDWTELEM *pred1 = pred + y*obmc_stride;
 
697
        uint8_t *cur1 = cur + y*ref_stride;
 
698
        uint8_t *dst1 = dst + sx + (sy+y)*ref_stride;
 
699
        for(x=x0; x<x1; x++){
 
700
#if FRAC_BITS >= LOG2_OBMC_MAX
 
701
            int v = (cur1[x] * obmc1[x]) << (FRAC_BITS - LOG2_OBMC_MAX);
 
702
#else
 
703
            int v = (cur1[x] * obmc1[x] + (1<<(LOG2_OBMC_MAX - FRAC_BITS-1))) >> (LOG2_OBMC_MAX - FRAC_BITS);
 
704
#endif
 
705
            v = (v + pred1[x]) >> FRAC_BITS;
 
706
            if(v&(~255)) v= ~(v>>31);
 
707
            dst1[x] = v;
 
708
        }
 
709
    }
 
710
 
 
711
    /* copy the regions where obmc[] = (uint8_t)256 */
 
712
    if(LOG2_OBMC_MAX == 8
 
713
        && (mb_x == 0 || mb_x == b_stride-1)
 
714
        && (mb_y == 0 || mb_y == b_height-1)){
 
715
        if(mb_x == 0)
 
716
            x1 = block_w;
 
717
        else
 
718
            x0 = block_w;
 
719
        if(mb_y == 0)
 
720
            y1 = block_w;
 
721
        else
 
722
            y0 = block_w;
 
723
        for(y=y0; y<y1; y++)
 
724
            memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
 
725
    }
 
726
 
 
727
    if(block_w==16){
 
728
        /* FIXME rearrange dsputil to fit 32x32 cmp functions */
 
729
        /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */
 
730
        /* FIXME cmps overlap but do not cover the wavelet's whole support.
 
731
         * So improving the score of one block is not strictly guaranteed
 
732
         * to improve the score of the whole frame, thus iterative motion
 
733
         * estimation does not always converge. */
 
734
        if(s->avctx->me_cmp == FF_CMP_W97)
 
735
            distortion = ff_w97_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
 
736
        else if(s->avctx->me_cmp == FF_CMP_W53)
 
737
            distortion = ff_w53_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
 
738
        else{
 
739
            distortion = 0;
 
740
            for(i=0; i<4; i++){
 
741
                int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
 
742
                distortion += s->dsp.me_cmp[0](&s->m, src + off, dst + off, ref_stride, 16);
 
743
            }
 
744
        }
 
745
    }else{
 
746
        assert(block_w==8);
 
747
        distortion = s->dsp.me_cmp[0](&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
 
748
    }
 
749
 
 
750
    if(plane_index==0){
 
751
        for(i=0; i<4; i++){
 
752
/* ..RRr
 
753
 * .RXx.
 
754
 * rxx..
 
755
 */
 
756
            rate += get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
 
757
        }
 
758
        if(mb_x == b_stride-2)
 
759
            rate += get_block_bits(s, mb_x + 1, mb_y + 1, 1);
 
760
    }
 
761
    return distortion + rate*penalty_factor;
 
762
}
 
763
 
 
764
static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){
 
765
    int i, y2;
 
766
    Plane *p= &s->plane[plane_index];
 
767
    const int block_size = MB_SIZE >> s->block_max_depth;
 
768
    const int block_w    = plane_index ? block_size/2 : block_size;
 
769
    const uint8_t *obmc  = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
 
770
    const int obmc_stride= plane_index ? block_size : 2*block_size;
 
771
    const int ref_stride= s->current_picture.linesize[plane_index];
 
772
    uint8_t *dst= s->current_picture.data[plane_index];
 
773
    uint8_t *src= s-> input_picture.data[plane_index];
 
774
    //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst
 
775
    // const has only been removed from zero_dst to suppress a warning
 
776
    static IDWTELEM zero_dst[4096]; //FIXME
 
777
    const int b_stride = s->b_width << s->block_max_depth;
 
778
    const int w= p->width;
 
779
    const int h= p->height;
 
780
    int distortion= 0;
 
781
    int rate= 0;
 
782
    const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
 
783
 
 
784
    for(i=0; i<9; i++){
 
785
        int mb_x2= mb_x + (i%3) - 1;
 
786
        int mb_y2= mb_y + (i/3) - 1;
 
787
        int x= block_w*mb_x2 + block_w/2;
 
788
        int y= block_w*mb_y2 + block_w/2;
 
789
 
 
790
        add_yblock(s, 0, NULL, zero_dst, dst, obmc,
 
791
                   x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
 
792
 
 
793
        //FIXME find a cleaner/simpler way to skip the outside stuff
 
794
        for(y2= y; y2<0; y2++)
 
795
            memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
 
796
        for(y2= h; y2<y+block_w; y2++)
 
797
            memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
 
798
        if(x<0){
 
799
            for(y2= y; y2<y+block_w; y2++)
 
800
                memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x);
 
801
        }
 
802
        if(x+block_w > w){
 
803
            for(y2= y; y2<y+block_w; y2++)
 
804
                memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w);
 
805
        }
 
806
 
 
807
        assert(block_w== 8 || block_w==16);
 
808
        distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w);
 
809
    }
 
810
 
 
811
    if(plane_index==0){
 
812
        BlockNode *b= &s->block[mb_x+mb_y*b_stride];
 
813
        int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1);
 
814
 
 
815
/* ..RRRr
 
816
 * .RXXx.
 
817
 * .RXXx.
 
818
 * rxxx.
 
819
 */
 
820
        if(merged)
 
821
            rate = get_block_bits(s, mb_x, mb_y, 2);
 
822
        for(i=merged?4:0; i<9; i++){
 
823
            static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
 
824
            rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1);
 
825
        }
 
826
    }
 
827
    return distortion + rate*penalty_factor;
 
828
}
 
829
 
 
830
static int encode_subband_c0run(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){
 
831
    const int w= b->width;
 
832
    const int h= b->height;
 
833
    int x, y;
 
834
 
 
835
    if(1){
 
836
        int run=0;
 
837
        int runs[w*h];
 
838
        int run_index=0;
 
839
        int max_index;
 
840
 
 
841
        for(y=0; y<h; y++){
 
842
            for(x=0; x<w; x++){
 
843
                int v, p=0;
 
844
                int /*ll=0, */l=0, lt=0, t=0, rt=0;
 
845
                v= src[x + y*stride];
 
846
 
 
847
                if(y){
 
848
                    t= src[x + (y-1)*stride];
 
849
                    if(x){
 
850
                        lt= src[x - 1 + (y-1)*stride];
 
851
                    }
 
852
                    if(x + 1 < w){
 
853
                        rt= src[x + 1 + (y-1)*stride];
 
854
                    }
 
855
                }
 
856
                if(x){
 
857
                    l= src[x - 1 + y*stride];
 
858
                    /*if(x > 1){
 
859
                        if(orientation==1) ll= src[y + (x-2)*stride];
 
860
                        else               ll= src[x - 2 + y*stride];
 
861
                    }*/
 
862
                }
 
863
                if(parent){
 
864
                    int px= x>>1;
 
865
                    int py= y>>1;
 
866
                    if(px<b->parent->width && py<b->parent->height)
 
867
                        p= parent[px + py*2*stride];
 
868
                }
 
869
                if(!(/*ll|*/l|lt|t|rt|p)){
 
870
                    if(v){
 
871
                        runs[run_index++]= run;
 
872
                        run=0;
 
873
                    }else{
 
874
                        run++;
 
875
                    }
 
876
                }
 
877
            }
 
878
        }
 
879
        max_index= run_index;
 
880
        runs[run_index++]= run;
 
881
        run_index=0;
 
882
        run= runs[run_index++];
 
883
 
 
884
        put_symbol2(&s->c, b->state[30], max_index, 0);
 
885
        if(run_index <= max_index)
 
886
            put_symbol2(&s->c, b->state[1], run, 3);
 
887
 
 
888
        for(y=0; y<h; y++){
 
889
            if(s->c.bytestream_end - s->c.bytestream < w*40){
 
890
                av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
 
891
                return -1;
 
892
            }
 
893
            for(x=0; x<w; x++){
 
894
                int v, p=0;
 
895
                int /*ll=0, */l=0, lt=0, t=0, rt=0;
 
896
                v= src[x + y*stride];
 
897
 
 
898
                if(y){
 
899
                    t= src[x + (y-1)*stride];
 
900
                    if(x){
 
901
                        lt= src[x - 1 + (y-1)*stride];
 
902
                    }
 
903
                    if(x + 1 < w){
 
904
                        rt= src[x + 1 + (y-1)*stride];
 
905
                    }
 
906
                }
 
907
                if(x){
 
908
                    l= src[x - 1 + y*stride];
 
909
                    /*if(x > 1){
 
910
                        if(orientation==1) ll= src[y + (x-2)*stride];
 
911
                        else               ll= src[x - 2 + y*stride];
 
912
                    }*/
 
913
                }
 
914
                if(parent){
 
915
                    int px= x>>1;
 
916
                    int py= y>>1;
 
917
                    if(px<b->parent->width && py<b->parent->height)
 
918
                        p= parent[px + py*2*stride];
 
919
                }
 
920
                if(/*ll|*/l|lt|t|rt|p){
 
921
                    int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
 
922
 
 
923
                    put_rac(&s->c, &b->state[0][context], !!v);
 
924
                }else{
 
925
                    if(!run){
 
926
                        run= runs[run_index++];
 
927
 
 
928
                        if(run_index <= max_index)
 
929
                            put_symbol2(&s->c, b->state[1], run, 3);
 
930
                        assert(v);
 
931
                    }else{
 
932
                        run--;
 
933
                        assert(!v);
 
934
                    }
 
935
                }
 
936
                if(v){
 
937
                    int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
 
938
                    int l2= 2*FFABS(l) + (l<0);
 
939
                    int t2= 2*FFABS(t) + (t<0);
 
940
 
 
941
                    put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4);
 
942
                    put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
 
943
                }
 
944
            }
 
945
        }
 
946
    }
 
947
    return 0;
 
948
}
 
949
 
 
950
static int encode_subband(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){
 
951
//    encode_subband_qtree(s, b, src, parent, stride, orientation);
 
952
//    encode_subband_z0run(s, b, src, parent, stride, orientation);
 
953
    return encode_subband_c0run(s, b, src, parent, stride, orientation);
 
954
//    encode_subband_dzr(s, b, src, parent, stride, orientation);
 
955
}
 
956
 
 
957
static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){
 
958
    const int b_stride= s->b_width << s->block_max_depth;
 
959
    BlockNode *block= &s->block[mb_x + mb_y * b_stride];
 
960
    BlockNode backup= *block;
 
961
    unsigned value;
 
962
    int rd, index;
 
963
 
 
964
    assert(mb_x>=0 && mb_y>=0);
 
965
    assert(mb_x<b_stride);
 
966
 
 
967
    if(intra){
 
968
        block->color[0] = p[0];
 
969
        block->color[1] = p[1];
 
970
        block->color[2] = p[2];
 
971
        block->type |= BLOCK_INTRA;
 
972
    }else{
 
973
        index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1);
 
974
        value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12);
 
975
        if(s->me_cache[index] == value)
 
976
            return 0;
 
977
        s->me_cache[index]= value;
 
978
 
 
979
        block->mx= p[0];
 
980
        block->my= p[1];
 
981
        block->type &= ~BLOCK_INTRA;
 
982
    }
 
983
 
 
984
    rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged);
 
985
 
 
986
//FIXME chroma
 
987
    if(rd < *best_rd){
 
988
        *best_rd= rd;
 
989
        return 1;
 
990
    }else{
 
991
        *block= backup;
 
992
        return 0;
 
993
    }
 
994
}
 
995
 
 
996
/* special case for int[2] args we discard afterwards,
 
997
 * fixes compilation problem with gcc 2.95 */
 
998
static av_always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){
 
999
    int p[2] = {p0, p1};
 
1000
    return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
 
1001
}
 
1002
 
 
1003
static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd){
 
1004
    const int b_stride= s->b_width << s->block_max_depth;
 
1005
    BlockNode *block= &s->block[mb_x + mb_y * b_stride];
 
1006
    BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]};
 
1007
    unsigned value;
 
1008
    int rd, index;
 
1009
 
 
1010
    assert(mb_x>=0 && mb_y>=0);
 
1011
    assert(mb_x<b_stride);
 
1012
    assert(((mb_x|mb_y)&1) == 0);
 
1013
 
 
1014
    index= (p0 + 31*p1) & (ME_CACHE_SIZE-1);
 
1015
    value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12);
 
1016
    if(s->me_cache[index] == value)
 
1017
        return 0;
 
1018
    s->me_cache[index]= value;
 
1019
 
 
1020
    block->mx= p0;
 
1021
    block->my= p1;
 
1022
    block->ref= ref;
 
1023
    block->type &= ~BLOCK_INTRA;
 
1024
    block[1]= block[b_stride]= block[b_stride+1]= *block;
 
1025
 
 
1026
    rd= get_4block_rd(s, mb_x, mb_y, 0);
 
1027
 
 
1028
//FIXME chroma
 
1029
    if(rd < *best_rd){
 
1030
        *best_rd= rd;
 
1031
        return 1;
 
1032
    }else{
 
1033
        block[0]= backup[0];
 
1034
        block[1]= backup[1];
 
1035
        block[b_stride]= backup[2];
 
1036
        block[b_stride+1]= backup[3];
 
1037
        return 0;
 
1038
    }
 
1039
}
 
1040
 
 
1041
static void iterative_me(SnowContext *s){
 
1042
    int pass, mb_x, mb_y;
 
1043
    const int b_width = s->b_width  << s->block_max_depth;
 
1044
    const int b_height= s->b_height << s->block_max_depth;
 
1045
    const int b_stride= b_width;
 
1046
    int color[3];
 
1047
 
 
1048
    {
 
1049
        RangeCoder r = s->c;
 
1050
        uint8_t state[sizeof(s->block_state)];
 
1051
        memcpy(state, s->block_state, sizeof(s->block_state));
 
1052
        for(mb_y= 0; mb_y<s->b_height; mb_y++)
 
1053
            for(mb_x= 0; mb_x<s->b_width; mb_x++)
 
1054
                encode_q_branch(s, 0, mb_x, mb_y);
 
1055
        s->c = r;
 
1056
        memcpy(s->block_state, state, sizeof(s->block_state));
 
1057
    }
 
1058
 
 
1059
    for(pass=0; pass<25; pass++){
 
1060
        int change= 0;
 
1061
 
 
1062
        for(mb_y= 0; mb_y<b_height; mb_y++){
 
1063
            for(mb_x= 0; mb_x<b_width; mb_x++){
 
1064
                int dia_change, i, j, ref;
 
1065
                int best_rd= INT_MAX, ref_rd;
 
1066
                BlockNode backup, ref_b;
 
1067
                const int index= mb_x + mb_y * b_stride;
 
1068
                BlockNode *block= &s->block[index];
 
1069
                BlockNode *tb =                   mb_y            ? &s->block[index-b_stride  ] : NULL;
 
1070
                BlockNode *lb = mb_x                              ? &s->block[index         -1] : NULL;
 
1071
                BlockNode *rb = mb_x+1<b_width                    ? &s->block[index         +1] : NULL;
 
1072
                BlockNode *bb =                   mb_y+1<b_height ? &s->block[index+b_stride  ] : NULL;
 
1073
                BlockNode *tlb= mb_x           && mb_y            ? &s->block[index-b_stride-1] : NULL;
 
1074
                BlockNode *trb= mb_x+1<b_width && mb_y            ? &s->block[index-b_stride+1] : NULL;
 
1075
                BlockNode *blb= mb_x           && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL;
 
1076
                BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->block[index+b_stride+1] : NULL;
 
1077
                const int b_w= (MB_SIZE >> s->block_max_depth);
 
1078
                uint8_t obmc_edged[b_w*2][b_w*2];
 
1079
 
 
1080
                if(pass && (block->type & BLOCK_OPT))
 
1081
                    continue;
 
1082
                block->type |= BLOCK_OPT;
 
1083
 
 
1084
                backup= *block;
 
1085
 
 
1086
                if(!s->me_cache_generation)
 
1087
                    memset(s->me_cache, 0, sizeof(s->me_cache));
 
1088
                s->me_cache_generation += 1<<22;
 
1089
 
 
1090
                //FIXME precalculate
 
1091
                {
 
1092
                    int x, y;
 
1093
                    memcpy(obmc_edged, obmc_tab[s->block_max_depth], b_w*b_w*4);
 
1094
                    if(mb_x==0)
 
1095
                        for(y=0; y<b_w*2; y++)
 
1096
                            memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
 
1097
                    if(mb_x==b_stride-1)
 
1098
                        for(y=0; y<b_w*2; y++)
 
1099
                            memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
 
1100
                    if(mb_y==0){
 
1101
                        for(x=0; x<b_w*2; x++)
 
1102
                            obmc_edged[0][x] += obmc_edged[b_w-1][x];
 
1103
                        for(y=1; y<b_w; y++)
 
1104
                            memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
 
1105
                    }
 
1106
                    if(mb_y==b_height-1){
 
1107
                        for(x=0; x<b_w*2; x++)
 
1108
                            obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
 
1109
                        for(y=b_w; y<b_w*2-1; y++)
 
1110
                            memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
 
1111
                    }
 
1112
                }
 
1113
 
 
1114
                //skip stuff outside the picture
 
1115
                if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
 
1116
                    uint8_t *src= s->  input_picture.data[0];
 
1117
                    uint8_t *dst= s->current_picture.data[0];
 
1118
                    const int stride= s->current_picture.linesize[0];
 
1119
                    const int block_w= MB_SIZE >> s->block_max_depth;
 
1120
                    const int sx= block_w*mb_x - block_w/2;
 
1121
                    const int sy= block_w*mb_y - block_w/2;
 
1122
                    const int w= s->plane[0].width;
 
1123
                    const int h= s->plane[0].height;
 
1124
                    int y;
 
1125
 
 
1126
                    for(y=sy; y<0; y++)
 
1127
                        memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
 
1128
                    for(y=h; y<sy+block_w*2; y++)
 
1129
                        memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
 
1130
                    if(sx<0){
 
1131
                        for(y=sy; y<sy+block_w*2; y++)
 
1132
                            memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
 
1133
                    }
 
1134
                    if(sx+block_w*2 > w){
 
1135
                        for(y=sy; y<sy+block_w*2; y++)
 
1136
                            memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
 
1137
                    }
 
1138
                }
 
1139
 
 
1140
                // intra(black) = neighbors' contribution to the current block
 
1141
                for(i=0; i<3; i++)
 
1142
                    color[i]= get_dc(s, mb_x, mb_y, i);
 
1143
 
 
1144
                // get previous score (cannot be cached due to OBMC)
 
1145
                if(pass > 0 && (block->type&BLOCK_INTRA)){
 
1146
                    int color0[3]= {block->color[0], block->color[1], block->color[2]};
 
1147
                    check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd);
 
1148
                }else
 
1149
                    check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd);
 
1150
 
 
1151
                ref_b= *block;
 
1152
                ref_rd= best_rd;
 
1153
                for(ref=0; ref < s->ref_frames; ref++){
 
1154
                    int16_t (*mvr)[2]= &s->ref_mvs[ref][index];
 
1155
                    if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold
 
1156
                        continue;
 
1157
                    block->ref= ref;
 
1158
                    best_rd= INT_MAX;
 
1159
 
 
1160
                    check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd);
 
1161
                    check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd);
 
1162
                    if(tb)
 
1163
                        check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd);
 
1164
                    if(lb)
 
1165
                        check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd);
 
1166
                    if(rb)
 
1167
                        check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd);
 
1168
                    if(bb)
 
1169
                        check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd);
 
1170
 
 
1171
                    /* fullpel ME */
 
1172
                    //FIXME avoid subpel interpolation / round to nearest integer
 
1173
                    do{
 
1174
                        dia_change=0;
 
1175
                        for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){
 
1176
                            for(j=0; j<i; j++){
 
1177
                                dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
 
1178
                                dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
 
1179
                                dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
 
1180
                                dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
 
1181
                            }
 
1182
                        }
 
1183
                    }while(dia_change);
 
1184
                    /* subpel ME */
 
1185
                    do{
 
1186
                        static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
 
1187
                        dia_change=0;
 
1188
                        for(i=0; i<8; i++)
 
1189
                            dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd);
 
1190
                    }while(dia_change);
 
1191
                    //FIXME or try the standard 2 pass qpel or similar
 
1192
 
 
1193
                    mvr[0][0]= block->mx;
 
1194
                    mvr[0][1]= block->my;
 
1195
                    if(ref_rd > best_rd){
 
1196
                        ref_rd= best_rd;
 
1197
                        ref_b= *block;
 
1198
                    }
 
1199
                }
 
1200
                best_rd= ref_rd;
 
1201
                *block= ref_b;
 
1202
                check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd);
 
1203
                //FIXME RD style color selection
 
1204
                if(!same_block(block, &backup)){
 
1205
                    if(tb ) tb ->type &= ~BLOCK_OPT;
 
1206
                    if(lb ) lb ->type &= ~BLOCK_OPT;
 
1207
                    if(rb ) rb ->type &= ~BLOCK_OPT;
 
1208
                    if(bb ) bb ->type &= ~BLOCK_OPT;
 
1209
                    if(tlb) tlb->type &= ~BLOCK_OPT;
 
1210
                    if(trb) trb->type &= ~BLOCK_OPT;
 
1211
                    if(blb) blb->type &= ~BLOCK_OPT;
 
1212
                    if(brb) brb->type &= ~BLOCK_OPT;
 
1213
                    change ++;
 
1214
                }
 
1215
            }
 
1216
        }
 
1217
        av_log(s->avctx, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change);
 
1218
        if(!change)
 
1219
            break;
 
1220
    }
 
1221
 
 
1222
    if(s->block_max_depth == 1){
 
1223
        int change= 0;
 
1224
        for(mb_y= 0; mb_y<b_height; mb_y+=2){
 
1225
            for(mb_x= 0; mb_x<b_width; mb_x+=2){
 
1226
                int i;
 
1227
                int best_rd, init_rd;
 
1228
                const int index= mb_x + mb_y * b_stride;
 
1229
                BlockNode *b[4];
 
1230
 
 
1231
                b[0]= &s->block[index];
 
1232
                b[1]= b[0]+1;
 
1233
                b[2]= b[0]+b_stride;
 
1234
                b[3]= b[2]+1;
 
1235
                if(same_block(b[0], b[1]) &&
 
1236
                   same_block(b[0], b[2]) &&
 
1237
                   same_block(b[0], b[3]))
 
1238
                    continue;
 
1239
 
 
1240
                if(!s->me_cache_generation)
 
1241
                    memset(s->me_cache, 0, sizeof(s->me_cache));
 
1242
                s->me_cache_generation += 1<<22;
 
1243
 
 
1244
                init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0);
 
1245
 
 
1246
                //FIXME more multiref search?
 
1247
                check_4block_inter(s, mb_x, mb_y,
 
1248
                                   (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
 
1249
                                   (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
 
1250
 
 
1251
                for(i=0; i<4; i++)
 
1252
                    if(!(b[i]->type&BLOCK_INTRA))
 
1253
                        check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd);
 
1254
 
 
1255
                if(init_rd != best_rd)
 
1256
                    change++;
 
1257
            }
 
1258
        }
 
1259
        av_log(s->avctx, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4);
 
1260
    }
 
1261
}
 
1262
 
 
1263
static void encode_blocks(SnowContext *s, int search){
 
1264
    int x, y;
 
1265
    int w= s->b_width;
 
1266
    int h= s->b_height;
 
1267
 
 
1268
    if(s->avctx->me_method == ME_ITER && !s->keyframe && search)
 
1269
        iterative_me(s);
 
1270
 
 
1271
    for(y=0; y<h; y++){
 
1272
        if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
 
1273
            av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
 
1274
            return;
 
1275
        }
 
1276
        for(x=0; x<w; x++){
 
1277
            if(s->avctx->me_method == ME_ITER || !search)
 
1278
                encode_q_branch2(s, 0, x, y);
 
1279
            else
 
1280
                encode_q_branch (s, 0, x, y);
 
1281
        }
 
1282
    }
 
1283
}
 
1284
 
 
1285
static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias){
 
1286
    const int w= b->width;
 
1287
    const int h= b->height;
 
1288
    const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16);
 
1289
    const int qmul= qexp[qlog&(QROOT-1)]<<((qlog>>QSHIFT) + ENCODER_EXTRA_BITS);
 
1290
    int x,y, thres1, thres2;
 
1291
 
 
1292
    if(s->qlog == LOSSLESS_QLOG){
 
1293
        for(y=0; y<h; y++)
 
1294
            for(x=0; x<w; x++)
 
1295
                dst[x + y*stride]= src[x + y*stride];
 
1296
        return;
 
1297
    }
 
1298
 
 
1299
    bias= bias ? 0 : (3*qmul)>>3;
 
1300
    thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
 
1301
    thres2= 2*thres1;
 
1302
 
 
1303
    if(!bias){
 
1304
        for(y=0; y<h; y++){
 
1305
            for(x=0; x<w; x++){
 
1306
                int i= src[x + y*stride];
 
1307
 
 
1308
                if((unsigned)(i+thres1) > thres2){
 
1309
                    if(i>=0){
 
1310
                        i<<= QEXPSHIFT;
 
1311
                        i/= qmul; //FIXME optimize
 
1312
                        dst[x + y*stride]=  i;
 
1313
                    }else{
 
1314
                        i= -i;
 
1315
                        i<<= QEXPSHIFT;
 
1316
                        i/= qmul; //FIXME optimize
 
1317
                        dst[x + y*stride]= -i;
 
1318
                    }
 
1319
                }else
 
1320
                    dst[x + y*stride]= 0;
 
1321
            }
 
1322
        }
 
1323
    }else{
 
1324
        for(y=0; y<h; y++){
 
1325
            for(x=0; x<w; x++){
 
1326
                int i= src[x + y*stride];
 
1327
 
 
1328
                if((unsigned)(i+thres1) > thres2){
 
1329
                    if(i>=0){
 
1330
                        i<<= QEXPSHIFT;
 
1331
                        i= (i + bias) / qmul; //FIXME optimize
 
1332
                        dst[x + y*stride]=  i;
 
1333
                    }else{
 
1334
                        i= -i;
 
1335
                        i<<= QEXPSHIFT;
 
1336
                        i= (i + bias) / qmul; //FIXME optimize
 
1337
                        dst[x + y*stride]= -i;
 
1338
                    }
 
1339
                }else
 
1340
                    dst[x + y*stride]= 0;
 
1341
            }
 
1342
        }
 
1343
    }
 
1344
}
 
1345
 
 
1346
static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride){
 
1347
    const int w= b->width;
 
1348
    const int h= b->height;
 
1349
    const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16);
 
1350
    const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
 
1351
    const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
 
1352
    int x,y;
 
1353
 
 
1354
    if(s->qlog == LOSSLESS_QLOG) return;
 
1355
 
 
1356
    for(y=0; y<h; y++){
 
1357
        for(x=0; x<w; x++){
 
1358
            int i= src[x + y*stride];
 
1359
            if(i<0){
 
1360
                src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
 
1361
            }else if(i>0){
 
1362
                src[x + y*stride]=  (( i*qmul + qadd)>>(QEXPSHIFT));
 
1363
            }
 
1364
        }
 
1365
    }
 
1366
}
 
1367
 
 
1368
static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){
 
1369
    const int w= b->width;
 
1370
    const int h= b->height;
 
1371
    int x,y;
 
1372
 
 
1373
    for(y=h-1; y>=0; y--){
 
1374
        for(x=w-1; x>=0; x--){
 
1375
            int i= x + y*stride;
 
1376
 
 
1377
            if(x){
 
1378
                if(use_median){
 
1379
                    if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
 
1380
                    else  src[i] -= src[i - 1];
 
1381
                }else{
 
1382
                    if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
 
1383
                    else  src[i] -= src[i - 1];
 
1384
                }
 
1385
            }else{
 
1386
                if(y) src[i] -= src[i - stride];
 
1387
            }
 
1388
        }
 
1389
    }
 
1390
}
 
1391
 
 
1392
static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){
 
1393
    const int w= b->width;
 
1394
    const int h= b->height;
 
1395
    int x,y;
 
1396
 
 
1397
    for(y=0; y<h; y++){
 
1398
        for(x=0; x<w; x++){
 
1399
            int i= x + y*stride;
 
1400
 
 
1401
            if(x){
 
1402
                if(use_median){
 
1403
                    if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
 
1404
                    else  src[i] += src[i - 1];
 
1405
                }else{
 
1406
                    if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
 
1407
                    else  src[i] += src[i - 1];
 
1408
                }
 
1409
            }else{
 
1410
                if(y) src[i] += src[i - stride];
 
1411
            }
 
1412
        }
 
1413
    }
 
1414
}
 
1415
 
 
1416
static void encode_qlogs(SnowContext *s){
 
1417
    int plane_index, level, orientation;
 
1418
 
 
1419
    for(plane_index=0; plane_index<2; plane_index++){
 
1420
        for(level=0; level<s->spatial_decomposition_count; level++){
 
1421
            for(orientation=level ? 1:0; orientation<4; orientation++){
 
1422
                if(orientation==2) continue;
 
1423
                put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
 
1424
            }
 
1425
        }
 
1426
    }
 
1427
}
 
1428
 
 
1429
static void encode_header(SnowContext *s){
 
1430
    int plane_index, i;
 
1431
    uint8_t kstate[32];
 
1432
 
 
1433
    memset(kstate, MID_STATE, sizeof(kstate));
 
1434
 
 
1435
    put_rac(&s->c, kstate, s->keyframe);
 
1436
    if(s->keyframe || s->always_reset){
 
1437
        ff_snow_reset_contexts(s);
 
1438
        s->last_spatial_decomposition_type=
 
1439
        s->last_qlog=
 
1440
        s->last_qbias=
 
1441
        s->last_mv_scale=
 
1442
        s->last_block_max_depth= 0;
 
1443
        for(plane_index=0; plane_index<2; plane_index++){
 
1444
            Plane *p= &s->plane[plane_index];
 
1445
            p->last_htaps=0;
 
1446
            p->last_diag_mc=0;
 
1447
            memset(p->last_hcoeff, 0, sizeof(p->last_hcoeff));
 
1448
        }
 
1449
    }
 
1450
    if(s->keyframe){
 
1451
        put_symbol(&s->c, s->header_state, s->version, 0);
 
1452
        put_rac(&s->c, s->header_state, s->always_reset);
 
1453
        put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
 
1454
        put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
 
1455
        put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
 
1456
        put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
 
1457
        put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
 
1458
        put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
 
1459
        put_rac(&s->c, s->header_state, s->spatial_scalability);
 
1460
//        put_rac(&s->c, s->header_state, s->rate_scalability);
 
1461
        put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0);
 
1462
 
 
1463
        encode_qlogs(s);
 
1464
    }
 
1465
 
 
1466
    if(!s->keyframe){
 
1467
        int update_mc=0;
 
1468
        for(plane_index=0; plane_index<2; plane_index++){
 
1469
            Plane *p= &s->plane[plane_index];
 
1470
            update_mc |= p->last_htaps   != p->htaps;
 
1471
            update_mc |= p->last_diag_mc != p->diag_mc;
 
1472
            update_mc |= !!memcmp(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff));
 
1473
        }
 
1474
        put_rac(&s->c, s->header_state, update_mc);
 
1475
        if(update_mc){
 
1476
            for(plane_index=0; plane_index<2; plane_index++){
 
1477
                Plane *p= &s->plane[plane_index];
 
1478
                put_rac(&s->c, s->header_state, p->diag_mc);
 
1479
                put_symbol(&s->c, s->header_state, p->htaps/2-1, 0);
 
1480
                for(i= p->htaps/2; i; i--)
 
1481
                    put_symbol(&s->c, s->header_state, FFABS(p->hcoeff[i]), 0);
 
1482
            }
 
1483
        }
 
1484
        if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){
 
1485
            put_rac(&s->c, s->header_state, 1);
 
1486
            put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
 
1487
            encode_qlogs(s);
 
1488
        }else
 
1489
            put_rac(&s->c, s->header_state, 0);
 
1490
    }
 
1491
 
 
1492
    put_symbol(&s->c, s->header_state, s->spatial_decomposition_type - s->last_spatial_decomposition_type, 1);
 
1493
    put_symbol(&s->c, s->header_state, s->qlog            - s->last_qlog    , 1);
 
1494
    put_symbol(&s->c, s->header_state, s->mv_scale        - s->last_mv_scale, 1);
 
1495
    put_symbol(&s->c, s->header_state, s->qbias           - s->last_qbias   , 1);
 
1496
    put_symbol(&s->c, s->header_state, s->block_max_depth - s->last_block_max_depth, 1);
 
1497
 
 
1498
}
 
1499
 
 
1500
static void update_last_header_values(SnowContext *s){
 
1501
    int plane_index;
 
1502
 
 
1503
    if(!s->keyframe){
 
1504
        for(plane_index=0; plane_index<2; plane_index++){
 
1505
            Plane *p= &s->plane[plane_index];
 
1506
            p->last_diag_mc= p->diag_mc;
 
1507
            p->last_htaps  = p->htaps;
 
1508
            memcpy(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff));
 
1509
        }
 
1510
    }
 
1511
 
 
1512
    s->last_spatial_decomposition_type  = s->spatial_decomposition_type;
 
1513
    s->last_qlog                        = s->qlog;
 
1514
    s->last_qbias                       = s->qbias;
 
1515
    s->last_mv_scale                    = s->mv_scale;
 
1516
    s->last_block_max_depth             = s->block_max_depth;
 
1517
    s->last_spatial_decomposition_count = s->spatial_decomposition_count;
 
1518
}
 
1519
 
 
1520
static int qscale2qlog(int qscale){
 
1521
    return rint(QROOT*log(qscale / (float)FF_QP2LAMBDA)/log(2))
 
1522
           + 61*QROOT/8; ///< 64 > 60
 
1523
}
 
1524
 
 
1525
static int ratecontrol_1pass(SnowContext *s, AVFrame *pict)
 
1526
{
 
1527
    /* Estimate the frame's complexity as a sum of weighted dwt coefficients.
 
1528
     * FIXME we know exact mv bits at this point,
 
1529
     * but ratecontrol isn't set up to include them. */
 
1530
    uint32_t coef_sum= 0;
 
1531
    int level, orientation, delta_qlog;
 
1532
 
 
1533
    for(level=0; level<s->spatial_decomposition_count; level++){
 
1534
        for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
1535
            SubBand *b= &s->plane[0].band[level][orientation];
 
1536
            IDWTELEM *buf= b->ibuf;
 
1537
            const int w= b->width;
 
1538
            const int h= b->height;
 
1539
            const int stride= b->stride;
 
1540
            const int qlog= av_clip(2*QROOT + b->qlog, 0, QROOT*16);
 
1541
            const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
 
1542
            const int qdiv= (1<<16)/qmul;
 
1543
            int x, y;
 
1544
            //FIXME this is ugly
 
1545
            for(y=0; y<h; y++)
 
1546
                for(x=0; x<w; x++)
 
1547
                    buf[x+y*stride]= b->buf[x+y*stride];
 
1548
            if(orientation==0)
 
1549
                decorrelate(s, b, buf, stride, 1, 0);
 
1550
            for(y=0; y<h; y++)
 
1551
                for(x=0; x<w; x++)
 
1552
                    coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
 
1553
        }
 
1554
    }
 
1555
 
 
1556
    /* ugly, ratecontrol just takes a sqrt again */
 
1557
    coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
 
1558
    assert(coef_sum < INT_MAX);
 
1559
 
 
1560
    if(pict->pict_type == AV_PICTURE_TYPE_I){
 
1561
        s->m.current_picture.mb_var_sum= coef_sum;
 
1562
        s->m.current_picture.mc_mb_var_sum= 0;
 
1563
    }else{
 
1564
        s->m.current_picture.mc_mb_var_sum= coef_sum;
 
1565
        s->m.current_picture.mb_var_sum= 0;
 
1566
    }
 
1567
 
 
1568
    pict->quality= ff_rate_estimate_qscale(&s->m, 1);
 
1569
    if (pict->quality < 0)
 
1570
        return INT_MIN;
 
1571
    s->lambda= pict->quality * 3/2;
 
1572
    delta_qlog= qscale2qlog(pict->quality) - s->qlog;
 
1573
    s->qlog+= delta_qlog;
 
1574
    return delta_qlog;
 
1575
}
 
1576
 
 
1577
static void calculate_visual_weight(SnowContext *s, Plane *p){
 
1578
    int width = p->width;
 
1579
    int height= p->height;
 
1580
    int level, orientation, x, y;
 
1581
 
 
1582
    for(level=0; level<s->spatial_decomposition_count; level++){
 
1583
        for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
1584
            SubBand *b= &p->band[level][orientation];
 
1585
            IDWTELEM *ibuf= b->ibuf;
 
1586
            int64_t error=0;
 
1587
 
 
1588
            memset(s->spatial_idwt_buffer, 0, sizeof(*s->spatial_idwt_buffer)*width*height);
 
1589
            ibuf[b->width/2 + b->height/2*b->stride]= 256*16;
 
1590
            ff_spatial_idwt(s->spatial_idwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
 
1591
            for(y=0; y<height; y++){
 
1592
                for(x=0; x<width; x++){
 
1593
                    int64_t d= s->spatial_idwt_buffer[x + y*width]*16;
 
1594
                    error += d*d;
 
1595
                }
 
1596
            }
 
1597
 
 
1598
            b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
 
1599
        }
 
1600
    }
 
1601
}
 
1602
 
 
1603
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
 
1604
    SnowContext *s = avctx->priv_data;
 
1605
    RangeCoder * const c= &s->c;
 
1606
    AVFrame *pict = data;
 
1607
    const int width= s->avctx->width;
 
1608
    const int height= s->avctx->height;
 
1609
    int level, orientation, plane_index, i, y;
 
1610
    uint8_t rc_header_bak[sizeof(s->header_state)];
 
1611
    uint8_t rc_block_bak[sizeof(s->block_state)];
 
1612
 
 
1613
    ff_init_range_encoder(c, buf, buf_size);
 
1614
    ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
 
1615
 
 
1616
    for(i=0; i<3; i++){
 
1617
        int shift= !!i;
 
1618
        for(y=0; y<(height>>shift); y++)
 
1619
            memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]],
 
1620
                   &pict->data[i][y * pict->linesize[i]],
 
1621
                   width>>shift);
 
1622
    }
 
1623
    s->new_picture = *pict;
 
1624
 
 
1625
    s->m.picture_number= avctx->frame_number;
 
1626
    if(avctx->flags&CODEC_FLAG_PASS2){
 
1627
        s->m.pict_type =
 
1628
        pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
 
1629
        s->keyframe= pict->pict_type==AV_PICTURE_TYPE_I;
 
1630
        if(!(avctx->flags&CODEC_FLAG_QSCALE)) {
 
1631
            pict->quality= ff_rate_estimate_qscale(&s->m, 0);
 
1632
            if (pict->quality < 0)
 
1633
                return -1;
 
1634
        }
 
1635
    }else{
 
1636
        s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
 
1637
        s->m.pict_type=
 
1638
        pict->pict_type= s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
 
1639
    }
 
1640
 
 
1641
    if(s->pass1_rc && avctx->frame_number == 0)
 
1642
        pict->quality= 2*FF_QP2LAMBDA;
 
1643
    if(pict->quality){
 
1644
        s->qlog= qscale2qlog(pict->quality);
 
1645
        s->lambda = pict->quality * 3/2;
 
1646
    }
 
1647
    if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){
 
1648
        s->qlog= LOSSLESS_QLOG;
 
1649
        s->lambda = 0;
 
1650
    }//else keep previous frame's qlog until after motion estimation
 
1651
 
 
1652
    ff_snow_frame_start(s);
 
1653
 
 
1654
    s->m.current_picture_ptr= &s->m.current_picture;
 
1655
    s->m.last_picture.f.pts = s->m.current_picture.f.pts;
 
1656
    s->m.current_picture.f.pts = pict->pts;
 
1657
    if(pict->pict_type == AV_PICTURE_TYPE_P){
 
1658
        int block_width = (width +15)>>4;
 
1659
        int block_height= (height+15)>>4;
 
1660
        int stride= s->current_picture.linesize[0];
 
1661
 
 
1662
        assert(s->current_picture.data[0]);
 
1663
        assert(s->last_picture[0].data[0]);
 
1664
 
 
1665
        s->m.avctx= s->avctx;
 
1666
        s->m.current_picture.f.data[0] = s->current_picture.data[0];
 
1667
        s->m.   last_picture.f.data[0] = s->last_picture[0].data[0];
 
1668
        s->m.    new_picture.f.data[0] = s->  input_picture.data[0];
 
1669
        s->m.   last_picture_ptr= &s->m.   last_picture;
 
1670
        s->m.linesize=
 
1671
        s->m.   last_picture.f.linesize[0] =
 
1672
        s->m.    new_picture.f.linesize[0] =
 
1673
        s->m.current_picture.f.linesize[0] = stride;
 
1674
        s->m.uvlinesize= s->current_picture.linesize[1];
 
1675
        s->m.width = width;
 
1676
        s->m.height= height;
 
1677
        s->m.mb_width = block_width;
 
1678
        s->m.mb_height= block_height;
 
1679
        s->m.mb_stride=   s->m.mb_width+1;
 
1680
        s->m.b8_stride= 2*s->m.mb_width+1;
 
1681
        s->m.f_code=1;
 
1682
        s->m.pict_type= pict->pict_type;
 
1683
        s->m.me_method= s->avctx->me_method;
 
1684
        s->m.me.scene_change_score=0;
 
1685
        s->m.flags= s->avctx->flags;
 
1686
        s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
 
1687
        s->m.out_format= FMT_H263;
 
1688
        s->m.unrestricted_mv= 1;
 
1689
 
 
1690
        s->m.lambda = s->lambda;
 
1691
        s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
 
1692
        s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
 
1693
 
 
1694
        s->m.dsp= s->dsp; //move
 
1695
        ff_init_me(&s->m);
 
1696
        s->dsp= s->m.dsp;
 
1697
    }
 
1698
 
 
1699
    if(s->pass1_rc){
 
1700
        memcpy(rc_header_bak, s->header_state, sizeof(s->header_state));
 
1701
        memcpy(rc_block_bak, s->block_state, sizeof(s->block_state));
 
1702
    }
 
1703
 
 
1704
redo_frame:
 
1705
 
 
1706
    if(pict->pict_type == AV_PICTURE_TYPE_I)
 
1707
        s->spatial_decomposition_count= 5;
 
1708
    else
 
1709
        s->spatial_decomposition_count= 5;
 
1710
 
 
1711
    s->m.pict_type = pict->pict_type;
 
1712
    s->qbias= pict->pict_type == AV_PICTURE_TYPE_P ? 2 : 0;
 
1713
 
 
1714
    ff_snow_common_init_after_header(avctx);
 
1715
 
 
1716
    if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){
 
1717
        for(plane_index=0; plane_index<3; plane_index++){
 
1718
            calculate_visual_weight(s, &s->plane[plane_index]);
 
1719
        }
 
1720
    }
 
1721
 
 
1722
    encode_header(s);
 
1723
    s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start);
 
1724
    encode_blocks(s, 1);
 
1725
    s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits;
 
1726
 
 
1727
    for(plane_index=0; plane_index<3; plane_index++){
 
1728
        Plane *p= &s->plane[plane_index];
 
1729
        int w= p->width;
 
1730
        int h= p->height;
 
1731
        int x, y;
 
1732
//        int bits= put_bits_count(&s->c.pb);
 
1733
 
 
1734
        if (!s->memc_only) {
 
1735
            //FIXME optimize
 
1736
            if(pict->data[plane_index]) //FIXME gray hack
 
1737
                for(y=0; y<h; y++){
 
1738
                    for(x=0; x<w; x++){
 
1739
                        s->spatial_idwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
 
1740
                    }
 
1741
                }
 
1742
            predict_plane(s, s->spatial_idwt_buffer, plane_index, 0);
 
1743
 
 
1744
            if(   plane_index==0
 
1745
               && pict->pict_type == AV_PICTURE_TYPE_P
 
1746
               && !(avctx->flags&CODEC_FLAG_PASS2)
 
1747
               && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
 
1748
                ff_init_range_encoder(c, buf, buf_size);
 
1749
                ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
 
1750
                pict->pict_type= AV_PICTURE_TYPE_I;
 
1751
                s->keyframe=1;
 
1752
                s->current_picture.key_frame=1;
 
1753
                goto redo_frame;
 
1754
            }
 
1755
 
 
1756
            if(s->qlog == LOSSLESS_QLOG){
 
1757
                for(y=0; y<h; y++){
 
1758
                    for(x=0; x<w; x++){
 
1759
                        s->spatial_dwt_buffer[y*w + x]= (s->spatial_idwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS;
 
1760
                    }
 
1761
                }
 
1762
            }else{
 
1763
                for(y=0; y<h; y++){
 
1764
                    for(x=0; x<w; x++){
 
1765
                        s->spatial_dwt_buffer[y*w + x]=s->spatial_idwt_buffer[y*w + x]<<ENCODER_EXTRA_BITS;
 
1766
                    }
 
1767
                }
 
1768
            }
 
1769
 
 
1770
            /*  if(QUANTIZE2)
 
1771
                dwt_quantize(s, p, s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type);
 
1772
            else*/
 
1773
                ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
 
1774
 
 
1775
            if(s->pass1_rc && plane_index==0){
 
1776
                int delta_qlog = ratecontrol_1pass(s, pict);
 
1777
                if (delta_qlog <= INT_MIN)
 
1778
                    return -1;
 
1779
                if(delta_qlog){
 
1780
                    //reordering qlog in the bitstream would eliminate this reset
 
1781
                    ff_init_range_encoder(c, buf, buf_size);
 
1782
                    memcpy(s->header_state, rc_header_bak, sizeof(s->header_state));
 
1783
                    memcpy(s->block_state, rc_block_bak, sizeof(s->block_state));
 
1784
                    encode_header(s);
 
1785
                    encode_blocks(s, 0);
 
1786
                }
 
1787
            }
 
1788
 
 
1789
            for(level=0; level<s->spatial_decomposition_count; level++){
 
1790
                for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
1791
                    SubBand *b= &p->band[level][orientation];
 
1792
 
 
1793
                    if(!QUANTIZE2)
 
1794
                        quantize(s, b, b->ibuf, b->buf, b->stride, s->qbias);
 
1795
                    if(orientation==0)
 
1796
                        decorrelate(s, b, b->ibuf, b->stride, pict->pict_type == AV_PICTURE_TYPE_P, 0);
 
1797
                    encode_subband(s, b, b->ibuf, b->parent ? b->parent->ibuf : NULL, b->stride, orientation);
 
1798
                    assert(b->parent==NULL || b->parent->stride == b->stride*2);
 
1799
                    if(orientation==0)
 
1800
                        correlate(s, b, b->ibuf, b->stride, 1, 0);
 
1801
                }
 
1802
            }
 
1803
 
 
1804
            for(level=0; level<s->spatial_decomposition_count; level++){
 
1805
                for(orientation=level ? 1 : 0; orientation<4; orientation++){
 
1806
                    SubBand *b= &p->band[level][orientation];
 
1807
 
 
1808
                    dequantize(s, b, b->ibuf, b->stride);
 
1809
                }
 
1810
            }
 
1811
 
 
1812
            ff_spatial_idwt(s->spatial_idwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
 
1813
            if(s->qlog == LOSSLESS_QLOG){
 
1814
                for(y=0; y<h; y++){
 
1815
                    for(x=0; x<w; x++){
 
1816
                        s->spatial_idwt_buffer[y*w + x]<<=FRAC_BITS;
 
1817
                    }
 
1818
                }
 
1819
            }
 
1820
            predict_plane(s, s->spatial_idwt_buffer, plane_index, 1);
 
1821
        }else{
 
1822
            //ME/MC only
 
1823
            if(pict->pict_type == AV_PICTURE_TYPE_I){
 
1824
                for(y=0; y<h; y++){
 
1825
                    for(x=0; x<w; x++){
 
1826
                        s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]=
 
1827
                            pict->data[plane_index][y*pict->linesize[plane_index] + x];
 
1828
                    }
 
1829
                }
 
1830
            }else{
 
1831
                memset(s->spatial_idwt_buffer, 0, sizeof(IDWTELEM)*w*h);
 
1832
                predict_plane(s, s->spatial_idwt_buffer, plane_index, 1);
 
1833
            }
 
1834
        }
 
1835
        if(s->avctx->flags&CODEC_FLAG_PSNR){
 
1836
            int64_t error= 0;
 
1837
 
 
1838
            if(pict->data[plane_index]) //FIXME gray hack
 
1839
                for(y=0; y<h; y++){
 
1840
                    for(x=0; x<w; x++){
 
1841
                        int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x];
 
1842
                        error += d*d;
 
1843
                    }
 
1844
                }
 
1845
            s->avctx->error[plane_index] += error;
 
1846
            s->current_picture.error[plane_index] = error;
 
1847
        }
 
1848
 
 
1849
    }
 
1850
 
 
1851
    update_last_header_values(s);
 
1852
 
 
1853
    ff_snow_release_buffer(avctx);
 
1854
 
 
1855
    s->current_picture.coded_picture_number = avctx->frame_number;
 
1856
    s->current_picture.pict_type = pict->pict_type;
 
1857
    s->current_picture.quality = pict->quality;
 
1858
    s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start);
 
1859
    s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits;
 
1860
    s->m.current_picture.f.display_picture_number =
 
1861
    s->m.current_picture.f.coded_picture_number   = avctx->frame_number;
 
1862
    s->m.current_picture.f.quality                = pict->quality;
 
1863
    s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
 
1864
    if(s->pass1_rc)
 
1865
        if (ff_rate_estimate_qscale(&s->m, 0) < 0)
 
1866
            return -1;
 
1867
    if(avctx->flags&CODEC_FLAG_PASS1)
 
1868
        ff_write_pass1_stats(&s->m);
 
1869
    s->m.last_pict_type = s->m.pict_type;
 
1870
    avctx->frame_bits = s->m.frame_bits;
 
1871
    avctx->mv_bits = s->m.mv_bits;
 
1872
    avctx->misc_bits = s->m.misc_bits;
 
1873
    avctx->p_tex_bits = s->m.p_tex_bits;
 
1874
 
 
1875
    emms_c();
 
1876
 
 
1877
    return ff_rac_terminate(c);
 
1878
}
 
1879
 
 
1880
static av_cold int encode_end(AVCodecContext *avctx)
 
1881
{
 
1882
    SnowContext *s = avctx->priv_data;
 
1883
 
 
1884
    ff_snow_common_end(s);
 
1885
    if (s->input_picture.data[0])
 
1886
        avctx->release_buffer(avctx, &s->input_picture);
 
1887
    av_free(avctx->stats_out);
 
1888
 
 
1889
    return 0;
 
1890
}
 
1891
 
 
1892
#define OFFSET(x) offsetof(SnowContext, x)
 
1893
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 
1894
static const AVOption options[] = {
 
1895
    { "memc_only",      "Only do ME/MC (I frames -> ref, P frame -> ME+MC).",   OFFSET(memc_only), AV_OPT_TYPE_INT, { 0 }, 0, 1, VE },
 
1896
    { NULL },
 
1897
};
 
1898
 
 
1899
static const AVClass snowenc_class = {
 
1900
    .class_name = "snow encoder",
 
1901
    .item_name  = av_default_item_name,
 
1902
    .option     = options,
 
1903
    .version    = LIBAVUTIL_VERSION_INT,
 
1904
};
 
1905
 
 
1906
AVCodec ff_snow_encoder = {
 
1907
    .name           = "snow",
 
1908
    .type           = AVMEDIA_TYPE_VIDEO,
 
1909
    .id             = CODEC_ID_SNOW,
 
1910
    .priv_data_size = sizeof(SnowContext),
 
1911
    .init           = encode_init,
 
1912
    .encode         = encode_frame,
 
1913
    .close          = encode_end,
 
1914
    .long_name = NULL_IF_CONFIG_SMALL("Snow"),
 
1915
    .priv_class     = &snowenc_class,
 
1916
};
 
1917
#endif