2 * Escape 130 video decoder
3 * Copyright (C) 2008 Eli Friedman (eli.friedman <at> gmail.com)
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/attributes.h"
23 #include "libavutil/mem.h"
25 #define BITSTREAM_READER_LE
30 typedef struct Escape130Context {
33 uint8_t *new_y, *old_y;
34 uint8_t *new_u, *old_u;
35 uint8_t *new_v, *old_v;
41 static const uint8_t offset_table[] = { 2, 4, 10, 20 };
42 static const int8_t sign_table[64][4] = {
102 static const int8_t luma_adjust[] = { -4, -3, -2, -1, 1, 2, 3, 4 };
104 static const int8_t chroma_adjust[2][8] = {
105 { 1, 1, 0, -1, -1, -1, 0, 1 },
106 { 0, 1, 1, 1, 0, -1, -1, -1 }
109 static const uint8_t chroma_vals[] = {
110 20, 28, 36, 44, 52, 60, 68, 76,
111 84, 92, 100, 106, 112, 116, 120, 124,
112 128, 132, 136, 140, 144, 150, 156, 164,
113 172, 180, 188, 196, 204, 212, 220, 228
116 static av_cold int escape130_decode_init(AVCodecContext *avctx)
118 Escape130Context *s = avctx->priv_data;
119 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
121 if ((avctx->width & 1) || (avctx->height & 1)) {
122 av_log(avctx, AV_LOG_ERROR,
123 "Dimensions should be a multiple of two.\n");
124 return AVERROR_INVALIDDATA;
127 s->old_y_avg = av_malloc(avctx->width * avctx->height / 4);
128 s->buf1 = av_malloc(avctx->width * avctx->height * 3 / 2);
129 s->buf2 = av_malloc(avctx->width * avctx->height * 3 / 2);
130 if (!s->old_y_avg || !s->buf1 || !s->buf2) {
131 av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
132 return AVERROR(ENOMEM);
135 s->linesize[0] = avctx->width;
137 s->linesize[2] = avctx->width / 2;
140 s->new_u = s->new_y + avctx->width * avctx->height;
141 s->new_v = s->new_u + avctx->width * avctx->height / 4;
143 s->old_u = s->old_y + avctx->width * avctx->height;
144 s->old_v = s->old_u + avctx->width * avctx->height / 4;
145 memset(s->old_y, 0, avctx->width * avctx->height);
146 memset(s->old_u, 0x10, avctx->width * avctx->height / 4);
147 memset(s->old_v, 0x10, avctx->width * avctx->height / 4);
152 static av_cold int escape130_decode_close(AVCodecContext *avctx)
154 Escape130Context *s = avctx->priv_data;
156 av_freep(&s->old_y_avg);
163 static int decode_skip_count(GetBitContext* gb)
167 if (get_bits_left(gb) < 1+3)
170 value = get_bits1(gb);
174 value = get_bits(gb, 3);
178 value = get_bits(gb, 8);
182 value = get_bits(gb, 15);
189 static int escape130_decode_frame(AVCodecContext *avctx, void *data,
190 int *got_frame, AVPacket *avpkt)
192 int buf_size = avpkt->size;
193 Escape130Context *s = avctx->priv_data;
198 uint8_t *old_y, *old_cb, *old_cr,
199 *new_y, *new_cb, *new_cr;
200 uint8_t *dstY, *dstU, *dstV;
201 unsigned old_y_stride, old_cb_stride, old_cr_stride,
202 new_y_stride, new_cb_stride, new_cr_stride;
203 unsigned total_blocks = avctx->width * avctx->height / 4,
204 block_index, block_x = 0;
205 unsigned y[4] = { 0 }, cb = 0x10, cr = 0x10;
206 int skip = -1, y_avg = 0, i, j;
207 uint8_t *ya = s->old_y_avg;
209 // first 16 bytes are header; no useful information in here
210 if (buf_size <= 16) {
211 av_log(avctx, AV_LOG_ERROR, "Insufficient frame data\n");
212 return AVERROR_INVALIDDATA;
215 if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
218 if ((ret = init_get_bits8(&gb, avpkt->data, avpkt->size)) < 0)
220 skip_bits_long(&gb, 16 * 8);
225 new_y_stride = s->linesize[0];
226 new_cb_stride = s->linesize[1];
227 new_cr_stride = s->linesize[2];
231 old_y_stride = s->linesize[0];
232 old_cb_stride = s->linesize[1];
233 old_cr_stride = s->linesize[2];
235 for (block_index = 0; block_index < total_blocks; block_index++) {
236 // Note that this call will make us skip the rest of the blocks
237 // if the frame ends prematurely.
239 skip = decode_skip_count(&gb);
241 av_log(avctx, AV_LOG_ERROR, "Error decoding skip value\n");
242 return AVERROR_INVALIDDATA;
248 y[2] = old_y[old_y_stride];
249 y[3] = old_y[old_y_stride + 1];
254 if (get_bits1(&gb)) {
255 unsigned sign_selector = get_bits(&gb, 6);
256 unsigned difference_selector = get_bits(&gb, 2);
257 y_avg = 2 * get_bits(&gb, 5);
258 for (i = 0; i < 4; i++) {
259 y[i] = av_clip(y_avg + offset_table[difference_selector] *
260 sign_table[sign_selector][i], 0, 63);
262 } else if (get_bits1(&gb)) {
263 if (get_bits1(&gb)) {
264 y_avg = get_bits(&gb, 6);
266 unsigned adjust_index = get_bits(&gb, 3);
267 y_avg = (y_avg + luma_adjust[adjust_index]) & 63;
269 for (i = 0; i < 4; i++)
273 if (get_bits1(&gb)) {
274 if (get_bits1(&gb)) {
275 cb = get_bits(&gb, 5);
276 cr = get_bits(&gb, 5);
278 unsigned adjust_index = get_bits(&gb, 3);
279 cb = (cb + chroma_adjust[0][adjust_index]) & 31;
280 cr = (cr + chroma_adjust[1][adjust_index]) & 31;
288 new_y[new_y_stride] = y[2];
289 new_y[new_y_stride + 1] = y[3];
300 if (block_x * 2 == avctx->width) {
302 old_y += old_y_stride * 2 - avctx->width;
303 old_cb += old_cb_stride - avctx->width / 2;
304 old_cr += old_cr_stride - avctx->width / 2;
305 new_y += new_y_stride * 2 - avctx->width;
306 new_cb += new_cb_stride - avctx->width / 2;
307 new_cr += new_cr_stride - avctx->width / 2;
319 for (j = 0; j < avctx->height; j++) {
320 for (i = 0; i < avctx->width; i++)
321 dstY[i] = new_y[i] << 2;
322 dstY += pic->linesize[0];
323 new_y += new_y_stride;
325 for (j = 0; j < avctx->height / 2; j++) {
326 for (i = 0; i < avctx->width / 2; i++) {
327 dstU[i] = chroma_vals[new_cb[i]];
328 dstV[i] = chroma_vals[new_cr[i]];
330 dstU += pic->linesize[1];
331 dstV += pic->linesize[2];
332 new_cb += new_cb_stride;
333 new_cr += new_cr_stride;
336 ff_dlog(avctx, "Frame data: provided %d bytes, used %d bytes\n",
337 buf_size, get_bits_count(&gb) >> 3);
339 FFSWAP(uint8_t*, s->old_y, s->new_y);
340 FFSWAP(uint8_t*, s->old_u, s->new_u);
341 FFSWAP(uint8_t*, s->old_v, s->new_v);
348 AVCodec ff_escape130_decoder = {
350 .long_name = NULL_IF_CONFIG_SMALL("Escape 130"),
351 .type = AVMEDIA_TYPE_VIDEO,
352 .id = AV_CODEC_ID_ESCAPE130,
353 .priv_data_size = sizeof(Escape130Context),
354 .init = escape130_decode_init,
355 .close = escape130_decode_close,
356 .decode = escape130_decode_frame,
357 .capabilities = AV_CODEC_CAP_DR1,
358 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,