1/* 2 * Intel Indeo 2 codec 3 * Copyright (c) 2005 Konstantin Shishkov 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22/** 23 * @file libavcodec/indeo2.c 24 * Intel Indeo 2 decoder. 25 */ 26#define ALT_BITSTREAM_READER_LE 27#include "avcodec.h" 28#include "bitstream.h" 29#include "indeo2data.h" 30 31typedef struct Ir2Context{ 32 AVCodecContext *avctx; 33 AVFrame picture; 34 GetBitContext gb; 35 int decode_delta; 36} Ir2Context; 37 38#define CODE_VLC_BITS 14 39static VLC ir2_vlc; 40 41/* Indeo 2 codes are in range 0x01..0x7F and 0x81..0x90 */ 42static inline int ir2_get_code(GetBitContext *gb) 43{ 44 return get_vlc2(gb, ir2_vlc.table, CODE_VLC_BITS, 1) + 1; 45} 46 47static int ir2_decode_plane(Ir2Context *ctx, int width, int height, uint8_t *dst, int stride, 48 const uint8_t *table) 49{ 50 int i; 51 int j; 52 int out = 0; 53 int c; 54 int t; 55 56 if(width&1) 57 return -1; 58 59 /* first line contain absolute values, other lines contain deltas */ 60 while (out < width){ 61 c = ir2_get_code(&ctx->gb); 62 if(c >= 0x80) { /* we have a run */ 63 c -= 0x7F; 64 if(out + c*2 > width) 65 return -1; 66 for (i = 0; i < c * 2; i++) 67 dst[out++] = 0x80; 68 } else { /* copy two values from table */ 69 dst[out++] = table[c * 2]; 70 dst[out++] = table[(c * 2) + 1]; 71 } 72 } 73 dst += stride; 74 75 for (j = 1; j < height; j++){ 76 out = 0; 77 while (out < width){ 78 c = ir2_get_code(&ctx->gb); 79 if(c >= 0x80) { /* we have a skip */ 80 c -= 0x7F; 81 if(out + c*2 > width) 82 return -1; 83 for (i = 0; i < c * 2; i++) { 84 dst[out] = dst[out - stride]; 85 out++; 86 } 87 } else { /* add two deltas from table */ 88 t = dst[out - stride] + (table[c * 2] - 128); 89 t= av_clip_uint8(t); 90 dst[out] = t; 91 out++; 92 t = dst[out - stride] + (table[(c * 2) + 1] - 128); 93 t= av_clip_uint8(t); 94 dst[out] = t; 95 out++; 96 } 97 } 98 dst += stride; 99 } 100 return 0; 101} 102 103static int ir2_decode_plane_inter(Ir2Context *ctx, int width, int height, uint8_t *dst, int stride, 104 const uint8_t *table) 105{ 106 int j; 107 int out = 0; 108 int c; 109 int t; 110 111 if(width&1) 112 return -1; 113 114 for (j = 0; j < height; j++){ 115 out = 0; 116 while (out < width){ 117 c = ir2_get_code(&ctx->gb); 118 if(c >= 0x80) { /* we have a skip */ 119 c -= 0x7F; 120 out += c * 2; 121 } else { /* add two deltas from table */ 122 t = dst[out] + (((table[c * 2] - 128)*3) >> 2); 123 t= av_clip_uint8(t); 124 dst[out] = t; 125 out++; 126 t = dst[out] + (((table[(c * 2) + 1] - 128)*3) >> 2); 127 t= av_clip_uint8(t); 128 dst[out] = t; 129 out++; 130 } 131 } 132 dst += stride; 133 } 134 return 0; 135} 136 137static int ir2_decode_frame(AVCodecContext *avctx, 138 void *data, int *data_size, 139 const uint8_t *buf, int buf_size) 140{ 141 Ir2Context * const s = avctx->priv_data; 142 AVFrame *picture = data; 143 AVFrame * const p= (AVFrame*)&s->picture; 144 int start; 145 146 if(p->data[0]) 147 avctx->release_buffer(avctx, p); 148 149 p->reference = 1; 150 p->buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; 151 if (avctx->reget_buffer(avctx, p)) { 152 av_log(s->avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); 153 return -1; 154 } 155 156 s->decode_delta = buf[18]; 157 158 /* decide whether frame uses deltas or not */ 159#ifndef ALT_BITSTREAM_READER_LE 160 for (i = 0; i < buf_size; i++) 161 buf[i] = ff_reverse[buf[i]]; 162#endif 163 start = 48; /* hardcoded for now */ 164 165 init_get_bits(&s->gb, buf + start, buf_size - start); 166 167 if (s->decode_delta) { /* intraframe */ 168 ir2_decode_plane(s, avctx->width, avctx->height, 169 s->picture.data[0], s->picture.linesize[0], ir2_luma_table); 170 /* swapped U and V */ 171 ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2, 172 s->picture.data[2], s->picture.linesize[2], ir2_luma_table); 173 ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2, 174 s->picture.data[1], s->picture.linesize[1], ir2_luma_table); 175 } else { /* interframe */ 176 ir2_decode_plane_inter(s, avctx->width, avctx->height, 177 s->picture.data[0], s->picture.linesize[0], ir2_luma_table); 178 /* swapped U and V */ 179 ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2, 180 s->picture.data[2], s->picture.linesize[2], ir2_luma_table); 181 ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2, 182 s->picture.data[1], s->picture.linesize[1], ir2_luma_table); 183 } 184 185 *picture= *(AVFrame*)&s->picture; 186 *data_size = sizeof(AVPicture); 187 188 return buf_size; 189} 190 191static av_cold int ir2_decode_init(AVCodecContext *avctx){ 192 Ir2Context * const ic = avctx->priv_data; 193 194 ic->avctx = avctx; 195 196 avctx->pix_fmt= PIX_FMT_YUV410P; 197 198 if (!ir2_vlc.table) 199#ifdef ALT_BITSTREAM_READER_LE 200 init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, 201 &ir2_codes[0][1], 4, 2, 202 &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC | INIT_VLC_LE); 203#else 204 init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, 205 &ir2_codes[0][1], 4, 2, 206 &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC); 207#endif 208 209 return 0; 210} 211 212AVCodec indeo2_decoder = { 213 "indeo2", 214 CODEC_TYPE_VIDEO, 215 CODEC_ID_INDEO2, 216 sizeof(Ir2Context), 217 ir2_decode_init, 218 NULL, 219 NULL, 220 ir2_decode_frame, 221 CODEC_CAP_DR1, 222 .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo 2"), 223}; 224