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
29 typedef struct Escape130Context {
32 uint8_t *new_y, *old_y;
33 uint8_t *new_u, *old_u;
34 uint8_t *new_v, *old_v;
40 static const uint8_t offset_table[] = { 2, 4, 10, 20 };
41 static const int8_t sign_table[64][4] = {
101 static const int8_t luma_adjust[] = { -4, -3, -2, -1, 1, 2, 3, 4 };
103 static const int8_t chroma_adjust[2][8] = {
104 { 1, 1, 0, -1, -1, -1, 0, 1 },
105 { 0, 1, 1, 1, 0, -1, -1, -1 }
108 const uint8_t chroma_vals[] = {
109 20, 28, 36, 44, 52, 60, 68, 76,
110 84, 92, 100, 106, 112, 116, 120, 124,
111 128, 132, 136, 140, 144, 150, 156, 164,
112 172, 180, 188, 196, 204, 212, 220, 228
115 static av_cold int escape130_decode_init(AVCodecContext *avctx)
117 Escape130Context *s = avctx->priv_data;
118 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
120 if ((avctx->width & 1) || (avctx->height & 1)) {
121 av_log(avctx, AV_LOG_ERROR,
122 "Dimensions should be a multiple of two.\n");
123 return AVERROR_INVALIDDATA;
126 s->old_y_avg = av_malloc(avctx->width * avctx->height / 4);
127 s->buf1 = av_malloc(avctx->width * avctx->height * 3 / 2);
128 s->buf2 = av_malloc(avctx->width * avctx->height * 3 / 2);
129 if (!s->old_y_avg || !s->buf1 || !s->buf2) {
130 av_freep(&s->old_y_avg);
133 av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
134 return AVERROR(ENOMEM);
137 s->linesize[0] = avctx->width;
139 s->linesize[2] = avctx->width / 2;
142 s->new_u = s->new_y + avctx->width * avctx->height;
143 s->new_v = s->new_u + avctx->width * avctx->height / 4;
145 s->old_u = s->old_y + avctx->width * avctx->height;
146 s->old_v = s->old_u + avctx->width * avctx->height / 4;
147 memset(s->old_y, 0, avctx->width * avctx->height);
148 memset(s->old_u, 0x10, avctx->width * avctx->height / 4);
149 memset(s->old_v, 0x10, avctx->width * avctx->height / 4);
154 static av_cold int escape130_decode_close(AVCodecContext *avctx)
156 Escape130Context *s = avctx->priv_data;
158 av_freep(&s->old_y_avg);
165 static int decode_skip_count(GetBitContext* gb)
169 if (get_bits_left(gb) < 1+3)
172 value = get_bits1(gb);
176 value = get_bits(gb, 3);
180 value = get_bits(gb, 8);
184 value = get_bits(gb, 15);
191 static int escape130_decode_frame(AVCodecContext *avctx, void *data,
192 int *got_frame, AVPacket *avpkt)
194 const uint8_t *buf = avpkt->data;
195 int buf_size = avpkt->size;
196 Escape130Context *s = avctx->priv_data;
201 uint8_t *old_y, *old_cb, *old_cr,
202 *new_y, *new_cb, *new_cr;
203 uint8_t *dstY, *dstU, *dstV;
204 unsigned old_y_stride, old_cb_stride, old_cr_stride,
205 new_y_stride, new_cb_stride, new_cr_stride;
206 unsigned total_blocks = avctx->width * avctx->height / 4,
207 block_index, block_x = 0;
208 unsigned y[4] = { 0 }, cb = 0x10, cr = 0x10;
209 int skip = -1, y_avg = 0, i, j;
210 uint8_t *ya = s->old_y_avg;
212 // first 16 bytes are header; no useful information in here
213 if (buf_size <= 16) {
214 av_log(avctx, AV_LOG_ERROR, "Insufficient frame data\n");
215 return AVERROR_INVALIDDATA;
218 if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
221 init_get_bits(&gb, buf + 16, (buf_size - 16) * 8);
226 new_y_stride = s->linesize[0];
227 new_cb_stride = s->linesize[1];
228 new_cr_stride = s->linesize[2];
232 old_y_stride = s->linesize[0];
233 old_cb_stride = s->linesize[1];
234 old_cr_stride = s->linesize[2];
236 for (block_index = 0; block_index < total_blocks; block_index++) {
237 // Note that this call will make us skip the rest of the blocks
238 // if the frame ends prematurely.
240 skip = decode_skip_count(&gb);
242 av_log(avctx, AV_LOG_ERROR, "Error decoding skip value\n");
243 return AVERROR_INVALIDDATA;
249 y[2] = old_y[old_y_stride];
250 y[3] = old_y[old_y_stride + 1];
255 if (get_bits1(&gb)) {
256 unsigned sign_selector = get_bits(&gb, 6);
257 unsigned difference_selector = get_bits(&gb, 2);
258 y_avg = 2 * get_bits(&gb, 5);
259 for (i = 0; i < 4; i++) {
260 y[i] = av_clip(y_avg + offset_table[difference_selector] *
261 sign_table[sign_selector][i], 0, 63);
263 } else if (get_bits1(&gb)) {
264 if (get_bits1(&gb)) {
265 y_avg = get_bits(&gb, 6);
267 unsigned adjust_index = get_bits(&gb, 3);
268 y_avg = (y_avg + luma_adjust[adjust_index]) & 63;
270 for (i = 0; i < 4; i++)
274 if (get_bits1(&gb)) {
275 if (get_bits1(&gb)) {
276 cb = get_bits(&gb, 5);
277 cr = get_bits(&gb, 5);
279 unsigned adjust_index = get_bits(&gb, 3);
280 cb = (cb + chroma_adjust[0][adjust_index]) & 31;
281 cr = (cr + chroma_adjust[1][adjust_index]) & 31;
289 new_y[new_y_stride] = y[2];
290 new_y[new_y_stride + 1] = y[3];
301 if (block_x * 2 == avctx->width) {
303 old_y += old_y_stride * 2 - avctx->width;
304 old_cb += old_cb_stride - avctx->width / 2;
305 old_cr += old_cr_stride - avctx->width / 2;
306 new_y += new_y_stride * 2 - avctx->width;
307 new_cb += new_cb_stride - avctx->width / 2;
308 new_cr += new_cr_stride - avctx->width / 2;
320 for (j = 0; j < avctx->height; j++) {
321 for (i = 0; i < avctx->width; i++)
322 dstY[i] = new_y[i] << 2;
323 dstY += pic->linesize[0];
324 new_y += new_y_stride;
326 for (j = 0; j < avctx->height / 2; j++) {
327 for (i = 0; i < avctx->width / 2; i++) {
328 dstU[i] = chroma_vals[new_cb[i]];
329 dstV[i] = chroma_vals[new_cr[i]];
331 dstU += pic->linesize[1];
332 dstV += pic->linesize[2];
333 new_cb += new_cb_stride;
334 new_cr += new_cr_stride;
337 av_dlog(avctx, "Frame data: provided %d bytes, used %d bytes\n",
338 buf_size, get_bits_count(&gb) >> 3);
340 FFSWAP(uint8_t*, s->old_y, s->new_y);
341 FFSWAP(uint8_t*, s->old_u, s->new_u);
342 FFSWAP(uint8_t*, s->old_v, s->new_v);
349 AVCodec ff_escape130_decoder = {
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 = CODEC_CAP_DR1,
358 .long_name = NULL_IF_CONFIG_SMALL("Escape 130"),