2
* FFV1 codec for libavcodec
4
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6
* This library 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 of the License, or (at your option) any later version.
11
* This library 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.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
* FF Video Codec 1 (a experimental lossless codec)
34
#define CONTEXT_SIZE 32
36
static const int8_t quant3[256]={
37
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
54
static const int8_t quant5[256]={
55
0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
57
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
58
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
59
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
60
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
61
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
62
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
63
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
64
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
65
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
66
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
67
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
68
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
69
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
72
static const int8_t quant7[256]={
73
0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
74
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
75
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
76
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
77
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
78
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
79
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
80
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
81
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
82
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
83
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
84
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
85
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
86
-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
87
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
88
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
90
static const int8_t quant9[256]={
91
0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
92
3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
93
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
94
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
95
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
96
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
98
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
99
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
100
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
101
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
102
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
103
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
104
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
105
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
106
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
108
static const int8_t quant11[256]={
109
0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
110
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
111
4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
112
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
113
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
114
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
115
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
116
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
117
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
118
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
119
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
120
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
121
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
122
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
123
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
124
-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
126
static const int8_t quant13[256]={
127
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
128
4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
129
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130
5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
131
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
132
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
133
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
134
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
135
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
136
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
137
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
138
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
139
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
140
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
141
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
145
static const uint8_t log2_run[32]={
146
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
147
4, 4, 5, 5, 6, 6, 7, 7,
148
8, 9,10,11,12,13,14,15,
151
typedef struct VlcState{
158
typedef struct PlaneContext{
160
uint8_t (*state)[CONTEXT_SIZE];
162
uint8_t interlace_bit_state[2];
165
typedef struct FFV1Context{
166
AVCodecContext *avctx;
172
int chroma_h_shift, chroma_v_shift;
177
int ac; ///< 1-> CABAC 0-> golomb rice
178
PlaneContext plane[MAX_PLANES];
179
int16_t quant_table[5][256];
184
static inline int predict(uint8_t *src, uint8_t *last){
185
const int LT= last[-1];
186
const int T= last[ 0];
187
const int L = src[-1];
189
return mid_pred(L, L + T - LT, T);
192
static inline int get_context(FFV1Context *f, uint8_t *src, uint8_t *last, uint8_t *last2){
193
const int LT= last[-1];
194
const int T= last[ 0];
195
const int RT= last[ 1];
196
const int L = src[-1];
198
if(f->quant_table[3][127]){
199
const int TT= last2[0];
200
const int LL= src[-2];
201
return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
202
+f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
204
return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
210
static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed, int max_exp){
215
const int e= av_log2(a);
217
put_cabac(c, state+0, 0);
220
put_cabac(c, state+1+i, 1); //1..8
224
put_cabac(c, state+1+i, 0); //1..8
226
for(i=e-1; i>=0; i--){
227
put_cabac(c, state+16+e+i, (a>>i)&1); //17..29
230
put_cabac(c, state+9 + e, v < 0); //9..16
233
put_cabac(c, state+0, 1);
237
static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed, int max_exp){
238
if(get_cabac(c, state+0))
243
for(e=0; e<max_exp; e++){
246
if(get_cabac(c, state + 1 + e)==0){ // 1..8
247
for(i=e-1; i>=0; i--){
248
a += get_cabac(c, state+16+e+i)<<i; //17..29
251
if(is_signed && get_cabac(c, state+9 + e)) //9..16
261
static inline void update_vlc_state(VlcState * const state, const int v){
262
int drift= state->drift;
263
int count= state->count;
264
state->error_sum += ABS(v);
267
if(count == 128){ //FIXME variable
270
state->error_sum >>= 1;
275
if(state->bias > -128) state->bias--;
281
if(state->bias < 127) state->bias++;
292
static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v){
294
//printf("final: %d ", v);
295
v = (int8_t)(v - state->bias);
299
while(i < state->error_sum){ //FIXME optimize
307
if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
310
code= v ^ ((2*state->drift + state->count)>>31);
315
//printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k);
316
set_ur_golomb(pb, code, k, 12, 8);
318
update_vlc_state(state, v);
321
static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state){
326
while(i < state->error_sum){ //FIXME optimize
333
v= get_ur_golomb(gb, k, 12, 8);
334
//printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
341
if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
343
v ^= ((2*state->drift + state->count)>>31);
346
ret= (int8_t)(v + state->bias);
348
update_vlc_state(state, v);
349
//printf("final: %d\n", ret);
355
static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
356
PlaneContext * const p= &s->plane[plane_index];
357
CABACContext * const c= &s->c;
359
uint8_t sample_buffer[2][w+6];
360
uint8_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
363
memset(sample_buffer, 0, sizeof(sample_buffer));
366
uint8_t *temp= sample[0]; //FIXME try a normal buffer
370
sample[0]= sample[1];
373
sample[1][-1]= sample[0][0 ];
374
sample[0][ w]= sample[0][w-1];
377
uint8_t *temp_src= src + x + stride*y;
380
context= get_context(s, sample[1]+x, sample[0]+x, sample[1]+x);
381
diff= temp_src[0] - predict(sample[1]+x, sample[0]+x);
391
put_symbol(c, p->state[context], diff, 1, 7);
393
if(context == 0) run_mode=1;
398
while(run_count >= 1<<log2_run[run_index]){
399
run_count -= 1<<log2_run[run_index];
401
put_bits(&s->pb, 1, 1);
404
put_bits(&s->pb, 1 + log2_run[run_index], run_count);
405
if(run_index) run_index--;
414
// printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)get_bit_count(&s->pb));
417
put_vlc_symbol(&s->pb, &p->vlc_state[context], diff);
420
sample[1][x]= temp_src[0];
423
while(run_count >= 1<<log2_run[run_index]){
424
run_count -= 1<<log2_run[run_index];
426
put_bits(&s->pb, 1, 1);
430
put_bits(&s->pb, 1, 1);
435
static void write_quant_table(CABACContext *c, int16_t *quant_table){
438
uint8_t state[CONTEXT_SIZE]={0};
440
for(i=1; i<128 ; i++){
441
if(quant_table[i] != quant_table[i-1]){
442
put_symbol(c, state, i-last-1, 0, 7);
446
put_symbol(c, state, i-last-1, 0, 7);
449
static void write_header(FFV1Context *f){
450
uint8_t state[CONTEXT_SIZE]={0};
452
CABACContext * const c= &f->c;
454
put_symbol(c, state, f->version, 0, 7);
455
put_symbol(c, state, f->avctx->coder_type, 0, 7);
456
put_symbol(c, state, 0, 0, 7); //YUV cs type
457
put_cabac(c, state, 1); //chroma planes
458
put_symbol(c, state, f->chroma_h_shift, 0, 7);
459
put_symbol(c, state, f->chroma_v_shift, 0, 7);
460
put_cabac(c, state, 0); //no transparency plane
463
write_quant_table(c, f->quant_table[i]);
466
static int common_init(AVCodecContext *avctx){
467
FFV1Context *s = avctx->priv_data;
471
s->flags= avctx->flags;
473
dsputil_init(&s->dsp, avctx);
475
width= s->width= avctx->width;
476
height= s->height= avctx->height;
478
assert(width && height);
483
static int encode_init(AVCodecContext *avctx)
485
FFV1Context *s = avctx->priv_data;
491
s->ac= avctx->coder_type;
494
for(i=0; i<256; i++){
495
s->quant_table[0][i]= quant11[i];
496
s->quant_table[1][i]= 11*quant11[i];
497
if(avctx->context_model==0){
498
s->quant_table[2][i]= 11*11*quant11[i];
499
s->quant_table[3][i]=
500
s->quant_table[4][i]=0;
502
s->quant_table[2][i]= 11*11*quant5 [i];
503
s->quant_table[3][i]= 5*11*11*quant5 [i];
504
s->quant_table[4][i]= 5*5*11*11*quant5 [i];
508
for(i=0; i<s->plane_count; i++){
509
PlaneContext * const p= &s->plane[i];
511
if(avctx->context_model==0){
512
p->context_count= (11*11*11+1)/2;
514
p->context_count= (11*11*5*5*5+1)/2;
518
if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
520
if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
524
avctx->coded_frame= &s->picture;
525
switch(avctx->pix_fmt){
526
case PIX_FMT_YUV444P:
527
case PIX_FMT_YUV422P:
528
case PIX_FMT_YUV420P:
529
case PIX_FMT_YUV411P:
530
case PIX_FMT_YUV410P:
531
avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
534
fprintf(stderr, "format not supported\n");
545
static void clear_state(FFV1Context *f){
548
for(i=0; i<f->plane_count; i++){
549
PlaneContext *p= &f->plane[i];
551
p->interlace_bit_state[0]= 0;
552
p->interlace_bit_state[1]= 0;
554
for(j=0; j<p->context_count; j++){
556
memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE);
557
p->state[j][7] = 2*62;
559
p->vlc_state[j].drift= 0;
560
p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
561
p->vlc_state[j].bias= 0;
562
p->vlc_state[j].count= 1;
568
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
569
FFV1Context *f = avctx->priv_data;
570
CABACContext * const c= &f->c;
571
AVFrame *pict = data;
572
const int width= f->width;
573
const int height= f->height;
574
AVFrame * const p= &f->picture;
577
if(avctx->strict_std_compliance >= 0){
578
printf("this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
579
"use vstrict=-1 to use it anyway\n");
583
ff_init_cabac_encoder(c, buf, buf_size);
584
ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
587
p->pict_type= FF_I_TYPE;
589
if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
590
put_cabac_bypass(c, 1);
595
put_cabac_bypass(c, 0);
600
used_count += put_cabac_terminate(c, 1);
601
//printf("pos=%d\n", used_count);
602
init_put_bits(&f->pb, buf + used_count, buf_size - used_count, NULL, NULL);
606
const int chroma_width = -((-width )>>f->chroma_h_shift);
607
const int chroma_height= -((-height)>>f->chroma_v_shift);
609
encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
611
encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
612
encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
619
return put_cabac_terminate(c, 1);
621
flush_put_bits(&f->pb); //nicer padding FIXME
622
return used_count + (get_bit_count(&f->pb)+7)/8;
626
static void common_end(FFV1Context *s){
629
for(i=0; i<s->plane_count; i++){
630
PlaneContext *p= &s->plane[i];
636
static int encode_end(AVCodecContext *avctx)
638
FFV1Context *s = avctx->priv_data;
645
static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
646
PlaneContext * const p= &s->plane[plane_index];
647
CABACContext * const c= &s->c;
649
uint8_t sample_buffer[2][w+6];
650
uint8_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
653
memset(sample_buffer, 0, sizeof(sample_buffer));
656
uint8_t *temp= sample[0]; //FIXME try a normal buffer
660
sample[0]= sample[1];
663
sample[1][-1]= sample[0][0 ];
664
sample[0][ w]= sample[0][w-1];
667
uint8_t *temp_src= src + x + stride*y;
668
int diff, context, sign;
670
context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
679
diff= get_symbol(c, p->state[context], 1, 7);
681
if(context == 0 && run_mode==0) run_mode=1;
684
if(run_count==0 && run_mode==1){
685
if(get_bits1(&s->gb)){
686
run_count = 1<<log2_run[run_index];
687
if(x + run_count <= w) run_index++;
689
if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
691
if(run_index) run_index--;
699
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
704
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
706
// printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb));
709
if(sign) diff= (int8_t)(-diff); //FIXME remove cast
712
temp_src[0] = predict(sample[1] + x, sample[0] + x) + diff;
714
assert(diff>= -128 && diff <= 127);
719
static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
722
uint8_t state[CONTEXT_SIZE]={0};
724
for(v=0; i<128 ; v++){
725
int len= get_symbol(c, state, 0, 7) + 1;
727
if(len + i > 128) return -1;
730
quant_table[i] = scale*v;
733
//if(i%16==0) printf("\n");
737
for(i=1; i<128; i++){
738
quant_table[256-i]= -quant_table[i];
740
quant_table[128]= -quant_table[127];
745
static int read_header(FFV1Context *f){
746
uint8_t state[CONTEXT_SIZE]={0};
747
int i, context_count;
748
CABACContext * const c= &f->c;
750
f->version= get_symbol(c, state, 0, 7);
751
f->ac= f->avctx->coder_type= get_symbol(c, state, 0, 7);
752
get_symbol(c, state, 0, 7); //YUV cs type
753
get_cabac(c, state); //no chroma = false
754
f->chroma_h_shift= get_symbol(c, state, 0, 7);
755
f->chroma_v_shift= get_symbol(c, state, 0, 7);
756
get_cabac(c, state); //transparency plane
759
switch(16*f->chroma_h_shift + f->chroma_v_shift){
760
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
761
case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
762
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
763
case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
764
case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
766
fprintf(stderr, "format not supported\n");
769
//printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
773
context_count*= read_quant_table(c, f->quant_table[i], context_count);
774
if(context_count < 0){
775
printf("read_quant_table error\n");
779
context_count= (context_count+1)/2;
781
for(i=0; i<f->plane_count; i++){
782
PlaneContext * const p= &f->plane[i];
784
p->context_count= context_count;
787
if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
789
if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
796
static int decode_init(AVCodecContext *avctx)
798
// FFV1Context *s = avctx->priv_data;
803
switch(s->bitstream_bpp){
805
avctx->pix_fmt = PIX_FMT_YUV420P;
808
avctx->pix_fmt = PIX_FMT_YUV422P;
813
avctx->pix_fmt = PIX_FMT_RGBA32;
815
avctx->pix_fmt = PIX_FMT_BGR24;
826
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
827
FFV1Context *f = avctx->priv_data;
828
CABACContext * const c= &f->c;
829
const int width= f->width;
830
const int height= f->height;
831
AVFrame * const p= &f->picture;
834
AVFrame *picture = data;
838
/* no supplementary picture */
842
ff_init_cabac_decoder(c, buf, buf_size);
843
ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
845
p->pict_type= FF_I_TYPE; //FIXME I vs. P
846
if(get_cabac_bypass(c)){
855
if(avctx->get_buffer(avctx, p) < 0){
856
fprintf(stderr, "get_buffer() failed\n");
860
if(avctx->debug&FF_DEBUG_PICT_INFO)
861
printf("keyframe:%d coder:%d\n", p->key_frame, f->ac);
864
bytes_read = get_cabac_terminate(c);
865
if(bytes_read ==0) printf("error at end of AC stream\n");
866
//printf("pos=%d\n", bytes_read);
867
init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
869
bytes_read = 0; /* avoid warning */
873
const int chroma_width = -((-width )>>f->chroma_h_shift);
874
const int chroma_height= -((-height)>>f->chroma_v_shift);
875
decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
877
decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
878
decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
887
avctx->release_buffer(avctx, p); //FIXME
889
*data_size = sizeof(AVFrame);
892
bytes_read= get_cabac_terminate(c);
893
if(bytes_read ==0) printf("error at end of frame\n");
895
bytes_read+= (get_bits_count(&f->gb)+7)/8;
901
static int decode_end(AVCodecContext *avctx)
903
FFV1Context *s = avctx->priv_data;
906
if(avctx->get_buffer == avcodec_default_get_buffer){
908
av_freep(&s->picture.base[i]);
909
s->picture.data[i]= NULL;
911
av_freep(&s->picture.opaque);
917
AVCodec ffv1_decoder = {
926
CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
930
#ifdef CONFIG_ENCODERS
931
AVCodec ffv1_encoder = {