1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * FFV1 decoder 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * FF Video Codec 1 (a lossless codec) decoder 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 29cabdff1aSopenharmony_ci#include "libavutil/crc.h" 30cabdff1aSopenharmony_ci#include "libavutil/opt.h" 31cabdff1aSopenharmony_ci#include "libavutil/imgutils.h" 32cabdff1aSopenharmony_ci#include "libavutil/pixdesc.h" 33cabdff1aSopenharmony_ci#include "avcodec.h" 34cabdff1aSopenharmony_ci#include "codec_internal.h" 35cabdff1aSopenharmony_ci#include "get_bits.h" 36cabdff1aSopenharmony_ci#include "rangecoder.h" 37cabdff1aSopenharmony_ci#include "golomb.h" 38cabdff1aSopenharmony_ci#include "mathops.h" 39cabdff1aSopenharmony_ci#include "ffv1.h" 40cabdff1aSopenharmony_ci#include "thread.h" 41cabdff1aSopenharmony_ci#include "threadframe.h" 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_cistatic inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, 44cabdff1aSopenharmony_ci int is_signed) 45cabdff1aSopenharmony_ci{ 46cabdff1aSopenharmony_ci if (get_rac(c, state + 0)) 47cabdff1aSopenharmony_ci return 0; 48cabdff1aSopenharmony_ci else { 49cabdff1aSopenharmony_ci int i, e; 50cabdff1aSopenharmony_ci unsigned a; 51cabdff1aSopenharmony_ci e = 0; 52cabdff1aSopenharmony_ci while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10 53cabdff1aSopenharmony_ci e++; 54cabdff1aSopenharmony_ci if (e > 31) 55cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 56cabdff1aSopenharmony_ci } 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci a = 1; 59cabdff1aSopenharmony_ci for (i = e - 1; i >= 0; i--) 60cabdff1aSopenharmony_ci a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21 63cabdff1aSopenharmony_ci return (a ^ e) - e; 64cabdff1aSopenharmony_ci } 65cabdff1aSopenharmony_ci} 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_cistatic av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed) 68cabdff1aSopenharmony_ci{ 69cabdff1aSopenharmony_ci return get_symbol_inline(c, state, is_signed); 70cabdff1aSopenharmony_ci} 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_cistatic inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state, 73cabdff1aSopenharmony_ci int bits) 74cabdff1aSopenharmony_ci{ 75cabdff1aSopenharmony_ci int k, i, v, ret; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci i = state->count; 78cabdff1aSopenharmony_ci k = 0; 79cabdff1aSopenharmony_ci while (i < state->error_sum) { // FIXME: optimize 80cabdff1aSopenharmony_ci k++; 81cabdff1aSopenharmony_ci i += i; 82cabdff1aSopenharmony_ci } 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci v = get_sr_golomb(gb, k, 12, bits); 85cabdff1aSopenharmony_ci ff_dlog(NULL, "v:%d bias:%d error:%d drift:%d count:%d k:%d", 86cabdff1aSopenharmony_ci v, state->bias, state->error_sum, state->drift, state->count, k); 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci v ^= ((2 * state->drift + state->count) >> 31); 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci ret = fold(v + state->bias, bits); 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci update_vlc_state(state, v); 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci return ret; 95cabdff1aSopenharmony_ci} 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_cistatic int is_input_end(FFV1Context *s) 98cabdff1aSopenharmony_ci{ 99cabdff1aSopenharmony_ci if (s->ac != AC_GOLOMB_RICE) { 100cabdff1aSopenharmony_ci RangeCoder *const c = &s->c; 101cabdff1aSopenharmony_ci if (c->overread > MAX_OVERREAD) 102cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 103cabdff1aSopenharmony_ci } else { 104cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 1) 105cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 106cabdff1aSopenharmony_ci } 107cabdff1aSopenharmony_ci return 0; 108cabdff1aSopenharmony_ci} 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ci#define TYPE int16_t 111cabdff1aSopenharmony_ci#define RENAME(name) name 112cabdff1aSopenharmony_ci#include "ffv1dec_template.c" 113cabdff1aSopenharmony_ci#undef TYPE 114cabdff1aSopenharmony_ci#undef RENAME 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ci#define TYPE int32_t 117cabdff1aSopenharmony_ci#define RENAME(name) name ## 32 118cabdff1aSopenharmony_ci#include "ffv1dec_template.c" 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_cistatic int decode_plane(FFV1Context *s, uint8_t *src, 121cabdff1aSopenharmony_ci int w, int h, int stride, int plane_index, 122cabdff1aSopenharmony_ci int pixel_stride) 123cabdff1aSopenharmony_ci{ 124cabdff1aSopenharmony_ci int x, y; 125cabdff1aSopenharmony_ci int16_t *sample[2]; 126cabdff1aSopenharmony_ci sample[0] = s->sample_buffer + 3; 127cabdff1aSopenharmony_ci sample[1] = s->sample_buffer + w + 6 + 3; 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci s->run_index = 0; 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci memset(s->sample_buffer, 0, 2 * (w + 6) * sizeof(*s->sample_buffer)); 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci for (y = 0; y < h; y++) { 134cabdff1aSopenharmony_ci int16_t *temp = sample[0]; // FIXME: try a normal buffer 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci sample[0] = sample[1]; 137cabdff1aSopenharmony_ci sample[1] = temp; 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci sample[1][-1] = sample[0][0]; 140cabdff1aSopenharmony_ci sample[0][w] = sample[0][w - 1]; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci if (s->avctx->bits_per_raw_sample <= 8) { 143cabdff1aSopenharmony_ci int ret = decode_line(s, w, sample, plane_index, 8); 144cabdff1aSopenharmony_ci if (ret < 0) 145cabdff1aSopenharmony_ci return ret; 146cabdff1aSopenharmony_ci for (x = 0; x < w; x++) 147cabdff1aSopenharmony_ci src[x*pixel_stride + stride * y] = sample[1][x]; 148cabdff1aSopenharmony_ci } else { 149cabdff1aSopenharmony_ci int ret = decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample); 150cabdff1aSopenharmony_ci if (ret < 0) 151cabdff1aSopenharmony_ci return ret; 152cabdff1aSopenharmony_ci if (s->packed_at_lsb) { 153cabdff1aSopenharmony_ci for (x = 0; x < w; x++) { 154cabdff1aSopenharmony_ci ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x]; 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci } else { 157cabdff1aSopenharmony_ci for (x = 0; x < w; x++) { 158cabdff1aSopenharmony_ci ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x] << (16 - s->avctx->bits_per_raw_sample) | ((uint16_t **)sample)[1][x] >> (2 * s->avctx->bits_per_raw_sample - 16); 159cabdff1aSopenharmony_ci } 160cabdff1aSopenharmony_ci } 161cabdff1aSopenharmony_ci } 162cabdff1aSopenharmony_ci } 163cabdff1aSopenharmony_ci return 0; 164cabdff1aSopenharmony_ci} 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_cistatic int decode_slice_header(const FFV1Context *f, FFV1Context *fs) 167cabdff1aSopenharmony_ci{ 168cabdff1aSopenharmony_ci RangeCoder *c = &fs->c; 169cabdff1aSopenharmony_ci uint8_t state[CONTEXT_SIZE]; 170cabdff1aSopenharmony_ci unsigned ps, i, context_count; 171cabdff1aSopenharmony_ci int sx, sy, sw, sh; 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci memset(state, 128, sizeof(state)); 174cabdff1aSopenharmony_ci sx = get_symbol(c, state, 0); 175cabdff1aSopenharmony_ci sy = get_symbol(c, state, 0); 176cabdff1aSopenharmony_ci sw = get_symbol(c, state, 0) + 1U; 177cabdff1aSopenharmony_ci sh = get_symbol(c, state, 0) + 1U; 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci av_assert0(f->version > 2); 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0) 183cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 184cabdff1aSopenharmony_ci if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh) 185cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci fs->slice_x = sx * (int64_t)f->width / f->num_h_slices; 188cabdff1aSopenharmony_ci fs->slice_y = sy * (int64_t)f->height / f->num_v_slices; 189cabdff1aSopenharmony_ci fs->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - fs->slice_x; 190cabdff1aSopenharmony_ci fs->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - fs->slice_y; 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci av_assert0((unsigned)fs->slice_width <= f->width && 193cabdff1aSopenharmony_ci (unsigned)fs->slice_height <= f->height); 194cabdff1aSopenharmony_ci av_assert0 ( (unsigned)fs->slice_x + (uint64_t)fs->slice_width <= f->width 195cabdff1aSopenharmony_ci && (unsigned)fs->slice_y + (uint64_t)fs->slice_height <= f->height); 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci if (fs->ac == AC_GOLOMB_RICE && fs->slice_width >= (1<<23)) 198cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci for (i = 0; i < f->plane_count; i++) { 201cabdff1aSopenharmony_ci PlaneContext * const p = &fs->plane[i]; 202cabdff1aSopenharmony_ci int idx = get_symbol(c, state, 0); 203cabdff1aSopenharmony_ci if (idx >= (unsigned)f->quant_table_count) { 204cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n"); 205cabdff1aSopenharmony_ci return -1; 206cabdff1aSopenharmony_ci } 207cabdff1aSopenharmony_ci p->quant_table_index = idx; 208cabdff1aSopenharmony_ci memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table)); 209cabdff1aSopenharmony_ci context_count = f->context_count[idx]; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci if (p->context_count < context_count) { 212cabdff1aSopenharmony_ci av_freep(&p->state); 213cabdff1aSopenharmony_ci av_freep(&p->vlc_state); 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci p->context_count = context_count; 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci ps = get_symbol(c, state, 0); 219cabdff1aSopenharmony_ci if (ps == 1) { 220cabdff1aSopenharmony_ci f->cur->interlaced_frame = 1; 221cabdff1aSopenharmony_ci f->cur->top_field_first = 1; 222cabdff1aSopenharmony_ci } else if (ps == 2) { 223cabdff1aSopenharmony_ci f->cur->interlaced_frame = 1; 224cabdff1aSopenharmony_ci f->cur->top_field_first = 0; 225cabdff1aSopenharmony_ci } else if (ps == 3) { 226cabdff1aSopenharmony_ci f->cur->interlaced_frame = 0; 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio.num = get_symbol(c, state, 0); 229cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio.den = get_symbol(c, state, 0); 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci if (av_image_check_sar(f->width, f->height, 232cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio) < 0) { 233cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n", 234cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio.num, 235cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio.den); 236cabdff1aSopenharmony_ci f->cur->sample_aspect_ratio = (AVRational){ 0, 1 }; 237cabdff1aSopenharmony_ci } 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci if (fs->version > 3) { 240cabdff1aSopenharmony_ci fs->slice_reset_contexts = get_rac(c, state); 241cabdff1aSopenharmony_ci fs->slice_coding_mode = get_symbol(c, state, 0); 242cabdff1aSopenharmony_ci if (fs->slice_coding_mode != 1) { 243cabdff1aSopenharmony_ci fs->slice_rct_by_coef = get_symbol(c, state, 0); 244cabdff1aSopenharmony_ci fs->slice_rct_ry_coef = get_symbol(c, state, 0); 245cabdff1aSopenharmony_ci if ((uint64_t)fs->slice_rct_by_coef + (uint64_t)fs->slice_rct_ry_coef > 4) { 246cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n"); 247cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 248cabdff1aSopenharmony_ci } 249cabdff1aSopenharmony_ci } 250cabdff1aSopenharmony_ci } 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci return 0; 253cabdff1aSopenharmony_ci} 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_cistatic int decode_slice(AVCodecContext *c, void *arg) 256cabdff1aSopenharmony_ci{ 257cabdff1aSopenharmony_ci FFV1Context *fs = *(void **)arg; 258cabdff1aSopenharmony_ci FFV1Context *f = fs->avctx->priv_data; 259cabdff1aSopenharmony_ci int width, height, x, y, ret; 260cabdff1aSopenharmony_ci const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step; 261cabdff1aSopenharmony_ci AVFrame * const p = f->cur; 262cabdff1aSopenharmony_ci int i, si; 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci for( si=0; fs != f->slice_context[si]; si ++) 265cabdff1aSopenharmony_ci ; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci if(f->fsrc && !p->key_frame) 268cabdff1aSopenharmony_ci ff_thread_await_progress(&f->last_picture, si, 0); 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci if(f->fsrc && !p->key_frame) { 271cabdff1aSopenharmony_ci FFV1Context *fssrc = f->fsrc->slice_context[si]; 272cabdff1aSopenharmony_ci FFV1Context *fsdst = f->slice_context[si]; 273cabdff1aSopenharmony_ci av_assert1(fsdst->plane_count == fssrc->plane_count); 274cabdff1aSopenharmony_ci av_assert1(fsdst == fs); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci if (!p->key_frame) 277cabdff1aSopenharmony_ci fsdst->slice_damaged |= fssrc->slice_damaged; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci for (i = 0; i < f->plane_count; i++) { 280cabdff1aSopenharmony_ci PlaneContext *psrc = &fssrc->plane[i]; 281cabdff1aSopenharmony_ci PlaneContext *pdst = &fsdst->plane[i]; 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci av_free(pdst->state); 284cabdff1aSopenharmony_ci av_free(pdst->vlc_state); 285cabdff1aSopenharmony_ci memcpy(pdst, psrc, sizeof(*pdst)); 286cabdff1aSopenharmony_ci pdst->state = NULL; 287cabdff1aSopenharmony_ci pdst->vlc_state = NULL; 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci if (fssrc->ac) { 290cabdff1aSopenharmony_ci pdst->state = av_malloc_array(CONTEXT_SIZE, psrc->context_count); 291cabdff1aSopenharmony_ci memcpy(pdst->state, psrc->state, CONTEXT_SIZE * psrc->context_count); 292cabdff1aSopenharmony_ci } else { 293cabdff1aSopenharmony_ci pdst->vlc_state = av_malloc_array(sizeof(*pdst->vlc_state), psrc->context_count); 294cabdff1aSopenharmony_ci memcpy(pdst->vlc_state, psrc->vlc_state, sizeof(*pdst->vlc_state) * psrc->context_count); 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci } 297cabdff1aSopenharmony_ci } 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci fs->slice_rct_by_coef = 1; 300cabdff1aSopenharmony_ci fs->slice_rct_ry_coef = 1; 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci if (f->version > 2) { 303cabdff1aSopenharmony_ci if (ff_ffv1_init_slice_state(f, fs) < 0) 304cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 305cabdff1aSopenharmony_ci if (decode_slice_header(f, fs) < 0) { 306cabdff1aSopenharmony_ci fs->slice_x = fs->slice_y = fs->slice_height = fs->slice_width = 0; 307cabdff1aSopenharmony_ci fs->slice_damaged = 1; 308cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci if ((ret = ff_ffv1_init_slice_state(f, fs)) < 0) 312cabdff1aSopenharmony_ci return ret; 313cabdff1aSopenharmony_ci if (f->cur->key_frame || fs->slice_reset_contexts) { 314cabdff1aSopenharmony_ci ff_ffv1_clear_slice_state(f, fs); 315cabdff1aSopenharmony_ci } else if (fs->slice_damaged) { 316cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci width = fs->slice_width; 320cabdff1aSopenharmony_ci height = fs->slice_height; 321cabdff1aSopenharmony_ci x = fs->slice_x; 322cabdff1aSopenharmony_ci y = fs->slice_y; 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci if (fs->ac == AC_GOLOMB_RICE) { 325cabdff1aSopenharmony_ci if (f->version == 3 && f->micro_version > 1 || f->version > 3) 326cabdff1aSopenharmony_ci get_rac(&fs->c, (uint8_t[]) { 129 }); 327cabdff1aSopenharmony_ci fs->ac_byte_count = f->version > 2 || (!x && !y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0; 328cabdff1aSopenharmony_ci init_get_bits(&fs->gb, 329cabdff1aSopenharmony_ci fs->c.bytestream_start + fs->ac_byte_count, 330cabdff1aSopenharmony_ci (fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count) * 8); 331cabdff1aSopenharmony_ci } 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci av_assert1(width && height); 334cabdff1aSopenharmony_ci if (f->colorspace == 0 && (f->chroma_planes || !fs->transparency)) { 335cabdff1aSopenharmony_ci const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift); 336cabdff1aSopenharmony_ci const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift); 337cabdff1aSopenharmony_ci const int cx = x >> f->chroma_h_shift; 338cabdff1aSopenharmony_ci const int cy = y >> f->chroma_v_shift; 339cabdff1aSopenharmony_ci decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci if (f->chroma_planes) { 342cabdff1aSopenharmony_ci decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1); 343cabdff1aSopenharmony_ci decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1); 344cabdff1aSopenharmony_ci } 345cabdff1aSopenharmony_ci if (fs->transparency) 346cabdff1aSopenharmony_ci decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2, 1); 347cabdff1aSopenharmony_ci } else if (f->colorspace == 0) { 348cabdff1aSopenharmony_ci decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 2); 349cabdff1aSopenharmony_ci decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0] + 1, width, height, p->linesize[0], 1, 2); 350cabdff1aSopenharmony_ci } else if (f->use32bit) { 351cabdff1aSopenharmony_ci uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0], 352cabdff1aSopenharmony_ci p->data[1] + ps * x + y * p->linesize[1], 353cabdff1aSopenharmony_ci p->data[2] + ps * x + y * p->linesize[2], 354cabdff1aSopenharmony_ci p->data[3] + ps * x + y * p->linesize[3] }; 355cabdff1aSopenharmony_ci decode_rgb_frame32(fs, planes, width, height, p->linesize); 356cabdff1aSopenharmony_ci } else { 357cabdff1aSopenharmony_ci uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0], 358cabdff1aSopenharmony_ci p->data[1] + ps * x + y * p->linesize[1], 359cabdff1aSopenharmony_ci p->data[2] + ps * x + y * p->linesize[2], 360cabdff1aSopenharmony_ci p->data[3] + ps * x + y * p->linesize[3] }; 361cabdff1aSopenharmony_ci decode_rgb_frame(fs, planes, width, height, p->linesize); 362cabdff1aSopenharmony_ci } 363cabdff1aSopenharmony_ci if (fs->ac != AC_GOLOMB_RICE && f->version > 2) { 364cabdff1aSopenharmony_ci int v; 365cabdff1aSopenharmony_ci get_rac(&fs->c, (uint8_t[]) { 129 }); 366cabdff1aSopenharmony_ci v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5*f->ec; 367cabdff1aSopenharmony_ci if (v) { 368cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v); 369cabdff1aSopenharmony_ci fs->slice_damaged = 1; 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci emms_c(); 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci ff_thread_report_progress(&f->picture, si, 0); 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci return 0; 378cabdff1aSopenharmony_ci} 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_cistatic int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale) 381cabdff1aSopenharmony_ci{ 382cabdff1aSopenharmony_ci int v; 383cabdff1aSopenharmony_ci int i = 0; 384cabdff1aSopenharmony_ci uint8_t state[CONTEXT_SIZE]; 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci memset(state, 128, sizeof(state)); 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci for (v = 0; i < 128; v++) { 389cabdff1aSopenharmony_ci unsigned len = get_symbol(c, state, 0) + 1U; 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci if (len > 128 - i || !len) 392cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 393cabdff1aSopenharmony_ci 394cabdff1aSopenharmony_ci while (len--) { 395cabdff1aSopenharmony_ci quant_table[i] = scale * v; 396cabdff1aSopenharmony_ci i++; 397cabdff1aSopenharmony_ci } 398cabdff1aSopenharmony_ci } 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci for (i = 1; i < 128; i++) 401cabdff1aSopenharmony_ci quant_table[256 - i] = -quant_table[i]; 402cabdff1aSopenharmony_ci quant_table[128] = -quant_table[127]; 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci return 2 * v - 1; 405cabdff1aSopenharmony_ci} 406cabdff1aSopenharmony_ci 407cabdff1aSopenharmony_cistatic int read_quant_tables(RangeCoder *c, 408cabdff1aSopenharmony_ci int16_t quant_table[MAX_CONTEXT_INPUTS][256]) 409cabdff1aSopenharmony_ci{ 410cabdff1aSopenharmony_ci int i; 411cabdff1aSopenharmony_ci int context_count = 1; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci for (i = 0; i < 5; i++) { 414cabdff1aSopenharmony_ci int ret = read_quant_table(c, quant_table[i], context_count); 415cabdff1aSopenharmony_ci if (ret < 0) 416cabdff1aSopenharmony_ci return ret; 417cabdff1aSopenharmony_ci context_count *= ret; 418cabdff1aSopenharmony_ci if (context_count > 32768U) { 419cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 420cabdff1aSopenharmony_ci } 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci return (context_count + 1) / 2; 423cabdff1aSopenharmony_ci} 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_cistatic int read_extra_header(FFV1Context *f) 426cabdff1aSopenharmony_ci{ 427cabdff1aSopenharmony_ci RangeCoder *const c = &f->c; 428cabdff1aSopenharmony_ci uint8_t state[CONTEXT_SIZE]; 429cabdff1aSopenharmony_ci int i, j, k, ret; 430cabdff1aSopenharmony_ci uint8_t state2[32][CONTEXT_SIZE]; 431cabdff1aSopenharmony_ci unsigned crc = 0; 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_ci memset(state2, 128, sizeof(state2)); 434cabdff1aSopenharmony_ci memset(state, 128, sizeof(state)); 435cabdff1aSopenharmony_ci 436cabdff1aSopenharmony_ci ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size); 437cabdff1aSopenharmony_ci ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8); 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_ci f->version = get_symbol(c, state, 0); 440cabdff1aSopenharmony_ci if (f->version < 2) { 441cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "Invalid version in global header\n"); 442cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 443cabdff1aSopenharmony_ci } 444cabdff1aSopenharmony_ci if (f->version > 2) { 445cabdff1aSopenharmony_ci c->bytestream_end -= 4; 446cabdff1aSopenharmony_ci f->micro_version = get_symbol(c, state, 0); 447cabdff1aSopenharmony_ci if (f->micro_version < 0) 448cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 449cabdff1aSopenharmony_ci } 450cabdff1aSopenharmony_ci f->ac = get_symbol(c, state, 0); 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ci if (f->ac == AC_RANGE_CUSTOM_TAB) { 453cabdff1aSopenharmony_ci for (i = 1; i < 256; i++) 454cabdff1aSopenharmony_ci f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i]; 455cabdff1aSopenharmony_ci } 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_ci f->colorspace = get_symbol(c, state, 0); //YUV cs type 458cabdff1aSopenharmony_ci f->avctx->bits_per_raw_sample = get_symbol(c, state, 0); 459cabdff1aSopenharmony_ci f->chroma_planes = get_rac(c, state); 460cabdff1aSopenharmony_ci f->chroma_h_shift = get_symbol(c, state, 0); 461cabdff1aSopenharmony_ci f->chroma_v_shift = get_symbol(c, state, 0); 462cabdff1aSopenharmony_ci f->transparency = get_rac(c, state); 463cabdff1aSopenharmony_ci f->plane_count = 1 + (f->chroma_planes || f->version<4) + f->transparency; 464cabdff1aSopenharmony_ci f->num_h_slices = 1 + get_symbol(c, state, 0); 465cabdff1aSopenharmony_ci f->num_v_slices = 1 + get_symbol(c, state, 0); 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ci if (f->chroma_h_shift > 4U || f->chroma_v_shift > 4U) { 468cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "chroma shift parameters %d %d are invalid\n", 469cabdff1aSopenharmony_ci f->chroma_h_shift, f->chroma_v_shift); 470cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_ci if (f->num_h_slices > (unsigned)f->width || !f->num_h_slices || 474cabdff1aSopenharmony_ci f->num_v_slices > (unsigned)f->height || !f->num_v_slices 475cabdff1aSopenharmony_ci ) { 476cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "slice count invalid\n"); 477cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 478cabdff1aSopenharmony_ci } 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci if (f->num_h_slices > MAX_SLICES / f->num_v_slices) { 481cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "slice count unsupported\n"); 482cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 483cabdff1aSopenharmony_ci } 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_ci f->quant_table_count = get_symbol(c, state, 0); 486cabdff1aSopenharmony_ci if (f->quant_table_count > (unsigned)MAX_QUANT_TABLES || !f->quant_table_count) { 487cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "quant table count %d is invalid\n", f->quant_table_count); 488cabdff1aSopenharmony_ci f->quant_table_count = 0; 489cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 490cabdff1aSopenharmony_ci } 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci for (i = 0; i < f->quant_table_count; i++) { 493cabdff1aSopenharmony_ci f->context_count[i] = read_quant_tables(c, f->quant_tables[i]); 494cabdff1aSopenharmony_ci if (f->context_count[i] < 0) { 495cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n"); 496cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci } 499cabdff1aSopenharmony_ci if ((ret = ff_ffv1_allocate_initial_states(f)) < 0) 500cabdff1aSopenharmony_ci return ret; 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci for (i = 0; i < f->quant_table_count; i++) 503cabdff1aSopenharmony_ci if (get_rac(c, state)) { 504cabdff1aSopenharmony_ci for (j = 0; j < f->context_count[i]; j++) 505cabdff1aSopenharmony_ci for (k = 0; k < CONTEXT_SIZE; k++) { 506cabdff1aSopenharmony_ci int pred = j ? f->initial_states[i][j - 1][k] : 128; 507cabdff1aSopenharmony_ci f->initial_states[i][j][k] = 508cabdff1aSopenharmony_ci (pred + get_symbol(c, state2[k], 1)) & 0xFF; 509cabdff1aSopenharmony_ci } 510cabdff1aSopenharmony_ci } 511cabdff1aSopenharmony_ci 512cabdff1aSopenharmony_ci if (f->version > 2) { 513cabdff1aSopenharmony_ci f->ec = get_symbol(c, state, 0); 514cabdff1aSopenharmony_ci if (f->micro_version > 2) 515cabdff1aSopenharmony_ci f->intra = get_symbol(c, state, 0); 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci if (f->version > 2) { 519cabdff1aSopenharmony_ci unsigned v; 520cabdff1aSopenharmony_ci v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, 521cabdff1aSopenharmony_ci f->avctx->extradata, f->avctx->extradata_size); 522cabdff1aSopenharmony_ci if (v || f->avctx->extradata_size < 4) { 523cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!\n", v); 524cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 525cabdff1aSopenharmony_ci } 526cabdff1aSopenharmony_ci crc = AV_RB32(f->avctx->extradata + f->avctx->extradata_size - 4); 527cabdff1aSopenharmony_ci } 528cabdff1aSopenharmony_ci 529cabdff1aSopenharmony_ci if (f->avctx->debug & FF_DEBUG_PICT_INFO) 530cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_DEBUG, 531cabdff1aSopenharmony_ci "global: ver:%d.%d, coder:%d, colorspace: %d bpr:%d chroma:%d(%d:%d), alpha:%d slices:%dx%d qtabs:%d ec:%d intra:%d CRC:0x%08X\n", 532cabdff1aSopenharmony_ci f->version, f->micro_version, 533cabdff1aSopenharmony_ci f->ac, 534cabdff1aSopenharmony_ci f->colorspace, 535cabdff1aSopenharmony_ci f->avctx->bits_per_raw_sample, 536cabdff1aSopenharmony_ci f->chroma_planes, f->chroma_h_shift, f->chroma_v_shift, 537cabdff1aSopenharmony_ci f->transparency, 538cabdff1aSopenharmony_ci f->num_h_slices, f->num_v_slices, 539cabdff1aSopenharmony_ci f->quant_table_count, 540cabdff1aSopenharmony_ci f->ec, 541cabdff1aSopenharmony_ci f->intra, 542cabdff1aSopenharmony_ci crc 543cabdff1aSopenharmony_ci ); 544cabdff1aSopenharmony_ci return 0; 545cabdff1aSopenharmony_ci} 546cabdff1aSopenharmony_ci 547cabdff1aSopenharmony_cistatic int read_header(FFV1Context *f) 548cabdff1aSopenharmony_ci{ 549cabdff1aSopenharmony_ci uint8_t state[CONTEXT_SIZE]; 550cabdff1aSopenharmony_ci int i, j, context_count = -1; //-1 to avoid warning 551cabdff1aSopenharmony_ci RangeCoder *const c = &f->slice_context[0]->c; 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_ci memset(state, 128, sizeof(state)); 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci if (f->version < 2) { 556cabdff1aSopenharmony_ci int chroma_planes, chroma_h_shift, chroma_v_shift, transparency, colorspace, bits_per_raw_sample; 557cabdff1aSopenharmony_ci unsigned v= get_symbol(c, state, 0); 558cabdff1aSopenharmony_ci if (v >= 2) { 559cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "invalid version %d in ver01 header\n", v); 560cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci f->version = v; 563cabdff1aSopenharmony_ci f->ac = get_symbol(c, state, 0); 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_ci if (f->ac == AC_RANGE_CUSTOM_TAB) { 566cabdff1aSopenharmony_ci for (i = 1; i < 256; i++) { 567cabdff1aSopenharmony_ci int st = get_symbol(c, state, 1) + c->one_state[i]; 568cabdff1aSopenharmony_ci if (st < 1 || st > 255) { 569cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "invalid state transition %d\n", st); 570cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 571cabdff1aSopenharmony_ci } 572cabdff1aSopenharmony_ci f->state_transition[i] = st; 573cabdff1aSopenharmony_ci } 574cabdff1aSopenharmony_ci } 575cabdff1aSopenharmony_ci 576cabdff1aSopenharmony_ci colorspace = get_symbol(c, state, 0); //YUV cs type 577cabdff1aSopenharmony_ci bits_per_raw_sample = f->version > 0 ? get_symbol(c, state, 0) : f->avctx->bits_per_raw_sample; 578cabdff1aSopenharmony_ci chroma_planes = get_rac(c, state); 579cabdff1aSopenharmony_ci chroma_h_shift = get_symbol(c, state, 0); 580cabdff1aSopenharmony_ci chroma_v_shift = get_symbol(c, state, 0); 581cabdff1aSopenharmony_ci transparency = get_rac(c, state); 582cabdff1aSopenharmony_ci if (colorspace == 0 && f->avctx->skip_alpha) 583cabdff1aSopenharmony_ci transparency = 0; 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci if (f->plane_count) { 586cabdff1aSopenharmony_ci if (colorspace != f->colorspace || 587cabdff1aSopenharmony_ci bits_per_raw_sample != f->avctx->bits_per_raw_sample || 588cabdff1aSopenharmony_ci chroma_planes != f->chroma_planes || 589cabdff1aSopenharmony_ci chroma_h_shift != f->chroma_h_shift || 590cabdff1aSopenharmony_ci chroma_v_shift != f->chroma_v_shift || 591cabdff1aSopenharmony_ci transparency != f->transparency) { 592cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "Invalid change of global parameters\n"); 593cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 594cabdff1aSopenharmony_ci } 595cabdff1aSopenharmony_ci } 596cabdff1aSopenharmony_ci 597cabdff1aSopenharmony_ci if (chroma_h_shift > 4U || chroma_v_shift > 4U) { 598cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "chroma shift parameters %d %d are invalid\n", 599cabdff1aSopenharmony_ci chroma_h_shift, chroma_v_shift); 600cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 601cabdff1aSopenharmony_ci } 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ci f->colorspace = colorspace; 604cabdff1aSopenharmony_ci f->avctx->bits_per_raw_sample = bits_per_raw_sample; 605cabdff1aSopenharmony_ci f->chroma_planes = chroma_planes; 606cabdff1aSopenharmony_ci f->chroma_h_shift = chroma_h_shift; 607cabdff1aSopenharmony_ci f->chroma_v_shift = chroma_v_shift; 608cabdff1aSopenharmony_ci f->transparency = transparency; 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_ci f->plane_count = 2 + f->transparency; 611cabdff1aSopenharmony_ci } 612cabdff1aSopenharmony_ci 613cabdff1aSopenharmony_ci if (f->colorspace == 0) { 614cabdff1aSopenharmony_ci if (!f->transparency && !f->chroma_planes) { 615cabdff1aSopenharmony_ci if (f->avctx->bits_per_raw_sample <= 8) 616cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY8; 617cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 9) { 618cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 619cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY9; 620cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 10) { 621cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 622cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY10; 623cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 12) { 624cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 625cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY12; 626cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 16) { 627cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 628cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY16; 629cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample < 16) { 630cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GRAY16; 631cabdff1aSopenharmony_ci } else 632cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 633cabdff1aSopenharmony_ci } else if (f->transparency && !f->chroma_planes) { 634cabdff1aSopenharmony_ci if (f->avctx->bits_per_raw_sample <= 8) 635cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_YA8; 636cabdff1aSopenharmony_ci else 637cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 638cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample<=8 && !f->transparency) { 639cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 640cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P; break; 641cabdff1aSopenharmony_ci case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P; break; 642cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P; break; 643cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P; break; 644cabdff1aSopenharmony_ci case 0x20: f->avctx->pix_fmt = AV_PIX_FMT_YUV411P; break; 645cabdff1aSopenharmony_ci case 0x22: f->avctx->pix_fmt = AV_PIX_FMT_YUV410P; break; 646cabdff1aSopenharmony_ci } 647cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample <= 8 && f->transparency) { 648cabdff1aSopenharmony_ci switch(16*f->chroma_h_shift + f->chroma_v_shift) { 649cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P; break; 650cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P; break; 651cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P; break; 652cabdff1aSopenharmony_ci } 653cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 9 && !f->transparency) { 654cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 655cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 656cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P9; break; 657cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P9; break; 658cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P9; break; 659cabdff1aSopenharmony_ci } 660cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 9 && f->transparency) { 661cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 662cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 663cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P9; break; 664cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P9; break; 665cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P9; break; 666cabdff1aSopenharmony_ci } 667cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 10 && !f->transparency) { 668cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 669cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 670cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P10; break; 671cabdff1aSopenharmony_ci case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P10; break; 672cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P10; break; 673cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P10; break; 674cabdff1aSopenharmony_ci } 675cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 10 && f->transparency) { 676cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 677cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 678cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P10; break; 679cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P10; break; 680cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P10; break; 681cabdff1aSopenharmony_ci } 682cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 12 && !f->transparency) { 683cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 684cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 685cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P12; break; 686cabdff1aSopenharmony_ci case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P12; break; 687cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P12; break; 688cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P12; break; 689cabdff1aSopenharmony_ci } 690cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 14 && !f->transparency) { 691cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 692cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 693cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P14; break; 694cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P14; break; 695cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P14; break; 696cabdff1aSopenharmony_ci } 697cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency){ 698cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 699cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 700cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P16; break; 701cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P16; break; 702cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P16; break; 703cabdff1aSopenharmony_ci } 704cabdff1aSopenharmony_ci } else if (f->avctx->bits_per_raw_sample == 16 && f->transparency){ 705cabdff1aSopenharmony_ci f->packed_at_lsb = 1; 706cabdff1aSopenharmony_ci switch(16 * f->chroma_h_shift + f->chroma_v_shift) { 707cabdff1aSopenharmony_ci case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P16; break; 708cabdff1aSopenharmony_ci case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P16; break; 709cabdff1aSopenharmony_ci case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16; break; 710cabdff1aSopenharmony_ci } 711cabdff1aSopenharmony_ci } 712cabdff1aSopenharmony_ci } else if (f->colorspace == 1) { 713cabdff1aSopenharmony_ci if (f->chroma_h_shift || f->chroma_v_shift) { 714cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, 715cabdff1aSopenharmony_ci "chroma subsampling not supported in this colorspace\n"); 716cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 717cabdff1aSopenharmony_ci } 718cabdff1aSopenharmony_ci if ( f->avctx->bits_per_raw_sample <= 8 && !f->transparency) 719cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_0RGB32; 720cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample <= 8 && f->transparency) 721cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_RGB32; 722cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 9 && !f->transparency) 723cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRP9; 724cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 10 && !f->transparency) 725cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRP10; 726cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 10 && f->transparency) 727cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRAP10; 728cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 12 && !f->transparency) 729cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRP12; 730cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 12 && f->transparency) 731cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRAP12; 732cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 14 && !f->transparency) 733cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRP14; 734cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency) { 735cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRP16; 736cabdff1aSopenharmony_ci f->use32bit = 1; 737cabdff1aSopenharmony_ci } 738cabdff1aSopenharmony_ci else if (f->avctx->bits_per_raw_sample == 16 && f->transparency) { 739cabdff1aSopenharmony_ci f->avctx->pix_fmt = AV_PIX_FMT_GBRAP16; 740cabdff1aSopenharmony_ci f->use32bit = 1; 741cabdff1aSopenharmony_ci } 742cabdff1aSopenharmony_ci } else { 743cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n"); 744cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 745cabdff1aSopenharmony_ci } 746cabdff1aSopenharmony_ci if (f->avctx->pix_fmt == AV_PIX_FMT_NONE) { 747cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "format not supported\n"); 748cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 749cabdff1aSopenharmony_ci } 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_ci ff_dlog(f->avctx, "%d %d %d\n", 752cabdff1aSopenharmony_ci f->chroma_h_shift, f->chroma_v_shift, f->avctx->pix_fmt); 753cabdff1aSopenharmony_ci if (f->version < 2) { 754cabdff1aSopenharmony_ci context_count = read_quant_tables(c, f->quant_table); 755cabdff1aSopenharmony_ci if (context_count < 0) { 756cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n"); 757cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci f->slice_count = f->max_slice_count; 760cabdff1aSopenharmony_ci } else if (f->version < 3) { 761cabdff1aSopenharmony_ci f->slice_count = get_symbol(c, state, 0); 762cabdff1aSopenharmony_ci } else { 763cabdff1aSopenharmony_ci const uint8_t *p = c->bytestream_end; 764cabdff1aSopenharmony_ci for (f->slice_count = 0; 765cabdff1aSopenharmony_ci f->slice_count < MAX_SLICES && 3 + 5*!!f->ec < p - c->bytestream_start; 766cabdff1aSopenharmony_ci f->slice_count++) { 767cabdff1aSopenharmony_ci int trailer = 3 + 5*!!f->ec; 768cabdff1aSopenharmony_ci int size = AV_RB24(p-trailer); 769cabdff1aSopenharmony_ci if (size + trailer > p - c->bytestream_start) 770cabdff1aSopenharmony_ci break; 771cabdff1aSopenharmony_ci p -= size + trailer; 772cabdff1aSopenharmony_ci } 773cabdff1aSopenharmony_ci } 774cabdff1aSopenharmony_ci if (f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0 || f->slice_count > f->max_slice_count) { 775cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid (max=%d)\n", f->slice_count, f->max_slice_count); 776cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 777cabdff1aSopenharmony_ci } 778cabdff1aSopenharmony_ci 779cabdff1aSopenharmony_ci for (j = 0; j < f->slice_count; j++) { 780cabdff1aSopenharmony_ci FFV1Context *fs = f->slice_context[j]; 781cabdff1aSopenharmony_ci fs->ac = f->ac; 782cabdff1aSopenharmony_ci fs->packed_at_lsb = f->packed_at_lsb; 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci fs->slice_damaged = 0; 785cabdff1aSopenharmony_ci 786cabdff1aSopenharmony_ci if (f->version == 2) { 787cabdff1aSopenharmony_ci int sx = get_symbol(c, state, 0); 788cabdff1aSopenharmony_ci int sy = get_symbol(c, state, 0); 789cabdff1aSopenharmony_ci int sw = get_symbol(c, state, 0) + 1U; 790cabdff1aSopenharmony_ci int sh = get_symbol(c, state, 0) + 1U; 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0) 793cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 794cabdff1aSopenharmony_ci if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh) 795cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 796cabdff1aSopenharmony_ci 797cabdff1aSopenharmony_ci fs->slice_x = sx * (int64_t)f->width / f->num_h_slices; 798cabdff1aSopenharmony_ci fs->slice_y = sy * (int64_t)f->height / f->num_v_slices; 799cabdff1aSopenharmony_ci fs->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - fs->slice_x; 800cabdff1aSopenharmony_ci fs->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - fs->slice_y; 801cabdff1aSopenharmony_ci 802cabdff1aSopenharmony_ci av_assert0((unsigned)fs->slice_width <= f->width && 803cabdff1aSopenharmony_ci (unsigned)fs->slice_height <= f->height); 804cabdff1aSopenharmony_ci av_assert0 ( (unsigned)fs->slice_x + (uint64_t)fs->slice_width <= f->width 805cabdff1aSopenharmony_ci && (unsigned)fs->slice_y + (uint64_t)fs->slice_height <= f->height); 806cabdff1aSopenharmony_ci } 807cabdff1aSopenharmony_ci 808cabdff1aSopenharmony_ci for (i = 0; i < f->plane_count; i++) { 809cabdff1aSopenharmony_ci PlaneContext *const p = &fs->plane[i]; 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci if (f->version == 2) { 812cabdff1aSopenharmony_ci int idx = get_symbol(c, state, 0); 813cabdff1aSopenharmony_ci if (idx >= (unsigned)f->quant_table_count) { 814cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, 815cabdff1aSopenharmony_ci "quant_table_index out of range\n"); 816cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 817cabdff1aSopenharmony_ci } 818cabdff1aSopenharmony_ci p->quant_table_index = idx; 819cabdff1aSopenharmony_ci memcpy(p->quant_table, f->quant_tables[idx], 820cabdff1aSopenharmony_ci sizeof(p->quant_table)); 821cabdff1aSopenharmony_ci context_count = f->context_count[idx]; 822cabdff1aSopenharmony_ci } else { 823cabdff1aSopenharmony_ci memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table)); 824cabdff1aSopenharmony_ci } 825cabdff1aSopenharmony_ci 826cabdff1aSopenharmony_ci if (f->version <= 2) { 827cabdff1aSopenharmony_ci av_assert0(context_count >= 0); 828cabdff1aSopenharmony_ci if (p->context_count < context_count) { 829cabdff1aSopenharmony_ci av_freep(&p->state); 830cabdff1aSopenharmony_ci av_freep(&p->vlc_state); 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci p->context_count = context_count; 833cabdff1aSopenharmony_ci } 834cabdff1aSopenharmony_ci } 835cabdff1aSopenharmony_ci } 836cabdff1aSopenharmony_ci return 0; 837cabdff1aSopenharmony_ci} 838cabdff1aSopenharmony_ci 839cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx) 840cabdff1aSopenharmony_ci{ 841cabdff1aSopenharmony_ci FFV1Context *f = avctx->priv_data; 842cabdff1aSopenharmony_ci int ret; 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci if ((ret = ff_ffv1_common_init(avctx)) < 0) 845cabdff1aSopenharmony_ci return ret; 846cabdff1aSopenharmony_ci 847cabdff1aSopenharmony_ci if (avctx->extradata_size > 0 && (ret = read_extra_header(f)) < 0) 848cabdff1aSopenharmony_ci return ret; 849cabdff1aSopenharmony_ci 850cabdff1aSopenharmony_ci if ((ret = ff_ffv1_init_slice_contexts(f)) < 0) 851cabdff1aSopenharmony_ci return ret; 852cabdff1aSopenharmony_ci 853cabdff1aSopenharmony_ci return 0; 854cabdff1aSopenharmony_ci} 855cabdff1aSopenharmony_ci 856cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *rframe, 857cabdff1aSopenharmony_ci int *got_frame, AVPacket *avpkt) 858cabdff1aSopenharmony_ci{ 859cabdff1aSopenharmony_ci uint8_t *buf = avpkt->data; 860cabdff1aSopenharmony_ci int buf_size = avpkt->size; 861cabdff1aSopenharmony_ci FFV1Context *f = avctx->priv_data; 862cabdff1aSopenharmony_ci RangeCoder *const c = &f->slice_context[0]->c; 863cabdff1aSopenharmony_ci int i, ret; 864cabdff1aSopenharmony_ci uint8_t keystate = 128; 865cabdff1aSopenharmony_ci uint8_t *buf_p; 866cabdff1aSopenharmony_ci AVFrame *p; 867cabdff1aSopenharmony_ci 868cabdff1aSopenharmony_ci if (f->last_picture.f) 869cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(avctx, &f->last_picture); 870cabdff1aSopenharmony_ci FFSWAP(ThreadFrame, f->picture, f->last_picture); 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_ci f->cur = p = f->picture.f; 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_ci if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) { 875cabdff1aSopenharmony_ci /* we have interlaced material flagged in container */ 876cabdff1aSopenharmony_ci p->interlaced_frame = 1; 877cabdff1aSopenharmony_ci if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB) 878cabdff1aSopenharmony_ci p->top_field_first = 1; 879cabdff1aSopenharmony_ci } 880cabdff1aSopenharmony_ci 881cabdff1aSopenharmony_ci f->avctx = avctx; 882cabdff1aSopenharmony_ci ff_init_range_decoder(c, buf, buf_size); 883cabdff1aSopenharmony_ci ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8); 884cabdff1aSopenharmony_ci 885cabdff1aSopenharmony_ci p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P 886cabdff1aSopenharmony_ci if (get_rac(c, &keystate)) { 887cabdff1aSopenharmony_ci p->key_frame = 1; 888cabdff1aSopenharmony_ci f->key_frame_ok = 0; 889cabdff1aSopenharmony_ci if ((ret = read_header(f)) < 0) 890cabdff1aSopenharmony_ci return ret; 891cabdff1aSopenharmony_ci f->key_frame_ok = 1; 892cabdff1aSopenharmony_ci } else { 893cabdff1aSopenharmony_ci if (!f->key_frame_ok) { 894cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 895cabdff1aSopenharmony_ci "Cannot decode non-keyframe without valid keyframe\n"); 896cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 897cabdff1aSopenharmony_ci } 898cabdff1aSopenharmony_ci p->key_frame = 0; 899cabdff1aSopenharmony_ci } 900cabdff1aSopenharmony_ci 901cabdff1aSopenharmony_ci if (f->ac != AC_GOLOMB_RICE) { 902cabdff1aSopenharmony_ci if (buf_size < avctx->width * avctx->height / (128*8)) 903cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 904cabdff1aSopenharmony_ci } else { 905cabdff1aSopenharmony_ci int w = avctx->width; 906cabdff1aSopenharmony_ci int s = 1 + w / (1<<23); 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci w /= s; 909cabdff1aSopenharmony_ci 910cabdff1aSopenharmony_ci for (i = 0; w > (1<<ff_log2_run[i]); i++) 911cabdff1aSopenharmony_ci w -= ff_log2_run[i]; 912cabdff1aSopenharmony_ci if (buf_size < (avctx->height + i + 6) / 8 * s) 913cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 914cabdff1aSopenharmony_ci } 915cabdff1aSopenharmony_ci 916cabdff1aSopenharmony_ci ret = ff_thread_get_ext_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF); 917cabdff1aSopenharmony_ci if (ret < 0) 918cabdff1aSopenharmony_ci return ret; 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_PICT_INFO) 921cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n", 922cabdff1aSopenharmony_ci f->version, p->key_frame, f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample); 923cabdff1aSopenharmony_ci 924cabdff1aSopenharmony_ci ff_thread_finish_setup(avctx); 925cabdff1aSopenharmony_ci 926cabdff1aSopenharmony_ci buf_p = buf + buf_size; 927cabdff1aSopenharmony_ci for (i = f->slice_count - 1; i >= 0; i--) { 928cabdff1aSopenharmony_ci FFV1Context *fs = f->slice_context[i]; 929cabdff1aSopenharmony_ci int trailer = 3 + 5*!!f->ec; 930cabdff1aSopenharmony_ci int v; 931cabdff1aSopenharmony_ci 932cabdff1aSopenharmony_ci if (i || f->version > 2) { 933cabdff1aSopenharmony_ci if (trailer > buf_p - buf) v = INT_MAX; 934cabdff1aSopenharmony_ci else v = AV_RB24(buf_p-trailer) + trailer; 935cabdff1aSopenharmony_ci } else v = buf_p - c->bytestream_start; 936cabdff1aSopenharmony_ci if (buf_p - c->bytestream_start < v) { 937cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n"); 938cabdff1aSopenharmony_ci ff_thread_report_progress(&f->picture, INT_MAX, 0); 939cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 940cabdff1aSopenharmony_ci } 941cabdff1aSopenharmony_ci buf_p -= v; 942cabdff1aSopenharmony_ci 943cabdff1aSopenharmony_ci if (f->ec) { 944cabdff1aSopenharmony_ci unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, v); 945cabdff1aSopenharmony_ci if (crc) { 946cabdff1aSopenharmony_ci int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts; 947cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc); 948cabdff1aSopenharmony_ci if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) { 949cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase)); 950cabdff1aSopenharmony_ci } else if (ts != AV_NOPTS_VALUE) { 951cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts); 952cabdff1aSopenharmony_ci } else { 953cabdff1aSopenharmony_ci av_log(f->avctx, AV_LOG_ERROR, "\n"); 954cabdff1aSopenharmony_ci } 955cabdff1aSopenharmony_ci fs->slice_damaged = 1; 956cabdff1aSopenharmony_ci } 957cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_PICT_INFO) { 958cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "slice %d, CRC: 0x%08"PRIX32"\n", i, AV_RB32(buf_p + v - 4)); 959cabdff1aSopenharmony_ci } 960cabdff1aSopenharmony_ci } 961cabdff1aSopenharmony_ci 962cabdff1aSopenharmony_ci if (i) { 963cabdff1aSopenharmony_ci ff_init_range_decoder(&fs->c, buf_p, v); 964cabdff1aSopenharmony_ci } else 965cabdff1aSopenharmony_ci fs->c.bytestream_end = buf_p + v; 966cabdff1aSopenharmony_ci 967cabdff1aSopenharmony_ci fs->avctx = avctx; 968cabdff1aSopenharmony_ci } 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci avctx->execute(avctx, 971cabdff1aSopenharmony_ci decode_slice, 972cabdff1aSopenharmony_ci &f->slice_context[0], 973cabdff1aSopenharmony_ci NULL, 974cabdff1aSopenharmony_ci f->slice_count, 975cabdff1aSopenharmony_ci sizeof(void*)); 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci for (i = f->slice_count - 1; i >= 0; i--) { 978cabdff1aSopenharmony_ci FFV1Context *fs = f->slice_context[i]; 979cabdff1aSopenharmony_ci int j; 980cabdff1aSopenharmony_ci if (fs->slice_damaged && f->last_picture.f->data[0]) { 981cabdff1aSopenharmony_ci const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); 982cabdff1aSopenharmony_ci const uint8_t *src[4]; 983cabdff1aSopenharmony_ci uint8_t *dst[4]; 984cabdff1aSopenharmony_ci ff_thread_await_progress(&f->last_picture, INT_MAX, 0); 985cabdff1aSopenharmony_ci for (j = 0; j < desc->nb_components; j++) { 986cabdff1aSopenharmony_ci int pixshift = desc->comp[j].depth > 8; 987cabdff1aSopenharmony_ci int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0; 988cabdff1aSopenharmony_ci int sv = (j == 1 || j == 2) ? f->chroma_v_shift : 0; 989cabdff1aSopenharmony_ci dst[j] = p->data[j] + p->linesize[j] * 990cabdff1aSopenharmony_ci (fs->slice_y >> sv) + ((fs->slice_x >> sh) << pixshift); 991cabdff1aSopenharmony_ci src[j] = f->last_picture.f->data[j] + f->last_picture.f->linesize[j] * 992cabdff1aSopenharmony_ci (fs->slice_y >> sv) + ((fs->slice_x >> sh) << pixshift); 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci } 995cabdff1aSopenharmony_ci if (desc->flags & AV_PIX_FMT_FLAG_PAL) { 996cabdff1aSopenharmony_ci dst[1] = p->data[1]; 997cabdff1aSopenharmony_ci src[1] = f->last_picture.f->data[1]; 998cabdff1aSopenharmony_ci } 999cabdff1aSopenharmony_ci av_image_copy(dst, p->linesize, src, 1000cabdff1aSopenharmony_ci f->last_picture.f->linesize, 1001cabdff1aSopenharmony_ci avctx->pix_fmt, 1002cabdff1aSopenharmony_ci fs->slice_width, 1003cabdff1aSopenharmony_ci fs->slice_height); 1004cabdff1aSopenharmony_ci } 1005cabdff1aSopenharmony_ci } 1006cabdff1aSopenharmony_ci ff_thread_report_progress(&f->picture, INT_MAX, 0); 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci if (f->last_picture.f) 1009cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(avctx, &f->last_picture); 1010cabdff1aSopenharmony_ci if ((ret = av_frame_ref(rframe, f->picture.f)) < 0) 1011cabdff1aSopenharmony_ci return ret; 1012cabdff1aSopenharmony_ci 1013cabdff1aSopenharmony_ci *got_frame = 1; 1014cabdff1aSopenharmony_ci 1015cabdff1aSopenharmony_ci return buf_size; 1016cabdff1aSopenharmony_ci} 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_cistatic void copy_fields(FFV1Context *fsdst, const FFV1Context *fssrc, 1019cabdff1aSopenharmony_ci const FFV1Context *fsrc) 1020cabdff1aSopenharmony_ci{ 1021cabdff1aSopenharmony_ci fsdst->version = fsrc->version; 1022cabdff1aSopenharmony_ci fsdst->micro_version = fsrc->micro_version; 1023cabdff1aSopenharmony_ci fsdst->chroma_planes = fsrc->chroma_planes; 1024cabdff1aSopenharmony_ci fsdst->chroma_h_shift = fsrc->chroma_h_shift; 1025cabdff1aSopenharmony_ci fsdst->chroma_v_shift = fsrc->chroma_v_shift; 1026cabdff1aSopenharmony_ci fsdst->transparency = fsrc->transparency; 1027cabdff1aSopenharmony_ci fsdst->plane_count = fsrc->plane_count; 1028cabdff1aSopenharmony_ci fsdst->ac = fsrc->ac; 1029cabdff1aSopenharmony_ci fsdst->colorspace = fsrc->colorspace; 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_ci fsdst->ec = fsrc->ec; 1032cabdff1aSopenharmony_ci fsdst->intra = fsrc->intra; 1033cabdff1aSopenharmony_ci fsdst->slice_damaged = fssrc->slice_damaged; 1034cabdff1aSopenharmony_ci fsdst->key_frame_ok = fsrc->key_frame_ok; 1035cabdff1aSopenharmony_ci 1036cabdff1aSopenharmony_ci fsdst->packed_at_lsb = fsrc->packed_at_lsb; 1037cabdff1aSopenharmony_ci fsdst->slice_count = fsrc->slice_count; 1038cabdff1aSopenharmony_ci if (fsrc->version<3){ 1039cabdff1aSopenharmony_ci fsdst->slice_x = fssrc->slice_x; 1040cabdff1aSopenharmony_ci fsdst->slice_y = fssrc->slice_y; 1041cabdff1aSopenharmony_ci fsdst->slice_width = fssrc->slice_width; 1042cabdff1aSopenharmony_ci fsdst->slice_height = fssrc->slice_height; 1043cabdff1aSopenharmony_ci } 1044cabdff1aSopenharmony_ci} 1045cabdff1aSopenharmony_ci 1046cabdff1aSopenharmony_ci#if HAVE_THREADS 1047cabdff1aSopenharmony_cistatic int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) 1048cabdff1aSopenharmony_ci{ 1049cabdff1aSopenharmony_ci FFV1Context *fsrc = src->priv_data; 1050cabdff1aSopenharmony_ci FFV1Context *fdst = dst->priv_data; 1051cabdff1aSopenharmony_ci int i, ret; 1052cabdff1aSopenharmony_ci 1053cabdff1aSopenharmony_ci if (dst == src) 1054cabdff1aSopenharmony_ci return 0; 1055cabdff1aSopenharmony_ci 1056cabdff1aSopenharmony_ci { 1057cabdff1aSopenharmony_ci ThreadFrame picture = fdst->picture, last_picture = fdst->last_picture; 1058cabdff1aSopenharmony_ci uint8_t (*initial_states[MAX_QUANT_TABLES])[32]; 1059cabdff1aSopenharmony_ci struct FFV1Context *slice_context[MAX_SLICES]; 1060cabdff1aSopenharmony_ci memcpy(initial_states, fdst->initial_states, sizeof(fdst->initial_states)); 1061cabdff1aSopenharmony_ci memcpy(slice_context, fdst->slice_context , sizeof(fdst->slice_context)); 1062cabdff1aSopenharmony_ci 1063cabdff1aSopenharmony_ci memcpy(fdst, fsrc, sizeof(*fdst)); 1064cabdff1aSopenharmony_ci memcpy(fdst->initial_states, initial_states, sizeof(fdst->initial_states)); 1065cabdff1aSopenharmony_ci memcpy(fdst->slice_context, slice_context , sizeof(fdst->slice_context)); 1066cabdff1aSopenharmony_ci fdst->picture = picture; 1067cabdff1aSopenharmony_ci fdst->last_picture = last_picture; 1068cabdff1aSopenharmony_ci for (i = 0; i<fdst->num_h_slices * fdst->num_v_slices; i++) { 1069cabdff1aSopenharmony_ci FFV1Context *fssrc = fsrc->slice_context[i]; 1070cabdff1aSopenharmony_ci FFV1Context *fsdst = fdst->slice_context[i]; 1071cabdff1aSopenharmony_ci copy_fields(fsdst, fssrc, fsrc); 1072cabdff1aSopenharmony_ci } 1073cabdff1aSopenharmony_ci av_assert0(!fdst->plane[0].state); 1074cabdff1aSopenharmony_ci av_assert0(!fdst->sample_buffer); 1075cabdff1aSopenharmony_ci } 1076cabdff1aSopenharmony_ci 1077cabdff1aSopenharmony_ci av_assert1(fdst->max_slice_count == fsrc->max_slice_count); 1078cabdff1aSopenharmony_ci 1079cabdff1aSopenharmony_ci 1080cabdff1aSopenharmony_ci ff_thread_release_ext_buffer(dst, &fdst->picture); 1081cabdff1aSopenharmony_ci if (fsrc->picture.f->data[0]) { 1082cabdff1aSopenharmony_ci if ((ret = ff_thread_ref_frame(&fdst->picture, &fsrc->picture)) < 0) 1083cabdff1aSopenharmony_ci return ret; 1084cabdff1aSopenharmony_ci } 1085cabdff1aSopenharmony_ci 1086cabdff1aSopenharmony_ci fdst->fsrc = fsrc; 1087cabdff1aSopenharmony_ci 1088cabdff1aSopenharmony_ci return 0; 1089cabdff1aSopenharmony_ci} 1090cabdff1aSopenharmony_ci#endif 1091cabdff1aSopenharmony_ci 1092cabdff1aSopenharmony_ciconst FFCodec ff_ffv1_decoder = { 1093cabdff1aSopenharmony_ci .p.name = "ffv1", 1094cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), 1095cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 1096cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_FFV1, 1097cabdff1aSopenharmony_ci .priv_data_size = sizeof(FFV1Context), 1098cabdff1aSopenharmony_ci .init = decode_init, 1099cabdff1aSopenharmony_ci .close = ff_ffv1_close, 1100cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 1101cabdff1aSopenharmony_ci .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context), 1102cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/ | 1103cabdff1aSopenharmony_ci AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, 1104cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP | 1105cabdff1aSopenharmony_ci FF_CODEC_CAP_ALLOCATE_PROGRESS, 1106cabdff1aSopenharmony_ci}; 1107