annotate ffv1.c @ 1325:1cbc2380d172 libavcodec

CONFIG_ENCODERS cleanup
author michaelni
date Sun, 22 Jun 2003 11:08:22 +0000
parents 799839d1e2e1
children c16ac5b7ac79
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
1 /*
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
2 * FFV1 codec for libavcodec
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
3 *
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
5 *
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
10 *
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
14 * Lesser General Public License for more details.
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
15 *
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
17 * License along with this library; if not, write to the Free Software
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
19 *
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
20 */
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
21
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
22 /**
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
23 * @file ffv1.c
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
24 * FF Video Codec 1 (a experimental lossless codec)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
25 */
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
26
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
27 #include "common.h"
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
28 #include "avcodec.h"
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
29 #include "dsputil.h"
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
30 #include "cabac.h"
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
31 #include "golomb.h"
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
32
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
33 #define MAX_PLANES 4
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
34 #define CONTEXT_SIZE 32
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
35
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
36 static const int8_t quant3[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
37 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
53 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
54 static const int8_t quant5[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
55 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
56 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
57 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
58 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
59 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
63 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
64 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
65 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
66 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
67 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
68 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
71 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
72 static const int8_t quant7[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
73 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
75 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
76 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
77 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
78 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
79 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
81 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
82 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
83 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
84 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
89 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
90 static const int8_t quant9[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
91 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
92 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
93 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
94 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
95 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
96 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
99 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
100 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
101 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
102 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
107 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
108 static const int8_t quant11[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
109 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
110 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
111 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
112 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
113 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
114 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
115 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
117 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
118 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
119 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
120 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
123 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
124 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
125 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
126 static const int8_t quant13[256]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
127 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
128 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
129 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
130 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
131 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
132 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
133 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
134 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
135 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
136 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
137 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
138 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
140 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
143 };
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
144
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
145 static const uint8_t log2_run[32]={
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
146 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
147 4, 4, 5, 5, 6, 6, 7, 7,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
148 8, 9,10,11,12,13,14,15,
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
149 };
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
150
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
151 typedef struct VlcState{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
152 int16_t drift;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
153 uint16_t error_sum;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
154 int8_t bias;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
155 uint8_t count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
156 } VlcState;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
157
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
158 typedef struct PlaneContext{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
159 int context_count;
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
160 uint8_t (*state)[CONTEXT_SIZE];
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
161 VlcState *vlc_state;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
162 uint8_t interlace_bit_state[2];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
163 } PlaneContext;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
164
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
165 typedef struct FFV1Context{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
166 AVCodecContext *avctx;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
167 CABACContext c;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
168 GetBitContext gb;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
169 PutBitContext pb;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
170 int version;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
171 int width, height;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
172 int chroma_h_shift, chroma_v_shift;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
173 int flags;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
174 int picture_number;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
175 AVFrame picture;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
176 int plane_count;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
177 int ac; ///< 1-> CABAC 0-> golomb rice
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
178 PlaneContext plane[MAX_PLANES];
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
179 int16_t quant_table[5][256];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
180
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
181 DSPContext dsp;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
182 }FFV1Context;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
183
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
184 static inline int predict(uint8_t *src, uint8_t *last){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
185 const int LT= last[-1];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
186 const int T= last[ 0];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
187 const int L = src[-1];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
188 uint8_t *cm = cropTbl + MAX_NEG_CROP;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
189 const int gradient= cm[L + T - LT];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
190
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
191 return mid_pred(L, gradient, T);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
192 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
193
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
194 static inline int get_context(FFV1Context *f, uint8_t *src, uint8_t *last, uint8_t *last2){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
195 const int LT= last[-1];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
196 const int T= last[ 0];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
197 const int RT= last[ 1];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
198 const int L = src[-1];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
199
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
200 if(f->quant_table[3][127]){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
201 const int TT= last2[0];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
202 const int LL= src[-2];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
203 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
204 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
205 }else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
206 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
207 }
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
208
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
209 /**
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
210 * put
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
211 */
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
212 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
213 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
214
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
215 if(v){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
216 const int a= ABS(v);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
217 const int e= av_log2(a);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
218
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
219 put_cabac(c, state+0, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
220 put_cabac_u(c, state+1, e, 7, 6, 1); //1..7
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
221 if(e<7){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
222 for(i=e-1; i>=0; i--){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
223 static const int offset[7]= {15+0, 15+0, 15+1, 15+3, 15+6, 15+10, 15+11};
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
224 put_cabac(c, state+offset[e]+i, (a>>i)&1); //15..31
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
225 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
226 if(is_signed)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
227 put_cabac(c, state+8 + e, v < 0); //8..14
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
228 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
229 }else{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
230 put_cabac(c, state+0, 1);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
231 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
232 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
233
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
234 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
235 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
236
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
237 if(get_cabac(c, state+0))
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
238 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
239 else{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
240 const int e= get_cabac_u(c, state+1, 7, 6, 1); //1..7
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
241
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
242 if(e<7){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
243 int a= 1<<e;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
244
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
245 for(i=e-1; i>=0; i--){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
246 static const int offset[7]= {15+0, 15+0, 15+1, 15+3, 15+6, 15+10, 15+11};
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
247 a += get_cabac(c, state+offset[e]+i)<<i; //14..31
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
248 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
249
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
250 if(is_signed && get_cabac(c, state+8 + e)) //8..14
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
251 return -a;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
252 else
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
253 return a;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
254 }else
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
255 return -128;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
256 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
257 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
258
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
259 static inline void update_vlc_state(VlcState * const state, const int v){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
260 int drift= state->drift;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
261 int count= state->count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
262 state->error_sum += ABS(v);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
263 drift += v;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
264
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
265 if(count == 128){ //FIXME variable
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
266 count >>= 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
267 drift >>= 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
268 state->error_sum >>= 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
269 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
270 count++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
271
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
272 if(drift <= -count){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
273 if(state->bias > -128) state->bias--;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
274
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
275 drift += count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
276 if(drift <= -count)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
277 drift= -count + 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
278 }else if(drift > 0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
279 if(state->bias < 127) state->bias++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
280
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
281 drift -= count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
282 if(drift > 0)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
283 drift= 0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
284 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
285
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
286 state->drift= drift;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
287 state->count= count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
288 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
289
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
290 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
291 int i, k, code;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
292 //printf("final: %d ", v);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
293 v = (int8_t)(v - state->bias);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
294
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
295 i= state->count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
296 k=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
297 while(i < state->error_sum){ //FIXME optimize
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
298 k++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
299 i += i;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
300 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
301 #if 0 // JPEG LS
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
302 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
303 else code= v;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
304 #else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
305 code= v ^ ((2*state->drift + state->count)>>31);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
306 #endif
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
307
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
308 code = -2*code-1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
309 code^= (code>>31);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
310 //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);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
311 set_ur_golomb(pb, code, k, 8, 8);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
312
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
313 update_vlc_state(state, v);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
314 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
315
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
316 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
317 int k, i, v, ret;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
318
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
319 i= state->count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
320 k=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
321 while(i < state->error_sum){ //FIXME optimize
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
322 k++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
323 i += i;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
324 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
325
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
326 v= get_ur_golomb(gb, k, 8, 8);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
327 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
328
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
329 v++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
330 if(v&1) v= (v>>1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
331 else v= -(v>>1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
332
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
333 #if 0 // JPEG LS
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
334 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
335 #else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
336 v ^= ((2*state->drift + state->count)>>31);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
337 #endif
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
338
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
339 ret= (int8_t)(v + state->bias);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
340
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
341 update_vlc_state(state, v);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
342 //printf("final: %d\n", ret);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
343 return ret;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
344 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
345
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
346
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
347
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
348 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
349 PlaneContext * const p= &s->plane[plane_index];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
350 CABACContext * const c= &s->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
351 int x,y;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
352 uint8_t pred_diff_buffer[4][w+6]; //FIXME rema,e
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
353 uint8_t *pred_diff[4]= {pred_diff_buffer[0]+3, pred_diff_buffer[1]+3, pred_diff_buffer[2]+3, pred_diff_buffer[3]+3};
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
354 int run_index=0;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
355
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
356 memset(pred_diff_buffer, 0, sizeof(pred_diff_buffer));
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
357
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
358 for(y=0; y<h; y++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
359 uint8_t *temp= pred_diff[0]; //FIXME try a normal buffer
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
360 int run_count=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
361 int run_mode=0;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
362
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
363 pred_diff[0]= pred_diff[1];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
364 pred_diff[1]= pred_diff[2];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
365 pred_diff[2]= pred_diff[3];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
366 pred_diff[3]= temp;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
367
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
368 pred_diff[3][-1]= pred_diff[2][0 ];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
369 pred_diff[2][ w]= pred_diff[2][w-1];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
370
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
371 for(x=0; x<w; x++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
372 uint8_t *temp_src= src + x + stride*y;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
373 int diff, context;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
374
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
375 context= get_context(s, pred_diff[3]+x, pred_diff[2]+x, pred_diff[1]+x);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
376 diff= temp_src[0] - predict(pred_diff[3]+x, pred_diff[2]+x);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
377
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
378 if(context < 0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
379 context = -context;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
380 diff= -diff;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
381 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
382
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
383 diff= (int8_t)diff;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
384
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
385 if(s->ac)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
386 put_symbol(c, p->state[context], diff, 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
387 else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
388 if(context == 0) run_mode=1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
389
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
390 if(run_mode){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
391
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
392 if(diff){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
393 while(run_count >= 1<<log2_run[run_index]){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
394 run_count -= 1<<log2_run[run_index];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
395 run_index++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
396 put_bits(&s->pb, 1, 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
397 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
398
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
399 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
400 if(run_index) run_index--;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
401 run_count=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
402 run_mode=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
403 if(diff>0) diff--;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
404 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
405 run_count++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
406 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
407 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
408
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
409 // 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));
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
410
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
411 if(run_mode == 0)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
412 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
413 }
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
414
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
415 pred_diff[3][x]= temp_src[0];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
416 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
417 if(run_mode){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
418 while(run_count >= 1<<log2_run[run_index]){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
419 run_count -= 1<<log2_run[run_index];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
420 run_index++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
421 put_bits(&s->pb, 1, 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
422 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
423
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
424 if(run_count)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
425 put_bits(&s->pb, 1, 1);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
426 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
427 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
428 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
429
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
430 static void write_quant_table(CABACContext *c, int16_t *quant_table){
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
431 int last=0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
432 int i;
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
433 uint8_t state[CONTEXT_SIZE]={0};
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
434
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
435 for(i=1; i<128 ; i++){
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
436 if(quant_table[i] != quant_table[i-1]){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
437 put_symbol(c, state, i-last-1, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
438 last= i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
439 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
440 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
441 put_symbol(c, state, i-last-1, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
442 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
443
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
444 static void write_header(FFV1Context *f){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
445 uint8_t state[CONTEXT_SIZE]={0};
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
446 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
447 CABACContext * const c= &f->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
448
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
449 put_symbol(c, state, f->version, 0);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
450 put_symbol(c, state, f->avctx->coder_type, 0);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
451 put_symbol(c, state, 0, 0); //YUV cs type
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
452 put_cabac(c, state, 1); //chroma planes
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
453 put_symbol(c, state, f->chroma_h_shift, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
454 put_symbol(c, state, f->chroma_v_shift, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
455 put_cabac(c, state, 0); //no transparency plane
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
456
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
457 for(i=0; i<5; i++)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
458 write_quant_table(c, f->quant_table[i]);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
459 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
460
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
461 static int common_init(AVCodecContext *avctx){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
462 FFV1Context *s = avctx->priv_data;
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
463 int width, height;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
464
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
465 s->avctx= avctx;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
466 s->flags= avctx->flags;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
467
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
468 dsputil_init(&s->dsp, avctx);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
469
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
470 width= s->width= avctx->width;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
471 height= s->height= avctx->height;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
472
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
473 assert(width && height);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
474
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
475 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
476 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
477
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
478 static int encode_init(AVCodecContext *avctx)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
479 {
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
480 FFV1Context *s = avctx->priv_data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
481 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
482
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
483 common_init(avctx);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
484
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
485 s->version=0;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
486 s->ac= avctx->coder_type;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
487
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
488 s->plane_count=3;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
489 for(i=0; i<256; i++){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
490 s->quant_table[0][i]= quant11[i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
491 s->quant_table[1][i]= 11*quant11[i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
492 if(avctx->context_model==0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
493 s->quant_table[2][i]= 11*11*quant11[i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
494 s->quant_table[3][i]=
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
495 s->quant_table[4][i]=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
496 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
497 s->quant_table[2][i]= 11*11*quant5 [i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
498 s->quant_table[3][i]= 5*11*11*quant5 [i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
499 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
500 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
501 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
502
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
503 for(i=0; i<s->plane_count; i++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
504 PlaneContext * const p= &s->plane[i];
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
505
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
506 if(avctx->context_model==0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
507 p->context_count= (11*11*11+1)/2;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
508 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
509 p->context_count= (11*11*5*5*5+1)/2;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
510 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
511
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
512 if(s->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
513 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
514 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
515 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
516 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
517 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
518
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
519 avctx->coded_frame= &s->picture;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
520 switch(avctx->pix_fmt){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
521 case PIX_FMT_YUV444P:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
522 case PIX_FMT_YUV422P:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
523 case PIX_FMT_YUV420P:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
524 case PIX_FMT_YUV411P:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
525 case PIX_FMT_YUV410P:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
526 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
527 break;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
528 default:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
529 fprintf(stderr, "format not supported\n");
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
530 return -1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
531 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
532
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
533
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
534 s->picture_number=0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
535
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
536 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
537 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
538
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
539
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
540 static void clear_state(FFV1Context *f){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
541 int i, j;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
542
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
543 for(i=0; i<f->plane_count; i++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
544 PlaneContext *p= &f->plane[i];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
545
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
546 p->interlace_bit_state[0]= 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
547 p->interlace_bit_state[1]= 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
548
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
549 for(j=0; j<p->context_count; j++){
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
550 if(f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
551 memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
552 p->state[j][7] = 2*62;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
553 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
554 p->vlc_state[j].drift= 0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
555 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
556 p->vlc_state[j].bias= 0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
557 p->vlc_state[j].count= 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
558 }
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
559 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
560 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
561 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
562
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
563 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
564 FFV1Context *f = avctx->priv_data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
565 CABACContext * const c= &f->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
566 AVFrame *pict = data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
567 const int width= f->width;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
568 const int height= f->height;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
569 AVFrame * const p= &f->picture;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
570 int used_count= 0;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
571
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
572 if(avctx->strict_std_compliance >= 0){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
573 printf("this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
574 "use vstrict=-1 to use it anyway\n");
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
575 return -1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
576 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
577
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
578 ff_init_cabac_encoder(c, buf, buf_size);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
579 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
580
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
581 *p = *pict;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
582 p->pict_type= FF_I_TYPE;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
583
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
584 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
585 put_cabac_bypass(c, 1);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
586 p->key_frame= 1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
587 write_header(f);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
588 clear_state(f);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
589 }else{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
590 put_cabac_bypass(c, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
591 p->key_frame= 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
592 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
593
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
594 if(!f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
595 used_count += put_cabac_terminate(c, 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
596 //printf("pos=%d\n", used_count);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
597 init_put_bits(&f->pb, buf + used_count, buf_size - used_count, NULL, NULL);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
598 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
599
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
600 if(1){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
601 const int chroma_width = -((-width )>>f->chroma_h_shift);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
602 const int chroma_height= -((-height)>>f->chroma_v_shift);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
603
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
604 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
605
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
606 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
607 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 2);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
608 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
609 emms_c();
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
610
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
611 f->picture_number++;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
612
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
613 if(f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
614 return put_cabac_terminate(c, 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
615 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
616 flush_put_bits(&f->pb); //nicer padding FIXME
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
617 return used_count + (get_bit_count(&f->pb)+7)/8;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
618 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
619 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
620
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
621 static void common_end(FFV1Context *s){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
622 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
623
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
624 for(i=0; i<s->plane_count; i++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
625 PlaneContext *p= &s->plane[i];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
626
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
627 av_freep(&p->state);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
628 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
629 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
630
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
631 static int encode_end(AVCodecContext *avctx)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
632 {
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
633 FFV1Context *s = avctx->priv_data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
634
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
635 common_end(s);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
636
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
637 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
638 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
639
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
640 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
641 PlaneContext * const p= &s->plane[plane_index];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
642 CABACContext * const c= &s->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
643 int x,y;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
644 uint8_t pred_diff_buffer[4][w+6];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
645 uint8_t *pred_diff[4]= {pred_diff_buffer[0]+3, pred_diff_buffer[1]+3, pred_diff_buffer[2]+3, pred_diff_buffer[3]+3};
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
646 int run_index=0;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
647
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
648 memset(pred_diff_buffer, 0, sizeof(pred_diff_buffer));
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
649
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
650 for(y=0; y<h; y++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
651 uint8_t *temp= pred_diff[0]; //FIXME try a normal buffer
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
652 int run_count=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
653 int run_mode=0;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
654
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
655 pred_diff[0]= pred_diff[1];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
656 pred_diff[1]= pred_diff[2];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
657 pred_diff[2]= pred_diff[3];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
658 pred_diff[3]= temp;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
659
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
660 pred_diff[3][-1]= pred_diff[2][0 ];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
661 pred_diff[2][ w]= pred_diff[2][w-1];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
662
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
663 for(x=0; x<w; x++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
664 uint8_t *temp_src= src + x + stride*y;
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
665 int diff, context, sign;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
666
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
667 context= get_context(s, pred_diff[3] + x, pred_diff[2] + x, pred_diff[1] + x);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
668 if(context < 0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
669 context= -context;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
670 sign=1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
671 }else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
672 sign=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
673
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
674
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
675 if(s->ac)
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
676 diff= get_symbol(c, p->state[context], 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
677 else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
678 if(context == 0 && run_mode==0) run_mode=1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
679
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
680 if(run_mode){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
681 if(run_count==0 && run_mode==1){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
682 if(get_bits1(&s->gb)){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
683 run_count = 1<<log2_run[run_index];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
684 if(x + run_count <= w) run_index++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
685 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
686 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
687 else run_count=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
688 if(run_index) run_index--;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
689 run_mode=2;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
690 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
691 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
692 run_count--;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
693 if(run_count < 0){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
694 run_mode=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
695 run_count=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
696 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
697 if(diff>=0) diff++;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
698 }else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
699 diff=0;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
700 }else
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
701 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
702
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
703 // 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));
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
704 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
705
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
706 if(sign) diff= (int8_t)(-diff); //FIXME remove cast
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
707
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
708 pred_diff[3][x]=
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
709 temp_src[0] = predict(pred_diff[3] + x, pred_diff[2] + x) + diff;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
710
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
711 assert(diff>= -128 && diff <= 127);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
712 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
713 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
714 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
715
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
716 static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
717 int v;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
718 int i=0;
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
719 uint8_t state[CONTEXT_SIZE]={0};
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
720
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
721 for(v=0; i<128 ; v++){
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
722 int len= get_symbol(c, state, 0) + 1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
723
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
724 if(len + i > 128) return -1;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
725
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
726 while(len--){
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
727 quant_table[i] = scale*v;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
728 i++;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
729 //printf("%2d ",v);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
730 //if(i%16==0) printf("\n");
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
731 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
732 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
733
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
734 for(i=1; i<128; i++){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
735 quant_table[256-i]= -quant_table[i];
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
736 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
737 quant_table[128]= -quant_table[127];
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
738
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
739 return 2*v - 1;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
740 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
741
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
742 static int read_header(FFV1Context *f){
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
743 uint8_t state[CONTEXT_SIZE]={0};
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
744 int i, context_count;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
745 CABACContext * const c= &f->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
746
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
747 f->version= get_symbol(c, state, 0);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
748 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
749 get_symbol(c, state, 0); //YUV cs type
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
750 get_cabac(c, state); //no chroma = false
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
751 f->chroma_h_shift= get_symbol(c, state, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
752 f->chroma_v_shift= get_symbol(c, state, 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
753 get_cabac(c, state); //transparency plane
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
754 f->plane_count= 3;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
755
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
756 context_count=1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
757 for(i=0; i<5; i++){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
758 context_count*= read_quant_table(c, f->quant_table[i], context_count);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
759 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
760 context_count= (context_count+1)/2;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
761
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
762 for(i=0; i<f->plane_count; i++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
763 PlaneContext * const p= &f->plane[i];
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
764
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
765 p->context_count= context_count;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
766
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
767 if(f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
768 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
769 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
770 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
771 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
772 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
773
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
774 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
775 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
776
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
777 static int decode_init(AVCodecContext *avctx)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
778 {
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
779 // FFV1Context *s = avctx->priv_data;
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
780
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
781 common_init(avctx);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
782
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
783 #if 0
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
784 switch(s->bitstream_bpp){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
785 case 12:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
786 avctx->pix_fmt = PIX_FMT_YUV420P;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
787 break;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
788 case 16:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
789 avctx->pix_fmt = PIX_FMT_YUV422P;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
790 break;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
791 case 24:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
792 case 32:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
793 if(s->bgr32){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
794 avctx->pix_fmt = PIX_FMT_RGBA32;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
795 }else{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
796 avctx->pix_fmt = PIX_FMT_BGR24;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
797 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
798 break;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
799 default:
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
800 assert(0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
801 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
802 #endif
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
803
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
804 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
805 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
806
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
807 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
808 FFV1Context *f = avctx->priv_data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
809 CABACContext * const c= &f->c;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
810 const int width= f->width;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
811 const int height= f->height;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
812 AVFrame * const p= &f->picture;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
813 int bytes_read;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
814
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
815 AVFrame *picture = data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
816
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
817 *data_size = 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
818
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
819 /* no supplementary picture */
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
820 if (buf_size == 0)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
821 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
822
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
823 ff_init_cabac_decoder(c, buf, buf_size);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
824 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
825
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
826 p->reference= 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
827 if(avctx->get_buffer(avctx, p) < 0){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
828 fprintf(stderr, "get_buffer() failed\n");
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
829 return -1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
830 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
831
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
832 p->pict_type= FF_I_TYPE; //FIXME I vs. P
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
833 if(get_cabac_bypass(c)){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
834 p->key_frame= 1;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
835 read_header(f);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
836 clear_state(f);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
837 }else{
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
838 p->key_frame= 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
839 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
840 if(avctx->debug&FF_DEBUG_PICT_INFO)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
841 printf("keyframe:%d\n", p->key_frame);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
842
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
843 if(!f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
844 bytes_read = get_cabac_terminate(c);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
845 if(bytes_read ==0) printf("error at end of AC stream\n");
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
846 //printf("pos=%d\n", bytes_read);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
847 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
848 }
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
849
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
850 if(1){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
851 const int chroma_width = -((-width )>>f->chroma_h_shift);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
852 const int chroma_height= -((-height)>>f->chroma_v_shift);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
853 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
854
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
855 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
856 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 2);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
857 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
858
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
859 emms_c();
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
860
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
861 f->picture_number++;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
862
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
863 *picture= *p;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
864
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
865 avctx->release_buffer(avctx, p); //FIXME
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
866
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
867 *data_size = sizeof(AVFrame);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
868
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
869 if(f->ac){
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
870 bytes_read= get_cabac_terminate(c);
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
871 if(bytes_read ==0) printf("error at end of frame\n");
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
872 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
873 bytes_read+= (get_bits_count(&f->gb)+7)/8;
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
874 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1302
diff changeset
875
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
876 return bytes_read;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
877 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
878
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
879 static int decode_end(AVCodecContext *avctx)
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
880 {
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
881 FFV1Context *s = avctx->priv_data;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
882 int i;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
883
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
884 if(avctx->get_buffer == avcodec_default_get_buffer){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
885 for(i=0; i<4; i++){
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
886 av_freep(&s->picture.base[i]);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
887 s->picture.data[i]= NULL;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
888 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
889 av_freep(&s->picture.opaque);
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
890 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
891
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
892 return 0;
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
893 }
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
894
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
895 AVCodec ffv1_decoder = {
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
896 "ffv1",
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
897 CODEC_TYPE_VIDEO,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
898 CODEC_ID_FFV1,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
899 sizeof(FFV1Context),
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
900 decode_init,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
901 NULL,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
902 decode_end,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
903 decode_frame,
1302
c41f51b5d5d6 reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents: 1300
diff changeset
904 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
905 NULL
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
906 };
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
907
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1306
diff changeset
908 #ifdef CONFIG_ENCODERS
1300
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
909 AVCodec ffv1_encoder = {
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
910 "ffv1",
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
911 CODEC_TYPE_VIDEO,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
912 CODEC_ID_FFV1,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
913 sizeof(FFV1Context),
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
914 encode_init,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
915 encode_frame,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
916 encode_end,
e18667d1e94d FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff changeset
917 };
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1306
diff changeset
918 #endif