annotate src/ffmpeg/libavcodec/huffyuv.c @ 814:2eaaa3aa182b trunk

[svn] - make the whole thing compile. runtime linking is another story.
author nenolod
date Mon, 12 Mar 2007 13:00:06 -0700
parents e8776388b02a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
808
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2 * huffyuv codec for libavcodec
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4 * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at>
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
5 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
6 * This file is part of FFmpeg.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
7 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
12 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
16 * Lesser General Public License for more details.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
17 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
21 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
22 * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
23 * the algorithm used
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
24 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
25
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
26 /**
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
27 * @file huffyuv.c
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
28 * huffyuv codec for libavcodec.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
29 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
30
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
31 #include "common.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
32 #include "bitstream.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
33 #include "avcodec.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
34 #include "dsputil.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
35
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
36 #define VLC_BITS 11
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
37
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
38 #ifdef WORDS_BIGENDIAN
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
39 #define B 3
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
40 #define G 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
41 #define R 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
42 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
43 #define B 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
44 #define G 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
45 #define R 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
46 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
47
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
48 typedef enum Predictor{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
49 LEFT= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
50 PLANE,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
51 MEDIAN,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
52 } Predictor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
53
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
54 typedef struct HYuvContext{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
55 AVCodecContext *avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
56 Predictor predictor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
57 GetBitContext gb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
58 PutBitContext pb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
59 int interlaced;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
60 int decorrelate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
61 int bitstream_bpp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
62 int version;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
63 int yuy2; //use yuy2 instead of 422P
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
64 int bgr32; //use bgr32 instead of bgr24
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
65 int width, height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
66 int flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
67 int context;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
68 int picture_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
69 int last_slice_end;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
70 uint8_t *temp[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
71 uint64_t stats[3][256];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
72 uint8_t len[3][256];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
73 uint32_t bits[3][256];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
74 VLC vlc[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
75 AVFrame picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
76 uint8_t *bitstream_buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
77 unsigned int bitstream_buffer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
78 DSPContext dsp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
79 }HYuvContext;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
80
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
81 static const unsigned char classic_shift_luma[] = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
82 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
83 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
84 69,68, 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
85 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
86
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
87 static const unsigned char classic_shift_chroma[] = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
88 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
89 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
90 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
91 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
92
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
93 static const unsigned char classic_add_luma[256] = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
94 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
95 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
96 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
97 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
98 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
99 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
100 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
101 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
102 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
103 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
104 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
105 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
106 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
107 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
108 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
109 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
110 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
111
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
112 static const unsigned char classic_add_chroma[256] = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
113 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
114 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
115 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
116 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
117 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
118 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
119 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
120 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
121 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
122 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
123 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
124 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
125 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
126 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
127 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
128 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
129 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
130
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
131 static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
132 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
133
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
134 for(i=0; i<w-1; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
135 acc+= src[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
136 dst[i]= acc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
137 i++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
138 acc+= src[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
139 dst[i]= acc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
140 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
141
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
142 for(; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
143 acc+= src[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
144 dst[i]= acc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
145 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
146
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
147 return acc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
148 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
149
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
150 static inline void add_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
151 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
152 uint8_t l, lt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
153
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
154 l= *left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
155 lt= *left_top;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
156
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
157 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
158 l= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF) + diff[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
159 lt= src1[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
160 dst[i]= l;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
161 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
162
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
163 *left= l;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
164 *left_top= lt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
165 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
166
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
167 static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
168 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
169 int r,g,b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
170 r= *red;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
171 g= *green;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
172 b= *blue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
173
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
174 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
175 b+= src[4*i+B];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
176 g+= src[4*i+G];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
177 r+= src[4*i+R];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
178
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
179 dst[4*i+B]= b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
180 dst[4*i+G]= g;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
181 dst[4*i+R]= r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
182 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
183
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
184 *red= r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
185 *green= g;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
186 *blue= b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
187 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
188
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
189 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
190 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
191 if(w<32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
192 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
193 const int temp= src[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
194 dst[i]= temp - left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
195 left= temp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
196 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
197 return left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
198 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
199 for(i=0; i<16; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
200 const int temp= src[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
201 dst[i]= temp - left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
202 left= temp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
203 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
204 s->dsp.diff_bytes(dst+16, src+16, src+15, w-16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
205 return src[w-1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
206 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
207 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
208
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
209 static void read_len_table(uint8_t *dst, GetBitContext *gb){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
210 int i, val, repeat;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
211
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
212 for(i=0; i<256;){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
213 repeat= get_bits(gb, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
214 val = get_bits(gb, 5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
215 if(repeat==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
216 repeat= get_bits(gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
217 //printf("%d %d\n", val, repeat);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
218 while (repeat--)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
219 dst[i++] = val;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
220 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
221 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
222
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
223 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
224 int len, index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
225 uint32_t bits=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
226
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
227 for(len=32; len>0; len--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
228 for(index=0; index<256; index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
229 if(len_table[index]==len)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
230 dst[index]= bits++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
231 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
232 if(bits & 1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
233 av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
234 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
235 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
236 bits >>= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
237 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
238 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
239 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
240
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
241 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
242 static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
243 uint64_t counts[2*size];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
244 int up[2*size];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
245 int offset, i, next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
246
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
247 for(offset=1; ; offset<<=1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
248 for(i=0; i<size; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
249 counts[i]= stats[i] + offset - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
250 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
251
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
252 for(next=size; next<size*2; next++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
253 uint64_t min1, min2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
254 int min1_i, min2_i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
255
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
256 min1=min2= INT64_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
257 min1_i= min2_i=-1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
258
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
259 for(i=0; i<next; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
260 if(min2 > counts[i]){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
261 if(min1 > counts[i]){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
262 min2= min1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
263 min2_i= min1_i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
264 min1= counts[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
265 min1_i= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
266 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
267 min2= counts[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
268 min2_i= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
269 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
270 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
271 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
272
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
273 if(min2==INT64_MAX) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
274
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
275 counts[next]= min1 + min2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
276 counts[min1_i]=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
277 counts[min2_i]= INT64_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
278 up[min1_i]=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
279 up[min2_i]= next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
280 up[next]= -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
281 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
282
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
283 for(i=0; i<size; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
284 int len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
285 int index=i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
286
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
287 for(len=0; up[index] != -1; len++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
288 index= up[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
289
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
290 if(len >= 32) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
291
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
292 dst[i]= len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
293 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
294 if(i==size) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
295 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
296 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
297 #endif /* CONFIG_ENCODERS */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
298
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
299 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
300 GetBitContext gb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
301 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
302
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
303 init_get_bits(&gb, src, length*8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
304
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
305 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
306 read_len_table(s->len[i], &gb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
307
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
308 if(generate_bits_table(s->bits[i], s->len[i])<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
309 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
310 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
311 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
312 for(j=0; j<256; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
313 printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
314 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
315 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
316 free_vlc(&s->vlc[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
317 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
318 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
319
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
320 return (get_bits_count(&gb)+7)/8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
321 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
322
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
323 static int read_old_huffman_tables(HYuvContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
324 #if 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
325 GetBitContext gb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
326 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
327
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
328 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
329 read_len_table(s->len[0], &gb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
330 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
331 read_len_table(s->len[1], &gb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
332
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
333 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
334 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
335
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
336 if(s->bitstream_bpp >= 24){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
337 memcpy(s->bits[1], s->bits[0], 256*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
338 memcpy(s->len[1] , s->len [0], 256*sizeof(uint8_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
339 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
340 memcpy(s->bits[2], s->bits[1], 256*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
341 memcpy(s->len[2] , s->len [1], 256*sizeof(uint8_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
342
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
343 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
344 free_vlc(&s->vlc[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
345 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
346 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
347
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
348 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
349 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
350 av_log(s->avctx, AV_LOG_DEBUG, "v1 huffyuv is not supported \n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
351 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
352 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
353 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
354
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
355 static void alloc_temp(HYuvContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
356 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
357
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
358 if(s->bitstream_bpp<24){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
359 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
360 s->temp[i]= av_malloc(s->width + 16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
361 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
362 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
363 s->temp[0]= av_malloc(4*s->width + 16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
364 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
365 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
366
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
367 static int common_init(AVCodecContext *avctx){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
368 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
369
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
370 s->avctx= avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
371 s->flags= avctx->flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
372
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
373 dsputil_init(&s->dsp, avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
374
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
375 s->width= avctx->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
376 s->height= avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
377 assert(s->width>0 && s->height>0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
378
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
379 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
380 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
381
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
382 #ifdef CONFIG_DECODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
383 static int decode_init(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
384 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
385 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
386
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
387 common_init(avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
388 memset(s->vlc, 0, 3*sizeof(VLC));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
389
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
390 avctx->coded_frame= &s->picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
391 s->interlaced= s->height > 288;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
392
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
393 s->bgr32=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
394 //if(avctx->extradata)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
395 // printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
396 if(avctx->extradata_size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
397 if((avctx->bits_per_sample&7) && avctx->bits_per_sample != 12)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
398 s->version=1; // do such files exist at all?
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
399 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
400 s->version=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
401 }else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
402 s->version=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
403
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
404 if(s->version==2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
405 int method, interlace;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
406
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
407 method= ((uint8_t*)avctx->extradata)[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
408 s->decorrelate= method&64 ? 1 : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
409 s->predictor= method&63;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
410 s->bitstream_bpp= ((uint8_t*)avctx->extradata)[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
411 if(s->bitstream_bpp==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
412 s->bitstream_bpp= avctx->bits_per_sample&~7;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
413 interlace= (((uint8_t*)avctx->extradata)[2] & 0x30) >> 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
414 s->interlaced= (interlace==1) ? 1 : (interlace==2) ? 0 : s->interlaced;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
415 s->context= ((uint8_t*)avctx->extradata)[2] & 0x40 ? 1 : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
416
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
417 if(read_huffman_tables(s, ((uint8_t*)avctx->extradata)+4, avctx->extradata_size) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
418 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
419 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
420 switch(avctx->bits_per_sample&7){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
421 case 1:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
422 s->predictor= LEFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
423 s->decorrelate= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
424 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
425 case 2:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
426 s->predictor= LEFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
427 s->decorrelate= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
428 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
429 case 3:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
430 s->predictor= PLANE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
431 s->decorrelate= avctx->bits_per_sample >= 24;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
432 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
433 case 4:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
434 s->predictor= MEDIAN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
435 s->decorrelate= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
436 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
437 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
438 s->predictor= LEFT; //OLD
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
439 s->decorrelate= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
440 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
441 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
442 s->bitstream_bpp= avctx->bits_per_sample & ~7;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
443 s->context= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
444
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
445 if(read_old_huffman_tables(s) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
446 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
447 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
448
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
449 switch(s->bitstream_bpp){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
450 case 12:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
451 avctx->pix_fmt = PIX_FMT_YUV420P;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
452 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
453 case 16:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
454 if(s->yuy2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
455 avctx->pix_fmt = PIX_FMT_YUV422;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
456 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
457 avctx->pix_fmt = PIX_FMT_YUV422P;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
458 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
459 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
460 case 24:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
461 case 32:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
462 if(s->bgr32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
463 avctx->pix_fmt = PIX_FMT_RGBA32;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
464 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
465 avctx->pix_fmt = PIX_FMT_BGR24;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
466 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
467 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
468 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
469 assert(0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
470 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
471
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
472 alloc_temp(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
473
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
474 // av_log(NULL, AV_LOG_DEBUG, "pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
475
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
476 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
477 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
478 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
479
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
480 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
481 static int store_table(HYuvContext *s, uint8_t *len, uint8_t *buf){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
482 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
483 int index= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
484
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
485 for(i=0; i<256;){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
486 int val= len[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
487 int repeat=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
488
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
489 for(; i<256 && len[i]==val && repeat<255; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
490 repeat++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
491
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
492 assert(val < 32 && val >0 && repeat<256 && repeat>0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
493 if(repeat>7){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
494 buf[index++]= val;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
495 buf[index++]= repeat;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
496 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
497 buf[index++]= val | (repeat<<5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
498 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
499 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
500
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
501 return index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
502 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
503
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
504 static int encode_init(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
505 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
506 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
507 int i, j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
508
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
509 common_init(avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
510
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
511 avctx->extradata= av_mallocz(1024*30); // 256*3+4 == 772
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
512 avctx->stats_out= av_mallocz(1024*30); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
513 s->version=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
514
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
515 avctx->coded_frame= &s->picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
516
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
517 switch(avctx->pix_fmt){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
518 case PIX_FMT_YUV420P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
519 s->bitstream_bpp= 12;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
520 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
521 case PIX_FMT_YUV422P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
522 s->bitstream_bpp= 16;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
523 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
524 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
525 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
526 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
527 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
528 avctx->bits_per_sample= s->bitstream_bpp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
529 s->decorrelate= s->bitstream_bpp >= 24;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
530 s->predictor= avctx->prediction_method;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
531 s->interlaced= avctx->flags&CODEC_FLAG_INTERLACED_ME ? 1 : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
532 if(avctx->context_model==1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
533 s->context= avctx->context_model;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
534 if(s->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
535 av_log(avctx, AV_LOG_ERROR, "context=1 is not compatible with 2 pass huffyuv encoding\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
536 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
537 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
538 }else s->context= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
539
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
540 if(avctx->codec->id==CODEC_ID_HUFFYUV){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
541 if(avctx->pix_fmt==PIX_FMT_YUV420P){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
542 av_log(avctx, AV_LOG_ERROR, "Error: YV12 is not supported by huffyuv; use vcodec=ffvhuff or format=422p\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
543 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
544 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
545 if(avctx->context_model){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
546 av_log(avctx, AV_LOG_ERROR, "Error: per-frame huffman tables are not supported by huffyuv; use vcodec=ffvhuff\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
547 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
548 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
549 if(s->interlaced != ( s->height > 288 ))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
550 av_log(avctx, AV_LOG_INFO, "using huffyuv 2.2.0 or newer interlacing flag\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
551 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
552
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
553 ((uint8_t*)avctx->extradata)[0]= s->predictor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
554 ((uint8_t*)avctx->extradata)[1]= s->bitstream_bpp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
555 ((uint8_t*)avctx->extradata)[2]= s->interlaced ? 0x10 : 0x20;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
556 if(s->context)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
557 ((uint8_t*)avctx->extradata)[2]|= 0x40;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
558 ((uint8_t*)avctx->extradata)[3]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
559 s->avctx->extradata_size= 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
560
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
561 if(avctx->stats_in){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
562 char *p= avctx->stats_in;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
563
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
564 for(i=0; i<3; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
565 for(j=0; j<256; j++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
566 s->stats[i][j]= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
567
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
568 for(;;){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
569 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
570 char *next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
571
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
572 for(j=0; j<256; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
573 s->stats[i][j]+= strtol(p, &next, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
574 if(next==p) return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
575 p=next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
576 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
577 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
578 if(p[0]==0 || p[1]==0 || p[2]==0) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
579 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
580 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
581 for(i=0; i<3; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
582 for(j=0; j<256; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
583 int d= FFMIN(j, 256-j);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
584
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
585 s->stats[i][j]= 100000000/(d+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
586 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
587 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
588
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
589 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
590 generate_len_table(s->len[i], s->stats[i], 256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
591
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
592 if(generate_bits_table(s->bits[i], s->len[i])<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
593 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
594 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
595
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
596 s->avctx->extradata_size+=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
597 store_table(s, s->len[i], &((uint8_t*)s->avctx->extradata)[s->avctx->extradata_size]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
598 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
599
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
600 if(s->context){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
601 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
602 int pels = s->width*s->height / (i?40:10);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
603 for(j=0; j<256; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
604 int d= FFMIN(j, 256-j);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
605 s->stats[i][j]= pels/(d+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
606 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
607 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
608 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
609 for(i=0; i<3; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
610 for(j=0; j<256; j++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
611 s->stats[i][j]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
612 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
613
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
614 // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
615
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
616 alloc_temp(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
617
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
618 s->picture_number=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
619
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
620 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
621 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
622 #endif /* CONFIG_ENCODERS */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
623
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
624 static void decode_422_bitstream(HYuvContext *s, int count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
625 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
626
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
627 count/=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
628
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
629 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
630 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
631 s->temp[1][ i ]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
632 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
633 s->temp[2][ i ]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
634 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
635 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
636
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
637 static void decode_gray_bitstream(HYuvContext *s, int count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
638 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
639
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
640 count/=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
641
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
642 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
643 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
644 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
645 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
646 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
647
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
648 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
649 static int encode_422_bitstream(HYuvContext *s, int count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
650 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
651
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
652 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 2*4*count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
653 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
654 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
655 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
656
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
657 count/=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
658 if(s->flags&CODEC_FLAG_PASS1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
659 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
660 s->stats[0][ s->temp[0][2*i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
661 s->stats[1][ s->temp[1][ i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
662 s->stats[0][ s->temp[0][2*i+1] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
663 s->stats[2][ s->temp[2][ i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
664 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
665 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
666 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
667 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
668 if(s->context){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
669 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
670 s->stats[0][ s->temp[0][2*i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
671 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
672 s->stats[1][ s->temp[1][ i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
673 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
674 s->stats[0][ s->temp[0][2*i+1] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
675 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
676 s->stats[2][ s->temp[2][ i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
677 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
678 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
679 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
680 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
681 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
682 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
683 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
684 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
685 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
686 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
687 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
688 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
689
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
690 static int encode_gray_bitstream(HYuvContext *s, int count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
691 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
692
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
693 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 4*count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
694 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
695 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
696 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
697
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
698 count/=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
699 if(s->flags&CODEC_FLAG_PASS1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
700 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
701 s->stats[0][ s->temp[0][2*i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
702 s->stats[0][ s->temp[0][2*i+1] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
703 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
704 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
705 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
706 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
707
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
708 if(s->context){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
709 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
710 s->stats[0][ s->temp[0][2*i ] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
711 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
712 s->stats[0][ s->temp[0][2*i+1] ]++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
713 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
714 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
715 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
716 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
717 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
718 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
719 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
720 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
721 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
722 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
723 #endif /* CONFIG_ENCODERS */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
724
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
725 static void decode_bgr_bitstream(HYuvContext *s, int count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
726 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
727
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
728 if(s->decorrelate){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
729 if(s->bitstream_bpp==24){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
730 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
731 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
732 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
733 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
734 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
735 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
736 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
737 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
738 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
739 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
740 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
741 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
742 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
743 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
744 if(s->bitstream_bpp==24){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
745 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
746 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
747 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
748 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
749 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
750 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
751 for(i=0; i<count; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
752 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
753 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
754 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
755 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
756 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
757 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
758 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
759 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
760
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
761 #ifdef CONFIG_DECODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
762 static void draw_slice(HYuvContext *s, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
763 int h, cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
764 int offset[4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
765
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
766 if(s->avctx->draw_horiz_band==NULL)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
767 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
768
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
769 h= y - s->last_slice_end;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
770 y -= h;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
771
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
772 if(s->bitstream_bpp==12){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
773 cy= y>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
774 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
775 cy= y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
776 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
777
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
778 offset[0] = s->picture.linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
779 offset[1] = s->picture.linesize[1]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
780 offset[2] = s->picture.linesize[2]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
781 offset[3] = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
782 emms_c();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
783
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
784 s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
785
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
786 s->last_slice_end= y + h;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
787 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
788
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
789 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
790 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
791 const int width= s->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
792 const int width2= s->width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
793 const int height= s->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
794 int fake_ystride, fake_ustride, fake_vstride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
795 AVFrame * const p= &s->picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
796 int table_size= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
797
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
798 AVFrame *picture = data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
799
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
800 s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
801
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
802 s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
803
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
804 if(p->data[0])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
805 avctx->release_buffer(avctx, p);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
806
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
807 p->reference= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
808 if(avctx->get_buffer(avctx, p) < 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
809 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
810 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
811 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
812
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
813 if(s->context){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
814 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
815 if(table_size < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
816 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
817 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
818
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
819 if((unsigned)(buf_size-table_size) >= INT_MAX/8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
820 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
821
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
822 init_get_bits(&s->gb, s->bitstream_buffer+table_size, (buf_size-table_size)*8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
823
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
824 fake_ystride= s->interlaced ? p->linesize[0]*2 : p->linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
825 fake_ustride= s->interlaced ? p->linesize[1]*2 : p->linesize[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
826 fake_vstride= s->interlaced ? p->linesize[2]*2 : p->linesize[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
827
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
828 s->last_slice_end= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
829
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
830 if(s->bitstream_bpp<24){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
831 int y, cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
832 int lefty, leftu, leftv;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
833 int lefttopy, lefttopu, lefttopv;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
834
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
835 if(s->yuy2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
836 p->data[0][3]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
837 p->data[0][2]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
838 p->data[0][1]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
839 p->data[0][0]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
840
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
841 av_log(avctx, AV_LOG_ERROR, "YUY2 output is not implemented yet\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
842 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
843 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
844
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
845 leftv= p->data[2][0]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
846 lefty= p->data[0][1]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
847 leftu= p->data[1][0]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
848 p->data[0][0]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
849
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
850 switch(s->predictor){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
851 case LEFT:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
852 case PLANE:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
853 decode_422_bitstream(s, width-2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
854 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
855 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
856 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
857 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
858 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
859
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
860 for(cy=y=1; y<s->height; y++,cy++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
861 uint8_t *ydst, *udst, *vdst;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
862
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
863 if(s->bitstream_bpp==12){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
864 decode_gray_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
865
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
866 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
867
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
868 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
869 if(s->predictor == PLANE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
870 if(y>s->interlaced)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
871 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
872 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
873 y++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
874 if(y>=s->height) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
875 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
876
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
877 draw_slice(s, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
878
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
879 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
880 udst= p->data[1] + p->linesize[1]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
881 vdst= p->data[2] + p->linesize[2]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
882
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
883 decode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
884 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
885 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
886 leftu= add_left_prediction(udst, s->temp[1], width2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
887 leftv= add_left_prediction(vdst, s->temp[2], width2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
888 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
889 if(s->predictor == PLANE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
890 if(cy>s->interlaced){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
891 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
892 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
893 s->dsp.add_bytes(udst, udst - fake_ustride, width2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
894 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
895 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
896 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
897 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
898 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
899 draw_slice(s, height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
900
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
901 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
902 case MEDIAN:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
903 /* first line except first 2 pixels is left predicted */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
904 decode_422_bitstream(s, width-2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
905 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
906 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
907 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
908 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
909 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
910
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
911 cy=y=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
912
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
913 /* second line is left predicted for interlaced case */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
914 if(s->interlaced){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
915 decode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
916 lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
917 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
918 leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
919 leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
920 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
921 y++; cy++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
922 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
923
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
924 /* next 4 pixels are left predicted too */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
925 decode_422_bitstream(s, 4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
926 lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
927 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
928 leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
929 leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
930 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
931
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
932 /* next line except the first 4 pixels is median predicted */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
933 lefttopy= p->data[0][3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
934 decode_422_bitstream(s, width-4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
935 add_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
936 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
937 lefttopu= p->data[1][1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
938 lefttopv= p->data[2][1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
939 add_median_prediction(p->data[1] + fake_ustride+2, p->data[1]+2, s->temp[1], width2-2, &leftu, &lefttopu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
940 add_median_prediction(p->data[2] + fake_vstride+2, p->data[2]+2, s->temp[2], width2-2, &leftv, &lefttopv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
941 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
942 y++; cy++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
943
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
944 for(; y<height; y++,cy++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
945 uint8_t *ydst, *udst, *vdst;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
946
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
947 if(s->bitstream_bpp==12){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
948 while(2*cy > y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
949 decode_gray_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
950 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
951 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
952 y++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
953 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
954 if(y>=height) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
955 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
956 draw_slice(s, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
957
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
958 decode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
959
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
960 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
961 udst= p->data[1] + p->linesize[1]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
962 vdst= p->data[2] + p->linesize[2]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
963
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
964 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
965 if(!(s->flags&CODEC_FLAG_GRAY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
966 add_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
967 add_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
968 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
969 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
970
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
971 draw_slice(s, height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
972 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
973 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
974 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
975 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
976 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
977 int leftr, leftg, leftb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
978 const int last_line= (height-1)*p->linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
979
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
980 if(s->bitstream_bpp==32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
981 skip_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
982 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
983 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
984 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
985 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
986 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
987 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
988 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
989 skip_bits(&s->gb, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
990 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
991
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
992 if(s->bgr32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
993 switch(s->predictor){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
994 case LEFT:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
995 case PLANE:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
996 decode_bgr_bitstream(s, width-1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
997 add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
998
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
999 for(y=s->height-2; y>=0; y--){ //yes its stored upside down
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1000 decode_bgr_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1001
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1002 add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1003 if(s->predictor == PLANE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1004 if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1005 s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1006 p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1007 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1008 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1009 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1010 draw_slice(s, height); // just 1 large slice as this is not possible in reverse order
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1011 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1012 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1013 av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1014 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1015 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1016
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1017 av_log(avctx, AV_LOG_ERROR, "BGR24 output is not implemented yet\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1018 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1019 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1020 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1021 emms_c();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1022
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1023 *picture= *p;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1024 *data_size = sizeof(AVFrame);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1025
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1026 return (get_bits_count(&s->gb)+31)/32*4 + table_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1027 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1028 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1029
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1030 static int common_end(HYuvContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1031 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1032
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1033 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1034 av_freep(&s->temp[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1035 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1036 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1037 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1038
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1039 #ifdef CONFIG_DECODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1040 static int decode_end(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1041 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1042 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1043 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1044
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1045 common_end(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1046 av_freep(&s->bitstream_buffer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1047
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1048 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1049 free_vlc(&s->vlc[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1050 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1051
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1052 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1053 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1054 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1055
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1056 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1057 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1058 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1059 AVFrame *pict = data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1060 const int width= s->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1061 const int width2= s->width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1062 const int height= s->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1063 const int fake_ystride= s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1064 const int fake_ustride= s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1065 const int fake_vstride= s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1066 AVFrame * const p= &s->picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1067 int i, j, size=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1068
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1069 *p = *pict;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1070 p->pict_type= FF_I_TYPE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1071 p->key_frame= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1072
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1073 if(s->context){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1074 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1075 generate_len_table(s->len[i], s->stats[i], 256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1076 if(generate_bits_table(s->bits[i], s->len[i])<0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1077 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1078 size+= store_table(s, s->len[i], &buf[size]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1079 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1080
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1081 for(i=0; i<3; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1082 for(j=0; j<256; j++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1083 s->stats[i][j] >>= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1084 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1085
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1086 init_put_bits(&s->pb, buf+size, buf_size-size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1087
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1088 if(avctx->pix_fmt == PIX_FMT_YUV422P || avctx->pix_fmt == PIX_FMT_YUV420P){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1089 int lefty, leftu, leftv, y, cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1090
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1091 put_bits(&s->pb, 8, leftv= p->data[2][0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1092 put_bits(&s->pb, 8, lefty= p->data[0][1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1093 put_bits(&s->pb, 8, leftu= p->data[1][0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1094 put_bits(&s->pb, 8, p->data[0][0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1095
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1096 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+2, width-2 , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1097 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+1, width2-1, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1098 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+1, width2-1, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1099
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1100 encode_422_bitstream(s, width-2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1101
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1102 if(s->predictor==MEDIAN){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1103 int lefttopy, lefttopu, lefttopv;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1104 cy=y=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1105 if(s->interlaced){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1106 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+p->linesize[0], width , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1107 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+p->linesize[1], width2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1108 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+p->linesize[2], width2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1109
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1110 encode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1111 y++; cy++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1112 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1113
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1114 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+fake_ystride, 4, lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1115 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+fake_ustride, 2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1116 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+fake_vstride, 2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1117
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1118 encode_422_bitstream(s, 4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1119
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1120 lefttopy= p->data[0][3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1121 lefttopu= p->data[1][1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1122 lefttopv= p->data[2][1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1123 s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1124 s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1125 s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1126 encode_422_bitstream(s, width-4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1127 y++; cy++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1128
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1129 for(; y<height; y++,cy++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1130 uint8_t *ydst, *udst, *vdst;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1131
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1132 if(s->bitstream_bpp==12){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1133 while(2*cy > y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1134 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1135 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1136 encode_gray_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1137 y++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1138 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1139 if(y>=height) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1140 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1141 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1142 udst= p->data[1] + p->linesize[1]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1143 vdst= p->data[2] + p->linesize[2]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1144
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1145 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1146 s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1147 s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1148
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1149 encode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1150 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1151 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1152 for(cy=y=1; y<height; y++,cy++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1153 uint8_t *ydst, *udst, *vdst;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1154
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1155 /* encode a luma only line & y++ */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1156 if(s->bitstream_bpp==12){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1157 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1158
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1159 if(s->predictor == PLANE && s->interlaced < y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1160 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1161
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1162 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1163 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1164 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1165 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1166 encode_gray_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1167 y++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1168 if(y>=height) break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1169 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1170
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1171 ydst= p->data[0] + p->linesize[0]*y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1172 udst= p->data[1] + p->linesize[1]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1173 vdst= p->data[2] + p->linesize[2]*cy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1174
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1175 if(s->predictor == PLANE && s->interlaced < cy){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1176 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1177 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1178 s->dsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1179
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1180 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1181 leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1182 leftv= sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1183 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1184 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1185 leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1186 leftv= sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1187 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1188
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1189 encode_422_bitstream(s, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1190 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1191 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1192 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1193 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1194 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1195 emms_c();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1196
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1197 size+= (put_bits_count(&s->pb)+31)/8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1198 size/= 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1199
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1200 if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1201 int j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1202 char *p= avctx->stats_out;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1203 char *end= p + 1024*30;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1204 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1205 for(j=0; j<256; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1206 snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1207 p+= strlen(p);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1208 s->stats[i][j]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1209 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1210 snprintf(p, end-p, "\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1211 p++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1212 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1213 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1214 if(!(s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1215 flush_put_bits(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1216 s->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1217 avctx->stats_out[0] = '\0';
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1218 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1219
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1220 s->picture_number++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1221
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1222 return size*4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1223 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1224
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1225 static int encode_end(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1226 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1227 HYuvContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1228
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1229 common_end(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1230
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1231 av_freep(&avctx->extradata);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1232 av_freep(&avctx->stats_out);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1233
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1234 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1235 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1236 #endif /* CONFIG_ENCODERS */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1237
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1238 #ifdef CONFIG_DECODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1239 AVCodec huffyuv_decoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1240 "huffyuv",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1241 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1242 CODEC_ID_HUFFYUV,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1243 sizeof(HYuvContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1244 decode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1245 NULL,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1246 decode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1247 decode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1248 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1249 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1250 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1251
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1252 AVCodec ffvhuff_decoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1253 "ffvhuff",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1254 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1255 CODEC_ID_FFVHUFF,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1256 sizeof(HYuvContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1257 decode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1258 NULL,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1259 decode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1260 decode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1261 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1262 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1263 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1264 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1265
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1266 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1267
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1268 AVCodec huffyuv_encoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1269 "huffyuv",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1270 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1271 CODEC_ID_HUFFYUV,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1272 sizeof(HYuvContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1273 encode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1274 encode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1275 encode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1276 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV422P, -1},
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1277 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1278
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1279 AVCodec ffvhuff_encoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1280 "ffvhuff",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1281 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1282 CODEC_ID_FFVHUFF,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1283 sizeof(HYuvContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1284 encode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1285 encode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1286 encode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1287 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, -1},
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1288 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1289
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1290 #endif //CONFIG_ENCODERS