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