Mercurial > libavcodec.hg
annotate huffyuv.c @ 9830:bd0879f752e6 libavcodec
Express the H.264 parser dependency on the golomb code in configure instead of
in the Makefile as it is done for all other parts that depend on golomb.
author | diego |
---|---|
date | Tue, 09 Jun 2009 20:29:52 +0000 |
parents | f1f5e78cf0aa |
children | fe4e6d8242d4 |
rev | line source |
---|---|
866 | 1 /* |
2 * huffyuv codec for libavcodec | |
3 * | |
1006 | 4 * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at> |
866 | 5 * |
5214 | 6 * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of |
7 * the algorithm used | |
8 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
9 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
10 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
11 * FFmpeg is free software; you can redistribute it and/or |
866 | 12 * modify it under the terms of the GNU Lesser General Public |
13 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
14 * version 2.1 of the License, or (at your option) any later version. |
866 | 15 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
16 * FFmpeg is distributed in the hope that it will be useful, |
866 | 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
19 * Lesser General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
22 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
866 | 24 */ |
2967 | 25 |
1106 | 26 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8627
diff
changeset
|
27 * @file libavcodec/huffyuv.c |
1106 | 28 * huffyuv codec for libavcodec. |
29 */ | |
866 | 30 |
4962
f99e40a7155b
Remove redundant #inclusion of common.h, avcodec.h already #includes it.
diego
parents:
4691
diff
changeset
|
31 #include "avcodec.h" |
9428 | 32 #include "get_bits.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9355
diff
changeset
|
33 #include "put_bits.h" |
866 | 34 #include "dsputil.h" |
35 | |
36 #define VLC_BITS 11 | |
903 | 37 |
2176 | 38 #ifdef WORDS_BIGENDIAN |
39 #define B 3 | |
40 #define G 2 | |
41 #define R 1 | |
42 #else | |
43 #define B 0 | |
44 #define G 1 | |
45 #define R 2 | |
46 #endif | |
47 | |
866 | 48 typedef enum Predictor{ |
49 LEFT= 0, | |
50 PLANE, | |
51 MEDIAN, | |
52 } Predictor; | |
2967 | 53 |
866 | 54 typedef struct HYuvContext{ |
55 AVCodecContext *avctx; | |
56 Predictor predictor; | |
57 GetBitContext gb; | |
58 PutBitContext pb; | |
59 int interlaced; | |
60 int decorrelate; | |
61 int bitstream_bpp; | |
62 int version; | |
63 int yuy2; //use yuy2 instead of 422P | |
64 int bgr32; //use bgr32 instead of bgr24 | |
65 int width, height; | |
66 int flags; | |
2369 | 67 int context; |
866 | 68 int picture_number; |
871 | 69 int last_slice_end; |
2422 | 70 uint8_t *temp[3]; |
866 | 71 uint64_t stats[3][256]; |
72 uint8_t len[3][256]; | |
73 uint32_t bits[3][256]; | |
5074 | 74 uint32_t pix_bgr_map[1<<VLC_BITS]; |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
75 VLC vlc[6]; //Y,U,V,YY,YU,YV |
925 | 76 AVFrame picture; |
2422 | 77 uint8_t *bitstream_buffer; |
3066
04b924f8f5a5
warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents:
3036
diff
changeset
|
78 unsigned int bitstream_buffer_size; |
2967 | 79 DSPContext dsp; |
866 | 80 }HYuvContext; |
81 | |
1082 | 82 static const unsigned char classic_shift_luma[] = { |
1080
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
83 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
84 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
85 69,68, 0 |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
86 }; |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
87 |
1082 | 88 static const unsigned char classic_shift_chroma[] = { |
1080
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
89 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
90 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
91 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0 |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
92 }; |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
93 |
1082 | 94 static const unsigned char classic_add_luma[256] = { |
1080
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
95 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
96 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
97 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
98 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
99 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
100 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
101 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
102 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
103 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
104 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
105 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
106 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
107 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
108 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
109 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
110 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
111 }; |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
112 |
1082 | 113 static const unsigned char classic_add_chroma[256] = { |
1080
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
114 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
115 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
116 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
117 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
118 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
119 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
120 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
121 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
122 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
123 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
124 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
125 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
126 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
127 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
128 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
129 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2, |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
130 }; |
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
131 |
866 | 132 static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){ |
133 int i; | |
134 | |
135 for(i=0; i<w-1; i++){ | |
136 acc+= src[i]; | |
137 dst[i]= acc; | |
138 i++; | |
139 acc+= src[i]; | |
140 dst[i]= acc; | |
141 } | |
142 | |
143 for(; i<w; i++){ | |
144 acc+= src[i]; | |
145 dst[i]= acc; | |
146 } | |
147 | |
148 return acc; | |
149 } | |
150 | |
151 static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){ | |
152 int i; | |
153 int r,g,b; | |
154 r= *red; | |
155 g= *green; | |
156 b= *blue; | |
157 | |
158 for(i=0; i<w; i++){ | |
2176 | 159 b+= src[4*i+B]; |
160 g+= src[4*i+G]; | |
161 r+= src[4*i+R]; | |
2967 | 162 |
2176 | 163 dst[4*i+B]= b; |
164 dst[4*i+G]= g; | |
165 dst[4*i+R]= r; | |
866 | 166 } |
167 | |
168 *red= r; | |
169 *green= g; | |
170 *blue= b; | |
171 } | |
172 | |
871 | 173 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){ |
866 | 174 int i; |
871 | 175 if(w<32){ |
176 for(i=0; i<w; i++){ | |
177 const int temp= src[i]; | |
178 dst[i]= temp - left; | |
179 left= temp; | |
180 } | |
181 return left; | |
182 }else{ | |
183 for(i=0; i<16; i++){ | |
184 const int temp= src[i]; | |
185 dst[i]= temp - left; | |
186 left= temp; | |
187 } | |
188 s->dsp.diff_bytes(dst+16, src+16, src+15, w-16); | |
189 return src[w-1]; | |
866 | 190 } |
191 } | |
1325 | 192 |
4682 | 193 static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){ |
194 int i; | |
195 int r,g,b; | |
196 r= *red; | |
197 g= *green; | |
198 b= *blue; | |
199 for(i=0; i<FFMIN(w,4); i++){ | |
200 const int rt= src[i*4+R]; | |
201 const int gt= src[i*4+G]; | |
202 const int bt= src[i*4+B]; | |
203 dst[i*4+R]= rt - r; | |
204 dst[i*4+G]= gt - g; | |
205 dst[i*4+B]= bt - b; | |
206 r = rt; | |
207 g = gt; | |
208 b = bt; | |
209 } | |
210 s->dsp.diff_bytes(dst+16, src+16, src+12, w*4-16); | |
211 *red= src[(w-1)*4+R]; | |
212 *green= src[(w-1)*4+G]; | |
213 *blue= src[(w-1)*4+B]; | |
214 } | |
215 | |
866 | 216 static void read_len_table(uint8_t *dst, GetBitContext *gb){ |
217 int i, val, repeat; | |
2967 | 218 |
866 | 219 for(i=0; i<256;){ |
220 repeat= get_bits(gb, 3); | |
221 val = get_bits(gb, 5); | |
222 if(repeat==0) | |
223 repeat= get_bits(gb, 8); | |
224 //printf("%d %d\n", val, repeat); | |
225 while (repeat--) | |
226 dst[i++] = val; | |
227 } | |
228 } | |
229 | |
230 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){ | |
231 int len, index; | |
232 uint32_t bits=0; | |
233 | |
234 for(len=32; len>0; len--){ | |
235 for(index=0; index<256; index++){ | |
1279 | 236 if(len_table[index]==len) |
237 dst[index]= bits++; | |
866 | 238 } |
1279 | 239 if(bits & 1){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1529
diff
changeset
|
240 av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n"); |
1279 | 241 return -1; |
242 } | |
243 bits >>= 1; | |
866 | 244 } |
245 return 0; | |
246 } | |
247 | |
8590 | 248 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
249 typedef struct { |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
250 uint64_t val; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
251 int name; |
8308 | 252 } HeapElem; |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
253 |
8308 | 254 static void heap_sift(HeapElem *h, int root, int size) |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
255 { |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
256 while(root*2+1 < size) { |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
257 int child = root*2+1; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
258 if(child < size-1 && h[child].val > h[child+1].val) |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
259 child++; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
260 if(h[root].val > h[child].val) { |
8308 | 261 FFSWAP(HeapElem, h[root], h[child]); |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
262 root = child; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
263 } else |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
264 break; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
265 } |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
266 } |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
267 |
866 | 268 static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){ |
8308 | 269 HeapElem h[size]; |
866 | 270 int up[2*size]; |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
271 int len[2*size]; |
866 | 272 int offset, i, next; |
2967 | 273 |
866 | 274 for(offset=1; ; offset<<=1){ |
275 for(i=0; i<size; i++){ | |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
276 h[i].name = i; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
277 h[i].val = (stats[i] << 8) + offset; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
278 } |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
279 for(i=size/2-1; i>=0; i--) |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
280 heap_sift(h, i, size); |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
281 |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
282 for(next=size; next<size*2-1; next++){ |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
283 // merge the two smallest entries, and put it back in the heap |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
284 uint64_t min1v = h[0].val; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
285 up[h[0].name] = next; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
286 h[0].val = INT64_MAX; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
287 heap_sift(h, 0, size); |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
288 up[h[0].name] = next; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
289 h[0].name = next; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
290 h[0].val += min1v; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
291 heap_sift(h, 0, size); |
866 | 292 } |
2967 | 293 |
5040
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
294 len[2*size-2] = 0; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
295 for(i=2*size-3; i>=size; i--) |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
296 len[i] = len[up[i]] + 1; |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
297 for(i=0; i<size; i++) { |
5c6cd6601371
change brute force search to min-heap. 3.6x faster generate_len_table, 8% faster ffvhuff encoding.
lorenm
parents:
5026
diff
changeset
|
298 dst[i] = len[up[i]] + 1; |
5481
defae3a747d9
prevent huffyuv from generating codewords of length 32. (regression in r9069)
lorenm
parents:
5221
diff
changeset
|
299 if(dst[i] >= 32) break; |
866 | 300 } |
301 if(i==size) break; | |
302 } | |
303 } | |
8590 | 304 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */ |
866 | 305 |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
306 static void generate_joint_tables(HYuvContext *s){ |
5074 | 307 uint16_t symbols[1<<VLC_BITS]; |
308 uint16_t bits[1<<VLC_BITS]; | |
309 uint8_t len[1<<VLC_BITS]; | |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
310 if(s->bitstream_bpp < 24){ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
311 int p, i, y, u; |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
312 for(p=0; p<3; p++){ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
313 for(i=y=0; y<256; y++){ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
314 int len0 = s->len[0][y]; |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
315 int limit = VLC_BITS - len0; |
5073 | 316 if(limit <= 0) |
317 continue; | |
318 for(u=0; u<256; u++){ | |
319 int len1 = s->len[p][u]; | |
320 if(len1 > limit) | |
321 continue; | |
322 len[i] = len0 + len1; | |
323 bits[i] = (s->bits[0][y] << len1) + s->bits[p][u]; | |
324 symbols[i] = (y<<8) + u; | |
325 if(symbols[i] != 0xffff) // reserved to mean "invalid" | |
326 i++; | |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
327 } |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
328 } |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
329 free_vlc(&s->vlc[3+p]); |
5072
1aec7fab94c4
use sparse huffman tables. 1.5% faster huffyuv decoding.
lorenm
parents:
5063
diff
changeset
|
330 init_vlc_sparse(&s->vlc[3+p], VLC_BITS, i, len, 1, 1, bits, 2, 2, symbols, 2, 2, 0); |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
331 } |
5074 | 332 }else{ |
333 uint8_t (*map)[4] = (uint8_t(*)[4])s->pix_bgr_map; | |
334 int i, b, g, r, code; | |
335 int p0 = s->decorrelate; | |
336 int p1 = !s->decorrelate; | |
337 // restrict the range to +/-16 becaues that's pretty much guaranteed to | |
338 // cover all the combinations that fit in 11 bits total, and it doesn't | |
339 // matter if we miss a few rare codes. | |
340 for(i=0, g=-16; g<16; g++){ | |
341 int len0 = s->len[p0][g&255]; | |
342 int limit0 = VLC_BITS - len0; | |
343 if(limit0 < 2) | |
344 continue; | |
345 for(b=-16; b<16; b++){ | |
346 int len1 = s->len[p1][b&255]; | |
347 int limit1 = limit0 - len1; | |
348 if(limit1 < 1) | |
349 continue; | |
350 code = (s->bits[p0][g&255] << len1) + s->bits[p1][b&255]; | |
351 for(r=-16; r<16; r++){ | |
352 int len2 = s->len[2][r&255]; | |
353 if(len2 > limit1) | |
354 continue; | |
355 len[i] = len0 + len1 + len2; | |
356 bits[i] = (code << len2) + s->bits[2][r&255]; | |
357 if(s->decorrelate){ | |
358 map[i][G] = g; | |
359 map[i][B] = g+b; | |
360 map[i][R] = g+r; | |
361 }else{ | |
362 map[i][B] = g; | |
363 map[i][G] = b; | |
364 map[i][R] = r; | |
365 } | |
366 i++; | |
367 } | |
368 } | |
369 } | |
370 free_vlc(&s->vlc[3]); | |
371 init_vlc(&s->vlc[3], VLC_BITS, i, len, 1, 1, bits, 2, 2, 0); | |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
372 } |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
373 } |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
374 |
866 | 375 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){ |
376 GetBitContext gb; | |
377 int i; | |
2967 | 378 |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1006
diff
changeset
|
379 init_get_bits(&gb, src, length*8); |
2967 | 380 |
866 | 381 for(i=0; i<3; i++){ |
382 read_len_table(s->len[i], &gb); | |
2967 | 383 |
866 | 384 if(generate_bits_table(s->bits[i], s->len[i])<0){ |
385 return -1; | |
386 } | |
387 #if 0 | |
388 for(j=0; j<256; j++){ | |
389 printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j); | |
390 } | |
391 #endif | |
2369 | 392 free_vlc(&s->vlc[i]); |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2369
diff
changeset
|
393 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); |
866 | 394 } |
2967 | 395 |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
396 generate_joint_tables(s); |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
397 |
2369 | 398 return (get_bits_count(&gb)+7)/8; |
866 | 399 } |
400 | |
401 static int read_old_huffman_tables(HYuvContext *s){ | |
1080
a150aba978de
huffyuv v1 tables, as they are essential and the only possible way for decding of v1 files they very likely cant be copyrighted ...
michaelni
parents:
1078
diff
changeset
|
402 #if 1 |
866 | 403 GetBitContext gb; |
404 int i; | |
405 | |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1006
diff
changeset
|
406 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8); |
866 | 407 read_len_table(s->len[0], &gb); |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1006
diff
changeset
|
408 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8); |
866 | 409 read_len_table(s->len[1], &gb); |
2967 | 410 |
866 | 411 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i]; |
412 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i]; | |
413 | |
414 if(s->bitstream_bpp >= 24){ | |
415 memcpy(s->bits[1], s->bits[0], 256*sizeof(uint32_t)); | |
416 memcpy(s->len[1] , s->len [0], 256*sizeof(uint8_t)); | |
417 } | |
418 memcpy(s->bits[2], s->bits[1], 256*sizeof(uint32_t)); | |
419 memcpy(s->len[2] , s->len [1], 256*sizeof(uint8_t)); | |
2967 | 420 |
2369 | 421 for(i=0; i<3; i++){ |
422 free_vlc(&s->vlc[i]); | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2369
diff
changeset
|
423 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); |
2369 | 424 } |
2967 | 425 |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
426 generate_joint_tables(s); |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
427 |
866 | 428 return 0; |
429 #else | |
3177 | 430 av_log(s->avctx, AV_LOG_DEBUG, "v1 huffyuv is not supported \n"); |
866 | 431 return -1; |
432 #endif | |
433 } | |
434 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8760
diff
changeset
|
435 static av_cold void alloc_temp(HYuvContext *s){ |
2511 | 436 int i; |
2967 | 437 |
2511 | 438 if(s->bitstream_bpp<24){ |
439 for(i=0; i<3; i++){ | |
440 s->temp[i]= av_malloc(s->width + 16); | |
441 } | |
442 }else{ | |
4682 | 443 for(i=0; i<2; i++){ |
444 s->temp[i]= av_malloc(4*s->width + 16); | |
445 } | |
2511 | 446 } |
447 } | |
448 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8760
diff
changeset
|
449 static av_cold int common_init(AVCodecContext *avctx){ |
866 | 450 HYuvContext *s = avctx->priv_data; |
451 | |
452 s->avctx= avctx; | |
453 s->flags= avctx->flags; | |
2967 | 454 |
1097 | 455 dsputil_init(&s->dsp, avctx); |
2967 | 456 |
2422 | 457 s->width= avctx->width; |
458 s->height= avctx->height; | |
459 assert(s->width>0 && s->height>0); | |
2967 | 460 |
2422 | 461 return 0; |
462 } | |
463 | |
8590 | 464 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
465 static av_cold int decode_init(AVCodecContext *avctx) |
2422 | 466 { |
467 HYuvContext *s = avctx->priv_data; | |
468 | |
469 common_init(avctx); | |
2369 | 470 memset(s->vlc, 0, 3*sizeof(VLC)); |
2967 | 471 |
925 | 472 avctx->coded_frame= &s->picture; |
2422 | 473 s->interlaced= s->height > 288; |
903 | 474 |
866 | 475 s->bgr32=1; |
476 //if(avctx->extradata) | |
477 // printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size); | |
478 if(avctx->extradata_size){ | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
479 if((avctx->bits_per_coded_sample&7) && avctx->bits_per_coded_sample != 12) |
866 | 480 s->version=1; // do such files exist at all? |
481 else | |
482 s->version=2; | |
483 }else | |
484 s->version=0; | |
2967 | 485 |
866 | 486 if(s->version==2){ |
2374 | 487 int method, interlace; |
866 | 488 |
489 method= ((uint8_t*)avctx->extradata)[0]; | |
490 s->decorrelate= method&64 ? 1 : 0; | |
491 s->predictor= method&63; | |
492 s->bitstream_bpp= ((uint8_t*)avctx->extradata)[1]; | |
2967 | 493 if(s->bitstream_bpp==0) |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
494 s->bitstream_bpp= avctx->bits_per_coded_sample&~7; |
2374 | 495 interlace= (((uint8_t*)avctx->extradata)[2] & 0x30) >> 4; |
496 s->interlaced= (interlace==1) ? 1 : (interlace==2) ? 0 : s->interlaced; | |
2369 | 497 s->context= ((uint8_t*)avctx->extradata)[2] & 0x40 ? 1 : 0; |
2967 | 498 |
866 | 499 if(read_huffman_tables(s, ((uint8_t*)avctx->extradata)+4, avctx->extradata_size) < 0) |
500 return -1; | |
501 }else{ | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
502 switch(avctx->bits_per_coded_sample&7){ |
866 | 503 case 1: |
504 s->predictor= LEFT; | |
505 s->decorrelate= 0; | |
506 break; | |
507 case 2: | |
508 s->predictor= LEFT; | |
509 s->decorrelate= 1; | |
510 break; | |
511 case 3: | |
512 s->predictor= PLANE; | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
513 s->decorrelate= avctx->bits_per_coded_sample >= 24; |
866 | 514 break; |
515 case 4: | |
516 s->predictor= MEDIAN; | |
517 s->decorrelate= 0; | |
518 break; | |
519 default: | |
520 s->predictor= LEFT; //OLD | |
521 s->decorrelate= 0; | |
522 break; | |
523 } | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
524 s->bitstream_bpp= avctx->bits_per_coded_sample & ~7; |
2369 | 525 s->context= 0; |
2967 | 526 |
866 | 527 if(read_old_huffman_tables(s) < 0) |
528 return -1; | |
529 } | |
2967 | 530 |
866 | 531 switch(s->bitstream_bpp){ |
532 case 12: | |
533 avctx->pix_fmt = PIX_FMT_YUV420P; | |
534 break; | |
535 case 16: | |
536 if(s->yuy2){ | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
3947
diff
changeset
|
537 avctx->pix_fmt = PIX_FMT_YUYV422; |
866 | 538 }else{ |
539 avctx->pix_fmt = PIX_FMT_YUV422P; | |
540 } | |
541 break; | |
542 case 24: | |
543 case 32: | |
544 if(s->bgr32){ | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
3947
diff
changeset
|
545 avctx->pix_fmt = PIX_FMT_RGB32; |
866 | 546 }else{ |
547 avctx->pix_fmt = PIX_FMT_BGR24; | |
548 } | |
549 break; | |
550 default: | |
551 assert(0); | |
552 } | |
2967 | 553 |
2511 | 554 alloc_temp(s); |
2967 | 555 |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
556 // av_log(NULL, AV_LOG_DEBUG, "pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_coded_sample, s->interlaced); |
2190 | 557 |
866 | 558 return 0; |
559 } | |
8590 | 560 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */ |
866 | 561 |
8590 | 562 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER |
2369 | 563 static int store_table(HYuvContext *s, uint8_t *len, uint8_t *buf){ |
866 | 564 int i; |
2369 | 565 int index= 0; |
866 | 566 |
567 for(i=0; i<256;){ | |
568 int val= len[i]; | |
1529
cb523a2ca00f
fix the case where all vlc codes are 8 bits long (repeat=256)
michael
parents:
1528
diff
changeset
|
569 int repeat=0; |
2967 | 570 |
1529
cb523a2ca00f
fix the case where all vlc codes are 8 bits long (repeat=256)
michael
parents:
1528
diff
changeset
|
571 for(; i<256 && len[i]==val && repeat<255; i++) |
cb523a2ca00f
fix the case where all vlc codes are 8 bits long (repeat=256)
michael
parents:
1528
diff
changeset
|
572 repeat++; |
2967 | 573 |
1529
cb523a2ca00f
fix the case where all vlc codes are 8 bits long (repeat=256)
michael
parents:
1528
diff
changeset
|
574 assert(val < 32 && val >0 && repeat<256 && repeat>0); |
866 | 575 if(repeat>7){ |
2369 | 576 buf[index++]= val; |
577 buf[index++]= repeat; | |
866 | 578 }else{ |
2369 | 579 buf[index++]= val | (repeat<<5); |
866 | 580 } |
581 } | |
2967 | 582 |
2369 | 583 return index; |
866 | 584 } |
585 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
586 static av_cold int encode_init(AVCodecContext *avctx) |
866 | 587 { |
588 HYuvContext *s = avctx->priv_data; | |
2422 | 589 int i, j; |
866 | 590 |
2422 | 591 common_init(avctx); |
2967 | 592 |
2422 | 593 avctx->extradata= av_mallocz(1024*30); // 256*3+4 == 772 |
594 avctx->stats_out= av_mallocz(1024*30); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132 | |
866 | 595 s->version=2; |
2967 | 596 |
925 | 597 avctx->coded_frame= &s->picture; |
2967 | 598 |
866 | 599 switch(avctx->pix_fmt){ |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
600 case PIX_FMT_YUV420P: |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
601 s->bitstream_bpp= 12; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
602 break; |
866 | 603 case PIX_FMT_YUV422P: |
604 s->bitstream_bpp= 16; | |
605 break; | |
4682 | 606 case PIX_FMT_RGB32: |
607 s->bitstream_bpp= 24; | |
608 break; | |
866 | 609 default: |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1529
diff
changeset
|
610 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); |
866 | 611 return -1; |
612 } | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
613 avctx->bits_per_coded_sample= s->bitstream_bpp; |
866 | 614 s->decorrelate= s->bitstream_bpp >= 24; |
615 s->predictor= avctx->prediction_method; | |
2237
d43321e67acd
(non)interlaced huffyuv patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2233
diff
changeset
|
616 s->interlaced= avctx->flags&CODEC_FLAG_INTERLACED_ME ? 1 : 0; |
2369 | 617 if(avctx->context_model==1){ |
618 s->context= avctx->context_model; | |
619 if(s->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){ | |
620 av_log(avctx, AV_LOG_ERROR, "context=1 is not compatible with 2 pass huffyuv encoding\n"); | |
621 return -1; | |
622 } | |
623 }else s->context= 0; | |
2967 | 624 |
2373 | 625 if(avctx->codec->id==CODEC_ID_HUFFYUV){ |
626 if(avctx->pix_fmt==PIX_FMT_YUV420P){ | |
627 av_log(avctx, AV_LOG_ERROR, "Error: YV12 is not supported by huffyuv; use vcodec=ffvhuff or format=422p\n"); | |
628 return -1; | |
629 } | |
630 if(avctx->context_model){ | |
631 av_log(avctx, AV_LOG_ERROR, "Error: per-frame huffman tables are not supported by huffyuv; use vcodec=ffvhuff\n"); | |
632 return -1; | |
633 } | |
2422 | 634 if(s->interlaced != ( s->height > 288 )) |
2373 | 635 av_log(avctx, AV_LOG_INFO, "using huffyuv 2.2.0 or newer interlacing flag\n"); |
636 } | |
2967 | 637 |
4682 | 638 if(s->bitstream_bpp>=24 && s->predictor==MEDIAN){ |
639 av_log(avctx, AV_LOG_ERROR, "Error: RGB is incompatible with median predictor\n"); | |
640 return -1; | |
641 } | |
642 | |
643 ((uint8_t*)avctx->extradata)[0]= s->predictor | (s->decorrelate << 6); | |
866 | 644 ((uint8_t*)avctx->extradata)[1]= s->bitstream_bpp; |
2374 | 645 ((uint8_t*)avctx->extradata)[2]= s->interlaced ? 0x10 : 0x20; |
2369 | 646 if(s->context) |
647 ((uint8_t*)avctx->extradata)[2]|= 0x40; | |
866 | 648 ((uint8_t*)avctx->extradata)[3]= 0; |
649 s->avctx->extradata_size= 4; | |
2967 | 650 |
866 | 651 if(avctx->stats_in){ |
652 char *p= avctx->stats_in; | |
2967 | 653 |
866 | 654 for(i=0; i<3; i++) |
655 for(j=0; j<256; j++) | |
656 s->stats[i][j]= 1; | |
657 | |
658 for(;;){ | |
659 for(i=0; i<3; i++){ | |
660 char *next; | |
661 | |
662 for(j=0; j<256; j++){ | |
663 s->stats[i][j]+= strtol(p, &next, 0); | |
664 if(next==p) return -1; | |
665 p=next; | |
2967 | 666 } |
866 | 667 } |
668 if(p[0]==0 || p[1]==0 || p[2]==0) break; | |
669 } | |
670 }else{ | |
671 for(i=0; i<3; i++) | |
672 for(j=0; j<256; j++){ | |
673 int d= FFMIN(j, 256-j); | |
2967 | 674 |
866 | 675 s->stats[i][j]= 100000000/(d+1); |
676 } | |
677 } | |
2967 | 678 |
866 | 679 for(i=0; i<3; i++){ |
680 generate_len_table(s->len[i], s->stats[i], 256); | |
681 | |
682 if(generate_bits_table(s->bits[i], s->len[i])<0){ | |
683 return -1; | |
684 } | |
2967 | 685 |
2369 | 686 s->avctx->extradata_size+= |
687 store_table(s, s->len[i], &((uint8_t*)s->avctx->extradata)[s->avctx->extradata_size]); | |
866 | 688 } |
689 | |
2369 | 690 if(s->context){ |
691 for(i=0; i<3; i++){ | |
2422 | 692 int pels = s->width*s->height / (i?40:10); |
2369 | 693 for(j=0; j<256; j++){ |
694 int d= FFMIN(j, 256-j); | |
695 s->stats[i][j]= pels/(d+1); | |
696 } | |
697 } | |
698 }else{ | |
699 for(i=0; i<3; i++) | |
700 for(j=0; j<256; j++) | |
701 s->stats[i][j]= 0; | |
702 } | |
2967 | 703 |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7782
diff
changeset
|
704 // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_coded_sample, s->interlaced); |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1228
diff
changeset
|
705 |
2511 | 706 alloc_temp(s); |
707 | |
866 | 708 s->picture_number=0; |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1228
diff
changeset
|
709 |
866 | 710 return 0; |
711 } | |
8590 | 712 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */ |
866 | 713 |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
714 /* TODO instead of restarting the read when the code isn't in the first level |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
715 * of the joint table, jump into the 2nd level of the individual table. */ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
716 #define READ_2PIX(dst0, dst1, plane1){\ |
5072
1aec7fab94c4
use sparse huffman tables. 1.5% faster huffyuv decoding.
lorenm
parents:
5063
diff
changeset
|
717 uint16_t code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\ |
1aec7fab94c4
use sparse huffman tables. 1.5% faster huffyuv decoding.
lorenm
parents:
5063
diff
changeset
|
718 if(code != 0xffff){\ |
1aec7fab94c4
use sparse huffman tables. 1.5% faster huffyuv decoding.
lorenm
parents:
5063
diff
changeset
|
719 dst0 = code>>8;\ |
1aec7fab94c4
use sparse huffman tables. 1.5% faster huffyuv decoding.
lorenm
parents:
5063
diff
changeset
|
720 dst1 = code;\ |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
721 }else{\ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
722 dst0 = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);\ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
723 dst1 = get_vlc2(&s->gb, s->vlc[plane1].table, VLC_BITS, 3);\ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
724 }\ |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
725 } |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
726 |
866 | 727 static void decode_422_bitstream(HYuvContext *s, int count){ |
728 int i; | |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1228
diff
changeset
|
729 |
866 | 730 count/=2; |
2967 | 731 |
866 | 732 for(i=0; i<count; i++){ |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
733 READ_2PIX(s->temp[0][2*i ], s->temp[1][i], 1); |
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
734 READ_2PIX(s->temp[0][2*i+1], s->temp[2][i], 2); |
866 | 735 } |
736 } | |
737 | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
738 static void decode_gray_bitstream(HYuvContext *s, int count){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
739 int i; |
2967 | 740 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
741 count/=2; |
2967 | 742 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
743 for(i=0; i<count; i++){ |
5063
d5640ea6d4a6
merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
lorenm
parents:
5040
diff
changeset
|
744 READ_2PIX(s->temp[0][2*i ], s->temp[0][2*i+1], 0); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
745 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
746 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
747 |
8590 | 748 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
749 static int encode_422_bitstream(HYuvContext *s, int offset, int count){ |
866 | 750 int i; |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
751 const uint8_t *y = s->temp[0] + offset; |
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
752 const uint8_t *u = s->temp[1] + offset/2; |
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
753 const uint8_t *v = s->temp[2] + offset/2; |
2967 | 754 |
2422 | 755 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 2*4*count){ |
756 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
757 return -1; | |
758 } | |
2967 | 759 |
5026 | 760 #define LOAD4\ |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
761 int y0 = y[2*i];\ |
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
762 int y1 = y[2*i+1];\ |
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
763 int u0 = u[i];\ |
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
764 int v0 = v[i]; |
5026 | 765 |
866 | 766 count/=2; |
767 if(s->flags&CODEC_FLAG_PASS1){ | |
768 for(i=0; i<count; i++){ | |
5026 | 769 LOAD4; |
770 s->stats[0][y0]++; | |
771 s->stats[1][u0]++; | |
772 s->stats[0][y1]++; | |
773 s->stats[2][v0]++; | |
866 | 774 } |
2501 | 775 } |
776 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT) | |
777 return 0; | |
778 if(s->context){ | |
2369 | 779 for(i=0; i<count; i++){ |
5026 | 780 LOAD4; |
781 s->stats[0][y0]++; | |
782 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]); | |
783 s->stats[1][u0]++; | |
784 put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]); | |
785 s->stats[0][y1]++; | |
786 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]); | |
787 s->stats[2][v0]++; | |
788 put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]); | |
2369 | 789 } |
866 | 790 }else{ |
791 for(i=0; i<count; i++){ | |
5026 | 792 LOAD4; |
793 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]); | |
794 put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]); | |
795 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]); | |
796 put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]); | |
866 | 797 } |
798 } | |
2422 | 799 return 0; |
866 | 800 } |
801 | |
2422 | 802 static int encode_gray_bitstream(HYuvContext *s, int count){ |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
803 int i; |
2967 | 804 |
2422 | 805 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 4*count){ |
806 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
807 return -1; | |
808 } | |
809 | |
5026 | 810 #define LOAD2\ |
811 int y0 = s->temp[0][2*i];\ | |
812 int y1 = s->temp[0][2*i+1]; | |
813 #define STAT2\ | |
814 s->stats[0][y0]++;\ | |
815 s->stats[0][y1]++; | |
816 #define WRITE2\ | |
817 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\ | |
818 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]); | |
819 | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
820 count/=2; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
821 if(s->flags&CODEC_FLAG_PASS1){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
822 for(i=0; i<count; i++){ |
5026 | 823 LOAD2; |
824 STAT2; | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
825 } |
2501 | 826 } |
827 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT) | |
828 return 0; | |
2967 | 829 |
2501 | 830 if(s->context){ |
2369 | 831 for(i=0; i<count; i++){ |
5026 | 832 LOAD2; |
833 STAT2; | |
834 WRITE2; | |
2369 | 835 } |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
836 }else{ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
837 for(i=0; i<count; i++){ |
5026 | 838 LOAD2; |
839 WRITE2; | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
840 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
841 } |
2422 | 842 return 0; |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
843 } |
8590 | 844 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */ |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
845 |
5074 | 846 static av_always_inline void decode_bgr_1(HYuvContext *s, int count, int decorrelate, int alpha){ |
866 | 847 int i; |
5074 | 848 for(i=0; i<count; i++){ |
849 int code = get_vlc2(&s->gb, s->vlc[3].table, VLC_BITS, 1); | |
850 if(code != -1){ | |
851 *(uint32_t*)&s->temp[0][4*i] = s->pix_bgr_map[code]; | |
852 }else if(decorrelate){ | |
853 s->temp[0][4*i+G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); | |
854 s->temp[0][4*i+B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G]; | |
855 s->temp[0][4*i+R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G]; | |
866 | 856 }else{ |
5074 | 857 s->temp[0][4*i+B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3); |
858 s->temp[0][4*i+G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); | |
859 s->temp[0][4*i+R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); | |
866 | 860 } |
5074 | 861 if(alpha) |
862 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?! | |
863 } | |
864 } | |
865 | |
866 static void decode_bgr_bitstream(HYuvContext *s, int count){ | |
867 if(s->decorrelate){ | |
868 if(s->bitstream_bpp==24) | |
869 decode_bgr_1(s, count, 1, 0); | |
870 else | |
871 decode_bgr_1(s, count, 1, 1); | |
866 | 872 }else{ |
5074 | 873 if(s->bitstream_bpp==24) |
874 decode_bgr_1(s, count, 0, 0); | |
875 else | |
876 decode_bgr_1(s, count, 0, 1); | |
866 | 877 } |
878 } | |
879 | |
4682 | 880 static int encode_bgr_bitstream(HYuvContext *s, int count){ |
881 int i; | |
882 | |
883 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 3*4*count){ | |
884 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
885 return -1; | |
886 } | |
887 | |
5026 | 888 #define LOAD3\ |
889 int g= s->temp[0][4*i+G];\ | |
890 int b= (s->temp[0][4*i+B] - g) & 0xff;\ | |
891 int r= (s->temp[0][4*i+R] - g) & 0xff; | |
892 #define STAT3\ | |
893 s->stats[0][b]++;\ | |
894 s->stats[1][g]++;\ | |
895 s->stats[2][r]++; | |
896 #define WRITE3\ | |
897 put_bits(&s->pb, s->len[1][g], s->bits[1][g]);\ | |
898 put_bits(&s->pb, s->len[0][b], s->bits[0][b]);\ | |
899 put_bits(&s->pb, s->len[2][r], s->bits[2][r]); | |
900 | |
4682 | 901 if((s->flags&CODEC_FLAG_PASS1) && (s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT)){ |
902 for(i=0; i<count; i++){ | |
5026 | 903 LOAD3; |
904 STAT3; | |
4682 | 905 } |
906 }else if(s->context || (s->flags&CODEC_FLAG_PASS1)){ | |
907 for(i=0; i<count; i++){ | |
5026 | 908 LOAD3; |
909 STAT3; | |
910 WRITE3; | |
4682 | 911 } |
912 }else{ | |
913 for(i=0; i<count; i++){ | |
5026 | 914 LOAD3; |
915 WRITE3; | |
4682 | 916 } |
917 } | |
918 return 0; | |
919 } | |
920 | |
8590 | 921 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER |
871 | 922 static void draw_slice(HYuvContext *s, int y){ |
923 int h, cy; | |
1368 | 924 int offset[4]; |
2967 | 925 |
926 if(s->avctx->draw_horiz_band==NULL) | |
871 | 927 return; |
2967 | 928 |
871 | 929 h= y - s->last_slice_end; |
930 y -= h; | |
2967 | 931 |
871 | 932 if(s->bitstream_bpp==12){ |
933 cy= y>>1; | |
934 }else{ | |
935 cy= y; | |
936 } | |
1368 | 937 |
938 offset[0] = s->picture.linesize[0]*y; | |
939 offset[1] = s->picture.linesize[1]*cy; | |
940 offset[2] = s->picture.linesize[2]*cy; | |
941 offset[3] = 0; | |
871 | 942 emms_c(); |
943 | |
1370 | 944 s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h); |
2967 | 945 |
871 | 946 s->last_slice_end= y + h; |
947 } | |
948 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9346
diff
changeset
|
949 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){ |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9346
diff
changeset
|
950 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9346
diff
changeset
|
951 int buf_size = avpkt->size; |
866 | 952 HYuvContext *s = avctx->priv_data; |
953 const int width= s->width; | |
954 const int width2= s->width>>1; | |
955 const int height= s->height; | |
870 | 956 int fake_ystride, fake_ustride, fake_vstride; |
925 | 957 AVFrame * const p= &s->picture; |
2369 | 958 int table_size= 0; |
866 | 959 |
925 | 960 AVFrame *picture = data; |
866 | 961 |
9415
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
962 av_fast_malloc(&s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
963 if (!s->bitstream_buffer) |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
964 return AVERROR(ENOMEM); |
866 | 965 |
6234 | 966 s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (const uint32_t*)buf, buf_size/4); |
2967 | 967 |
1228 | 968 if(p->data[0]) |
969 avctx->release_buffer(avctx, p); | |
970 | |
903 | 971 p->reference= 0; |
972 if(avctx->get_buffer(avctx, p) < 0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1529
diff
changeset
|
973 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
903 | 974 return -1; |
975 } | |
2967 | 976 |
2369 | 977 if(s->context){ |
978 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size); | |
979 if(table_size < 0) | |
980 return -1; | |
981 } | |
982 | |
3201 | 983 if((unsigned)(buf_size-table_size) >= INT_MAX/8) |
984 return -1; | |
985 | |
2369 | 986 init_get_bits(&s->gb, s->bitstream_buffer+table_size, (buf_size-table_size)*8); |
870 | 987 |
903 | 988 fake_ystride= s->interlaced ? p->linesize[0]*2 : p->linesize[0]; |
989 fake_ustride= s->interlaced ? p->linesize[1]*2 : p->linesize[1]; | |
990 fake_vstride= s->interlaced ? p->linesize[2]*2 : p->linesize[2]; | |
2967 | 991 |
871 | 992 s->last_slice_end= 0; |
2967 | 993 |
866 | 994 if(s->bitstream_bpp<24){ |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
995 int y, cy; |
866 | 996 int lefty, leftu, leftv; |
997 int lefttopy, lefttopu, lefttopv; | |
2967 | 998 |
866 | 999 if(s->yuy2){ |
903 | 1000 p->data[0][3]= get_bits(&s->gb, 8); |
1001 p->data[0][2]= get_bits(&s->gb, 8); | |
1002 p->data[0][1]= get_bits(&s->gb, 8); | |
1003 p->data[0][0]= get_bits(&s->gb, 8); | |
2967 | 1004 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2552
diff
changeset
|
1005 av_log(avctx, AV_LOG_ERROR, "YUY2 output is not implemented yet\n"); |
866 | 1006 return -1; |
1007 }else{ | |
2967 | 1008 |
903 | 1009 leftv= p->data[2][0]= get_bits(&s->gb, 8); |
1010 lefty= p->data[0][1]= get_bits(&s->gb, 8); | |
1011 leftu= p->data[1][0]= get_bits(&s->gb, 8); | |
1012 p->data[0][0]= get_bits(&s->gb, 8); | |
2967 | 1013 |
866 | 1014 switch(s->predictor){ |
1015 case LEFT: | |
1016 case PLANE: | |
1017 decode_422_bitstream(s, width-2); | |
903 | 1018 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); |
866 | 1019 if(!(s->flags&CODEC_FLAG_GRAY)){ |
903 | 1020 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); |
1021 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); | |
866 | 1022 } |
1023 | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1024 for(cy=y=1; y<s->height; y++,cy++){ |
866 | 1025 uint8_t *ydst, *udst, *vdst; |
2967 | 1026 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1027 if(s->bitstream_bpp==12){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1028 decode_gray_bitstream(s, width); |
2967 | 1029 |
903 | 1030 ydst= p->data[0] + p->linesize[0]*y; |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1031 |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1032 lefty= add_left_prediction(ydst, s->temp[0], width, lefty); |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1033 if(s->predictor == PLANE){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1034 if(y>s->interlaced) |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1035 s->dsp.add_bytes(ydst, ydst - fake_ystride, width); |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1036 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1037 y++; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1038 if(y>=s->height) break; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1039 } |
2967 | 1040 |
871 | 1041 draw_slice(s, y); |
2967 | 1042 |
903 | 1043 ydst= p->data[0] + p->linesize[0]*y; |
1044 udst= p->data[1] + p->linesize[1]*cy; | |
1045 vdst= p->data[2] + p->linesize[2]*cy; | |
2967 | 1046 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1047 decode_422_bitstream(s, width); |
866 | 1048 lefty= add_left_prediction(ydst, s->temp[0], width, lefty); |
1049 if(!(s->flags&CODEC_FLAG_GRAY)){ | |
1050 leftu= add_left_prediction(udst, s->temp[1], width2, leftu); | |
1051 leftv= add_left_prediction(vdst, s->temp[2], width2, leftv); | |
1052 } | |
1053 if(s->predictor == PLANE){ | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1054 if(cy>s->interlaced){ |
866 | 1055 s->dsp.add_bytes(ydst, ydst - fake_ystride, width); |
1056 if(!(s->flags&CODEC_FLAG_GRAY)){ | |
1057 s->dsp.add_bytes(udst, udst - fake_ustride, width2); | |
1058 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2); | |
1059 } | |
1060 } | |
1061 } | |
1062 } | |
871 | 1063 draw_slice(s, height); |
2967 | 1064 |
866 | 1065 break; |
1066 case MEDIAN: | |
1067 /* first line except first 2 pixels is left predicted */ | |
1068 decode_422_bitstream(s, width-2); | |
903 | 1069 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); |
866 | 1070 if(!(s->flags&CODEC_FLAG_GRAY)){ |
903 | 1071 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); |
1072 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); | |
866 | 1073 } |
2967 | 1074 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1075 cy=y=1; |
2967 | 1076 |
866 | 1077 /* second line is left predicted for interlaced case */ |
1078 if(s->interlaced){ | |
1079 decode_422_bitstream(s, width); | |
903 | 1080 lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty); |
866 | 1081 if(!(s->flags&CODEC_FLAG_GRAY)){ |
903 | 1082 leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu); |
1083 leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv); | |
866 | 1084 } |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1085 y++; cy++; |
866 | 1086 } |
1087 | |
1088 /* next 4 pixels are left predicted too */ | |
1089 decode_422_bitstream(s, 4); | |
903 | 1090 lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty); |
866 | 1091 if(!(s->flags&CODEC_FLAG_GRAY)){ |
903 | 1092 leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu); |
1093 leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv); | |
866 | 1094 } |
1095 | |
1096 /* next line except the first 4 pixels is median predicted */ | |
903 | 1097 lefttopy= p->data[0][3]; |
866 | 1098 decode_422_bitstream(s, width-4); |
8760 | 1099 s->dsp.add_hfyu_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy); |
866 | 1100 if(!(s->flags&CODEC_FLAG_GRAY)){ |
903 | 1101 lefttopu= p->data[1][1]; |
1102 lefttopv= p->data[2][1]; | |
8760 | 1103 s->dsp.add_hfyu_median_prediction(p->data[1] + fake_ustride+2, p->data[1]+2, s->temp[1], width2-2, &leftu, &lefttopu); |
1104 s->dsp.add_hfyu_median_prediction(p->data[2] + fake_vstride+2, p->data[2]+2, s->temp[2], width2-2, &leftv, &lefttopv); | |
866 | 1105 } |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1106 y++; cy++; |
2967 | 1107 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1108 for(; y<height; y++,cy++){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1109 uint8_t *ydst, *udst, *vdst; |
866 | 1110 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1111 if(s->bitstream_bpp==12){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1112 while(2*cy > y){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1113 decode_gray_bitstream(s, width); |
903 | 1114 ydst= p->data[0] + p->linesize[0]*y; |
8760 | 1115 s->dsp.add_hfyu_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1116 y++; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1117 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1118 if(y>=height) break; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1119 } |
871 | 1120 draw_slice(s, y); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1121 |
866 | 1122 decode_422_bitstream(s, width); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1123 |
903 | 1124 ydst= p->data[0] + p->linesize[0]*y; |
1125 udst= p->data[1] + p->linesize[1]*cy; | |
1126 vdst= p->data[2] + p->linesize[2]*cy; | |
866 | 1127 |
8760 | 1128 s->dsp.add_hfyu_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy); |
866 | 1129 if(!(s->flags&CODEC_FLAG_GRAY)){ |
8760 | 1130 s->dsp.add_hfyu_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu); |
1131 s->dsp.add_hfyu_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv); | |
866 | 1132 } |
1133 } | |
871 | 1134 |
1135 draw_slice(s, height); | |
866 | 1136 break; |
1137 } | |
1138 } | |
1139 }else{ | |
1140 int y; | |
1141 int leftr, leftg, leftb; | |
903 | 1142 const int last_line= (height-1)*p->linesize[0]; |
2967 | 1143 |
866 | 1144 if(s->bitstream_bpp==32){ |
2177 | 1145 skip_bits(&s->gb, 8); |
1146 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); | |
1147 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); | |
1148 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); | |
866 | 1149 }else{ |
2177 | 1150 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); |
1151 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); | |
1152 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); | |
866 | 1153 skip_bits(&s->gb, 8); |
1154 } | |
2967 | 1155 |
866 | 1156 if(s->bgr32){ |
1157 switch(s->predictor){ | |
1158 case LEFT: | |
1159 case PLANE: | |
1160 decode_bgr_bitstream(s, width-1); | |
903 | 1161 add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb); |
866 | 1162 |
5129 | 1163 for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down. |
866 | 1164 decode_bgr_bitstream(s, width); |
2967 | 1165 |
903 | 1166 add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb); |
866 | 1167 if(s->predictor == PLANE){ |
2351 | 1168 if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){ |
2967 | 1169 s->dsp.add_bytes(p->data[0] + p->linesize[0]*y, |
903 | 1170 p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride); |
866 | 1171 } |
1172 } | |
1173 } | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2552
diff
changeset
|
1174 draw_slice(s, height); // just 1 large slice as this is not possible in reverse order |
866 | 1175 break; |
1176 default: | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1529
diff
changeset
|
1177 av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n"); |
866 | 1178 } |
1179 }else{ | |
1180 | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2552
diff
changeset
|
1181 av_log(avctx, AV_LOG_ERROR, "BGR24 output is not implemented yet\n"); |
866 | 1182 return -1; |
1183 } | |
1184 } | |
1185 emms_c(); | |
2967 | 1186 |
903 | 1187 *picture= *p; |
925 | 1188 *data_size = sizeof(AVFrame); |
2967 | 1189 |
3234
823272bdb4f7
dont forget table_size in the decode_frame return value
michael
parents:
3201
diff
changeset
|
1190 return (get_bits_count(&s->gb)+31)/32*4 + table_size; |
866 | 1191 } |
8590 | 1192 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */ |
866 | 1193 |
2422 | 1194 static int common_end(HYuvContext *s){ |
1195 int i; | |
2967 | 1196 |
2422 | 1197 for(i=0; i<3; i++){ |
1198 av_freep(&s->temp[i]); | |
1199 } | |
1200 return 0; | |
1201 } | |
1202 | |
8590 | 1203 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
1204 static av_cold int decode_end(AVCodecContext *avctx) |
866 | 1205 { |
1206 HYuvContext *s = avctx->priv_data; | |
1207 int i; | |
2967 | 1208 |
2422 | 1209 common_end(s); |
1210 av_freep(&s->bitstream_buffer); | |
2967 | 1211 |
5221 | 1212 for(i=0; i<6; i++){ |
903 | 1213 free_vlc(&s->vlc[i]); |
1214 } | |
866 | 1215 |
1216 return 0; | |
1217 } | |
8590 | 1218 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */ |
866 | 1219 |
8590 | 1220 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER |
866 | 1221 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ |
1222 HYuvContext *s = avctx->priv_data; | |
925 | 1223 AVFrame *pict = data; |
866 | 1224 const int width= s->width; |
1225 const int width2= s->width>>1; | |
1226 const int height= s->height; | |
1227 const int fake_ystride= s->interlaced ? pict->linesize[0]*2 : pict->linesize[0]; | |
1228 const int fake_ustride= s->interlaced ? pict->linesize[1]*2 : pict->linesize[1]; | |
1229 const int fake_vstride= s->interlaced ? pict->linesize[2]*2 : pict->linesize[2]; | |
925 | 1230 AVFrame * const p= &s->picture; |
2369 | 1231 int i, j, size=0; |
866 | 1232 |
903 | 1233 *p = *pict; |
1006 | 1234 p->pict_type= FF_I_TYPE; |
1235 p->key_frame= 1; | |
2967 | 1236 |
2369 | 1237 if(s->context){ |
1238 for(i=0; i<3; i++){ | |
1239 generate_len_table(s->len[i], s->stats[i], 256); | |
1240 if(generate_bits_table(s->bits[i], s->len[i])<0) | |
1241 return -1; | |
1242 size+= store_table(s, s->len[i], &buf[size]); | |
1243 } | |
1244 | |
1245 for(i=0; i<3; i++) | |
1246 for(j=0; j<256; j++) | |
1247 s->stats[i][j] >>= 1; | |
1248 } | |
1249 | |
1250 init_put_bits(&s->pb, buf+size, buf_size-size); | |
1251 | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1252 if(avctx->pix_fmt == PIX_FMT_YUV422P || avctx->pix_fmt == PIX_FMT_YUV420P){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1253 int lefty, leftu, leftv, y, cy; |
866 | 1254 |
903 | 1255 put_bits(&s->pb, 8, leftv= p->data[2][0]); |
1256 put_bits(&s->pb, 8, lefty= p->data[0][1]); | |
1257 put_bits(&s->pb, 8, leftu= p->data[1][0]); | |
1258 put_bits(&s->pb, 8, p->data[0][0]); | |
2967 | 1259 |
9695
f1f5e78cf0aa
Fix passing of unaligned addresses to dsputil diff_bytes() by
heydowns
parents:
9694
diff
changeset
|
1260 lefty= sub_left_prediction(s, s->temp[0], p->data[0], width , 0); |
f1f5e78cf0aa
Fix passing of unaligned addresses to dsputil diff_bytes() by
heydowns
parents:
9694
diff
changeset
|
1261 leftu= sub_left_prediction(s, s->temp[1], p->data[1], width2, 0); |
f1f5e78cf0aa
Fix passing of unaligned addresses to dsputil diff_bytes() by
heydowns
parents:
9694
diff
changeset
|
1262 leftv= sub_left_prediction(s, s->temp[2], p->data[2], width2, 0); |
2967 | 1263 |
9695
f1f5e78cf0aa
Fix passing of unaligned addresses to dsputil diff_bytes() by
heydowns
parents:
9694
diff
changeset
|
1264 encode_422_bitstream(s, 2, width-2); |
2967 | 1265 |
866 | 1266 if(s->predictor==MEDIAN){ |
1267 int lefttopy, lefttopu, lefttopv; | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1268 cy=y=1; |
866 | 1269 if(s->interlaced){ |
903 | 1270 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+p->linesize[0], width , lefty); |
1271 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+p->linesize[1], width2, leftu); | |
1272 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+p->linesize[2], width2, leftv); | |
2967 | 1273 |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
1274 encode_422_bitstream(s, 0, width); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1275 y++; cy++; |
866 | 1276 } |
2967 | 1277 |
903 | 1278 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+fake_ystride, 4, lefty); |
2190 | 1279 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+fake_ustride, 2, leftu); |
1280 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+fake_vstride, 2, leftv); | |
2967 | 1281 |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
1282 encode_422_bitstream(s, 0, 4); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1283 |
903 | 1284 lefttopy= p->data[0][3]; |
1285 lefttopu= p->data[1][1]; | |
1286 lefttopv= p->data[2][1]; | |
1527 | 1287 s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy); |
1288 s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu); | |
1289 s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv); | |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
1290 encode_422_bitstream(s, 0, width-4); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1291 y++; cy++; |
866 | 1292 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1293 for(; y<height; y++,cy++){ |
866 | 1294 uint8_t *ydst, *udst, *vdst; |
2967 | 1295 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1296 if(s->bitstream_bpp==12){ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1297 while(2*cy > y){ |
903 | 1298 ydst= p->data[0] + p->linesize[0]*y; |
1527 | 1299 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1300 encode_gray_bitstream(s, width); |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1301 y++; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1302 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1303 if(y>=height) break; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1304 } |
903 | 1305 ydst= p->data[0] + p->linesize[0]*y; |
1306 udst= p->data[1] + p->linesize[1]*cy; | |
1307 vdst= p->data[2] + p->linesize[2]*cy; | |
866 | 1308 |
1527 | 1309 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy); |
1310 s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu); | |
1311 s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv); | |
866 | 1312 |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
1313 encode_422_bitstream(s, 0, width); |
866 | 1314 } |
1315 }else{ | |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1316 for(cy=y=1; y<height; y++,cy++){ |
866 | 1317 uint8_t *ydst, *udst, *vdst; |
2967 | 1318 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1319 /* encode a luma only line & y++ */ |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1320 if(s->bitstream_bpp==12){ |
903 | 1321 ydst= p->data[0] + p->linesize[0]*y; |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1322 |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1323 if(s->predictor == PLANE && s->interlaced < y){ |
871 | 1324 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1325 |
871 | 1326 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1327 }else{ |
871 | 1328 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty); |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1329 } |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1330 encode_gray_bitstream(s, width); |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1331 y++; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1332 if(y>=height) break; |
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1333 } |
2967 | 1334 |
903 | 1335 ydst= p->data[0] + p->linesize[0]*y; |
1336 udst= p->data[1] + p->linesize[1]*cy; | |
1337 vdst= p->data[2] + p->linesize[2]*cy; | |
866 | 1338 |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1339 if(s->predictor == PLANE && s->interlaced < cy){ |
871 | 1340 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width); |
1341 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2); | |
2511 | 1342 s->dsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2); |
866 | 1343 |
871 | 1344 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty); |
1345 leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu); | |
2511 | 1346 leftv= sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv); |
866 | 1347 }else{ |
871 | 1348 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty); |
1349 leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu); | |
1350 leftv= sub_left_prediction(s, s->temp[2], vdst, width2, leftv); | |
866 | 1351 } |
1352 | |
9694
39f6d1f21ef8
Add offset argument to encode_422_bitstream() to control where
heydowns
parents:
9428
diff
changeset
|
1353 encode_422_bitstream(s, 0, width); |
866 | 1354 } |
2967 | 1355 } |
4682 | 1356 }else if(avctx->pix_fmt == PIX_FMT_RGB32){ |
1357 uint8_t *data = p->data[0] + (height-1)*p->linesize[0]; | |
1358 const int stride = -p->linesize[0]; | |
1359 const int fake_stride = -fake_ystride; | |
1360 int y; | |
1361 int leftr, leftg, leftb; | |
1362 | |
1363 put_bits(&s->pb, 8, leftr= data[R]); | |
1364 put_bits(&s->pb, 8, leftg= data[G]); | |
1365 put_bits(&s->pb, 8, leftb= data[B]); | |
1366 put_bits(&s->pb, 8, 0); | |
1367 | |
1368 sub_left_prediction_bgr32(s, s->temp[0], data+4, width-1, &leftr, &leftg, &leftb); | |
1369 encode_bgr_bitstream(s, width-1); | |
1370 | |
1371 for(y=1; y<s->height; y++){ | |
1372 uint8_t *dst = data + y*stride; | |
1373 if(s->predictor == PLANE && s->interlaced < y){ | |
1374 s->dsp.diff_bytes(s->temp[1], dst, dst - fake_stride, width*4); | |
1375 sub_left_prediction_bgr32(s, s->temp[0], s->temp[1], width, &leftr, &leftg, &leftb); | |
1376 }else{ | |
1377 sub_left_prediction_bgr32(s, s->temp[0], dst, width, &leftr, &leftg, &leftb); | |
1378 } | |
1379 encode_bgr_bitstream(s, width); | |
1380 } | |
866 | 1381 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1529
diff
changeset
|
1382 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n"); |
866 | 1383 } |
1384 emms_c(); | |
2967 | 1385 |
2369 | 1386 size+= (put_bits_count(&s->pb)+31)/8; |
9346
ee59f4f22dce
Make sure the last bits of huffyuv frames are zeroed.
michael
parents:
9007
diff
changeset
|
1387 put_bits(&s->pb, 16, 0); |
ee59f4f22dce
Make sure the last bits of huffyuv frames are zeroed.
michael
parents:
9007
diff
changeset
|
1388 put_bits(&s->pb, 15, 0); |
2369 | 1389 size/= 4; |
2967 | 1390 |
866 | 1391 if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){ |
1392 int j; | |
1393 char *p= avctx->stats_out; | |
2423 | 1394 char *end= p + 1024*30; |
866 | 1395 for(i=0; i<3; i++){ |
1396 for(j=0; j<256; j++){ | |
2962 | 1397 snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]); |
866 | 1398 p+= strlen(p); |
1399 s->stats[i][j]= 0; | |
1400 } | |
2423 | 1401 snprintf(p, end-p, "\n"); |
866 | 1402 p++; |
1403 } | |
5025
65dd8127ca46
r3938 broke 2pass huffyuv (not that anyone uses it)
lorenm
parents:
4962
diff
changeset
|
1404 } else |
65dd8127ca46
r3938 broke 2pass huffyuv (not that anyone uses it)
lorenm
parents:
4962
diff
changeset
|
1405 avctx->stats_out[0] = '\0'; |
2501 | 1406 if(!(s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)){ |
868
dfe7d66da6f0
YV12 support (warning this is experimental & wont work with offical huffyuv but there is a approx. 20% speed & compression gain)
michaelni
parents:
866
diff
changeset
|
1407 flush_put_bits(&s->pb); |
1273 | 1408 s->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size); |
866 | 1409 } |
2967 | 1410 |
866 | 1411 s->picture_number++; |
903 | 1412 |
866 | 1413 return size*4; |
1414 } | |
1415 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
1416 static av_cold int encode_end(AVCodecContext *avctx) |
866 | 1417 { |
2422 | 1418 HYuvContext *s = avctx->priv_data; |
2967 | 1419 |
2422 | 1420 common_end(s); |
866 | 1421 |
1422 av_freep(&avctx->extradata); | |
1423 av_freep(&avctx->stats_out); | |
2967 | 1424 |
866 | 1425 return 0; |
1426 } | |
8590 | 1427 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */ |
866 | 1428 |
8590 | 1429 #if CONFIG_HUFFYUV_DECODER |
866 | 1430 AVCodec huffyuv_decoder = { |
1431 "huffyuv", | |
1432 CODEC_TYPE_VIDEO, | |
1433 CODEC_ID_HUFFYUV, | |
1434 sizeof(HYuvContext), | |
1435 decode_init, | |
1436 NULL, | |
1437 decode_end, | |
1438 decode_frame, | |
871 | 1439 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND, |
6722 | 1440 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6788
diff
changeset
|
1441 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"), |
866 | 1442 }; |
7776
dbcdd0165e55
Replace generic CONFIG_DECODERS preprocessor conditionals by more specific
diego
parents:
7040
diff
changeset
|
1443 #endif |
866 | 1444 |
8590 | 1445 #if CONFIG_FFVHUFF_DECODER |
2373 | 1446 AVCodec ffvhuff_decoder = { |
1447 "ffvhuff", | |
1448 CODEC_TYPE_VIDEO, | |
1449 CODEC_ID_FFVHUFF, | |
1450 sizeof(HYuvContext), | |
1451 decode_init, | |
1452 NULL, | |
1453 decode_end, | |
1454 decode_frame, | |
1455 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND, | |
6722 | 1456 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6788
diff
changeset
|
1457 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"), |
2373 | 1458 }; |
3777 | 1459 #endif |
2373 | 1460 |
8590 | 1461 #if CONFIG_HUFFYUV_ENCODER |
866 | 1462 AVCodec huffyuv_encoder = { |
1463 "huffyuv", | |
1464 CODEC_TYPE_VIDEO, | |
1465 CODEC_ID_HUFFYUV, | |
1466 sizeof(HYuvContext), | |
1467 encode_init, | |
1468 encode_frame, | |
1469 encode_end, | |
6788 | 1470 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_RGB32, PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6788
diff
changeset
|
1471 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"), |
866 | 1472 }; |
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7776
diff
changeset
|
1473 #endif |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1228
diff
changeset
|
1474 |
8590 | 1475 #if CONFIG_FFVHUFF_ENCODER |
2373 | 1476 AVCodec ffvhuff_encoder = { |
1477 "ffvhuff", | |
1478 CODEC_TYPE_VIDEO, | |
1479 CODEC_ID_FFVHUFF, | |
1480 sizeof(HYuvContext), | |
1481 encode_init, | |
1482 encode_frame, | |
1483 encode_end, | |
6788 | 1484 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_RGB32, PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6788
diff
changeset
|
1485 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"), |
2373 | 1486 }; |
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7776
diff
changeset
|
1487 #endif |