85 #define classic_shift_luma_table_size 42
87 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
88 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
92 #define classic_shift_chroma_table_size 59
94 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
95 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
96 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
100 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
101 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
102 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
103 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
104 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
105 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
106 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
107 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
108 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
109 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
110 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
111 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
112 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
113 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
114 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
115 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
119 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
120 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
121 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
122 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63,
123 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
124 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
125 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111,
126 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1,
127 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134,
128 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96,
129 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
130 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
131 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26,
132 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
133 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
134 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
141 const int temp= src[i];
148 const int temp= src[i];
163 for(i=0; i<
FFMIN(w,4); i++){
164 const int rt= src[i*4+
R];
165 const int gt= src[i*4+
G];
166 const int bt= src[i*4+
B];
175 *red= src[(w-1)*4+
R];
176 *green= src[(w-1)*4+
G];
177 *blue= src[(w-1)*4+
B];
203 for(len=32; len>0; len--){
204 for(index=0; index<256; index++){
205 if(len_table[index]==len)
217 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
223 static void heap_sift(HeapElem *h,
int root,
int size)
225 while(root*2+1 < size) {
226 int child = root*2+1;
227 if(child < size-1 && h[child].val > h[child+1].val)
229 if(h[root].val > h[child].val) {
230 FFSWAP(HeapElem, h[root], h[child]);
237 static void generate_len_table(uint8_t *dst,
const uint64_t *stats){
244 for(offset=1; ; offset<<=1){
245 for(i=0; i<
size; i++){
247 h[i].val = (stats[i] << 8) + offset;
249 for(i=size/2-1; i>=0; i--)
250 heap_sift(h, i, size);
252 for(next=size; next<size*2-1; next++){
254 uint64_t min1v = h[0].val;
255 up[h[0].name] = next;
257 heap_sift(h, 0, size);
258 up[h[0].name] = next;
261 heap_sift(h, 0, size);
265 for(i=2*size-3; i>=
size; i--)
266 len[i] = len[up[i]] + 1;
267 for(i=0; i<
size; i++) {
268 dst[i] = len[up[i]] + 1;
269 if(dst[i] >= 32)
break;
283 for(i=y=0; y<256; y++){
284 int len0 = s->
len[0][y];
288 for(u=0; u<256; u++){
289 int len1 = s->
len[p][u];
292 len[i] = len0 + len1;
293 bits[i] = (s->
bits[0][y] << len1) + s->
bits[p][u];
294 symbols[i] = (y<<8) + u;
295 if(symbols[i] != 0xffff)
300 init_vlc_sparse(&s->
vlc[3+p],
VLC_BITS, i, len, 1, 1, bits, 2, 2, symbols, 2, 2, 0);
304 int i,
b,
g,
r, code;
310 for(i=0,
g=-16;
g<16;
g++){
311 int len0 = s->
len[p0][
g&255];
315 for(
b=-16;
b<16;
b++){
316 int len1 = s->
len[p1][
b&255];
317 int limit1 = limit0 - len1;
320 code = (s->
bits[p0][
g&255] << len1) + s->
bits[p1][
b&255];
321 for(
r=-16;
r<16;
r++){
322 int len2 = s->
len[2][
r&255];
325 len[i] = len0 + len1 + len2;
326 bits[i] = (code << len2) + s->
bits[2][
r&255];
382 memcpy(s->
bits[1], s->
bits[0], 256*
sizeof(uint32_t));
383 memcpy(s->
len[1] , s->
len [0], 256*
sizeof(uint8_t));
385 memcpy(s->
bits[2], s->
bits[1], 256*
sizeof(uint32_t));
386 memcpy(s->
len[2] , s->
len [1], 256*
sizeof(uint8_t));
429 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
435 memset(s->
vlc, 0, 3*
sizeof(
VLC));
452 int method, interlace;
463 interlace= (((uint8_t*)avctx->
extradata)[2] & 0x30) >> 4;
537 for (i = 0; i < 6; i++)
552 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
553 static int store_table(
HYuvContext *s,
const uint8_t *len, uint8_t *buf){
561 for(; i<256 && len[i]==val && repeat<255; i++)
564 assert(val < 32 && val >0 && repeat<256 && repeat>0);
567 buf[index++]= repeat;
569 buf[index++]= val | (repeat<<5);
610 av_log(avctx,
AV_LOG_ERROR,
"context=1 is not compatible with 2 pass huffyuv encoding\n");
617 av_log(avctx,
AV_LOG_ERROR,
"Error: YV12 is not supported by huffyuv; use vcodec=ffvhuff or format=422p\n");
621 av_log(avctx,
AV_LOG_ERROR,
"Error: per-frame huffman tables are not supported by huffyuv; use vcodec=ffvhuff\n");
652 for(j=0; j<256; j++){
653 s->
stats[i][j]+= strtol(p, &next, 0);
654 if(next==p)
return -1;
658 if(p[0]==0 || p[1]==0 || p[2]==0)
break;
662 for(j=0; j<256; j++){
663 int d=
FFMIN(j, 256-j);
665 s->
stats[i][j]= 100000000/(d+1);
670 generate_len_table(s->
len[i], s->
stats[i]);
683 for(j=0; j<256; j++){
684 int d=
FFMIN(j, 256-j);
685 s->
stats[i][j]= pels/(d+1);
706 #define READ_2PIX(dst0, dst1, plane1){\
707 uint16_t code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\
712 dst0 = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);\
713 dst1 = get_vlc2(&s->gb, s->vlc[plane1].table, VLC_BITS, 3);\
728 for(i=0; i<count; i++){
745 for(i=0; i<count; i++){
751 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
752 static int encode_422_bitstream(
HYuvContext *s,
int offset,
int count){
754 const uint8_t *y = s->
temp[0] + offset;
755 const uint8_t *u = s->
temp[1] + offset/2;
756 const uint8_t *
v = s->
temp[2] + offset/2;
771 for(i=0; i<count; i++){
782 for(i=0; i<count; i++){
794 for(i=0; i<count; i++){
805 static int encode_gray_bitstream(
HYuvContext *s,
int count){
814 int y0 = s->temp[0][2*i];\
815 int y1 = s->temp[0][2*i+1];
820 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\
821 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
825 for(i=0; i<count; i++){
834 for(i=0; i<count; i++){
840 for(i=0; i<count; i++){
851 for(i=0; i<count; i++){
855 }
else if(decorrelate){
892 int g= s->temp[0][4*i+G];\
893 int b= (s->temp[0][4*i+B] - g) & 0xff;\
894 int r= (s->temp[0][4*i+R] - g) & 0xff;
900 put_bits(&s->pb, s->len[1][g], s->bits[1][g]);\
901 put_bits(&s->pb, s->len[0][b], s->bits[0][b]);\
902 put_bits(&s->pb, s->len[2][r], s->bits[2][r]);
905 for(i=0; i<count; i++){
910 for(i=0; i<count; i++){
916 for(i=0; i<count; i++){
924 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
954 const uint8_t *buf = avpkt->
data;
955 int buf_size = avpkt->
size;
958 const int width2= s->
width>>1;
960 int fake_ystride, fake_ustride, fake_vstride;
988 if((
unsigned)(buf_size-table_size) >= INT_MAX/8)
1001 int lefty, leftu, leftv;
1002 int lefttopy, lefttopu, lefttopv;
1029 for(cy=y=1; y<s->
height; y++,cy++){
1030 uint8_t *ydst, *udst, *vdst;
1102 lefttopy= p->
data[0][3];
1106 lefttopu= p->
data[1][1];
1107 lefttopv= p->
data[2][1];
1113 for(; y<
height; y++,cy++){
1114 uint8_t *ydst, *udst, *vdst;
1123 if(y>=height)
break;
1146 int leftr, leftg, leftb, lefta;
1147 const int last_line= (height-1)*p->
linesize[0];
1158 lefta= p->
data[0][last_line+
A]= 255;
1169 for(y=s->
height-2; y>=0; y--){
1177 p->
data[0] + p->
linesize[0]*y + fake_ystride, fake_ystride);
1210 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
1230 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
1234 const int width= s->
width;
1235 const int width2= s->
width>>1;
1236 const int height= s->
height;
1249 generate_len_table(s->
len[i], s->
stats[i]);
1252 size+= store_table(s, s->
len[i], &buf[size]);
1256 for(j=0; j<256; j++)
1257 s->
stats[i][j] >>= 1;
1263 int lefty, leftu, leftv, y, cy;
1274 encode_422_bitstream(s, 2, width-2);
1277 int lefttopy, lefttopu, lefttopv;
1284 encode_422_bitstream(s, 0, width);
1292 encode_422_bitstream(s, 0, 4);
1294 lefttopy= p->
data[0][3];
1295 lefttopu= p->
data[1][1];
1296 lefttopv= p->
data[2][1];
1300 encode_422_bitstream(s, 0, width-4);
1303 for(; y<
height; y++,cy++){
1304 uint8_t *ydst, *udst, *vdst;
1310 encode_gray_bitstream(s, width);
1313 if(y>=height)
break;
1323 encode_422_bitstream(s, 0, width);
1326 for(cy=y=1; y<
height; y++,cy++){
1327 uint8_t *ydst, *udst, *vdst;
1340 encode_gray_bitstream(s, width);
1342 if(y>=height)
break;
1363 encode_422_bitstream(s, 0, width);
1367 uint8_t *data = p->
data[0] + (height-1)*p->
linesize[0];
1369 const int fake_stride = -fake_ystride;
1371 int leftr, leftg, leftb;
1381 for(y=1; y<s->
height; y++){
1382 uint8_t *dst = data + y*
stride;
1404 char *end= p + 1024*30;
1406 for(j=0; j<256; j++){
1407 snprintf(p, end-p,
"%"PRIu64
" ", s->
stats[i][j]);
1411 snprintf(p, end-p,
"\n");
1418 s->
dsp.
bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
1439 #if CONFIG_HUFFYUV_DECODER
1440 AVCodec ff_huffyuv_decoder = {
1454 #if CONFIG_FFVHUFF_DECODER
1455 AVCodec ff_ffvhuff_decoder = {
1469 #if CONFIG_HUFFYUV_ENCODER
1470 AVCodec ff_huffyuv_encoder = {
1483 #if CONFIG_FFVHUFF_ENCODER
1484 AVCodec ff_ffvhuff_encoder = {