annotate ffmpeg/libavcodec/ffv1enc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * FFV1 encoder
yading@10 3 *
yading@10 4 * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * FF Video Codec 1 (a lossless codec) encoder
yading@10 26 */
yading@10 27
yading@10 28 #include "libavutil/avassert.h"
yading@10 29 #include "libavutil/crc.h"
yading@10 30 #include "libavutil/opt.h"
yading@10 31 #include "libavutil/imgutils.h"
yading@10 32 #include "libavutil/pixdesc.h"
yading@10 33 #include "libavutil/timer.h"
yading@10 34 #include "avcodec.h"
yading@10 35 #include "internal.h"
yading@10 36 #include "put_bits.h"
yading@10 37 #include "rangecoder.h"
yading@10 38 #include "golomb.h"
yading@10 39 #include "mathops.h"
yading@10 40 #include "ffv1.h"
yading@10 41
yading@10 42 static const int8_t quant5_10bit[256] = {
yading@10 43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
yading@10 44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
yading@10 45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
yading@10 46 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 47 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 48 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 49 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 50 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 51 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 52 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 53 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 54 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 55 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1,
yading@10 56 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
yading@10 57 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
yading@10 58 -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
yading@10 59 };
yading@10 60
yading@10 61 static const int8_t quant5[256] = {
yading@10 62 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 63 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 64 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 69 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
yading@10 70 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 71 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 72 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 73 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 74 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 75 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 76 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 77 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
yading@10 78 };
yading@10 79
yading@10 80 static const int8_t quant9_10bit[256] = {
yading@10 81 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
yading@10 82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
yading@10 83 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
yading@10 84 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 85 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 86 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 87 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 88 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 89 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
yading@10 90 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
yading@10 91 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
yading@10 92 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
yading@10 93 -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
yading@10 94 -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
yading@10 95 -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
yading@10 96 -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
yading@10 97 };
yading@10 98
yading@10 99 static const int8_t quant11[256] = {
yading@10 100 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
yading@10 101 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
yading@10 102 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 103 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 104 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 105 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 106 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 107 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
yading@10 108 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
yading@10 109 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
yading@10 110 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
yading@10 111 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
yading@10 112 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
yading@10 113 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
yading@10 114 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
yading@10 115 -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
yading@10 116 };
yading@10 117
yading@10 118 static const uint8_t ver2_state[256] = {
yading@10 119 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
yading@10 120 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
yading@10 121 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
yading@10 122 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
yading@10 123 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
yading@10 124 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
yading@10 125 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
yading@10 126 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
yading@10 127 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
yading@10 128 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
yading@10 129 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
yading@10 130 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
yading@10 131 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
yading@10 132 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
yading@10 133 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
yading@10 134 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
yading@10 135 };
yading@10 136
yading@10 137 static void find_best_state(uint8_t best_state[256][256],
yading@10 138 const uint8_t one_state[256])
yading@10 139 {
yading@10 140 int i, j, k, m;
yading@10 141 double l2tab[256];
yading@10 142
yading@10 143 for (i = 1; i < 256; i++)
yading@10 144 l2tab[i] = log2(i / 256.0);
yading@10 145
yading@10 146 for (i = 0; i < 256; i++) {
yading@10 147 double best_len[256];
yading@10 148 double p = i / 256.0;
yading@10 149
yading@10 150 for (j = 0; j < 256; j++)
yading@10 151 best_len[j] = 1 << 30;
yading@10 152
yading@10 153 for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
yading@10 154 double occ[256] = { 0 };
yading@10 155 double len = 0;
yading@10 156 occ[j] = 1.0;
yading@10 157 for (k = 0; k < 256; k++) {
yading@10 158 double newocc[256] = { 0 };
yading@10 159 for (m = 1; m < 256; m++)
yading@10 160 if (occ[m]) {
yading@10 161 len -=occ[m]*( p *l2tab[ m]
yading@10 162 + (1-p)*l2tab[256-m]);
yading@10 163 }
yading@10 164 if (len < best_len[k]) {
yading@10 165 best_len[k] = len;
yading@10 166 best_state[i][k] = j;
yading@10 167 }
yading@10 168 for (m = 0; m < 256; m++)
yading@10 169 if (occ[m]) {
yading@10 170 newocc[ one_state[ m]] += occ[m] * p;
yading@10 171 newocc[256 - one_state[256 - m]] += occ[m] * (1 - p);
yading@10 172 }
yading@10 173 memcpy(occ, newocc, sizeof(occ));
yading@10 174 }
yading@10 175 }
yading@10 176 }
yading@10 177 }
yading@10 178
yading@10 179 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c,
yading@10 180 uint8_t *state, int v,
yading@10 181 int is_signed,
yading@10 182 uint64_t rc_stat[256][2],
yading@10 183 uint64_t rc_stat2[32][2])
yading@10 184 {
yading@10 185 int i;
yading@10 186
yading@10 187 #define put_rac(C, S, B) \
yading@10 188 do { \
yading@10 189 if (rc_stat) { \
yading@10 190 rc_stat[*(S)][B]++; \
yading@10 191 rc_stat2[(S) - state][B]++; \
yading@10 192 } \
yading@10 193 put_rac(C, S, B); \
yading@10 194 } while (0)
yading@10 195
yading@10 196 if (v) {
yading@10 197 const int a = FFABS(v);
yading@10 198 const int e = av_log2(a);
yading@10 199 put_rac(c, state + 0, 0);
yading@10 200 if (e <= 9) {
yading@10 201 for (i = 0; i < e; i++)
yading@10 202 put_rac(c, state + 1 + i, 1); // 1..10
yading@10 203 put_rac(c, state + 1 + i, 0);
yading@10 204
yading@10 205 for (i = e - 1; i >= 0; i--)
yading@10 206 put_rac(c, state + 22 + i, (a >> i) & 1); // 22..31
yading@10 207
yading@10 208 if (is_signed)
yading@10 209 put_rac(c, state + 11 + e, v < 0); // 11..21
yading@10 210 } else {
yading@10 211 for (i = 0; i < e; i++)
yading@10 212 put_rac(c, state + 1 + FFMIN(i, 9), 1); // 1..10
yading@10 213 put_rac(c, state + 1 + 9, 0);
yading@10 214
yading@10 215 for (i = e - 1; i >= 0; i--)
yading@10 216 put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1); // 22..31
yading@10 217
yading@10 218 if (is_signed)
yading@10 219 put_rac(c, state + 11 + 10, v < 0); // 11..21
yading@10 220 }
yading@10 221 } else {
yading@10 222 put_rac(c, state + 0, 1);
yading@10 223 }
yading@10 224 #undef put_rac
yading@10 225 }
yading@10 226
yading@10 227 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
yading@10 228 int v, int is_signed)
yading@10 229 {
yading@10 230 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
yading@10 231 }
yading@10 232
yading@10 233
yading@10 234 static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
yading@10 235 int v, int bits)
yading@10 236 {
yading@10 237 int i, k, code;
yading@10 238 v = fold(v - state->bias, bits);
yading@10 239
yading@10 240 i = state->count;
yading@10 241 k = 0;
yading@10 242 while (i < state->error_sum) { // FIXME: optimize
yading@10 243 k++;
yading@10 244 i += i;
yading@10 245 }
yading@10 246
yading@10 247 av_assert2(k <= 13);
yading@10 248
yading@10 249 #if 0 // JPEG LS
yading@10 250 if (k == 0 && 2 * state->drift <= -state->count)
yading@10 251 code = v ^ (-1);
yading@10 252 else
yading@10 253 code = v;
yading@10 254 #else
yading@10 255 code = v ^ ((2 * state->drift + state->count) >> 31);
yading@10 256 #endif
yading@10 257
yading@10 258 av_dlog(NULL, "v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code,
yading@10 259 state->bias, state->error_sum, state->drift, state->count, k);
yading@10 260 set_sr_golomb(pb, code, k, 12, bits);
yading@10 261
yading@10 262 update_vlc_state(state, v);
yading@10 263 }
yading@10 264
yading@10 265 static av_always_inline int encode_line(FFV1Context *s, int w,
yading@10 266 int16_t *sample[3],
yading@10 267 int plane_index, int bits)
yading@10 268 {
yading@10 269 PlaneContext *const p = &s->plane[plane_index];
yading@10 270 RangeCoder *const c = &s->c;
yading@10 271 int x;
yading@10 272 int run_index = s->run_index;
yading@10 273 int run_count = 0;
yading@10 274 int run_mode = 0;
yading@10 275
yading@10 276 if (s->ac) {
yading@10 277 if (c->bytestream_end - c->bytestream < w * 20) {
yading@10 278 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
yading@10 279 return AVERROR_INVALIDDATA;
yading@10 280 }
yading@10 281 } else {
yading@10 282 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < w * 4) {
yading@10 283 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
yading@10 284 return AVERROR_INVALIDDATA;
yading@10 285 }
yading@10 286 }
yading@10 287
yading@10 288 for (x = 0; x < w; x++) {
yading@10 289 int diff, context;
yading@10 290
yading@10 291 context = get_context(p, sample[0] + x, sample[1] + x, sample[2] + x);
yading@10 292 diff = sample[0][x] - predict(sample[0] + x, sample[1] + x);
yading@10 293
yading@10 294 if (context < 0) {
yading@10 295 context = -context;
yading@10 296 diff = -diff;
yading@10 297 }
yading@10 298
yading@10 299 diff = fold(diff, bits);
yading@10 300
yading@10 301 if (s->ac) {
yading@10 302 if (s->flags & CODEC_FLAG_PASS1) {
yading@10 303 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat,
yading@10 304 s->rc_stat2[p->quant_table_index][context]);
yading@10 305 } else {
yading@10 306 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
yading@10 307 }
yading@10 308 } else {
yading@10 309 if (context == 0)
yading@10 310 run_mode = 1;
yading@10 311
yading@10 312 if (run_mode) {
yading@10 313 if (diff) {
yading@10 314 while (run_count >= 1 << ff_log2_run[run_index]) {
yading@10 315 run_count -= 1 << ff_log2_run[run_index];
yading@10 316 run_index++;
yading@10 317 put_bits(&s->pb, 1, 1);
yading@10 318 }
yading@10 319
yading@10 320 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
yading@10 321 if (run_index)
yading@10 322 run_index--;
yading@10 323 run_count = 0;
yading@10 324 run_mode = 0;
yading@10 325 if (diff > 0)
yading@10 326 diff--;
yading@10 327 } else {
yading@10 328 run_count++;
yading@10 329 }
yading@10 330 }
yading@10 331
yading@10 332 av_dlog(s->avctx, "count:%d index:%d, mode:%d, x:%d pos:%d\n",
yading@10 333 run_count, run_index, run_mode, x,
yading@10 334 (int)put_bits_count(&s->pb));
yading@10 335
yading@10 336 if (run_mode == 0)
yading@10 337 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
yading@10 338 }
yading@10 339 }
yading@10 340 if (run_mode) {
yading@10 341 while (run_count >= 1 << ff_log2_run[run_index]) {
yading@10 342 run_count -= 1 << ff_log2_run[run_index];
yading@10 343 run_index++;
yading@10 344 put_bits(&s->pb, 1, 1);
yading@10 345 }
yading@10 346
yading@10 347 if (run_count)
yading@10 348 put_bits(&s->pb, 1, 1);
yading@10 349 }
yading@10 350 s->run_index = run_index;
yading@10 351
yading@10 352 return 0;
yading@10 353 }
yading@10 354
yading@10 355 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h,
yading@10 356 int stride, int plane_index)
yading@10 357 {
yading@10 358 int x, y, i;
yading@10 359 const int ring_size = s->avctx->context_model ? 3 : 2;
yading@10 360 int16_t *sample[3];
yading@10 361 s->run_index = 0;
yading@10 362
yading@10 363 memset(s->sample_buffer, 0, ring_size * (w + 6) * sizeof(*s->sample_buffer));
yading@10 364
yading@10 365 for (y = 0; y < h; y++) {
yading@10 366 for (i = 0; i < ring_size; i++)
yading@10 367 sample[i] = s->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
yading@10 368
yading@10 369 sample[0][-1]= sample[1][0 ];
yading@10 370 sample[1][ w]= sample[1][w-1];
yading@10 371 // { START_TIMER
yading@10 372 if (s->bits_per_raw_sample <= 8) {
yading@10 373 for (x = 0; x < w; x++)
yading@10 374 sample[0][x] = src[x + stride * y];
yading@10 375 encode_line(s, w, sample, plane_index, 8);
yading@10 376 } else {
yading@10 377 if (s->packed_at_lsb) {
yading@10 378 for (x = 0; x < w; x++) {
yading@10 379 sample[0][x] = ((uint16_t*)(src + stride*y))[x];
yading@10 380 }
yading@10 381 } else {
yading@10 382 for (x = 0; x < w; x++) {
yading@10 383 sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
yading@10 384 }
yading@10 385 }
yading@10 386 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
yading@10 387 }
yading@10 388 // STOP_TIMER("encode line") }
yading@10 389 }
yading@10 390 }
yading@10 391
yading@10 392 static void encode_rgb_frame(FFV1Context *s, uint8_t *src[3], int w, int h, int stride[3])
yading@10 393 {
yading@10 394 int x, y, p, i;
yading@10 395 const int ring_size = s->avctx->context_model ? 3 : 2;
yading@10 396 int16_t *sample[4][3];
yading@10 397 int lbd = s->bits_per_raw_sample <= 8;
yading@10 398 int bits = s->bits_per_raw_sample > 0 ? s->bits_per_raw_sample : 8;
yading@10 399 int offset = 1 << bits;
yading@10 400
yading@10 401 s->run_index = 0;
yading@10 402
yading@10 403 memset(s->sample_buffer, 0, ring_size * MAX_PLANES *
yading@10 404 (w + 6) * sizeof(*s->sample_buffer));
yading@10 405
yading@10 406 for (y = 0; y < h; y++) {
yading@10 407 for (i = 0; i < ring_size; i++)
yading@10 408 for (p = 0; p < MAX_PLANES; p++)
yading@10 409 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
yading@10 410
yading@10 411 for (x = 0; x < w; x++) {
yading@10 412 int b, g, r, av_uninit(a);
yading@10 413 if (lbd) {
yading@10 414 unsigned v = *((uint32_t*)(src[0] + x*4 + stride[0]*y));
yading@10 415 b = v & 0xFF;
yading@10 416 g = (v >> 8) & 0xFF;
yading@10 417 r = (v >> 16) & 0xFF;
yading@10 418 a = v >> 24;
yading@10 419 } else {
yading@10 420 b = *((uint16_t*)(src[0] + x*2 + stride[0]*y));
yading@10 421 g = *((uint16_t*)(src[1] + x*2 + stride[1]*y));
yading@10 422 r = *((uint16_t*)(src[2] + x*2 + stride[2]*y));
yading@10 423 }
yading@10 424
yading@10 425 b -= g;
yading@10 426 r -= g;
yading@10 427 g += (b + r) >> 2;
yading@10 428 b += offset;
yading@10 429 r += offset;
yading@10 430
yading@10 431 sample[0][0][x] = g;
yading@10 432 sample[1][0][x] = b;
yading@10 433 sample[2][0][x] = r;
yading@10 434 sample[3][0][x] = a;
yading@10 435 }
yading@10 436 for (p = 0; p < 3 + s->transparency; p++) {
yading@10 437 sample[p][0][-1] = sample[p][1][0 ];
yading@10 438 sample[p][1][ w] = sample[p][1][w-1];
yading@10 439 if (lbd)
yading@10 440 encode_line(s, w, sample[p], (p + 1) / 2, 9);
yading@10 441 else
yading@10 442 encode_line(s, w, sample[p], (p + 1) / 2, bits + 1);
yading@10 443 }
yading@10 444 }
yading@10 445 }
yading@10 446
yading@10 447 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
yading@10 448 {
yading@10 449 int last = 0;
yading@10 450 int i;
yading@10 451 uint8_t state[CONTEXT_SIZE];
yading@10 452 memset(state, 128, sizeof(state));
yading@10 453
yading@10 454 for (i = 1; i < 128; i++)
yading@10 455 if (quant_table[i] != quant_table[i - 1]) {
yading@10 456 put_symbol(c, state, i - last - 1, 0);
yading@10 457 last = i;
yading@10 458 }
yading@10 459 put_symbol(c, state, i - last - 1, 0);
yading@10 460 }
yading@10 461
yading@10 462 static void write_quant_tables(RangeCoder *c,
yading@10 463 int16_t quant_table[MAX_CONTEXT_INPUTS][256])
yading@10 464 {
yading@10 465 int i;
yading@10 466 for (i = 0; i < 5; i++)
yading@10 467 write_quant_table(c, quant_table[i]);
yading@10 468 }
yading@10 469
yading@10 470 static void write_header(FFV1Context *f)
yading@10 471 {
yading@10 472 uint8_t state[CONTEXT_SIZE];
yading@10 473 int i, j;
yading@10 474 RangeCoder *const c = &f->slice_context[0]->c;
yading@10 475
yading@10 476 memset(state, 128, sizeof(state));
yading@10 477
yading@10 478 if (f->version < 2) {
yading@10 479 put_symbol(c, state, f->version, 0);
yading@10 480 put_symbol(c, state, f->ac, 0);
yading@10 481 if (f->ac > 1) {
yading@10 482 for (i = 1; i < 256; i++)
yading@10 483 put_symbol(c, state,
yading@10 484 f->state_transition[i] - c->one_state[i], 1);
yading@10 485 }
yading@10 486 put_symbol(c, state, f->colorspace, 0); //YUV cs type
yading@10 487 if (f->version > 0)
yading@10 488 put_symbol(c, state, f->bits_per_raw_sample, 0);
yading@10 489 put_rac(c, state, f->chroma_planes);
yading@10 490 put_symbol(c, state, f->chroma_h_shift, 0);
yading@10 491 put_symbol(c, state, f->chroma_v_shift, 0);
yading@10 492 put_rac(c, state, f->transparency);
yading@10 493
yading@10 494 write_quant_tables(c, f->quant_table);
yading@10 495 } else if (f->version < 3) {
yading@10 496 put_symbol(c, state, f->slice_count, 0);
yading@10 497 for (i = 0; i < f->slice_count; i++) {
yading@10 498 FFV1Context *fs = f->slice_context[i];
yading@10 499 put_symbol(c, state,
yading@10 500 (fs->slice_x + 1) * f->num_h_slices / f->width, 0);
yading@10 501 put_symbol(c, state,
yading@10 502 (fs->slice_y + 1) * f->num_v_slices / f->height, 0);
yading@10 503 put_symbol(c, state,
yading@10 504 (fs->slice_width + 1) * f->num_h_slices / f->width - 1,
yading@10 505 0);
yading@10 506 put_symbol(c, state,
yading@10 507 (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
yading@10 508 0);
yading@10 509 for (j = 0; j < f->plane_count; j++) {
yading@10 510 put_symbol(c, state, f->plane[j].quant_table_index, 0);
yading@10 511 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
yading@10 512 }
yading@10 513 }
yading@10 514 }
yading@10 515 }
yading@10 516
yading@10 517 static int write_extradata(FFV1Context *f)
yading@10 518 {
yading@10 519 RangeCoder *const c = &f->c;
yading@10 520 uint8_t state[CONTEXT_SIZE];
yading@10 521 int i, j, k;
yading@10 522 uint8_t state2[32][CONTEXT_SIZE];
yading@10 523 unsigned v;
yading@10 524
yading@10 525 memset(state2, 128, sizeof(state2));
yading@10 526 memset(state, 128, sizeof(state));
yading@10 527
yading@10 528 f->avctx->extradata_size = 10000 + 4 +
yading@10 529 (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
yading@10 530 f->avctx->extradata = av_malloc(f->avctx->extradata_size);
yading@10 531 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
yading@10 532 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
yading@10 533
yading@10 534 put_symbol(c, state, f->version, 0);
yading@10 535 if (f->version > 2) {
yading@10 536 if (f->version == 3)
yading@10 537 f->minor_version = 2;
yading@10 538 put_symbol(c, state, f->minor_version, 0);
yading@10 539 }
yading@10 540
yading@10 541 put_symbol(c, state, f->ac, 0);
yading@10 542 if (f->ac > 1)
yading@10 543 for (i = 1; i < 256; i++)
yading@10 544 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
yading@10 545
yading@10 546 put_symbol(c, state, f->colorspace, 0); // YUV cs type
yading@10 547 put_symbol(c, state, f->bits_per_raw_sample, 0);
yading@10 548 put_rac(c, state, f->chroma_planes);
yading@10 549 put_symbol(c, state, f->chroma_h_shift, 0);
yading@10 550 put_symbol(c, state, f->chroma_v_shift, 0);
yading@10 551 put_rac(c, state, f->transparency);
yading@10 552 put_symbol(c, state, f->num_h_slices - 1, 0);
yading@10 553 put_symbol(c, state, f->num_v_slices - 1, 0);
yading@10 554
yading@10 555 put_symbol(c, state, f->quant_table_count, 0);
yading@10 556 for (i = 0; i < f->quant_table_count; i++)
yading@10 557 write_quant_tables(c, f->quant_tables[i]);
yading@10 558
yading@10 559 for (i = 0; i < f->quant_table_count; i++) {
yading@10 560 for (j = 0; j < f->context_count[i] * CONTEXT_SIZE; j++)
yading@10 561 if (f->initial_states[i] && f->initial_states[i][0][j] != 128)
yading@10 562 break;
yading@10 563 if (j < f->context_count[i] * CONTEXT_SIZE) {
yading@10 564 put_rac(c, state, 1);
yading@10 565 for (j = 0; j < f->context_count[i]; j++)
yading@10 566 for (k = 0; k < CONTEXT_SIZE; k++) {
yading@10 567 int pred = j ? f->initial_states[i][j - 1][k] : 128;
yading@10 568 put_symbol(c, state2[k],
yading@10 569 (int8_t)(f->initial_states[i][j][k] - pred), 1);
yading@10 570 }
yading@10 571 } else {
yading@10 572 put_rac(c, state, 0);
yading@10 573 }
yading@10 574 }
yading@10 575
yading@10 576 if (f->version > 2) {
yading@10 577 put_symbol(c, state, f->ec, 0);
yading@10 578 }
yading@10 579
yading@10 580 f->avctx->extradata_size = ff_rac_terminate(c);
yading@10 581 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
yading@10 582 AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
yading@10 583 f->avctx->extradata_size += 4;
yading@10 584
yading@10 585 return 0;
yading@10 586 }
yading@10 587
yading@10 588 static int sort_stt(FFV1Context *s, uint8_t stt[256])
yading@10 589 {
yading@10 590 int i, i2, changed, print = 0;
yading@10 591
yading@10 592 do {
yading@10 593 changed = 0;
yading@10 594 for (i = 12; i < 244; i++) {
yading@10 595 for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
yading@10 596
yading@10 597 #define COST(old, new) \
yading@10 598 s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
yading@10 599 s->rc_stat[old][1] * -log2((new) / 256.0)
yading@10 600
yading@10 601 #define COST2(old, new) \
yading@10 602 COST(old, new) + COST(256 - (old), 256 - (new))
yading@10 603
yading@10 604 double size0 = COST2(i, i) + COST2(i2, i2);
yading@10 605 double sizeX = COST2(i, i2) + COST2(i2, i);
yading@10 606 if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
yading@10 607 int j;
yading@10 608 FFSWAP(int, stt[i], stt[i2]);
yading@10 609 FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
yading@10 610 FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
yading@10 611 if (i != 256 - i2) {
yading@10 612 FFSWAP(int, stt[256 - i], stt[256 - i2]);
yading@10 613 FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
yading@10 614 FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
yading@10 615 }
yading@10 616 for (j = 1; j < 256; j++) {
yading@10 617 if (stt[j] == i)
yading@10 618 stt[j] = i2;
yading@10 619 else if (stt[j] == i2)
yading@10 620 stt[j] = i;
yading@10 621 if (i != 256 - i2) {
yading@10 622 if (stt[256 - j] == 256 - i)
yading@10 623 stt[256 - j] = 256 - i2;
yading@10 624 else if (stt[256 - j] == 256 - i2)
yading@10 625 stt[256 - j] = 256 - i;
yading@10 626 }
yading@10 627 }
yading@10 628 print = changed = 1;
yading@10 629 }
yading@10 630 }
yading@10 631 }
yading@10 632 } while (changed);
yading@10 633 return print;
yading@10 634 }
yading@10 635
yading@10 636 static av_cold int encode_init(AVCodecContext *avctx)
yading@10 637 {
yading@10 638 FFV1Context *s = avctx->priv_data;
yading@10 639 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
yading@10 640 int i, j, k, m, ret;
yading@10 641
yading@10 642 ffv1_common_init(avctx);
yading@10 643
yading@10 644 s->version = 0;
yading@10 645
yading@10 646 if ((avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) || avctx->slices>1)
yading@10 647 s->version = FFMAX(s->version, 2);
yading@10 648
yading@10 649 if (avctx->level == 3) {
yading@10 650 s->version = 3;
yading@10 651 }
yading@10 652
yading@10 653 if (s->ec < 0) {
yading@10 654 s->ec = (s->version >= 3);
yading@10 655 }
yading@10 656
yading@10 657 if (s->version >= 2 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
yading@10 658 av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
yading@10 659 return AVERROR_INVALIDDATA;
yading@10 660 }
yading@10 661
yading@10 662 s->ac = avctx->coder_type > 0 ? 2 : 0;
yading@10 663
yading@10 664 s->plane_count = 3;
yading@10 665 switch(avctx->pix_fmt) {
yading@10 666 case AV_PIX_FMT_YUV444P9:
yading@10 667 case AV_PIX_FMT_YUV422P9:
yading@10 668 case AV_PIX_FMT_YUV420P9:
yading@10 669 if (!avctx->bits_per_raw_sample)
yading@10 670 s->bits_per_raw_sample = 9;
yading@10 671 case AV_PIX_FMT_YUV444P10:
yading@10 672 case AV_PIX_FMT_YUV420P10:
yading@10 673 case AV_PIX_FMT_YUV422P10:
yading@10 674 s->packed_at_lsb = 1;
yading@10 675 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
yading@10 676 s->bits_per_raw_sample = 10;
yading@10 677 case AV_PIX_FMT_GRAY16:
yading@10 678 case AV_PIX_FMT_YUV444P16:
yading@10 679 case AV_PIX_FMT_YUV422P16:
yading@10 680 case AV_PIX_FMT_YUV420P16:
yading@10 681 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
yading@10 682 s->bits_per_raw_sample = 16;
yading@10 683 } else if (!s->bits_per_raw_sample) {
yading@10 684 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
yading@10 685 }
yading@10 686 if (s->bits_per_raw_sample <= 8) {
yading@10 687 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
yading@10 688 return AVERROR_INVALIDDATA;
yading@10 689 }
yading@10 690 if (!s->ac && avctx->coder_type == -1) {
yading@10 691 av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
yading@10 692 s->ac = 2;
yading@10 693 }
yading@10 694 if (!s->ac) {
yading@10 695 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
yading@10 696 return AVERROR(ENOSYS);
yading@10 697 }
yading@10 698 s->version = FFMAX(s->version, 1);
yading@10 699 case AV_PIX_FMT_GRAY8:
yading@10 700 case AV_PIX_FMT_YUV444P:
yading@10 701 case AV_PIX_FMT_YUV440P:
yading@10 702 case AV_PIX_FMT_YUV422P:
yading@10 703 case AV_PIX_FMT_YUV420P:
yading@10 704 case AV_PIX_FMT_YUV411P:
yading@10 705 case AV_PIX_FMT_YUV410P:
yading@10 706 s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
yading@10 707 s->colorspace = 0;
yading@10 708 break;
yading@10 709 case AV_PIX_FMT_YUVA444P:
yading@10 710 case AV_PIX_FMT_YUVA422P:
yading@10 711 case AV_PIX_FMT_YUVA420P:
yading@10 712 s->chroma_planes = 1;
yading@10 713 s->colorspace = 0;
yading@10 714 s->transparency = 1;
yading@10 715 break;
yading@10 716 case AV_PIX_FMT_RGB32:
yading@10 717 s->colorspace = 1;
yading@10 718 s->transparency = 1;
yading@10 719 break;
yading@10 720 case AV_PIX_FMT_0RGB32:
yading@10 721 s->colorspace = 1;
yading@10 722 break;
yading@10 723 case AV_PIX_FMT_GBRP9:
yading@10 724 if (!avctx->bits_per_raw_sample)
yading@10 725 s->bits_per_raw_sample = 9;
yading@10 726 case AV_PIX_FMT_GBRP10:
yading@10 727 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
yading@10 728 s->bits_per_raw_sample = 10;
yading@10 729 case AV_PIX_FMT_GBRP12:
yading@10 730 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
yading@10 731 s->bits_per_raw_sample = 12;
yading@10 732 case AV_PIX_FMT_GBRP14:
yading@10 733 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
yading@10 734 s->bits_per_raw_sample = 14;
yading@10 735 else if (!s->bits_per_raw_sample)
yading@10 736 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
yading@10 737 s->colorspace = 1;
yading@10 738 s->chroma_planes = 1;
yading@10 739 s->version = FFMAX(s->version, 1);
yading@10 740 break;
yading@10 741 default:
yading@10 742 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
yading@10 743 return AVERROR(ENOSYS);
yading@10 744 }
yading@10 745 if (s->transparency) {
yading@10 746 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
yading@10 747 }
yading@10 748 if (avctx->context_model > 1U) {
yading@10 749 av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
yading@10 750 return AVERROR(EINVAL);
yading@10 751 }
yading@10 752
yading@10 753 if (s->ac > 1)
yading@10 754 for (i = 1; i < 256; i++)
yading@10 755 s->state_transition[i] = ver2_state[i];
yading@10 756
yading@10 757 for (i = 0; i < 256; i++) {
yading@10 758 s->quant_table_count = 2;
yading@10 759 if (s->bits_per_raw_sample <= 8) {
yading@10 760 s->quant_tables[0][0][i]= quant11[i];
yading@10 761 s->quant_tables[0][1][i]= 11*quant11[i];
yading@10 762 s->quant_tables[0][2][i]= 11*11*quant11[i];
yading@10 763 s->quant_tables[1][0][i]= quant11[i];
yading@10 764 s->quant_tables[1][1][i]= 11*quant11[i];
yading@10 765 s->quant_tables[1][2][i]= 11*11*quant5 [i];
yading@10 766 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
yading@10 767 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
yading@10 768 } else {
yading@10 769 s->quant_tables[0][0][i]= quant9_10bit[i];
yading@10 770 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
yading@10 771 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
yading@10 772 s->quant_tables[1][0][i]= quant9_10bit[i];
yading@10 773 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
yading@10 774 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
yading@10 775 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
yading@10 776 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
yading@10 777 }
yading@10 778 }
yading@10 779 s->context_count[0] = (11 * 11 * 11 + 1) / 2;
yading@10 780 s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
yading@10 781 memcpy(s->quant_table, s->quant_tables[avctx->context_model],
yading@10 782 sizeof(s->quant_table));
yading@10 783
yading@10 784 for (i = 0; i < s->plane_count; i++) {
yading@10 785 PlaneContext *const p = &s->plane[i];
yading@10 786
yading@10 787 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
yading@10 788 p->quant_table_index = avctx->context_model;
yading@10 789 p->context_count = s->context_count[p->quant_table_index];
yading@10 790 }
yading@10 791
yading@10 792 if ((ret = ffv1_allocate_initial_states(s)) < 0)
yading@10 793 return ret;
yading@10 794
yading@10 795 avctx->coded_frame = &s->picture;
yading@10 796 if (!s->transparency)
yading@10 797 s->plane_count = 2;
yading@10 798 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
yading@10 799 s->picture_number = 0;
yading@10 800
yading@10 801 if (avctx->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
yading@10 802 for (i = 0; i < s->quant_table_count; i++) {
yading@10 803 s->rc_stat2[i] = av_mallocz(s->context_count[i] *
yading@10 804 sizeof(*s->rc_stat2[i]));
yading@10 805 if (!s->rc_stat2[i])
yading@10 806 return AVERROR(ENOMEM);
yading@10 807 }
yading@10 808 }
yading@10 809 if (avctx->stats_in) {
yading@10 810 char *p = avctx->stats_in;
yading@10 811 uint8_t best_state[256][256];
yading@10 812 int gob_count = 0;
yading@10 813 char *next;
yading@10 814
yading@10 815 av_assert0(s->version >= 2);
yading@10 816
yading@10 817 for (;;) {
yading@10 818 for (j = 0; j < 256; j++)
yading@10 819 for (i = 0; i < 2; i++) {
yading@10 820 s->rc_stat[j][i] = strtol(p, &next, 0);
yading@10 821 if (next == p) {
yading@10 822 av_log(avctx, AV_LOG_ERROR,
yading@10 823 "2Pass file invalid at %d %d [%s]\n", j, i, p);
yading@10 824 return AVERROR_INVALIDDATA;
yading@10 825 }
yading@10 826 p = next;
yading@10 827 }
yading@10 828 for (i = 0; i < s->quant_table_count; i++)
yading@10 829 for (j = 0; j < s->context_count[i]; j++) {
yading@10 830 for (k = 0; k < 32; k++)
yading@10 831 for (m = 0; m < 2; m++) {
yading@10 832 s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
yading@10 833 if (next == p) {
yading@10 834 av_log(avctx, AV_LOG_ERROR,
yading@10 835 "2Pass file invalid at %d %d %d %d [%s]\n",
yading@10 836 i, j, k, m, p);
yading@10 837 return AVERROR_INVALIDDATA;
yading@10 838 }
yading@10 839 p = next;
yading@10 840 }
yading@10 841 }
yading@10 842 gob_count = strtol(p, &next, 0);
yading@10 843 if (next == p || gob_count <= 0) {
yading@10 844 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
yading@10 845 return AVERROR_INVALIDDATA;
yading@10 846 }
yading@10 847 p = next;
yading@10 848 while (*p == '\n' || *p == ' ')
yading@10 849 p++;
yading@10 850 if (p[0] == 0)
yading@10 851 break;
yading@10 852 }
yading@10 853 sort_stt(s, s->state_transition);
yading@10 854
yading@10 855 find_best_state(best_state, s->state_transition);
yading@10 856
yading@10 857 for (i = 0; i < s->quant_table_count; i++) {
yading@10 858 for (k = 0; k < 32; k++) {
yading@10 859 double a=0, b=0;
yading@10 860 int jp = 0;
yading@10 861 for (j = 0; j < s->context_count[i]; j++) {
yading@10 862 double p = 128;
yading@10 863 if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
yading@10 864 if (a+b)
yading@10 865 p = 256.0 * b / (a + b);
yading@10 866 s->initial_states[i][jp][k] =
yading@10 867 best_state[av_clip(round(p), 1, 255)][av_clip((a + b) / gob_count, 0, 255)];
yading@10 868 for(jp++; jp<j; jp++)
yading@10 869 s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
yading@10 870 a=b=0;
yading@10 871 }
yading@10 872 a += s->rc_stat2[i][j][k][0];
yading@10 873 b += s->rc_stat2[i][j][k][1];
yading@10 874 if (a+b) {
yading@10 875 p = 256.0 * b / (a + b);
yading@10 876 }
yading@10 877 s->initial_states[i][j][k] =
yading@10 878 best_state[av_clip(round(p), 1, 255)][av_clip((a + b) / gob_count, 0, 255)];
yading@10 879 }
yading@10 880 }
yading@10 881 }
yading@10 882 }
yading@10 883
yading@10 884 if (s->version > 1) {
yading@10 885 s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
yading@10 886 for (; s->num_v_slices < 9; s->num_v_slices++) {
yading@10 887 for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
yading@10 888 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64 || !avctx->slices)
yading@10 889 goto slices_ok;
yading@10 890 }
yading@10 891 }
yading@10 892 av_log(avctx, AV_LOG_ERROR,
yading@10 893 "Unsupported number %d of slices requested, please specify a "
yading@10 894 "supported number with -slices (ex:4,6,9,12,16, ...)\n",
yading@10 895 avctx->slices);
yading@10 896 return AVERROR(ENOSYS);
yading@10 897 slices_ok:
yading@10 898 write_extradata(s);
yading@10 899 }
yading@10 900
yading@10 901 if ((ret = ffv1_init_slice_contexts(s)) < 0)
yading@10 902 return ret;
yading@10 903 if ((ret = ffv1_init_slices_state(s)) < 0)
yading@10 904 return ret;
yading@10 905
yading@10 906 #define STATS_OUT_SIZE 1024 * 1024 * 6
yading@10 907 if (avctx->flags & CODEC_FLAG_PASS1) {
yading@10 908 avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
yading@10 909 if (!avctx->stats_out)
yading@10 910 return AVERROR(ENOMEM);
yading@10 911 for (i = 0; i < s->quant_table_count; i++)
yading@10 912 for (j = 0; j < s->slice_count; j++) {
yading@10 913 FFV1Context *sf = s->slice_context[j];
yading@10 914 av_assert0(!sf->rc_stat2[i]);
yading@10 915 sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
yading@10 916 sizeof(*sf->rc_stat2[i]));
yading@10 917 if (!sf->rc_stat2[i])
yading@10 918 return AVERROR(ENOMEM);
yading@10 919 }
yading@10 920 }
yading@10 921
yading@10 922 return 0;
yading@10 923 }
yading@10 924
yading@10 925 static void encode_slice_header(FFV1Context *f, FFV1Context *fs)
yading@10 926 {
yading@10 927 RangeCoder *c = &fs->c;
yading@10 928 uint8_t state[CONTEXT_SIZE];
yading@10 929 int j;
yading@10 930 memset(state, 128, sizeof(state));
yading@10 931
yading@10 932 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
yading@10 933 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
yading@10 934 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
yading@10 935 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
yading@10 936 for (j=0; j<f->plane_count; j++) {
yading@10 937 put_symbol(c, state, f->plane[j].quant_table_index, 0);
yading@10 938 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
yading@10 939 }
yading@10 940 if (!f->picture.interlaced_frame)
yading@10 941 put_symbol(c, state, 3, 0);
yading@10 942 else
yading@10 943 put_symbol(c, state, 1 + !f->picture.top_field_first, 0);
yading@10 944 put_symbol(c, state, f->picture.sample_aspect_ratio.num, 0);
yading@10 945 put_symbol(c, state, f->picture.sample_aspect_ratio.den, 0);
yading@10 946 }
yading@10 947
yading@10 948 static int encode_slice(AVCodecContext *c, void *arg)
yading@10 949 {
yading@10 950 FFV1Context *fs = *(void **)arg;
yading@10 951 FFV1Context *f = fs->avctx->priv_data;
yading@10 952 int width = fs->slice_width;
yading@10 953 int height = fs->slice_height;
yading@10 954 int x = fs->slice_x;
yading@10 955 int y = fs->slice_y;
yading@10 956 AVFrame *const p = &f->picture;
yading@10 957 const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step_minus1 + 1;
yading@10 958
yading@10 959 if (p->key_frame)
yading@10 960 ffv1_clear_slice_state(f, fs);
yading@10 961 if (f->version > 2) {
yading@10 962 encode_slice_header(f, fs);
yading@10 963 }
yading@10 964 if (!fs->ac) {
yading@10 965 if (f->version > 2)
yading@10 966 put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
yading@10 967 fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
yading@10 968 init_put_bits(&fs->pb,
yading@10 969 fs->c.bytestream_start + fs->ac_byte_count,
yading@10 970 fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
yading@10 971 }
yading@10 972
yading@10 973 if (f->colorspace == 0) {
yading@10 974 const int chroma_width = -((-width) >> f->chroma_h_shift);
yading@10 975 const int chroma_height = -((-height) >> f->chroma_v_shift);
yading@10 976 const int cx = x >> f->chroma_h_shift;
yading@10 977 const int cy = y >> f->chroma_v_shift;
yading@10 978
yading@10 979 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
yading@10 980
yading@10 981 if (f->chroma_planes) {
yading@10 982 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
yading@10 983 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
yading@10 984 }
yading@10 985 if (fs->transparency)
yading@10 986 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
yading@10 987 } else {
yading@10 988 uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
yading@10 989 p->data[1] + ps*x + y*p->linesize[1],
yading@10 990 p->data[2] + ps*x + y*p->linesize[2]};
yading@10 991 encode_rgb_frame(fs, planes, width, height, p->linesize);
yading@10 992 }
yading@10 993 emms_c();
yading@10 994
yading@10 995 return 0;
yading@10 996 }
yading@10 997
yading@10 998 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
yading@10 999 const AVFrame *pict, int *got_packet)
yading@10 1000 {
yading@10 1001 FFV1Context *f = avctx->priv_data;
yading@10 1002 RangeCoder *const c = &f->slice_context[0]->c;
yading@10 1003 AVFrame *const p = &f->picture;
yading@10 1004 int used_count = 0;
yading@10 1005 uint8_t keystate = 128;
yading@10 1006 uint8_t *buf_p;
yading@10 1007 int i, ret;
yading@10 1008
yading@10 1009 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*((8*2+1+1)*4)/8
yading@10 1010 + FF_MIN_BUFFER_SIZE)) < 0)
yading@10 1011 return ret;
yading@10 1012
yading@10 1013 ff_init_range_encoder(c, pkt->data, pkt->size);
yading@10 1014 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
yading@10 1015
yading@10 1016 *p = *pict;
yading@10 1017 p->pict_type = AV_PICTURE_TYPE_I;
yading@10 1018
yading@10 1019 if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
yading@10 1020 put_rac(c, &keystate, 1);
yading@10 1021 p->key_frame = 1;
yading@10 1022 f->gob_count++;
yading@10 1023 write_header(f);
yading@10 1024 } else {
yading@10 1025 put_rac(c, &keystate, 0);
yading@10 1026 p->key_frame = 0;
yading@10 1027 }
yading@10 1028
yading@10 1029 if (f->ac > 1) {
yading@10 1030 int i;
yading@10 1031 for (i = 1; i < 256; i++) {
yading@10 1032 c->one_state[i] = f->state_transition[i];
yading@10 1033 c->zero_state[256 - i] = 256 - c->one_state[i];
yading@10 1034 }
yading@10 1035 }
yading@10 1036
yading@10 1037 for (i = 1; i < f->slice_count; i++) {
yading@10 1038 FFV1Context *fs = f->slice_context[i];
yading@10 1039 uint8_t *start = pkt->data + (pkt->size - used_count) * (int64_t)i / f->slice_count;
yading@10 1040 int len = pkt->size / f->slice_count;
yading@10 1041 ff_init_range_encoder(&fs->c, start, len);
yading@10 1042 }
yading@10 1043 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
yading@10 1044 f->slice_count, sizeof(void *));
yading@10 1045
yading@10 1046 buf_p = pkt->data;
yading@10 1047 for (i = 0; i < f->slice_count; i++) {
yading@10 1048 FFV1Context *fs = f->slice_context[i];
yading@10 1049 int bytes;
yading@10 1050
yading@10 1051 if (fs->ac) {
yading@10 1052 uint8_t state = 129;
yading@10 1053 put_rac(&fs->c, &state, 0);
yading@10 1054 bytes = ff_rac_terminate(&fs->c);
yading@10 1055 } else {
yading@10 1056 flush_put_bits(&fs->pb); // FIXME: nicer padding
yading@10 1057 bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7) / 8;
yading@10 1058 }
yading@10 1059 if (i > 0 || f->version > 2) {
yading@10 1060 av_assert0(bytes < pkt->size / f->slice_count);
yading@10 1061 memmove(buf_p, fs->c.bytestream_start, bytes);
yading@10 1062 av_assert0(bytes < (1 << 24));
yading@10 1063 AV_WB24(buf_p + bytes, bytes);
yading@10 1064 bytes += 3;
yading@10 1065 }
yading@10 1066 if (f->ec) {
yading@10 1067 unsigned v;
yading@10 1068 buf_p[bytes++] = 0;
yading@10 1069 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
yading@10 1070 AV_WL32(buf_p + bytes, v);
yading@10 1071 bytes += 4;
yading@10 1072 }
yading@10 1073 buf_p += bytes;
yading@10 1074 }
yading@10 1075
yading@10 1076 if ((avctx->flags & CODEC_FLAG_PASS1) && (f->picture_number & 31) == 0) {
yading@10 1077 int j, k, m;
yading@10 1078 char *p = avctx->stats_out;
yading@10 1079 char *end = p + STATS_OUT_SIZE;
yading@10 1080
yading@10 1081 memset(f->rc_stat, 0, sizeof(f->rc_stat));
yading@10 1082 for (i = 0; i < f->quant_table_count; i++)
yading@10 1083 memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
yading@10 1084
yading@10 1085 for (j = 0; j < f->slice_count; j++) {
yading@10 1086 FFV1Context *fs = f->slice_context[j];
yading@10 1087 for (i = 0; i < 256; i++) {
yading@10 1088 f->rc_stat[i][0] += fs->rc_stat[i][0];
yading@10 1089 f->rc_stat[i][1] += fs->rc_stat[i][1];
yading@10 1090 }
yading@10 1091 for (i = 0; i < f->quant_table_count; i++) {
yading@10 1092 for (k = 0; k < f->context_count[i]; k++)
yading@10 1093 for (m = 0; m < 32; m++) {
yading@10 1094 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
yading@10 1095 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
yading@10 1096 }
yading@10 1097 }
yading@10 1098 }
yading@10 1099
yading@10 1100 for (j = 0; j < 256; j++) {
yading@10 1101 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
yading@10 1102 f->rc_stat[j][0], f->rc_stat[j][1]);
yading@10 1103 p += strlen(p);
yading@10 1104 }
yading@10 1105 snprintf(p, end - p, "\n");
yading@10 1106
yading@10 1107 for (i = 0; i < f->quant_table_count; i++) {
yading@10 1108 for (j = 0; j < f->context_count[i]; j++)
yading@10 1109 for (m = 0; m < 32; m++) {
yading@10 1110 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
yading@10 1111 f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
yading@10 1112 p += strlen(p);
yading@10 1113 }
yading@10 1114 }
yading@10 1115 snprintf(p, end - p, "%d\n", f->gob_count);
yading@10 1116 } else if (avctx->flags & CODEC_FLAG_PASS1)
yading@10 1117 avctx->stats_out[0] = '\0';
yading@10 1118
yading@10 1119 f->picture_number++;
yading@10 1120 pkt->size = buf_p - pkt->data;
yading@10 1121 pkt->flags |= AV_PKT_FLAG_KEY * p->key_frame;
yading@10 1122 *got_packet = 1;
yading@10 1123
yading@10 1124 return 0;
yading@10 1125 }
yading@10 1126
yading@10 1127 #define OFFSET(x) offsetof(FFV1Context, x)
yading@10 1128 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
yading@10 1129 static const AVOption options[] = {
yading@10 1130 { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
yading@10 1131 { NULL }
yading@10 1132 };
yading@10 1133
yading@10 1134 static const AVClass class = {
yading@10 1135 .class_name = "ffv1 encoder",
yading@10 1136 .item_name = av_default_item_name,
yading@10 1137 .option = options,
yading@10 1138 .version = LIBAVUTIL_VERSION_INT,
yading@10 1139 };
yading@10 1140
yading@10 1141 static const AVCodecDefault ffv1_defaults[] = {
yading@10 1142 { "coder", "-1" },
yading@10 1143 { NULL },
yading@10 1144 };
yading@10 1145
yading@10 1146 AVCodec ff_ffv1_encoder = {
yading@10 1147 .name = "ffv1",
yading@10 1148 .type = AVMEDIA_TYPE_VIDEO,
yading@10 1149 .id = AV_CODEC_ID_FFV1,
yading@10 1150 .priv_data_size = sizeof(FFV1Context),
yading@10 1151 .init = encode_init,
yading@10 1152 .encode2 = encode_frame,
yading@10 1153 .close = ffv1_close,
yading@10 1154 .capabilities = CODEC_CAP_SLICE_THREADS,
yading@10 1155 .pix_fmts = (const enum AVPixelFormat[]) {
yading@10 1156 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV444P,
yading@10 1157 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
yading@10 1158 AV_PIX_FMT_YUV410P, AV_PIX_FMT_0RGB32, AV_PIX_FMT_RGB32, AV_PIX_FMT_YUV420P16,
yading@10 1159 AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9,
yading@10 1160 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
yading@10 1161 AV_PIX_FMT_GRAY16, AV_PIX_FMT_GRAY8, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
yading@10 1162 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
yading@10 1163 AV_PIX_FMT_NONE
yading@10 1164
yading@10 1165 },
yading@10 1166 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
yading@10 1167 .defaults = ffv1_defaults,
yading@10 1168 .priv_class = &class,
yading@10 1169 };