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