1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * BitJazz SheerVideo decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2016 Paul B Mahol 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#define CACHED_BITSTREAM_READER !ARCH_X86_32 23cabdff1aSopenharmony_ci#define SHEER_VLC_BITS 12 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 26cabdff1aSopenharmony_ci#include "avcodec.h" 27cabdff1aSopenharmony_ci#include "codec_internal.h" 28cabdff1aSopenharmony_ci#include "get_bits.h" 29cabdff1aSopenharmony_ci#include "thread.h" 30cabdff1aSopenharmony_ci#include "sheervideodata.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_citypedef struct SheerVideoContext { 33cabdff1aSopenharmony_ci unsigned format; 34cabdff1aSopenharmony_ci int alt; 35cabdff1aSopenharmony_ci VLC vlc[2]; 36cabdff1aSopenharmony_ci void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb); 37cabdff1aSopenharmony_ci} SheerVideoContext; 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_cistatic void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 40cabdff1aSopenharmony_ci{ 41cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 42cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v, *dst_a; 43cabdff1aSopenharmony_ci int x, y; 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 46cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 47cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 48cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 51cabdff1aSopenharmony_ci if (get_bits1(gb)) { 52cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 53cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 54cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 55cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 56cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 57cabdff1aSopenharmony_ci } 58cabdff1aSopenharmony_ci } else { 59cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 502 }; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 62cabdff1aSopenharmony_ci int y, u, v, a; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 65cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 66cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 67cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff; 70cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff; 71cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff; 72cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff; 73cabdff1aSopenharmony_ci } 74cabdff1aSopenharmony_ci } 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 77cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 78cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 79cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 80cabdff1aSopenharmony_ci } 81cabdff1aSopenharmony_ci} 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_cistatic void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 84cabdff1aSopenharmony_ci{ 85cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 86cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v, *dst_a; 87cabdff1aSopenharmony_ci int x, y; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 90cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 91cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 92cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci if (get_bits1(gb)) { 95cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 96cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 97cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 98cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 99cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 100cabdff1aSopenharmony_ci } 101cabdff1aSopenharmony_ci } else { 102cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 502 }; 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 105cabdff1aSopenharmony_ci int y, u, v, a; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 108cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 109cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 110cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff; 113cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff; 114cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff; 115cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff; 116cabdff1aSopenharmony_ci } 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 120cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 121cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 122cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 125cabdff1aSopenharmony_ci if (get_bits1(gb)) { 126cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 127cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 128cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 129cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 130cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 131cabdff1aSopenharmony_ci } 132cabdff1aSopenharmony_ci } else { 133cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 134cabdff1aSopenharmony_ci int y, u, v, a; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2]; 137cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2]; 138cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2]; 139cabdff1aSopenharmony_ci pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2]; 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 142cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] / 2 + x]; 143cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] / 2 + x]; 144cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] / 2 + x]; 145cabdff1aSopenharmony_ci pred_T[3] = dst_a[-p->linesize[3] / 2 + x]; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 148cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 149cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 150cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff; 153cabdff1aSopenharmony_ci dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 154cabdff1aSopenharmony_ci dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff; 155cabdff1aSopenharmony_ci dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 158cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 159cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 160cabdff1aSopenharmony_ci pred_TL[3] = pred_T[3]; 161cabdff1aSopenharmony_ci } 162cabdff1aSopenharmony_ci } 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 165cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 166cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 167cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 168cabdff1aSopenharmony_ci } 169cabdff1aSopenharmony_ci} 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_cistatic void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 172cabdff1aSopenharmony_ci{ 173cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 174cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v; 175cabdff1aSopenharmony_ci int x, y; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 178cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 179cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 182cabdff1aSopenharmony_ci if (get_bits1(gb)) { 183cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 184cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 185cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 186cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 187cabdff1aSopenharmony_ci } 188cabdff1aSopenharmony_ci } else { 189cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 512 }; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 192cabdff1aSopenharmony_ci int y, u, v; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 195cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 196cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff; 199cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff; 200cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci } 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 205cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 206cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci} 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_cistatic void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 211cabdff1aSopenharmony_ci{ 212cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 213cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v; 214cabdff1aSopenharmony_ci int x, y; 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 217cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 218cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci if (get_bits1(gb)) { 221cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 222cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 223cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 224cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 225cabdff1aSopenharmony_ci } 226cabdff1aSopenharmony_ci } else { 227cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 512 }; 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 230cabdff1aSopenharmony_ci int y, u, v; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 233cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 234cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff; 237cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff; 238cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff; 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci } 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 243cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 244cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 247cabdff1aSopenharmony_ci if (get_bits1(gb)) { 248cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 249cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 10); 250cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 10); 251cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 10); 252cabdff1aSopenharmony_ci } 253cabdff1aSopenharmony_ci } else { 254cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 255cabdff1aSopenharmony_ci int y, u, v; 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2]; 258cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2]; 259cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2]; 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 262cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] / 2 + x]; 263cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] / 2 + x]; 264cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] / 2 + x]; 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 267cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 268cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 271cabdff1aSopenharmony_ci dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff; 272cabdff1aSopenharmony_ci dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff; 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 275cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 276cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 277cabdff1aSopenharmony_ci } 278cabdff1aSopenharmony_ci } 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 281cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 282cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 283cabdff1aSopenharmony_ci } 284cabdff1aSopenharmony_ci} 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_cistatic void decode_yry10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 287cabdff1aSopenharmony_ci{ 288cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 289cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v; 290cabdff1aSopenharmony_ci int x, y; 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 293cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 294cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 297cabdff1aSopenharmony_ci if (get_bits1(gb)) { 298cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 299cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 300cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 301cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 302cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 303cabdff1aSopenharmony_ci } 304cabdff1aSopenharmony_ci } else { 305cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 0 }; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 308cabdff1aSopenharmony_ci int y1, y2, u, v; 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 311cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 312cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 313cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff; 316cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff; 317cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff; 318cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff; 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci } 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 323cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 324cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 325cabdff1aSopenharmony_ci } 326cabdff1aSopenharmony_ci} 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_cistatic void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 329cabdff1aSopenharmony_ci{ 330cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 331cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v; 332cabdff1aSopenharmony_ci int x, y; 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 335cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 336cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci if (get_bits1(gb)) { 339cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 340cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 341cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 342cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 343cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 344cabdff1aSopenharmony_ci } 345cabdff1aSopenharmony_ci } else { 346cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 0 }; 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 349cabdff1aSopenharmony_ci int y1, y2, u, v; 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 352cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 353cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 354cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff; 357cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff; 358cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff; 359cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff; 360cabdff1aSopenharmony_ci } 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 364cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 365cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 368cabdff1aSopenharmony_ci if (get_bits1(gb)) { 369cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 370cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 371cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 372cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 373cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 374cabdff1aSopenharmony_ci } 375cabdff1aSopenharmony_ci } else { 376cabdff1aSopenharmony_ci int pred_TL[6], pred_L[6], pred_T[6]; 377cabdff1aSopenharmony_ci int y1, y2, u, v; 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2]; 380cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2]; 381cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2]; 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 384cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] / 2 + x]; 385cabdff1aSopenharmony_ci pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1]; 386cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2]; 387cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2]; 388cabdff1aSopenharmony_ci 389cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 390cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 391cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 392cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 393cabdff1aSopenharmony_ci 394cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 395cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff; 396cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff; 397cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci pred_TL[0] = pred_T[3]; 400cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 401cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 402cabdff1aSopenharmony_ci } 403cabdff1aSopenharmony_ci } 404cabdff1aSopenharmony_ci 405cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 406cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 407cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci} 410cabdff1aSopenharmony_ci 411cabdff1aSopenharmony_cistatic void decode_ca2i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 412cabdff1aSopenharmony_ci{ 413cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 414cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v, *dst_a; 415cabdff1aSopenharmony_ci int x, y; 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 418cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 419cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 420cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 423cabdff1aSopenharmony_ci if (get_bits1(gb)) { 424cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 425cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 10); 426cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 427cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 428cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 10); 429cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 430cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci } else { 433cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 502 }; 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 436cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 439cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 440cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 441cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 442cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 443cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff; 446cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff; 447cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff; 448cabdff1aSopenharmony_ci dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff; 449cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff; 450cabdff1aSopenharmony_ci dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff; 451cabdff1aSopenharmony_ci } 452cabdff1aSopenharmony_ci } 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 455cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 456cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 457cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 458cabdff1aSopenharmony_ci } 459cabdff1aSopenharmony_ci} 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_cistatic void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 462cabdff1aSopenharmony_ci{ 463cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 464cabdff1aSopenharmony_ci uint16_t *dst_y, *dst_u, *dst_v, *dst_a; 465cabdff1aSopenharmony_ci int x, y; 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ci dst_y = (uint16_t *)p->data[0]; 468cabdff1aSopenharmony_ci dst_u = (uint16_t *)p->data[1]; 469cabdff1aSopenharmony_ci dst_v = (uint16_t *)p->data[2]; 470cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 471cabdff1aSopenharmony_ci 472cabdff1aSopenharmony_ci if (get_bits1(gb)) { 473cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 474cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 10); 475cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 476cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 477cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 10); 478cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 479cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 480cabdff1aSopenharmony_ci } 481cabdff1aSopenharmony_ci } else { 482cabdff1aSopenharmony_ci int pred[4] = { 502, 512, 512, 502 }; 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 485cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 488cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 489cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 490cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 491cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 492cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 493cabdff1aSopenharmony_ci 494cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff; 495cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff; 496cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff; 497cabdff1aSopenharmony_ci dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff; 498cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff; 499cabdff1aSopenharmony_ci dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff; 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci } 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 504cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 505cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 506cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 509cabdff1aSopenharmony_ci if (get_bits1(gb)) { 510cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 511cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 10); 512cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 10); 513cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 10); 514cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 10); 515cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 10); 516cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 10); 517cabdff1aSopenharmony_ci } 518cabdff1aSopenharmony_ci } else { 519cabdff1aSopenharmony_ci int pred_TL[6], pred_L[6], pred_T[6]; 520cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2]; 523cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2]; 524cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2]; 525cabdff1aSopenharmony_ci pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2]; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 528cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] / 2 + x]; 529cabdff1aSopenharmony_ci pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1]; 530cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2]; 531cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2]; 532cabdff1aSopenharmony_ci pred_T[4] = dst_a[-p->linesize[3] / 2 + x]; 533cabdff1aSopenharmony_ci pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1]; 534cabdff1aSopenharmony_ci 535cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 536cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 537cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 538cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 539cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 540cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 543cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff; 544cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff; 545cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff; 546cabdff1aSopenharmony_ci dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff; 547cabdff1aSopenharmony_ci dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff; 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci pred_TL[0] = pred_T[3]; 550cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 551cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 552cabdff1aSopenharmony_ci pred_TL[4] = pred_T[5]; 553cabdff1aSopenharmony_ci } 554cabdff1aSopenharmony_ci } 555cabdff1aSopenharmony_ci 556cabdff1aSopenharmony_ci dst_y += p->linesize[0] / 2; 557cabdff1aSopenharmony_ci dst_u += p->linesize[1] / 2; 558cabdff1aSopenharmony_ci dst_v += p->linesize[2] / 2; 559cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci} 562cabdff1aSopenharmony_ci 563cabdff1aSopenharmony_cistatic void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 564cabdff1aSopenharmony_ci{ 565cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 566cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v, *dst_a; 567cabdff1aSopenharmony_ci int x, y; 568cabdff1aSopenharmony_ci 569cabdff1aSopenharmony_ci dst_y = p->data[0]; 570cabdff1aSopenharmony_ci dst_u = p->data[1]; 571cabdff1aSopenharmony_ci dst_v = p->data[2]; 572cabdff1aSopenharmony_ci dst_a = p->data[3]; 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y += 1) { 575cabdff1aSopenharmony_ci if (get_bits1(gb)) { 576cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 577cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 8); 578cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 579cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 580cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 8); 581cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 582cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 583cabdff1aSopenharmony_ci } 584cabdff1aSopenharmony_ci } else { 585cabdff1aSopenharmony_ci int pred[4] = { 125, -128, -128, 125 }; 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 588cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 591cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 592cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 593cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 594cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 595cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 596cabdff1aSopenharmony_ci 597cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff; 598cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff; 599cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff; 600cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff; 601cabdff1aSopenharmony_ci dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff; 602cabdff1aSopenharmony_ci dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff; 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci } 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 607cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 608cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 609cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 610cabdff1aSopenharmony_ci } 611cabdff1aSopenharmony_ci} 612cabdff1aSopenharmony_ci 613cabdff1aSopenharmony_cistatic void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 614cabdff1aSopenharmony_ci{ 615cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 616cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v, *dst_a; 617cabdff1aSopenharmony_ci int x, y; 618cabdff1aSopenharmony_ci 619cabdff1aSopenharmony_ci dst_y = p->data[0]; 620cabdff1aSopenharmony_ci dst_u = p->data[1]; 621cabdff1aSopenharmony_ci dst_v = p->data[2]; 622cabdff1aSopenharmony_ci dst_a = p->data[3]; 623cabdff1aSopenharmony_ci 624cabdff1aSopenharmony_ci if (get_bits1(gb)) { 625cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 626cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 8); 627cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 628cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 629cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 8); 630cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 631cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 632cabdff1aSopenharmony_ci } 633cabdff1aSopenharmony_ci } else { 634cabdff1aSopenharmony_ci int pred[4] = { 125, -128, -128, 125 }; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 637cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 638cabdff1aSopenharmony_ci 639cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 640cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 641cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 642cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 643cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 644cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 645cabdff1aSopenharmony_ci 646cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff; 647cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff; 648cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff; 649cabdff1aSopenharmony_ci dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff; 650cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff; 651cabdff1aSopenharmony_ci dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff; 652cabdff1aSopenharmony_ci } 653cabdff1aSopenharmony_ci } 654cabdff1aSopenharmony_ci 655cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 656cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 657cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 658cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 661cabdff1aSopenharmony_ci if (get_bits1(gb)) { 662cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 663cabdff1aSopenharmony_ci dst_a[x ] = get_bits(gb, 8); 664cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 665cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 666cabdff1aSopenharmony_ci dst_a[x + 1] = get_bits(gb, 8); 667cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 668cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 669cabdff1aSopenharmony_ci } 670cabdff1aSopenharmony_ci } else { 671cabdff1aSopenharmony_ci int pred_TL[6], pred_L[6], pred_T[6]; 672cabdff1aSopenharmony_ci int y1, y2, u, v, a1, a2; 673cabdff1aSopenharmony_ci 674cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]]; 675cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]]; 676cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]]; 677cabdff1aSopenharmony_ci pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]]; 678cabdff1aSopenharmony_ci 679cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 680cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] + x]; 681cabdff1aSopenharmony_ci pred_T[3] = dst_y[-p->linesize[0] + x + 1]; 682cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] + x / 2]; 683cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] + x / 2]; 684cabdff1aSopenharmony_ci pred_T[4] = dst_a[-p->linesize[3] + x]; 685cabdff1aSopenharmony_ci pred_T[5] = dst_a[-p->linesize[3] + x + 1]; 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_ci a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 688cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 689cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 690cabdff1aSopenharmony_ci a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 691cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 692cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 695cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff; 696cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff; 697cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff; 698cabdff1aSopenharmony_ci dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff; 699cabdff1aSopenharmony_ci dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff; 700cabdff1aSopenharmony_ci 701cabdff1aSopenharmony_ci pred_TL[0] = pred_T[3]; 702cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 703cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 704cabdff1aSopenharmony_ci pred_TL[4] = pred_T[5]; 705cabdff1aSopenharmony_ci } 706cabdff1aSopenharmony_ci } 707cabdff1aSopenharmony_ci 708cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 709cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 710cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 711cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci} 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_cistatic void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 716cabdff1aSopenharmony_ci{ 717cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 718cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v; 719cabdff1aSopenharmony_ci int x, y; 720cabdff1aSopenharmony_ci 721cabdff1aSopenharmony_ci dst_y = p->data[0]; 722cabdff1aSopenharmony_ci dst_u = p->data[1]; 723cabdff1aSopenharmony_ci dst_v = p->data[2]; 724cabdff1aSopenharmony_ci 725cabdff1aSopenharmony_ci if (get_bits1(gb)) { 726cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 727cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 728cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8) + 128; 729cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 730cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8) + 128; 731cabdff1aSopenharmony_ci } 732cabdff1aSopenharmony_ci } else { 733cabdff1aSopenharmony_ci int pred[4] = { -128, 128, 128, 0 }; 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 736cabdff1aSopenharmony_ci int y1, y2, u, v; 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 739cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 740cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 741cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 742cabdff1aSopenharmony_ci 743cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff; 744cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff; 745cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff; 746cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff; 747cabdff1aSopenharmony_ci } 748cabdff1aSopenharmony_ci } 749cabdff1aSopenharmony_ci 750cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 751cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 752cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 753cabdff1aSopenharmony_ci 754cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 755cabdff1aSopenharmony_ci if (get_bits1(gb)) { 756cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 757cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 758cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8) + 128; 759cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 760cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8) + 128; 761cabdff1aSopenharmony_ci } 762cabdff1aSopenharmony_ci } else { 763cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 764cabdff1aSopenharmony_ci int y1, y2, u, v; 765cabdff1aSopenharmony_ci 766cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]]; 767cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]]; 768cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]]; 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 771cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] + x]; 772cabdff1aSopenharmony_ci pred_T[3] = dst_y[-p->linesize[0] + x + 1]; 773cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] + x / 2]; 774cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] + x / 2]; 775cabdff1aSopenharmony_ci 776cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 777cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 778cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 779cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 782cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff; 783cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff; 784cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff; 785cabdff1aSopenharmony_ci 786cabdff1aSopenharmony_ci pred_TL[0] = pred_T[3]; 787cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 788cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 789cabdff1aSopenharmony_ci } 790cabdff1aSopenharmony_ci } 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 793cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 794cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 795cabdff1aSopenharmony_ci } 796cabdff1aSopenharmony_ci} 797cabdff1aSopenharmony_ci 798cabdff1aSopenharmony_cistatic void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 799cabdff1aSopenharmony_ci{ 800cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 801cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v; 802cabdff1aSopenharmony_ci int x, y; 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ci dst_y = p->data[0]; 805cabdff1aSopenharmony_ci dst_u = p->data[1]; 806cabdff1aSopenharmony_ci dst_v = p->data[2]; 807cabdff1aSopenharmony_ci 808cabdff1aSopenharmony_ci if (get_bits1(gb)) { 809cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 810cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 811cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 812cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 813cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 814cabdff1aSopenharmony_ci } 815cabdff1aSopenharmony_ci } else { 816cabdff1aSopenharmony_ci int pred[4] = { 125, -128, -128, 0 }; 817cabdff1aSopenharmony_ci 818cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 819cabdff1aSopenharmony_ci int y1, y2, u, v; 820cabdff1aSopenharmony_ci 821cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 822cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 823cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 824cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 825cabdff1aSopenharmony_ci 826cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff; 827cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff; 828cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff; 829cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff; 830cabdff1aSopenharmony_ci } 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 834cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 835cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 836cabdff1aSopenharmony_ci 837cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 838cabdff1aSopenharmony_ci if (get_bits1(gb)) { 839cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 840cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 841cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 842cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 843cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 844cabdff1aSopenharmony_ci } 845cabdff1aSopenharmony_ci } else { 846cabdff1aSopenharmony_ci int pred_L[4]; 847cabdff1aSopenharmony_ci int y1, y2, u, v; 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci pred_L[0] = dst_y[-p->linesize[0]]; 850cabdff1aSopenharmony_ci pred_L[1] = dst_u[-p->linesize[1]]; 851cabdff1aSopenharmony_ci pred_L[2] = dst_v[-p->linesize[2]]; 852cabdff1aSopenharmony_ci 853cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 854cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 855cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 856cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 857cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 858cabdff1aSopenharmony_ci 859cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + pred_L[0]) & 0xff; 860cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + pred_L[1]) & 0xff; 861cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff; 862cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + pred_L[2]) & 0xff; 863cabdff1aSopenharmony_ci } 864cabdff1aSopenharmony_ci } 865cabdff1aSopenharmony_ci 866cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 867cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 868cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 869cabdff1aSopenharmony_ci } 870cabdff1aSopenharmony_ci} 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_cistatic void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 873cabdff1aSopenharmony_ci{ 874cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 875cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v; 876cabdff1aSopenharmony_ci int x, y; 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ci dst_y = p->data[0]; 879cabdff1aSopenharmony_ci dst_u = p->data[1]; 880cabdff1aSopenharmony_ci dst_v = p->data[2]; 881cabdff1aSopenharmony_ci 882cabdff1aSopenharmony_ci if (get_bits1(gb)) { 883cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 884cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 885cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 886cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 887cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 888cabdff1aSopenharmony_ci } 889cabdff1aSopenharmony_ci } else { 890cabdff1aSopenharmony_ci int pred[4] = { 125, -128, -128, 0 }; 891cabdff1aSopenharmony_ci 892cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 893cabdff1aSopenharmony_ci int y1, y2, u, v; 894cabdff1aSopenharmony_ci 895cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 896cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 897cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 898cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 899cabdff1aSopenharmony_ci 900cabdff1aSopenharmony_ci dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff; 901cabdff1aSopenharmony_ci dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff; 902cabdff1aSopenharmony_ci dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff; 903cabdff1aSopenharmony_ci dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff; 904cabdff1aSopenharmony_ci } 905cabdff1aSopenharmony_ci } 906cabdff1aSopenharmony_ci 907cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 908cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 909cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 912cabdff1aSopenharmony_ci if (get_bits1(gb)) { 913cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 914cabdff1aSopenharmony_ci dst_y[x ] = get_bits(gb, 8); 915cabdff1aSopenharmony_ci dst_u[x / 2] = get_bits(gb, 8); 916cabdff1aSopenharmony_ci dst_y[x + 1] = get_bits(gb, 8); 917cabdff1aSopenharmony_ci dst_v[x / 2] = get_bits(gb, 8); 918cabdff1aSopenharmony_ci } 919cabdff1aSopenharmony_ci } else { 920cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 921cabdff1aSopenharmony_ci int y1, y2, u, v; 922cabdff1aSopenharmony_ci 923cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]]; 924cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]]; 925cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]]; 926cabdff1aSopenharmony_ci 927cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x += 2) { 928cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] + x]; 929cabdff1aSopenharmony_ci pred_T[3] = dst_y[-p->linesize[0] + x + 1]; 930cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] + x / 2]; 931cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] + x / 2]; 932cabdff1aSopenharmony_ci 933cabdff1aSopenharmony_ci y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 934cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 935cabdff1aSopenharmony_ci y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 936cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 937cabdff1aSopenharmony_ci 938cabdff1aSopenharmony_ci dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 939cabdff1aSopenharmony_ci dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff; 940cabdff1aSopenharmony_ci dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff; 941cabdff1aSopenharmony_ci dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff; 942cabdff1aSopenharmony_ci 943cabdff1aSopenharmony_ci pred_TL[0] = pred_T[3]; 944cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 945cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 946cabdff1aSopenharmony_ci } 947cabdff1aSopenharmony_ci } 948cabdff1aSopenharmony_ci 949cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 950cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 951cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 952cabdff1aSopenharmony_ci } 953cabdff1aSopenharmony_ci} 954cabdff1aSopenharmony_ci 955cabdff1aSopenharmony_cistatic void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 956cabdff1aSopenharmony_ci{ 957cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 958cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v; 959cabdff1aSopenharmony_ci int x, y; 960cabdff1aSopenharmony_ci 961cabdff1aSopenharmony_ci dst_y = p->data[0]; 962cabdff1aSopenharmony_ci dst_u = p->data[1]; 963cabdff1aSopenharmony_ci dst_v = p->data[2]; 964cabdff1aSopenharmony_ci 965cabdff1aSopenharmony_ci if (get_bits1(gb)) { 966cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 967cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 968cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 969cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 970cabdff1aSopenharmony_ci } 971cabdff1aSopenharmony_ci } else { 972cabdff1aSopenharmony_ci int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 }; 973cabdff1aSopenharmony_ci 974cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 975cabdff1aSopenharmony_ci int y, u, v; 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 978cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 979cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0xff; 982cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0xff; 983cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0xff; 984cabdff1aSopenharmony_ci } 985cabdff1aSopenharmony_ci } 986cabdff1aSopenharmony_ci 987cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 988cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 989cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 990cabdff1aSopenharmony_ci 991cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 992cabdff1aSopenharmony_ci if (get_bits1(gb)) { 993cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 994cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 995cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 996cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 997cabdff1aSopenharmony_ci } 998cabdff1aSopenharmony_ci } else { 999cabdff1aSopenharmony_ci int pred_L[4]; 1000cabdff1aSopenharmony_ci int y, u, v; 1001cabdff1aSopenharmony_ci 1002cabdff1aSopenharmony_ci pred_L[0] = dst_y[-p->linesize[0]]; 1003cabdff1aSopenharmony_ci pred_L[1] = dst_u[-p->linesize[1]]; 1004cabdff1aSopenharmony_ci pred_L[2] = dst_v[-p->linesize[2]]; 1005cabdff1aSopenharmony_ci 1006cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1007cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1008cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1009cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1010cabdff1aSopenharmony_ci 1011cabdff1aSopenharmony_ci dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff; 1012cabdff1aSopenharmony_ci dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff; 1013cabdff1aSopenharmony_ci dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff; 1014cabdff1aSopenharmony_ci } 1015cabdff1aSopenharmony_ci } 1016cabdff1aSopenharmony_ci 1017cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1018cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1019cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1020cabdff1aSopenharmony_ci } 1021cabdff1aSopenharmony_ci} 1022cabdff1aSopenharmony_ci 1023cabdff1aSopenharmony_cistatic void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1024cabdff1aSopenharmony_ci{ 1025cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1026cabdff1aSopenharmony_ci uint8_t *dst_y, *dst_u, *dst_v; 1027cabdff1aSopenharmony_ci int x, y; 1028cabdff1aSopenharmony_ci 1029cabdff1aSopenharmony_ci dst_y = p->data[0]; 1030cabdff1aSopenharmony_ci dst_u = p->data[1]; 1031cabdff1aSopenharmony_ci dst_v = p->data[2]; 1032cabdff1aSopenharmony_ci 1033cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1034cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1035cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1036cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1037cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1038cabdff1aSopenharmony_ci } 1039cabdff1aSopenharmony_ci } else { 1040cabdff1aSopenharmony_ci int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 }; 1041cabdff1aSopenharmony_ci 1042cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1043cabdff1aSopenharmony_ci int y, u, v; 1044cabdff1aSopenharmony_ci 1045cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1046cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1047cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1048cabdff1aSopenharmony_ci 1049cabdff1aSopenharmony_ci dst_y[x] = pred[0] = (y + pred[0]) & 0xff; 1050cabdff1aSopenharmony_ci dst_u[x] = pred[1] = (u + pred[1]) & 0xff; 1051cabdff1aSopenharmony_ci dst_v[x] = pred[2] = (v + pred[2]) & 0xff; 1052cabdff1aSopenharmony_ci } 1053cabdff1aSopenharmony_ci } 1054cabdff1aSopenharmony_ci 1055cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1056cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1057cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1058cabdff1aSopenharmony_ci 1059cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1060cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1061cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1062cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1063cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1064cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1065cabdff1aSopenharmony_ci } 1066cabdff1aSopenharmony_ci } else { 1067cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1068cabdff1aSopenharmony_ci int y, u, v; 1069cabdff1aSopenharmony_ci 1070cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]]; 1071cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]]; 1072cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]]; 1073cabdff1aSopenharmony_ci 1074cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1075cabdff1aSopenharmony_ci pred_T[0] = dst_y[-p->linesize[0] + x]; 1076cabdff1aSopenharmony_ci pred_T[1] = dst_u[-p->linesize[1] + x]; 1077cabdff1aSopenharmony_ci pred_T[2] = dst_v[-p->linesize[2] + x]; 1078cabdff1aSopenharmony_ci 1079cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1080cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1081cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1082cabdff1aSopenharmony_ci 1083cabdff1aSopenharmony_ci dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 1084cabdff1aSopenharmony_ci dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff; 1085cabdff1aSopenharmony_ci dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff; 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1088cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1089cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1090cabdff1aSopenharmony_ci } 1091cabdff1aSopenharmony_ci } 1092cabdff1aSopenharmony_ci 1093cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1094cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1095cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1096cabdff1aSopenharmony_ci } 1097cabdff1aSopenharmony_ci} 1098cabdff1aSopenharmony_ci 1099cabdff1aSopenharmony_cistatic void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1100cabdff1aSopenharmony_ci{ 1101cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1102cabdff1aSopenharmony_ci uint8_t *dst_a, *dst_y, *dst_u, *dst_v; 1103cabdff1aSopenharmony_ci int x, y; 1104cabdff1aSopenharmony_ci 1105cabdff1aSopenharmony_ci dst_a = p->data[3]; 1106cabdff1aSopenharmony_ci dst_y = p->data[0]; 1107cabdff1aSopenharmony_ci dst_u = p->data[1]; 1108cabdff1aSopenharmony_ci dst_v = p->data[2]; 1109cabdff1aSopenharmony_ci 1110cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1111cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1112cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 8); 1113cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1114cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1115cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1116cabdff1aSopenharmony_ci } 1117cabdff1aSopenharmony_ci } else { 1118cabdff1aSopenharmony_ci int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 }; 1119cabdff1aSopenharmony_ci 1120cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1121cabdff1aSopenharmony_ci int a, y, u, v; 1122cabdff1aSopenharmony_ci 1123cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1124cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1125cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1126cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1127cabdff1aSopenharmony_ci 1128cabdff1aSopenharmony_ci dst_a[x] = pred[0] = (a + pred[0]) & 0xff; 1129cabdff1aSopenharmony_ci dst_y[x] = pred[1] = (y + pred[1]) & 0xff; 1130cabdff1aSopenharmony_ci dst_u[x] = pred[2] = (u + pred[2]) & 0xff; 1131cabdff1aSopenharmony_ci dst_v[x] = pred[3] = (v + pred[3]) & 0xff; 1132cabdff1aSopenharmony_ci } 1133cabdff1aSopenharmony_ci } 1134cabdff1aSopenharmony_ci 1135cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 1136cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1137cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1138cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1139cabdff1aSopenharmony_ci 1140cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1141cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1142cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1143cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 8); 1144cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1145cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1146cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1147cabdff1aSopenharmony_ci } 1148cabdff1aSopenharmony_ci } else { 1149cabdff1aSopenharmony_ci int pred_L[4]; 1150cabdff1aSopenharmony_ci int a, y, u, v; 1151cabdff1aSopenharmony_ci 1152cabdff1aSopenharmony_ci pred_L[0] = dst_a[-p->linesize[3]]; 1153cabdff1aSopenharmony_ci pred_L[1] = dst_y[-p->linesize[0]]; 1154cabdff1aSopenharmony_ci pred_L[2] = dst_u[-p->linesize[1]]; 1155cabdff1aSopenharmony_ci pred_L[3] = dst_v[-p->linesize[2]]; 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1158cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1159cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1160cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1161cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1162cabdff1aSopenharmony_ci 1163cabdff1aSopenharmony_ci dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff; 1164cabdff1aSopenharmony_ci dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff; 1165cabdff1aSopenharmony_ci dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff; 1166cabdff1aSopenharmony_ci dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff; 1167cabdff1aSopenharmony_ci } 1168cabdff1aSopenharmony_ci } 1169cabdff1aSopenharmony_ci 1170cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 1171cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1172cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1173cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1174cabdff1aSopenharmony_ci } 1175cabdff1aSopenharmony_ci} 1176cabdff1aSopenharmony_ci 1177cabdff1aSopenharmony_cistatic void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1178cabdff1aSopenharmony_ci{ 1179cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1180cabdff1aSopenharmony_ci uint8_t *dst_a, *dst_y, *dst_u, *dst_v; 1181cabdff1aSopenharmony_ci int x, y; 1182cabdff1aSopenharmony_ci 1183cabdff1aSopenharmony_ci dst_a = p->data[3]; 1184cabdff1aSopenharmony_ci dst_y = p->data[0]; 1185cabdff1aSopenharmony_ci dst_u = p->data[1]; 1186cabdff1aSopenharmony_ci dst_v = p->data[2]; 1187cabdff1aSopenharmony_ci 1188cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1189cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1190cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 8); 1191cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1192cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1193cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1194cabdff1aSopenharmony_ci } 1195cabdff1aSopenharmony_ci } else { 1196cabdff1aSopenharmony_ci int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 }; 1197cabdff1aSopenharmony_ci 1198cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1199cabdff1aSopenharmony_ci int a, y, u, v; 1200cabdff1aSopenharmony_ci 1201cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1202cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1203cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1204cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1205cabdff1aSopenharmony_ci 1206cabdff1aSopenharmony_ci dst_a[x] = pred[0] = (a + pred[0]) & 0xff; 1207cabdff1aSopenharmony_ci dst_y[x] = pred[1] = (y + pred[1]) & 0xff; 1208cabdff1aSopenharmony_ci dst_u[x] = pred[2] = (u + pred[2]) & 0xff; 1209cabdff1aSopenharmony_ci dst_v[x] = pred[3] = (v + pred[3]) & 0xff; 1210cabdff1aSopenharmony_ci } 1211cabdff1aSopenharmony_ci } 1212cabdff1aSopenharmony_ci 1213cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 1214cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1215cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1216cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1217cabdff1aSopenharmony_ci 1218cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1219cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1220cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1221cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 8); 1222cabdff1aSopenharmony_ci dst_y[x] = get_bits(gb, 8); 1223cabdff1aSopenharmony_ci dst_u[x] = get_bits(gb, 8); 1224cabdff1aSopenharmony_ci dst_v[x] = get_bits(gb, 8); 1225cabdff1aSopenharmony_ci } 1226cabdff1aSopenharmony_ci } else { 1227cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1228cabdff1aSopenharmony_ci int a, y, u, v; 1229cabdff1aSopenharmony_ci 1230cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]]; 1231cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]]; 1232cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]]; 1233cabdff1aSopenharmony_ci pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]]; 1234cabdff1aSopenharmony_ci 1235cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1236cabdff1aSopenharmony_ci pred_T[0] = dst_a[-p->linesize[3] + x]; 1237cabdff1aSopenharmony_ci pred_T[1] = dst_y[-p->linesize[0] + x]; 1238cabdff1aSopenharmony_ci pred_T[2] = dst_u[-p->linesize[1] + x]; 1239cabdff1aSopenharmony_ci pred_T[3] = dst_v[-p->linesize[2] + x]; 1240cabdff1aSopenharmony_ci 1241cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1242cabdff1aSopenharmony_ci y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1243cabdff1aSopenharmony_ci u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1244cabdff1aSopenharmony_ci v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1245cabdff1aSopenharmony_ci 1246cabdff1aSopenharmony_ci dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 1247cabdff1aSopenharmony_ci dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff; 1248cabdff1aSopenharmony_ci dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff; 1249cabdff1aSopenharmony_ci dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff; 1250cabdff1aSopenharmony_ci 1251cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1252cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1253cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1254cabdff1aSopenharmony_ci pred_TL[3] = pred_T[3]; 1255cabdff1aSopenharmony_ci } 1256cabdff1aSopenharmony_ci } 1257cabdff1aSopenharmony_ci 1258cabdff1aSopenharmony_ci dst_a += p->linesize[3]; 1259cabdff1aSopenharmony_ci dst_y += p->linesize[0]; 1260cabdff1aSopenharmony_ci dst_u += p->linesize[1]; 1261cabdff1aSopenharmony_ci dst_v += p->linesize[2]; 1262cabdff1aSopenharmony_ci } 1263cabdff1aSopenharmony_ci} 1264cabdff1aSopenharmony_ci 1265cabdff1aSopenharmony_cistatic void decode_argxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1266cabdff1aSopenharmony_ci{ 1267cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1268cabdff1aSopenharmony_ci uint16_t *dst_r, *dst_g, *dst_b, *dst_a; 1269cabdff1aSopenharmony_ci int x, y; 1270cabdff1aSopenharmony_ci 1271cabdff1aSopenharmony_ci dst_r = (uint16_t *)p->data[2]; 1272cabdff1aSopenharmony_ci dst_g = (uint16_t *)p->data[0]; 1273cabdff1aSopenharmony_ci dst_b = (uint16_t *)p->data[1]; 1274cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 1275cabdff1aSopenharmony_ci 1276cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 1277cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1278cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1279cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 1280cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1281cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1282cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1283cabdff1aSopenharmony_ci } 1284cabdff1aSopenharmony_ci } else { 1285cabdff1aSopenharmony_ci int pred[4] = { 512, 512, 512, 512 }; 1286cabdff1aSopenharmony_ci 1287cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1288cabdff1aSopenharmony_ci int r, g, b, a; 1289cabdff1aSopenharmony_ci 1290cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1291cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1292cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1293cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1294cabdff1aSopenharmony_ci 1295cabdff1aSopenharmony_ci dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff; 1296cabdff1aSopenharmony_ci dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff; 1297cabdff1aSopenharmony_ci dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff; 1298cabdff1aSopenharmony_ci dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff; 1299cabdff1aSopenharmony_ci } 1300cabdff1aSopenharmony_ci } 1301cabdff1aSopenharmony_ci 1302cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1303cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1304cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1305cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 1306cabdff1aSopenharmony_ci } 1307cabdff1aSopenharmony_ci} 1308cabdff1aSopenharmony_ci 1309cabdff1aSopenharmony_cistatic void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1310cabdff1aSopenharmony_ci{ 1311cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1312cabdff1aSopenharmony_ci uint16_t *dst_r, *dst_g, *dst_b, *dst_a; 1313cabdff1aSopenharmony_ci int x, y; 1314cabdff1aSopenharmony_ci 1315cabdff1aSopenharmony_ci dst_r = (uint16_t *)p->data[2]; 1316cabdff1aSopenharmony_ci dst_g = (uint16_t *)p->data[0]; 1317cabdff1aSopenharmony_ci dst_b = (uint16_t *)p->data[1]; 1318cabdff1aSopenharmony_ci dst_a = (uint16_t *)p->data[3]; 1319cabdff1aSopenharmony_ci 1320cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1321cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1322cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 1323cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1324cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1325cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1326cabdff1aSopenharmony_ci } 1327cabdff1aSopenharmony_ci } else { 1328cabdff1aSopenharmony_ci int pred[4] = { 512, 512, 512, 512 }; 1329cabdff1aSopenharmony_ci 1330cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1331cabdff1aSopenharmony_ci int r, g, b, a; 1332cabdff1aSopenharmony_ci 1333cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1334cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1335cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1336cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1337cabdff1aSopenharmony_ci 1338cabdff1aSopenharmony_ci dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff; 1339cabdff1aSopenharmony_ci dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff; 1340cabdff1aSopenharmony_ci dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff; 1341cabdff1aSopenharmony_ci dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff; 1342cabdff1aSopenharmony_ci } 1343cabdff1aSopenharmony_ci } 1344cabdff1aSopenharmony_ci 1345cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1346cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1347cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1348cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 1349cabdff1aSopenharmony_ci 1350cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1351cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1352cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1353cabdff1aSopenharmony_ci dst_a[x] = get_bits(gb, 10); 1354cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1355cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1356cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1357cabdff1aSopenharmony_ci } 1358cabdff1aSopenharmony_ci } else { 1359cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1360cabdff1aSopenharmony_ci int r, g, b, a; 1361cabdff1aSopenharmony_ci 1362cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2]; 1363cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2]; 1364cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2]; 1365cabdff1aSopenharmony_ci pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2]; 1366cabdff1aSopenharmony_ci 1367cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1368cabdff1aSopenharmony_ci pred_T[0] = dst_r[-p->linesize[2] / 2 + x]; 1369cabdff1aSopenharmony_ci pred_T[1] = dst_g[-p->linesize[0] / 2 + x]; 1370cabdff1aSopenharmony_ci pred_T[2] = dst_b[-p->linesize[1] / 2 + x]; 1371cabdff1aSopenharmony_ci pred_T[3] = dst_a[-p->linesize[3] / 2 + x]; 1372cabdff1aSopenharmony_ci 1373cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1374cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1375cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1376cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1377cabdff1aSopenharmony_ci 1378cabdff1aSopenharmony_ci dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff; 1379cabdff1aSopenharmony_ci dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 1380cabdff1aSopenharmony_ci dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff; 1381cabdff1aSopenharmony_ci dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff; 1382cabdff1aSopenharmony_ci 1383cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1384cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1385cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1386cabdff1aSopenharmony_ci pred_TL[3] = pred_T[3]; 1387cabdff1aSopenharmony_ci } 1388cabdff1aSopenharmony_ci } 1389cabdff1aSopenharmony_ci 1390cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1391cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1392cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1393cabdff1aSopenharmony_ci dst_a += p->linesize[3] / 2; 1394cabdff1aSopenharmony_ci } 1395cabdff1aSopenharmony_ci} 1396cabdff1aSopenharmony_ci 1397cabdff1aSopenharmony_cistatic void decode_rgbxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1398cabdff1aSopenharmony_ci{ 1399cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1400cabdff1aSopenharmony_ci uint16_t *dst_r, *dst_g, *dst_b; 1401cabdff1aSopenharmony_ci int x, y; 1402cabdff1aSopenharmony_ci 1403cabdff1aSopenharmony_ci dst_r = (uint16_t *)p->data[2]; 1404cabdff1aSopenharmony_ci dst_g = (uint16_t *)p->data[0]; 1405cabdff1aSopenharmony_ci dst_b = (uint16_t *)p->data[1]; 1406cabdff1aSopenharmony_ci 1407cabdff1aSopenharmony_ci for (y = 0; y < avctx->height; y++) { 1408cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1409cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1410cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1411cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1412cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1413cabdff1aSopenharmony_ci } 1414cabdff1aSopenharmony_ci } else { 1415cabdff1aSopenharmony_ci int pred[4] = { 512, 512, 512, 0 }; 1416cabdff1aSopenharmony_ci 1417cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1418cabdff1aSopenharmony_ci int r, g, b; 1419cabdff1aSopenharmony_ci 1420cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1421cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1422cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1423cabdff1aSopenharmony_ci 1424cabdff1aSopenharmony_ci dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff; 1425cabdff1aSopenharmony_ci dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff; 1426cabdff1aSopenharmony_ci dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff; 1427cabdff1aSopenharmony_ci } 1428cabdff1aSopenharmony_ci } 1429cabdff1aSopenharmony_ci 1430cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1431cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1432cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1433cabdff1aSopenharmony_ci } 1434cabdff1aSopenharmony_ci} 1435cabdff1aSopenharmony_ci 1436cabdff1aSopenharmony_cistatic void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1437cabdff1aSopenharmony_ci{ 1438cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1439cabdff1aSopenharmony_ci uint16_t *dst_r, *dst_g, *dst_b; 1440cabdff1aSopenharmony_ci int x, y; 1441cabdff1aSopenharmony_ci 1442cabdff1aSopenharmony_ci dst_r = (uint16_t *)p->data[2]; 1443cabdff1aSopenharmony_ci dst_g = (uint16_t *)p->data[0]; 1444cabdff1aSopenharmony_ci dst_b = (uint16_t *)p->data[1]; 1445cabdff1aSopenharmony_ci 1446cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1447cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1448cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1449cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1450cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1451cabdff1aSopenharmony_ci } 1452cabdff1aSopenharmony_ci } else { 1453cabdff1aSopenharmony_ci int pred[4] = { 512, 512, 512, 0 }; 1454cabdff1aSopenharmony_ci 1455cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1456cabdff1aSopenharmony_ci int r, g, b; 1457cabdff1aSopenharmony_ci 1458cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1459cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1460cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1461cabdff1aSopenharmony_ci 1462cabdff1aSopenharmony_ci dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff; 1463cabdff1aSopenharmony_ci dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff; 1464cabdff1aSopenharmony_ci dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff; 1465cabdff1aSopenharmony_ci } 1466cabdff1aSopenharmony_ci } 1467cabdff1aSopenharmony_ci 1468cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1469cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1470cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1471cabdff1aSopenharmony_ci 1472cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1473cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1474cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1475cabdff1aSopenharmony_ci dst_r[x] = get_bits(gb, 10); 1476cabdff1aSopenharmony_ci dst_g[x] = get_bits(gb, 10); 1477cabdff1aSopenharmony_ci dst_b[x] = get_bits(gb, 10); 1478cabdff1aSopenharmony_ci } 1479cabdff1aSopenharmony_ci } else { 1480cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1481cabdff1aSopenharmony_ci int r, g, b; 1482cabdff1aSopenharmony_ci 1483cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2]; 1484cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2]; 1485cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2]; 1486cabdff1aSopenharmony_ci 1487cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1488cabdff1aSopenharmony_ci pred_T[0] = dst_r[-p->linesize[2] / 2 + x]; 1489cabdff1aSopenharmony_ci pred_T[1] = dst_g[-p->linesize[0] / 2 + x]; 1490cabdff1aSopenharmony_ci pred_T[2] = dst_b[-p->linesize[1] / 2 + x]; 1491cabdff1aSopenharmony_ci 1492cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1493cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1494cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1495cabdff1aSopenharmony_ci 1496cabdff1aSopenharmony_ci dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff; 1497cabdff1aSopenharmony_ci dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff; 1498cabdff1aSopenharmony_ci dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff; 1499cabdff1aSopenharmony_ci 1500cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1501cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1502cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1503cabdff1aSopenharmony_ci } 1504cabdff1aSopenharmony_ci } 1505cabdff1aSopenharmony_ci 1506cabdff1aSopenharmony_ci dst_r += p->linesize[2] / 2; 1507cabdff1aSopenharmony_ci dst_g += p->linesize[0] / 2; 1508cabdff1aSopenharmony_ci dst_b += p->linesize[1] / 2; 1509cabdff1aSopenharmony_ci } 1510cabdff1aSopenharmony_ci} 1511cabdff1aSopenharmony_ci 1512cabdff1aSopenharmony_cistatic void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1513cabdff1aSopenharmony_ci{ 1514cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1515cabdff1aSopenharmony_ci uint8_t *dst; 1516cabdff1aSopenharmony_ci int x, y; 1517cabdff1aSopenharmony_ci 1518cabdff1aSopenharmony_ci dst = p->data[0]; 1519cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1520cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1521cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1522cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1523cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1524cabdff1aSopenharmony_ci dst[x * 4 + 3] = get_bits(gb, 8); 1525cabdff1aSopenharmony_ci } 1526cabdff1aSopenharmony_ci } else { 1527cabdff1aSopenharmony_ci int pred[4] = { -128, -128, -128, -128 }; 1528cabdff1aSopenharmony_ci 1529cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1530cabdff1aSopenharmony_ci int a, r, g, b; 1531cabdff1aSopenharmony_ci 1532cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1533cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1534cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1535cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1536cabdff1aSopenharmony_ci 1537cabdff1aSopenharmony_ci dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff; 1538cabdff1aSopenharmony_ci dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff; 1539cabdff1aSopenharmony_ci dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff; 1540cabdff1aSopenharmony_ci dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff; 1541cabdff1aSopenharmony_ci } 1542cabdff1aSopenharmony_ci } 1543cabdff1aSopenharmony_ci 1544cabdff1aSopenharmony_ci dst += p->linesize[0]; 1545cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1546cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1547cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1548cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1549cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1550cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1551cabdff1aSopenharmony_ci dst[x * 4 + 3] = get_bits(gb, 8); 1552cabdff1aSopenharmony_ci } 1553cabdff1aSopenharmony_ci } else { 1554cabdff1aSopenharmony_ci int pred_L[4]; 1555cabdff1aSopenharmony_ci int a, r, g, b; 1556cabdff1aSopenharmony_ci 1557cabdff1aSopenharmony_ci pred_L[0] = dst[-p->linesize[0] + 0]; 1558cabdff1aSopenharmony_ci pred_L[1] = dst[-p->linesize[0] + 1]; 1559cabdff1aSopenharmony_ci pred_L[2] = dst[-p->linesize[0] + 2]; 1560cabdff1aSopenharmony_ci pred_L[3] = dst[-p->linesize[0] + 3]; 1561cabdff1aSopenharmony_ci 1562cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1563cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1564cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1565cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1566cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1567cabdff1aSopenharmony_ci 1568cabdff1aSopenharmony_ci dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff; 1569cabdff1aSopenharmony_ci dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff; 1570cabdff1aSopenharmony_ci dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff; 1571cabdff1aSopenharmony_ci dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff; 1572cabdff1aSopenharmony_ci } 1573cabdff1aSopenharmony_ci } 1574cabdff1aSopenharmony_ci dst += p->linesize[0]; 1575cabdff1aSopenharmony_ci } 1576cabdff1aSopenharmony_ci} 1577cabdff1aSopenharmony_ci 1578cabdff1aSopenharmony_cistatic void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1579cabdff1aSopenharmony_ci{ 1580cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1581cabdff1aSopenharmony_ci uint8_t *dst; 1582cabdff1aSopenharmony_ci int x, y; 1583cabdff1aSopenharmony_ci 1584cabdff1aSopenharmony_ci dst = p->data[0]; 1585cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1586cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1587cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1588cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1589cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1590cabdff1aSopenharmony_ci dst[x * 4 + 3] = get_bits(gb, 8); 1591cabdff1aSopenharmony_ci } 1592cabdff1aSopenharmony_ci } else { 1593cabdff1aSopenharmony_ci int pred[4] = { -128, -128, -128, -128 }; 1594cabdff1aSopenharmony_ci 1595cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1596cabdff1aSopenharmony_ci int a, r, g, b; 1597cabdff1aSopenharmony_ci 1598cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1599cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1600cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1601cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1602cabdff1aSopenharmony_ci 1603cabdff1aSopenharmony_ci dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff; 1604cabdff1aSopenharmony_ci dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff; 1605cabdff1aSopenharmony_ci dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff; 1606cabdff1aSopenharmony_ci dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff; 1607cabdff1aSopenharmony_ci } 1608cabdff1aSopenharmony_ci } 1609cabdff1aSopenharmony_ci 1610cabdff1aSopenharmony_ci dst += p->linesize[0]; 1611cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1612cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1613cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1614cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1615cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1616cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1617cabdff1aSopenharmony_ci dst[x * 4 + 3] = get_bits(gb, 8); 1618cabdff1aSopenharmony_ci } 1619cabdff1aSopenharmony_ci } else { 1620cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1621cabdff1aSopenharmony_ci int a, r, g, b; 1622cabdff1aSopenharmony_ci 1623cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0]; 1624cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1]; 1625cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2]; 1626cabdff1aSopenharmony_ci pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3]; 1627cabdff1aSopenharmony_ci 1628cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1629cabdff1aSopenharmony_ci pred_T[0] = dst[-p->linesize[0] + 4 * x + 0]; 1630cabdff1aSopenharmony_ci pred_T[1] = dst[-p->linesize[0] + 4 * x + 1]; 1631cabdff1aSopenharmony_ci pred_T[2] = dst[-p->linesize[0] + 4 * x + 2]; 1632cabdff1aSopenharmony_ci pred_T[3] = dst[-p->linesize[0] + 4 * x + 3]; 1633cabdff1aSopenharmony_ci 1634cabdff1aSopenharmony_ci a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1635cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1636cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1637cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1638cabdff1aSopenharmony_ci 1639cabdff1aSopenharmony_ci dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 1640cabdff1aSopenharmony_ci dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff; 1641cabdff1aSopenharmony_ci dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff; 1642cabdff1aSopenharmony_ci dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff; 1643cabdff1aSopenharmony_ci 1644cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1645cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1646cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1647cabdff1aSopenharmony_ci pred_TL[3] = pred_T[3]; 1648cabdff1aSopenharmony_ci } 1649cabdff1aSopenharmony_ci } 1650cabdff1aSopenharmony_ci dst += p->linesize[0]; 1651cabdff1aSopenharmony_ci } 1652cabdff1aSopenharmony_ci} 1653cabdff1aSopenharmony_ci 1654cabdff1aSopenharmony_cistatic void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1655cabdff1aSopenharmony_ci{ 1656cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1657cabdff1aSopenharmony_ci uint8_t *dst; 1658cabdff1aSopenharmony_ci int x, y; 1659cabdff1aSopenharmony_ci 1660cabdff1aSopenharmony_ci dst = p->data[0]; 1661cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1662cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1663cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1664cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1665cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1666cabdff1aSopenharmony_ci } 1667cabdff1aSopenharmony_ci } else { 1668cabdff1aSopenharmony_ci int pred[4] = { -128, -128, -128, -128 }; 1669cabdff1aSopenharmony_ci 1670cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1671cabdff1aSopenharmony_ci int r, g, b; 1672cabdff1aSopenharmony_ci 1673cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1674cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1675cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1676cabdff1aSopenharmony_ci 1677cabdff1aSopenharmony_ci dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff; 1678cabdff1aSopenharmony_ci dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff; 1679cabdff1aSopenharmony_ci dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff; 1680cabdff1aSopenharmony_ci } 1681cabdff1aSopenharmony_ci } 1682cabdff1aSopenharmony_ci 1683cabdff1aSopenharmony_ci dst += p->linesize[0]; 1684cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1685cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1686cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1687cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1688cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1689cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1690cabdff1aSopenharmony_ci } 1691cabdff1aSopenharmony_ci } else { 1692cabdff1aSopenharmony_ci int pred_L[4]; 1693cabdff1aSopenharmony_ci int r, g, b; 1694cabdff1aSopenharmony_ci 1695cabdff1aSopenharmony_ci pred_L[0] = dst[-p->linesize[0] + 0]; 1696cabdff1aSopenharmony_ci pred_L[1] = dst[-p->linesize[0] + 1]; 1697cabdff1aSopenharmony_ci pred_L[2] = dst[-p->linesize[0] + 2]; 1698cabdff1aSopenharmony_ci 1699cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1700cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1701cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1702cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1703cabdff1aSopenharmony_ci 1704cabdff1aSopenharmony_ci dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff; 1705cabdff1aSopenharmony_ci dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff; 1706cabdff1aSopenharmony_ci dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff; 1707cabdff1aSopenharmony_ci } 1708cabdff1aSopenharmony_ci } 1709cabdff1aSopenharmony_ci dst += p->linesize[0]; 1710cabdff1aSopenharmony_ci } 1711cabdff1aSopenharmony_ci} 1712cabdff1aSopenharmony_ci 1713cabdff1aSopenharmony_cistatic void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) 1714cabdff1aSopenharmony_ci{ 1715cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1716cabdff1aSopenharmony_ci uint8_t *dst; 1717cabdff1aSopenharmony_ci int x, y; 1718cabdff1aSopenharmony_ci 1719cabdff1aSopenharmony_ci dst = p->data[0]; 1720cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1721cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1722cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1723cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1724cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1725cabdff1aSopenharmony_ci } 1726cabdff1aSopenharmony_ci } else { 1727cabdff1aSopenharmony_ci int pred[4] = { -128, -128, -128, -128 }; 1728cabdff1aSopenharmony_ci 1729cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1730cabdff1aSopenharmony_ci int r, g, b; 1731cabdff1aSopenharmony_ci 1732cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1733cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1734cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1735cabdff1aSopenharmony_ci 1736cabdff1aSopenharmony_ci dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff; 1737cabdff1aSopenharmony_ci dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff; 1738cabdff1aSopenharmony_ci dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff; 1739cabdff1aSopenharmony_ci } 1740cabdff1aSopenharmony_ci } 1741cabdff1aSopenharmony_ci 1742cabdff1aSopenharmony_ci dst += p->linesize[0]; 1743cabdff1aSopenharmony_ci for (y = 1; y < avctx->height; y++) { 1744cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1745cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1746cabdff1aSopenharmony_ci dst[x * 4 + 0] = get_bits(gb, 8); 1747cabdff1aSopenharmony_ci dst[x * 4 + 1] = get_bits(gb, 8); 1748cabdff1aSopenharmony_ci dst[x * 4 + 2] = get_bits(gb, 8); 1749cabdff1aSopenharmony_ci } 1750cabdff1aSopenharmony_ci } else { 1751cabdff1aSopenharmony_ci int pred_TL[4], pred_L[4], pred_T[4]; 1752cabdff1aSopenharmony_ci int r, g, b; 1753cabdff1aSopenharmony_ci 1754cabdff1aSopenharmony_ci pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0]; 1755cabdff1aSopenharmony_ci pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1]; 1756cabdff1aSopenharmony_ci pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2]; 1757cabdff1aSopenharmony_ci 1758cabdff1aSopenharmony_ci for (x = 0; x < avctx->width; x++) { 1759cabdff1aSopenharmony_ci pred_T[0] = dst[-p->linesize[0] + 4 * x + 0]; 1760cabdff1aSopenharmony_ci pred_T[1] = dst[-p->linesize[0] + 4 * x + 1]; 1761cabdff1aSopenharmony_ci pred_T[2] = dst[-p->linesize[0] + 4 * x + 2]; 1762cabdff1aSopenharmony_ci 1763cabdff1aSopenharmony_ci r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2); 1764cabdff1aSopenharmony_ci g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1765cabdff1aSopenharmony_ci b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2); 1766cabdff1aSopenharmony_ci 1767cabdff1aSopenharmony_ci dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff; 1768cabdff1aSopenharmony_ci dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff; 1769cabdff1aSopenharmony_ci dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff; 1770cabdff1aSopenharmony_ci 1771cabdff1aSopenharmony_ci pred_TL[0] = pred_T[0]; 1772cabdff1aSopenharmony_ci pred_TL[1] = pred_T[1]; 1773cabdff1aSopenharmony_ci pred_TL[2] = pred_T[2]; 1774cabdff1aSopenharmony_ci } 1775cabdff1aSopenharmony_ci } 1776cabdff1aSopenharmony_ci dst += p->linesize[0]; 1777cabdff1aSopenharmony_ci } 1778cabdff1aSopenharmony_ci} 1779cabdff1aSopenharmony_ci 1780cabdff1aSopenharmony_cistatic av_cold int build_vlc(VLC *vlc, const SheerTable *table) 1781cabdff1aSopenharmony_ci{ 1782cabdff1aSopenharmony_ci const uint8_t *cur = table->lens; 1783cabdff1aSopenharmony_ci uint8_t lens[1024]; 1784cabdff1aSopenharmony_ci unsigned count = 0; 1785cabdff1aSopenharmony_ci 1786cabdff1aSopenharmony_ci for (int step = 1, len = 1; len > 0; len += step) { 1787cabdff1aSopenharmony_ci unsigned new_count = count; 1788cabdff1aSopenharmony_ci 1789cabdff1aSopenharmony_ci if (len == 16) { 1790cabdff1aSopenharmony_ci new_count += table->nb_16s; 1791cabdff1aSopenharmony_ci step = -1; 1792cabdff1aSopenharmony_ci } else 1793cabdff1aSopenharmony_ci new_count += *cur++; 1794cabdff1aSopenharmony_ci 1795cabdff1aSopenharmony_ci for (; count < new_count; count++) 1796cabdff1aSopenharmony_ci lens[count] = len; 1797cabdff1aSopenharmony_ci } 1798cabdff1aSopenharmony_ci 1799cabdff1aSopenharmony_ci ff_free_vlc(vlc); 1800cabdff1aSopenharmony_ci return ff_init_vlc_from_lengths(vlc, SHEER_VLC_BITS, count, 1801cabdff1aSopenharmony_ci lens, sizeof(*lens), NULL, 0, 0, 0, 0, NULL); 1802cabdff1aSopenharmony_ci} 1803cabdff1aSopenharmony_ci 1804cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *p, 1805cabdff1aSopenharmony_ci int *got_frame, AVPacket *avpkt) 1806cabdff1aSopenharmony_ci{ 1807cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1808cabdff1aSopenharmony_ci const SheerTable *table; 1809cabdff1aSopenharmony_ci GetBitContext gb; 1810cabdff1aSopenharmony_ci unsigned format; 1811cabdff1aSopenharmony_ci int ret; 1812cabdff1aSopenharmony_ci 1813cabdff1aSopenharmony_ci if (avpkt->size <= 20) 1814cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1815cabdff1aSopenharmony_ci 1816cabdff1aSopenharmony_ci if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') && 1817cabdff1aSopenharmony_ci AV_RL32(avpkt->data) != MKTAG('Z','w','a','k')) 1818cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1819cabdff1aSopenharmony_ci 1820cabdff1aSopenharmony_ci s->alt = 0; 1821cabdff1aSopenharmony_ci format = AV_RL32(avpkt->data + 16); 1822cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "format: %s\n", av_fourcc2str(format)); 1823cabdff1aSopenharmony_ci switch (format) { 1824cabdff1aSopenharmony_ci case MKTAG(' ', 'R', 'G', 'B'): 1825cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_RGB0; 1826cabdff1aSopenharmony_ci s->decode_frame = decode_rgb; 1827cabdff1aSopenharmony_ci table = rgb; 1828cabdff1aSopenharmony_ci break; 1829cabdff1aSopenharmony_ci case MKTAG(' ', 'r', 'G', 'B'): 1830cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_RGB0; 1831cabdff1aSopenharmony_ci s->decode_frame = decode_rgbi; 1832cabdff1aSopenharmony_ci table = rgbi; 1833cabdff1aSopenharmony_ci break; 1834cabdff1aSopenharmony_ci case MKTAG('A', 'R', 'G', 'X'): 1835cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_GBRAP10; 1836cabdff1aSopenharmony_ci s->decode_frame = decode_argx; 1837cabdff1aSopenharmony_ci table = rgbx; 1838cabdff1aSopenharmony_ci break; 1839cabdff1aSopenharmony_ci case MKTAG('A', 'r', 'G', 'X'): 1840cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_GBRAP10; 1841cabdff1aSopenharmony_ci s->decode_frame = decode_argxi; 1842cabdff1aSopenharmony_ci table = rgbxi; 1843cabdff1aSopenharmony_ci break; 1844cabdff1aSopenharmony_ci case MKTAG('R', 'G', 'B', 'X'): 1845cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_GBRP10; 1846cabdff1aSopenharmony_ci s->decode_frame = decode_rgbx; 1847cabdff1aSopenharmony_ci table = rgbx; 1848cabdff1aSopenharmony_ci break; 1849cabdff1aSopenharmony_ci case MKTAG('r', 'G', 'B', 'X'): 1850cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_GBRP10; 1851cabdff1aSopenharmony_ci s->decode_frame = decode_rgbxi; 1852cabdff1aSopenharmony_ci table = rgbxi; 1853cabdff1aSopenharmony_ci break; 1854cabdff1aSopenharmony_ci case MKTAG('A', 'R', 'G', 'B'): 1855cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_ARGB; 1856cabdff1aSopenharmony_ci s->decode_frame = decode_argb; 1857cabdff1aSopenharmony_ci table = rgb; 1858cabdff1aSopenharmony_ci break; 1859cabdff1aSopenharmony_ci case MKTAG('A', 'r', 'G', 'B'): 1860cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_ARGB; 1861cabdff1aSopenharmony_ci s->decode_frame = decode_argbi; 1862cabdff1aSopenharmony_ci table = rgbi; 1863cabdff1aSopenharmony_ci break; 1864cabdff1aSopenharmony_ci case MKTAG('A', 'Y', 'B', 'R'): 1865cabdff1aSopenharmony_ci s->alt = 1; 1866cabdff1aSopenharmony_ci case MKTAG('A', 'Y', 'b', 'R'): 1867cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA444P; 1868cabdff1aSopenharmony_ci s->decode_frame = decode_aybr; 1869cabdff1aSopenharmony_ci table = ybr; 1870cabdff1aSopenharmony_ci break; 1871cabdff1aSopenharmony_ci case MKTAG('A', 'y', 'B', 'R'): 1872cabdff1aSopenharmony_ci s->alt = 1; 1873cabdff1aSopenharmony_ci case MKTAG('A', 'y', 'b', 'R'): 1874cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA444P; 1875cabdff1aSopenharmony_ci s->decode_frame = decode_aybri; 1876cabdff1aSopenharmony_ci table = ybri; 1877cabdff1aSopenharmony_ci break; 1878cabdff1aSopenharmony_ci case MKTAG(' ', 'Y', 'B', 'R'): 1879cabdff1aSopenharmony_ci s->alt = 1; 1880cabdff1aSopenharmony_ci case MKTAG(' ', 'Y', 'b', 'R'): 1881cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV444P; 1882cabdff1aSopenharmony_ci s->decode_frame = decode_ybr; 1883cabdff1aSopenharmony_ci table = ybr; 1884cabdff1aSopenharmony_ci break; 1885cabdff1aSopenharmony_ci case MKTAG(' ', 'y', 'B', 'R'): 1886cabdff1aSopenharmony_ci s->alt = 1; 1887cabdff1aSopenharmony_ci case MKTAG(' ', 'y', 'b', 'R'): 1888cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV444P; 1889cabdff1aSopenharmony_ci s->decode_frame = decode_ybri; 1890cabdff1aSopenharmony_ci table = ybri; 1891cabdff1aSopenharmony_ci break; 1892cabdff1aSopenharmony_ci case MKTAG('Y', 'B', 'R', 0x0a): 1893cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV444P10; 1894cabdff1aSopenharmony_ci s->decode_frame = decode_ybr10; 1895cabdff1aSopenharmony_ci table = ybr10; 1896cabdff1aSopenharmony_ci break; 1897cabdff1aSopenharmony_ci case MKTAG('y', 'B', 'R', 0x0a): 1898cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV444P10; 1899cabdff1aSopenharmony_ci s->decode_frame = decode_ybr10i; 1900cabdff1aSopenharmony_ci table = ybr10i; 1901cabdff1aSopenharmony_ci break; 1902cabdff1aSopenharmony_ci case MKTAG('C', 'A', '4', 'p'): 1903cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA444P10; 1904cabdff1aSopenharmony_ci s->decode_frame = decode_ca4p; 1905cabdff1aSopenharmony_ci table = ybr10; 1906cabdff1aSopenharmony_ci break; 1907cabdff1aSopenharmony_ci case MKTAG('C', 'A', '4', 'i'): 1908cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA444P10; 1909cabdff1aSopenharmony_ci s->decode_frame = decode_ca4i; 1910cabdff1aSopenharmony_ci table = ybr10i; 1911cabdff1aSopenharmony_ci break; 1912cabdff1aSopenharmony_ci case MKTAG('B', 'Y', 'R', 'Y'): 1913cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV422P; 1914cabdff1aSopenharmony_ci s->decode_frame = decode_byry; 1915cabdff1aSopenharmony_ci table = byry; 1916cabdff1aSopenharmony_ci break; 1917cabdff1aSopenharmony_ci case MKTAG('B', 'Y', 'R', 'y'): 1918cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV422P; 1919cabdff1aSopenharmony_ci s->decode_frame = decode_byryi; 1920cabdff1aSopenharmony_ci table = byryi; 1921cabdff1aSopenharmony_ci break; 1922cabdff1aSopenharmony_ci case MKTAG('Y', 'b', 'Y', 'r'): 1923cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV422P; 1924cabdff1aSopenharmony_ci s->decode_frame = decode_ybyr; 1925cabdff1aSopenharmony_ci table = ybyr; 1926cabdff1aSopenharmony_ci break; 1927cabdff1aSopenharmony_ci case MKTAG('C', '8', '2', 'p'): 1928cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA422P; 1929cabdff1aSopenharmony_ci s->decode_frame = decode_c82p; 1930cabdff1aSopenharmony_ci table = byry; 1931cabdff1aSopenharmony_ci break; 1932cabdff1aSopenharmony_ci case MKTAG('C', '8', '2', 'i'): 1933cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA422P; 1934cabdff1aSopenharmony_ci s->decode_frame = decode_c82i; 1935cabdff1aSopenharmony_ci table = byryi; 1936cabdff1aSopenharmony_ci break; 1937cabdff1aSopenharmony_ci case MKTAG(0xa2, 'Y', 'R', 'Y'): 1938cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV422P10; 1939cabdff1aSopenharmony_ci s->decode_frame = decode_yry10; 1940cabdff1aSopenharmony_ci table = yry10; 1941cabdff1aSopenharmony_ci break; 1942cabdff1aSopenharmony_ci case MKTAG(0xa2, 'Y', 'R', 'y'): 1943cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUV422P10; 1944cabdff1aSopenharmony_ci s->decode_frame = decode_yry10i; 1945cabdff1aSopenharmony_ci table = yry10i; 1946cabdff1aSopenharmony_ci break; 1947cabdff1aSopenharmony_ci case MKTAG('C', 'A', '2', 'p'): 1948cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA422P10; 1949cabdff1aSopenharmony_ci s->decode_frame = decode_ca2p; 1950cabdff1aSopenharmony_ci table = yry10; 1951cabdff1aSopenharmony_ci break; 1952cabdff1aSopenharmony_ci case MKTAG('C', 'A', '2', 'i'): 1953cabdff1aSopenharmony_ci avctx->pix_fmt = AV_PIX_FMT_YUVA422P10; 1954cabdff1aSopenharmony_ci s->decode_frame = decode_ca2i; 1955cabdff1aSopenharmony_ci table = yry10i; 1956cabdff1aSopenharmony_ci break; 1957cabdff1aSopenharmony_ci default: 1958cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "unsupported format: 0x%X", format); 1959cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1960cabdff1aSopenharmony_ci } 1961cabdff1aSopenharmony_ci 1962cabdff1aSopenharmony_ci if (s->format != format) { 1963cabdff1aSopenharmony_ci if ((ret = build_vlc(&s->vlc[0], &table[0])) < 0 || 1964cabdff1aSopenharmony_ci (ret = build_vlc(&s->vlc[1], &table[1])) < 0) { 1965cabdff1aSopenharmony_ci s->format = 0; 1966cabdff1aSopenharmony_ci return ret; 1967cabdff1aSopenharmony_ci } 1968cabdff1aSopenharmony_ci s->format = format; 1969cabdff1aSopenharmony_ci } 1970cabdff1aSopenharmony_ci if (avpkt->size < 20 + avctx->width * avctx->height / 16) { 1971cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Input packet too small\n"); 1972cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1973cabdff1aSopenharmony_ci } 1974cabdff1aSopenharmony_ci 1975cabdff1aSopenharmony_ci p->pict_type = AV_PICTURE_TYPE_I; 1976cabdff1aSopenharmony_ci p->key_frame = 1; 1977cabdff1aSopenharmony_ci 1978cabdff1aSopenharmony_ci if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) 1979cabdff1aSopenharmony_ci return ret; 1980cabdff1aSopenharmony_ci 1981cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0) 1982cabdff1aSopenharmony_ci return ret; 1983cabdff1aSopenharmony_ci 1984cabdff1aSopenharmony_ci s->decode_frame(avctx, p, &gb); 1985cabdff1aSopenharmony_ci 1986cabdff1aSopenharmony_ci *got_frame = 1; 1987cabdff1aSopenharmony_ci 1988cabdff1aSopenharmony_ci return avpkt->size; 1989cabdff1aSopenharmony_ci} 1990cabdff1aSopenharmony_ci 1991cabdff1aSopenharmony_cistatic av_cold int decode_end(AVCodecContext *avctx) 1992cabdff1aSopenharmony_ci{ 1993cabdff1aSopenharmony_ci SheerVideoContext *s = avctx->priv_data; 1994cabdff1aSopenharmony_ci 1995cabdff1aSopenharmony_ci ff_free_vlc(&s->vlc[0]); 1996cabdff1aSopenharmony_ci ff_free_vlc(&s->vlc[1]); 1997cabdff1aSopenharmony_ci 1998cabdff1aSopenharmony_ci return 0; 1999cabdff1aSopenharmony_ci} 2000cabdff1aSopenharmony_ci 2001cabdff1aSopenharmony_ciconst FFCodec ff_sheervideo_decoder = { 2002cabdff1aSopenharmony_ci .p.name = "sheervideo", 2003cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"), 2004cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 2005cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_SHEERVIDEO, 2006cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, 2007cabdff1aSopenharmony_ci .priv_data_size = sizeof(SheerVideoContext), 2008cabdff1aSopenharmony_ci .close = decode_end, 2009cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 2010cabdff1aSopenharmony_ci}; 2011