Mercurial > audlegacy-plugins
comparison src/ffmpeg/libavcodec/ffv1.c @ 808:e8776388b02a trunk
[svn] - add ffmpeg
| author | nenolod |
|---|---|
| date | Mon, 12 Mar 2007 11:18:54 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 807:0f9c8d4d3ac4 | 808:e8776388b02a |
|---|---|
| 1 /* | |
| 2 * FFV1 codec for libavcodec | |
| 3 * | |
| 4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
| 5 * | |
| 6 * This file is part of FFmpeg. | |
| 7 * | |
| 8 * FFmpeg is free software; you can redistribute it and/or | |
| 9 * modify it under the terms of the GNU Lesser General Public | |
| 10 * License as published by the Free Software Foundation; either | |
| 11 * version 2.1 of the License, or (at your option) any later version. | |
| 12 * | |
| 13 * FFmpeg is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU Lesser General Public | |
| 19 * License along with FFmpeg; if not, write to the Free Software | |
| 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 * | |
| 22 */ | |
| 23 | |
| 24 /** | |
| 25 * @file ffv1.c | |
| 26 * FF Video Codec 1 (an experimental lossless codec) | |
| 27 */ | |
| 28 | |
| 29 #include "common.h" | |
| 30 #include "bitstream.h" | |
| 31 #include "avcodec.h" | |
| 32 #include "dsputil.h" | |
| 33 #include "rangecoder.h" | |
| 34 #include "golomb.h" | |
| 35 | |
| 36 #define MAX_PLANES 4 | |
| 37 #define CONTEXT_SIZE 32 | |
| 38 | |
| 39 static const int8_t quant3[256]={ | |
| 40 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, | |
| 56 }; | |
| 57 static const int8_t quant5[256]={ | |
| 58 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 59 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 63 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 64 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 66 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 67 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 68 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 71 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 72 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 73 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
| 74 }; | |
| 75 static const int8_t quant7[256]={ | |
| 76 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 78 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 79 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 81 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 82 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 83 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 84 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 87 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 88 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 89 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, | |
| 90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 91 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, | |
| 92 }; | |
| 93 static const int8_t quant9[256]={ | |
| 94 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 95 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 96 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 99 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 100 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 101 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 102 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 106 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 107 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 108 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
| 109 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
| 110 }; | |
| 111 static const int8_t quant11[256]={ | |
| 112 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, | |
| 113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 114 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 115 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 117 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 118 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 119 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 120 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 124 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 125 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
| 126 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 127 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
| 128 }; | |
| 129 static const int8_t quant13[256]={ | |
| 130 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 131 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 133 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 134 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 135 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 136 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 137 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 138 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 140 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 141 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 142 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
| 143 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 144 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 145 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
| 146 }; | |
| 147 | |
| 148 static const uint8_t log2_run[32]={ | |
| 149 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, | |
| 150 4, 4, 5, 5, 6, 6, 7, 7, | |
| 151 8, 9,10,11,12,13,14,15, | |
| 152 }; | |
| 153 | |
| 154 typedef struct VlcState{ | |
| 155 int16_t drift; | |
| 156 uint16_t error_sum; | |
| 157 int8_t bias; | |
| 158 uint8_t count; | |
| 159 } VlcState; | |
| 160 | |
| 161 typedef struct PlaneContext{ | |
| 162 int context_count; | |
| 163 uint8_t (*state)[CONTEXT_SIZE]; | |
| 164 VlcState *vlc_state; | |
| 165 uint8_t interlace_bit_state[2]; | |
| 166 } PlaneContext; | |
| 167 | |
| 168 typedef struct FFV1Context{ | |
| 169 AVCodecContext *avctx; | |
| 170 RangeCoder c; | |
| 171 GetBitContext gb; | |
| 172 PutBitContext pb; | |
| 173 int version; | |
| 174 int width, height; | |
| 175 int chroma_h_shift, chroma_v_shift; | |
| 176 int flags; | |
| 177 int picture_number; | |
| 178 AVFrame picture; | |
| 179 int plane_count; | |
| 180 int ac; ///< 1-> CABAC 0-> golomb rice | |
| 181 PlaneContext plane[MAX_PLANES]; | |
| 182 int16_t quant_table[5][256]; | |
| 183 int run_index; | |
| 184 int colorspace; | |
| 185 | |
| 186 DSPContext dsp; | |
| 187 }FFV1Context; | |
| 188 | |
| 189 static always_inline int fold(int diff, int bits){ | |
| 190 if(bits==8) | |
| 191 diff= (int8_t)diff; | |
| 192 else{ | |
| 193 diff+= 1<<(bits-1); | |
| 194 diff&=(1<<bits)-1; | |
| 195 diff-= 1<<(bits-1); | |
| 196 } | |
| 197 | |
| 198 return diff; | |
| 199 } | |
| 200 | |
| 201 static inline int predict(int_fast16_t *src, int_fast16_t *last){ | |
| 202 const int LT= last[-1]; | |
| 203 const int T= last[ 0]; | |
| 204 const int L = src[-1]; | |
| 205 | |
| 206 return mid_pred(L, L + T - LT, T); | |
| 207 } | |
| 208 | |
| 209 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){ | |
| 210 const int LT= last[-1]; | |
| 211 const int T= last[ 0]; | |
| 212 const int RT= last[ 1]; | |
| 213 const int L = src[-1]; | |
| 214 | |
| 215 if(f->quant_table[3][127]){ | |
| 216 const int TT= last2[0]; | |
| 217 const int LL= src[-2]; | |
| 218 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF] | |
| 219 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF]; | |
| 220 }else | |
| 221 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]; | |
| 222 } | |
| 223 | |
| 224 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ | |
| 225 int i; | |
| 226 | |
| 227 if(v){ | |
| 228 const int a= FFABS(v); | |
| 229 const int e= av_log2(a); | |
| 230 put_rac(c, state+0, 0); | |
| 231 | |
| 232 assert(e<=9); | |
| 233 | |
| 234 for(i=0; i<e; i++){ | |
| 235 put_rac(c, state+1+i, 1); //1..10 | |
| 236 } | |
| 237 put_rac(c, state+1+i, 0); | |
| 238 | |
| 239 for(i=e-1; i>=0; i--){ | |
| 240 put_rac(c, state+22+i, (a>>i)&1); //22..31 | |
| 241 } | |
| 242 | |
| 243 if(is_signed) | |
| 244 put_rac(c, state+11 + e, v < 0); //11..21 | |
| 245 }else{ | |
| 246 put_rac(c, state+0, 1); | |
| 247 } | |
| 248 } | |
| 249 | |
| 250 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ | |
| 251 if(get_rac(c, state+0)) | |
| 252 return 0; | |
| 253 else{ | |
| 254 int i, e, a; | |
| 255 e= 0; | |
| 256 while(get_rac(c, state+1 + e)){ //1..10 | |
| 257 e++; | |
| 258 } | |
| 259 assert(e<=9); | |
| 260 | |
| 261 a= 1; | |
| 262 for(i=e-1; i>=0; i--){ | |
| 263 a += a + get_rac(c, state+22 + i); //22..31 | |
| 264 } | |
| 265 | |
| 266 if(is_signed && get_rac(c, state+11 + e)) //11..21 | |
| 267 return -a; | |
| 268 else | |
| 269 return a; | |
| 270 } | |
| 271 } | |
| 272 | |
| 273 static inline void update_vlc_state(VlcState * const state, const int v){ | |
| 274 int drift= state->drift; | |
| 275 int count= state->count; | |
| 276 state->error_sum += FFABS(v); | |
| 277 drift += v; | |
| 278 | |
| 279 if(count == 128){ //FIXME variable | |
| 280 count >>= 1; | |
| 281 drift >>= 1; | |
| 282 state->error_sum >>= 1; | |
| 283 } | |
| 284 count++; | |
| 285 | |
| 286 if(drift <= -count){ | |
| 287 if(state->bias > -128) state->bias--; | |
| 288 | |
| 289 drift += count; | |
| 290 if(drift <= -count) | |
| 291 drift= -count + 1; | |
| 292 }else if(drift > 0){ | |
| 293 if(state->bias < 127) state->bias++; | |
| 294 | |
| 295 drift -= count; | |
| 296 if(drift > 0) | |
| 297 drift= 0; | |
| 298 } | |
| 299 | |
| 300 state->drift= drift; | |
| 301 state->count= count; | |
| 302 } | |
| 303 | |
| 304 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){ | |
| 305 int i, k, code; | |
| 306 //printf("final: %d ", v); | |
| 307 v = fold(v - state->bias, bits); | |
| 308 | |
| 309 i= state->count; | |
| 310 k=0; | |
| 311 while(i < state->error_sum){ //FIXME optimize | |
| 312 k++; | |
| 313 i += i; | |
| 314 } | |
| 315 | |
| 316 assert(k<=8); | |
| 317 | |
| 318 #if 0 // JPEG LS | |
| 319 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1); | |
| 320 else code= v; | |
| 321 #else | |
| 322 code= v ^ ((2*state->drift + state->count)>>31); | |
| 323 #endif | |
| 324 | |
| 325 //printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k); | |
| 326 set_sr_golomb(pb, code, k, 12, bits); | |
| 327 | |
| 328 update_vlc_state(state, v); | |
| 329 } | |
| 330 | |
| 331 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){ | |
| 332 int k, i, v, ret; | |
| 333 | |
| 334 i= state->count; | |
| 335 k=0; | |
| 336 while(i < state->error_sum){ //FIXME optimize | |
| 337 k++; | |
| 338 i += i; | |
| 339 } | |
| 340 | |
| 341 assert(k<=8); | |
| 342 | |
| 343 v= get_sr_golomb(gb, k, 12, bits); | |
| 344 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k); | |
| 345 | |
| 346 #if 0 // JPEG LS | |
| 347 if(k==0 && 2*state->drift <= - state->count) v ^= (-1); | |
| 348 #else | |
| 349 v ^= ((2*state->drift + state->count)>>31); | |
| 350 #endif | |
| 351 | |
| 352 ret= fold(v + state->bias, bits); | |
| 353 | |
| 354 update_vlc_state(state, v); | |
| 355 //printf("final: %d\n", ret); | |
| 356 return ret; | |
| 357 } | |
| 358 | |
| 359 #ifdef CONFIG_ENCODERS | |
| 360 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ | |
| 361 PlaneContext * const p= &s->plane[plane_index]; | |
| 362 RangeCoder * const c= &s->c; | |
| 363 int x; | |
| 364 int run_index= s->run_index; | |
| 365 int run_count=0; | |
| 366 int run_mode=0; | |
| 367 | |
| 368 if(s->ac){ | |
| 369 if(c->bytestream_end - c->bytestream < w*20){ | |
| 370 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 371 return -1; | |
| 372 } | |
| 373 }else{ | |
| 374 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){ | |
| 375 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 376 return -1; | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 for(x=0; x<w; x++){ | |
| 381 int diff, context; | |
| 382 | |
| 383 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x); | |
| 384 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x); | |
| 385 | |
| 386 if(context < 0){ | |
| 387 context = -context; | |
| 388 diff= -diff; | |
| 389 } | |
| 390 | |
| 391 diff= fold(diff, bits); | |
| 392 | |
| 393 if(s->ac){ | |
| 394 put_symbol(c, p->state[context], diff, 1); | |
| 395 }else{ | |
| 396 if(context == 0) run_mode=1; | |
| 397 | |
| 398 if(run_mode){ | |
| 399 | |
| 400 if(diff){ | |
| 401 while(run_count >= 1<<log2_run[run_index]){ | |
| 402 run_count -= 1<<log2_run[run_index]; | |
| 403 run_index++; | |
| 404 put_bits(&s->pb, 1, 1); | |
| 405 } | |
| 406 | |
| 407 put_bits(&s->pb, 1 + log2_run[run_index], run_count); | |
| 408 if(run_index) run_index--; | |
| 409 run_count=0; | |
| 410 run_mode=0; | |
| 411 if(diff>0) diff--; | |
| 412 }else{ | |
| 413 run_count++; | |
| 414 } | |
| 415 } | |
| 416 | |
| 417 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)put_bits_count(&s->pb)); | |
| 418 | |
| 419 if(run_mode == 0) | |
| 420 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits); | |
| 421 } | |
| 422 } | |
| 423 if(run_mode){ | |
| 424 while(run_count >= 1<<log2_run[run_index]){ | |
| 425 run_count -= 1<<log2_run[run_index]; | |
| 426 run_index++; | |
| 427 put_bits(&s->pb, 1, 1); | |
| 428 } | |
| 429 | |
| 430 if(run_count) | |
| 431 put_bits(&s->pb, 1, 1); | |
| 432 } | |
| 433 s->run_index= run_index; | |
| 434 | |
| 435 return 0; | |
| 436 } | |
| 437 | |
| 438 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 439 int x,y,i; | |
| 440 const int ring_size= s->avctx->context_model ? 3 : 2; | |
| 441 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size]; | |
| 442 s->run_index=0; | |
| 443 | |
| 444 memset(sample_buffer, 0, sizeof(sample_buffer)); | |
| 445 | |
| 446 for(y=0; y<h; y++){ | |
| 447 for(i=0; i<ring_size; i++) | |
| 448 sample[i]= sample_buffer[(h+i-y)%ring_size]+3; | |
| 449 | |
| 450 sample[0][-1]= sample[1][0 ]; | |
| 451 sample[1][ w]= sample[1][w-1]; | |
| 452 //{START_TIMER | |
| 453 for(x=0; x<w; x++){ | |
| 454 sample[0][x]= src[x + stride*y]; | |
| 455 } | |
| 456 encode_line(s, w, sample, plane_index, 8); | |
| 457 //STOP_TIMER("encode line")} | |
| 458 } | |
| 459 } | |
| 460 | |
| 461 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | |
| 462 int x, y, p, i; | |
| 463 const int ring_size= s->avctx->context_model ? 3 : 2; | |
| 464 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size]; | |
| 465 s->run_index=0; | |
| 466 | |
| 467 memset(sample_buffer, 0, sizeof(sample_buffer)); | |
| 468 | |
| 469 for(y=0; y<h; y++){ | |
| 470 for(i=0; i<ring_size; i++) | |
| 471 for(p=0; p<3; p++) | |
| 472 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3; | |
| 473 | |
| 474 for(x=0; x<w; x++){ | |
| 475 int v= src[x + stride*y]; | |
| 476 int b= v&0xFF; | |
| 477 int g= (v>>8)&0xFF; | |
| 478 int r= (v>>16)&0xFF; | |
| 479 | |
| 480 b -= g; | |
| 481 r -= g; | |
| 482 g += (b + r)>>2; | |
| 483 b += 0x100; | |
| 484 r += 0x100; | |
| 485 | |
| 486 // assert(g>=0 && b>=0 && r>=0); | |
| 487 // assert(g<256 && b<512 && r<512); | |
| 488 sample[0][0][x]= g; | |
| 489 sample[1][0][x]= b; | |
| 490 sample[2][0][x]= r; | |
| 491 } | |
| 492 for(p=0; p<3; p++){ | |
| 493 sample[p][0][-1]= sample[p][1][0 ]; | |
| 494 sample[p][1][ w]= sample[p][1][w-1]; | |
| 495 encode_line(s, w, sample[p], FFMIN(p, 1), 9); | |
| 496 } | |
| 497 } | |
| 498 } | |
| 499 | |
| 500 static void write_quant_table(RangeCoder *c, int16_t *quant_table){ | |
| 501 int last=0; | |
| 502 int i; | |
| 503 uint8_t state[CONTEXT_SIZE]; | |
| 504 memset(state, 128, sizeof(state)); | |
| 505 | |
| 506 for(i=1; i<128 ; i++){ | |
| 507 if(quant_table[i] != quant_table[i-1]){ | |
| 508 put_symbol(c, state, i-last-1, 0); | |
| 509 last= i; | |
| 510 } | |
| 511 } | |
| 512 put_symbol(c, state, i-last-1, 0); | |
| 513 } | |
| 514 | |
| 515 static void write_header(FFV1Context *f){ | |
| 516 uint8_t state[CONTEXT_SIZE]; | |
| 517 int i; | |
| 518 RangeCoder * const c= &f->c; | |
| 519 | |
| 520 memset(state, 128, sizeof(state)); | |
| 521 | |
| 522 put_symbol(c, state, f->version, 0); | |
| 523 put_symbol(c, state, f->avctx->coder_type, 0); | |
| 524 put_symbol(c, state, f->colorspace, 0); //YUV cs type | |
| 525 put_rac(c, state, 1); //chroma planes | |
| 526 put_symbol(c, state, f->chroma_h_shift, 0); | |
| 527 put_symbol(c, state, f->chroma_v_shift, 0); | |
| 528 put_rac(c, state, 0); //no transparency plane | |
| 529 | |
| 530 for(i=0; i<5; i++) | |
| 531 write_quant_table(c, f->quant_table[i]); | |
| 532 } | |
| 533 #endif /* CONFIG_ENCODERS */ | |
| 534 | |
| 535 static int common_init(AVCodecContext *avctx){ | |
| 536 FFV1Context *s = avctx->priv_data; | |
| 537 int width, height; | |
| 538 | |
| 539 s->avctx= avctx; | |
| 540 s->flags= avctx->flags; | |
| 541 | |
| 542 dsputil_init(&s->dsp, avctx); | |
| 543 | |
| 544 width= s->width= avctx->width; | |
| 545 height= s->height= avctx->height; | |
| 546 | |
| 547 assert(width && height); | |
| 548 | |
| 549 return 0; | |
| 550 } | |
| 551 | |
| 552 #ifdef CONFIG_ENCODERS | |
| 553 static int encode_init(AVCodecContext *avctx) | |
| 554 { | |
| 555 FFV1Context *s = avctx->priv_data; | |
| 556 int i; | |
| 557 | |
| 558 common_init(avctx); | |
| 559 | |
| 560 s->version=0; | |
| 561 s->ac= avctx->coder_type; | |
| 562 | |
| 563 s->plane_count=2; | |
| 564 for(i=0; i<256; i++){ | |
| 565 s->quant_table[0][i]= quant11[i]; | |
| 566 s->quant_table[1][i]= 11*quant11[i]; | |
| 567 if(avctx->context_model==0){ | |
| 568 s->quant_table[2][i]= 11*11*quant11[i]; | |
| 569 s->quant_table[3][i]= | |
| 570 s->quant_table[4][i]=0; | |
| 571 }else{ | |
| 572 s->quant_table[2][i]= 11*11*quant5 [i]; | |
| 573 s->quant_table[3][i]= 5*11*11*quant5 [i]; | |
| 574 s->quant_table[4][i]= 5*5*11*11*quant5 [i]; | |
| 575 } | |
| 576 } | |
| 577 | |
| 578 for(i=0; i<s->plane_count; i++){ | |
| 579 PlaneContext * const p= &s->plane[i]; | |
| 580 | |
| 581 if(avctx->context_model==0){ | |
| 582 p->context_count= (11*11*11+1)/2; | |
| 583 }else{ | |
| 584 p->context_count= (11*11*5*5*5+1)/2; | |
| 585 } | |
| 586 | |
| 587 if(s->ac){ | |
| 588 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 589 }else{ | |
| 590 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 591 } | |
| 592 } | |
| 593 | |
| 594 avctx->coded_frame= &s->picture; | |
| 595 switch(avctx->pix_fmt){ | |
| 596 case PIX_FMT_YUV444P: | |
| 597 case PIX_FMT_YUV422P: | |
| 598 case PIX_FMT_YUV420P: | |
| 599 case PIX_FMT_YUV411P: | |
| 600 case PIX_FMT_YUV410P: | |
| 601 s->colorspace= 0; | |
| 602 break; | |
| 603 case PIX_FMT_RGBA32: | |
| 604 s->colorspace= 1; | |
| 605 break; | |
| 606 default: | |
| 607 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); | |
| 608 return -1; | |
| 609 } | |
| 610 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); | |
| 611 | |
| 612 s->picture_number=0; | |
| 613 | |
| 614 return 0; | |
| 615 } | |
| 616 #endif /* CONFIG_ENCODERS */ | |
| 617 | |
| 618 | |
| 619 static void clear_state(FFV1Context *f){ | |
| 620 int i, j; | |
| 621 | |
| 622 for(i=0; i<f->plane_count; i++){ | |
| 623 PlaneContext *p= &f->plane[i]; | |
| 624 | |
| 625 p->interlace_bit_state[0]= 128; | |
| 626 p->interlace_bit_state[1]= 128; | |
| 627 | |
| 628 for(j=0; j<p->context_count; j++){ | |
| 629 if(f->ac){ | |
| 630 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE); | |
| 631 }else{ | |
| 632 p->vlc_state[j].drift= 0; | |
| 633 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2); | |
| 634 p->vlc_state[j].bias= 0; | |
| 635 p->vlc_state[j].count= 1; | |
| 636 } | |
| 637 } | |
| 638 } | |
| 639 } | |
| 640 | |
| 641 #ifdef CONFIG_ENCODERS | |
| 642 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
| 643 FFV1Context *f = avctx->priv_data; | |
| 644 RangeCoder * const c= &f->c; | |
| 645 AVFrame *pict = data; | |
| 646 const int width= f->width; | |
| 647 const int height= f->height; | |
| 648 AVFrame * const p= &f->picture; | |
| 649 int used_count= 0; | |
| 650 uint8_t keystate=128; | |
| 651 | |
| 652 ff_init_range_encoder(c, buf, buf_size); | |
| 653 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); | |
| 654 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 655 | |
| 656 *p = *pict; | |
| 657 p->pict_type= FF_I_TYPE; | |
| 658 | |
| 659 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){ | |
| 660 put_rac(c, &keystate, 1); | |
| 661 p->key_frame= 1; | |
| 662 write_header(f); | |
| 663 clear_state(f); | |
| 664 }else{ | |
| 665 put_rac(c, &keystate, 0); | |
| 666 p->key_frame= 0; | |
| 667 } | |
| 668 | |
| 669 if(!f->ac){ | |
| 670 used_count += ff_rac_terminate(c); | |
| 671 //printf("pos=%d\n", used_count); | |
| 672 init_put_bits(&f->pb, buf + used_count, buf_size - used_count); | |
| 673 } | |
| 674 | |
| 675 if(f->colorspace==0){ | |
| 676 const int chroma_width = -((-width )>>f->chroma_h_shift); | |
| 677 const int chroma_height= -((-height)>>f->chroma_v_shift); | |
| 678 | |
| 679 encode_plane(f, p->data[0], width, height, p->linesize[0], 0); | |
| 680 | |
| 681 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); | |
| 682 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); | |
| 683 }else{ | |
| 684 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4); | |
| 685 } | |
| 686 emms_c(); | |
| 687 | |
| 688 f->picture_number++; | |
| 689 | |
| 690 if(f->ac){ | |
| 691 return ff_rac_terminate(c); | |
| 692 }else{ | |
| 693 flush_put_bits(&f->pb); //nicer padding FIXME | |
| 694 return used_count + (put_bits_count(&f->pb)+7)/8; | |
| 695 } | |
| 696 } | |
| 697 #endif /* CONFIG_ENCODERS */ | |
| 698 | |
| 699 static int common_end(AVCodecContext *avctx){ | |
| 700 FFV1Context *s = avctx->priv_data; | |
| 701 int i; | |
| 702 | |
| 703 for(i=0; i<s->plane_count; i++){ | |
| 704 PlaneContext *p= &s->plane[i]; | |
| 705 | |
| 706 av_freep(&p->state); | |
| 707 } | |
| 708 | |
| 709 return 0; | |
| 710 } | |
| 711 | |
| 712 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ | |
| 713 PlaneContext * const p= &s->plane[plane_index]; | |
| 714 RangeCoder * const c= &s->c; | |
| 715 int x; | |
| 716 int run_count=0; | |
| 717 int run_mode=0; | |
| 718 int run_index= s->run_index; | |
| 719 | |
| 720 for(x=0; x<w; x++){ | |
| 721 int diff, context, sign; | |
| 722 | |
| 723 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x); | |
| 724 if(context < 0){ | |
| 725 context= -context; | |
| 726 sign=1; | |
| 727 }else | |
| 728 sign=0; | |
| 729 | |
| 730 | |
| 731 if(s->ac){ | |
| 732 diff= get_symbol(c, p->state[context], 1); | |
| 733 }else{ | |
| 734 if(context == 0 && run_mode==0) run_mode=1; | |
| 735 | |
| 736 if(run_mode){ | |
| 737 if(run_count==0 && run_mode==1){ | |
| 738 if(get_bits1(&s->gb)){ | |
| 739 run_count = 1<<log2_run[run_index]; | |
| 740 if(x + run_count <= w) run_index++; | |
| 741 }else{ | |
| 742 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]); | |
| 743 else run_count=0; | |
| 744 if(run_index) run_index--; | |
| 745 run_mode=2; | |
| 746 } | |
| 747 } | |
| 748 run_count--; | |
| 749 if(run_count < 0){ | |
| 750 run_mode=0; | |
| 751 run_count=0; | |
| 752 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 753 if(diff>=0) diff++; | |
| 754 }else | |
| 755 diff=0; | |
| 756 }else | |
| 757 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 758 | |
| 759 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb)); | |
| 760 } | |
| 761 | |
| 762 if(sign) diff= -diff; | |
| 763 | |
| 764 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1); | |
| 765 } | |
| 766 s->run_index= run_index; | |
| 767 } | |
| 768 | |
| 769 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 770 int x, y; | |
| 771 int_fast16_t sample_buffer[2][w+6]; | |
| 772 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3}; | |
| 773 | |
| 774 s->run_index=0; | |
| 775 | |
| 776 memset(sample_buffer, 0, sizeof(sample_buffer)); | |
| 777 | |
| 778 for(y=0; y<h; y++){ | |
| 779 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer | |
| 780 | |
| 781 sample[0]= sample[1]; | |
| 782 sample[1]= temp; | |
| 783 | |
| 784 sample[1][-1]= sample[0][0 ]; | |
| 785 sample[0][ w]= sample[0][w-1]; | |
| 786 | |
| 787 //{START_TIMER | |
| 788 decode_line(s, w, sample, plane_index, 8); | |
| 789 for(x=0; x<w; x++){ | |
| 790 src[x + stride*y]= sample[1][x]; | |
| 791 } | |
| 792 //STOP_TIMER("decode-line")} | |
| 793 } | |
| 794 } | |
| 795 | |
| 796 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | |
| 797 int x, y, p; | |
| 798 int_fast16_t sample_buffer[3][2][w+6]; | |
| 799 int_fast16_t *sample[3][2]= { | |
| 800 {sample_buffer[0][0]+3, sample_buffer[0][1]+3}, | |
| 801 {sample_buffer[1][0]+3, sample_buffer[1][1]+3}, | |
| 802 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}}; | |
| 803 | |
| 804 s->run_index=0; | |
| 805 | |
| 806 memset(sample_buffer, 0, sizeof(sample_buffer)); | |
| 807 | |
| 808 for(y=0; y<h; y++){ | |
| 809 for(p=0; p<3; p++){ | |
| 810 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer | |
| 811 | |
| 812 sample[p][0]= sample[p][1]; | |
| 813 sample[p][1]= temp; | |
| 814 | |
| 815 sample[p][1][-1]= sample[p][0][0 ]; | |
| 816 sample[p][0][ w]= sample[p][0][w-1]; | |
| 817 decode_line(s, w, sample[p], FFMIN(p, 1), 9); | |
| 818 } | |
| 819 for(x=0; x<w; x++){ | |
| 820 int g= sample[0][1][x]; | |
| 821 int b= sample[1][1][x]; | |
| 822 int r= sample[2][1][x]; | |
| 823 | |
| 824 // assert(g>=0 && b>=0 && r>=0); | |
| 825 // assert(g<256 && b<512 && r<512); | |
| 826 | |
| 827 b -= 0x100; | |
| 828 r -= 0x100; | |
| 829 g -= (b + r)>>2; | |
| 830 b += g; | |
| 831 r += g; | |
| 832 | |
| 833 src[x + stride*y]= b + (g<<8) + (r<<16); | |
| 834 } | |
| 835 } | |
| 836 } | |
| 837 | |
| 838 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){ | |
| 839 int v; | |
| 840 int i=0; | |
| 841 uint8_t state[CONTEXT_SIZE]; | |
| 842 | |
| 843 memset(state, 128, sizeof(state)); | |
| 844 | |
| 845 for(v=0; i<128 ; v++){ | |
| 846 int len= get_symbol(c, state, 0) + 1; | |
| 847 | |
| 848 if(len + i > 128) return -1; | |
| 849 | |
| 850 while(len--){ | |
| 851 quant_table[i] = scale*v; | |
| 852 i++; | |
| 853 //printf("%2d ",v); | |
| 854 //if(i%16==0) printf("\n"); | |
| 855 } | |
| 856 } | |
| 857 | |
| 858 for(i=1; i<128; i++){ | |
| 859 quant_table[256-i]= -quant_table[i]; | |
| 860 } | |
| 861 quant_table[128]= -quant_table[127]; | |
| 862 | |
| 863 return 2*v - 1; | |
| 864 } | |
| 865 | |
| 866 static int read_header(FFV1Context *f){ | |
| 867 uint8_t state[CONTEXT_SIZE]; | |
| 868 int i, context_count; | |
| 869 RangeCoder * const c= &f->c; | |
| 870 | |
| 871 memset(state, 128, sizeof(state)); | |
| 872 | |
| 873 f->version= get_symbol(c, state, 0); | |
| 874 f->ac= f->avctx->coder_type= get_symbol(c, state, 0); | |
| 875 f->colorspace= get_symbol(c, state, 0); //YUV cs type | |
| 876 get_rac(c, state); //no chroma = false | |
| 877 f->chroma_h_shift= get_symbol(c, state, 0); | |
| 878 f->chroma_v_shift= get_symbol(c, state, 0); | |
| 879 get_rac(c, state); //transparency plane | |
| 880 f->plane_count= 2; | |
| 881 | |
| 882 if(f->colorspace==0){ | |
| 883 switch(16*f->chroma_h_shift + f->chroma_v_shift){ | |
| 884 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break; | |
| 885 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break; | |
| 886 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break; | |
| 887 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break; | |
| 888 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break; | |
| 889 default: | |
| 890 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n"); | |
| 891 return -1; | |
| 892 } | |
| 893 }else if(f->colorspace==1){ | |
| 894 if(f->chroma_h_shift || f->chroma_v_shift){ | |
| 895 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n"); | |
| 896 return -1; | |
| 897 } | |
| 898 f->avctx->pix_fmt= PIX_FMT_RGBA32; | |
| 899 }else{ | |
| 900 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n"); | |
| 901 return -1; | |
| 902 } | |
| 903 | |
| 904 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt); | |
| 905 | |
| 906 context_count=1; | |
| 907 for(i=0; i<5; i++){ | |
| 908 context_count*= read_quant_table(c, f->quant_table[i], context_count); | |
| 909 if(context_count < 0 || context_count > 32768){ | |
| 910 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n"); | |
| 911 return -1; | |
| 912 } | |
| 913 } | |
| 914 context_count= (context_count+1)/2; | |
| 915 | |
| 916 for(i=0; i<f->plane_count; i++){ | |
| 917 PlaneContext * const p= &f->plane[i]; | |
| 918 | |
| 919 p->context_count= context_count; | |
| 920 | |
| 921 if(f->ac){ | |
| 922 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 923 }else{ | |
| 924 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 925 } | |
| 926 } | |
| 927 | |
| 928 return 0; | |
| 929 } | |
| 930 | |
| 931 static int decode_init(AVCodecContext *avctx) | |
| 932 { | |
| 933 // FFV1Context *s = avctx->priv_data; | |
| 934 | |
| 935 common_init(avctx); | |
| 936 | |
| 937 return 0; | |
| 938 } | |
| 939 | |
| 940 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){ | |
| 941 FFV1Context *f = avctx->priv_data; | |
| 942 RangeCoder * const c= &f->c; | |
| 943 const int width= f->width; | |
| 944 const int height= f->height; | |
| 945 AVFrame * const p= &f->picture; | |
| 946 int bytes_read; | |
| 947 uint8_t keystate= 128; | |
| 948 | |
| 949 AVFrame *picture = data; | |
| 950 | |
| 951 ff_init_range_decoder(c, buf, buf_size); | |
| 952 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 953 | |
| 954 | |
| 955 p->pict_type= FF_I_TYPE; //FIXME I vs. P | |
| 956 if(get_rac(c, &keystate)){ | |
| 957 p->key_frame= 1; | |
| 958 if(read_header(f) < 0) | |
| 959 return -1; | |
| 960 clear_state(f); | |
| 961 }else{ | |
| 962 p->key_frame= 0; | |
| 963 } | |
| 964 if(!f->plane[0].state && !f->plane[0].vlc_state) | |
| 965 return -1; | |
| 966 | |
| 967 p->reference= 0; | |
| 968 if(avctx->get_buffer(avctx, p) < 0){ | |
| 969 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
| 970 return -1; | |
| 971 } | |
| 972 | |
| 973 if(avctx->debug&FF_DEBUG_PICT_INFO) | |
| 974 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac); | |
| 975 | |
| 976 if(!f->ac){ | |
| 977 bytes_read = c->bytestream - c->bytestream_start - 1; | |
| 978 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME | |
| 979 //printf("pos=%d\n", bytes_read); | |
| 980 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read); | |
| 981 } else { | |
| 982 bytes_read = 0; /* avoid warning */ | |
| 983 } | |
| 984 | |
| 985 if(f->colorspace==0){ | |
| 986 const int chroma_width = -((-width )>>f->chroma_h_shift); | |
| 987 const int chroma_height= -((-height)>>f->chroma_v_shift); | |
| 988 decode_plane(f, p->data[0], width, height, p->linesize[0], 0); | |
| 989 | |
| 990 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); | |
| 991 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); | |
| 992 }else{ | |
| 993 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4); | |
| 994 } | |
| 995 | |
| 996 emms_c(); | |
| 997 | |
| 998 f->picture_number++; | |
| 999 | |
| 1000 *picture= *p; | |
| 1001 | |
| 1002 avctx->release_buffer(avctx, p); //FIXME | |
| 1003 | |
| 1004 *data_size = sizeof(AVFrame); | |
| 1005 | |
| 1006 if(f->ac){ | |
| 1007 bytes_read= c->bytestream - c->bytestream_start - 1; | |
| 1008 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n"); | |
| 1009 }else{ | |
| 1010 bytes_read+= (get_bits_count(&f->gb)+7)/8; | |
| 1011 } | |
| 1012 | |
| 1013 return bytes_read; | |
| 1014 } | |
| 1015 | |
| 1016 AVCodec ffv1_decoder = { | |
| 1017 "ffv1", | |
| 1018 CODEC_TYPE_VIDEO, | |
| 1019 CODEC_ID_FFV1, | |
| 1020 sizeof(FFV1Context), | |
| 1021 decode_init, | |
| 1022 NULL, | |
| 1023 common_end, | |
| 1024 decode_frame, | |
| 1025 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, | |
| 1026 NULL | |
| 1027 }; | |
| 1028 | |
| 1029 #ifdef CONFIG_ENCODERS | |
| 1030 AVCodec ffv1_encoder = { | |
| 1031 "ffv1", | |
| 1032 CODEC_TYPE_VIDEO, | |
| 1033 CODEC_ID_FFV1, | |
| 1034 sizeof(FFV1Context), | |
| 1035 encode_init, | |
| 1036 encode_frame, | |
| 1037 common_end, | |
| 1038 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGBA32, -1}, | |
| 1039 }; | |
| 1040 #endif |
