2 * Escape 130 video decoder
3 * Copyright (C) 2008 Eli Friedman (eli.friedman <at> gmail.com)
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; 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_freep(&s->old_y_avg);
134 av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
135 return AVERROR(ENOMEM);
138 s->linesize[0] = avctx->width;
140 s->linesize[2] = avctx->width / 2;
143 s->new_u = s->new_y + avctx->width * avctx->height;
144 s->new_v = s->new_u + avctx->width * avctx->height / 4;
146 s->old_u = s->old_y + avctx->width * avctx->height;
147 s->old_v = s->old_u + avctx->width * avctx->height / 4;
148 memset(s->old_y, 0, avctx->width * avctx->height);
149 memset(s->old_u, 0x10, avctx->width * avctx->height / 4);
150 memset(s->old_v, 0x10, avctx->width * avctx->height / 4);
155 static av_cold int escape130_decode_close(AVCodecContext *avctx)
157 Escape130Context *s = avctx->priv_data;
159 av_freep(&s->old_y_avg);
166 static int decode_skip_count(GetBitContext* gb)
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 const uint8_t *buf = avpkt->data;
193 int buf_size = avpkt->size;
194 Escape130Context *s = avctx->priv_data;
199 uint8_t *old_y, *old_cb, *old_cr,
200 *new_y, *new_cb, *new_cr;
201 uint8_t *dstY, *dstU, *dstV;
202 unsigned old_y_stride, old_cb_stride, old_cr_stride,
203 new_y_stride, new_cb_stride, new_cr_stride;
204 unsigned total_blocks = avctx->width * avctx->height / 4,
205 block_index, block_x = 0;
206 unsigned y[4] = { 0 }, cb = 0x10, cr = 0x10;
207 int skip = -1, y_avg = 0, i, j;
208 uint8_t *ya = s->old_y_avg;
210 // first 16 bytes are header; no useful information in here
211 if (buf_size <= 16) {
212 av_log(avctx, AV_LOG_ERROR, "Insufficient frame data\n");
213 return AVERROR_INVALIDDATA;
216 if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
219 init_get_bits(&gb, buf + 16, (buf_size - 16) * 8);
224 new_y_stride = s->linesize[0];
225 new_cb_stride = s->linesize[1];
226 new_cr_stride = s->linesize[2];
230 old_y_stride = s->linesize[0];
231 old_cb_stride = s->linesize[1];
232 old_cr_stride = s->linesize[2];
234 for (block_index = 0; block_index < total_blocks; block_index++) {
235 // Note that this call will make us skip the rest of the blocks
236 // if the frame ends prematurely.
238 skip = decode_skip_count(&gb);
240 av_log(avctx, AV_LOG_ERROR, "Error decoding skip value\n");
241 return AVERROR_INVALIDDATA;
247 y[2] = old_y[old_y_stride];
248 y[3] = old_y[old_y_stride + 1];
253 if (get_bits1(&gb)) {
254 unsigned sign_selector = get_bits(&gb, 6);
255 unsigned difference_selector = get_bits(&gb, 2);
256 y_avg = 2 * get_bits(&gb, 5);
257 for (i = 0; i < 4; i++) {
258 y[i] = av_clip(y_avg + offset_table[difference_selector] *
259 sign_table[sign_selector][i], 0, 63);
261 } else if (get_bits1(&gb)) {
262 if (get_bits1(&gb)) {
263 y_avg = get_bits(&gb, 6);
265 unsigned adjust_index = get_bits(&gb, 3);
266 y_avg = (y_avg + luma_adjust[adjust_index]) & 63;
268 for (i = 0; i < 4; i++)
272 if (get_bits1(&gb)) {
273 if (get_bits1(&gb)) {
274 cb = get_bits(&gb, 5);
275 cr = get_bits(&gb, 5);
277 unsigned adjust_index = get_bits(&gb, 3);
278 cb = (cb + chroma_adjust[0][adjust_index]) & 31;
279 cr = (cr + chroma_adjust[1][adjust_index]) & 31;
287 new_y[new_y_stride] = y[2];
288 new_y[new_y_stride + 1] = y[3];
299 if (block_x * 2 == avctx->width) {
301 old_y += old_y_stride * 2 - avctx->width;
302 old_cb += old_cb_stride - avctx->width / 2;
303 old_cr += old_cr_stride - avctx->width / 2;
304 new_y += new_y_stride * 2 - avctx->width;
305 new_cb += new_cb_stride - avctx->width / 2;
306 new_cr += new_cr_stride - avctx->width / 2;
318 for (j = 0; j < avctx->height; j++) {
319 for (i = 0; i < avctx->width; i++)
320 dstY[i] = new_y[i] << 2;
321 dstY += pic->linesize[0];
322 new_y += new_y_stride;
324 for (j = 0; j < avctx->height / 2; j++) {
325 for (i = 0; i < avctx->width / 2; i++) {
326 dstU[i] = chroma_vals[new_cb[i]];
327 dstV[i] = chroma_vals[new_cr[i]];
329 dstU += pic->linesize[1];
330 dstV += pic->linesize[2];
331 new_cb += new_cb_stride;
332 new_cr += new_cr_stride;
335 ff_dlog(avctx, "Frame data: provided %d bytes, used %d bytes\n",
336 buf_size, get_bits_count(&gb) >> 3);
338 FFSWAP(uint8_t*, s->old_y, s->new_y);
339 FFSWAP(uint8_t*, s->old_u, s->new_u);
340 FFSWAP(uint8_t*, s->old_v, s->new_v);
347 AVCodec ff_escape130_decoder = {
349 .long_name = NULL_IF_CONFIG_SMALL("Escape 130"),
350 .type = AVMEDIA_TYPE_VIDEO,
351 .id = AV_CODEC_ID_ESCAPE130,
352 .priv_data_size = sizeof(Escape130Context),
353 .init = escape130_decode_init,
354 .close = escape130_decode_close,
355 .decode = escape130_decode_frame,
356 .capabilities = AV_CODEC_CAP_DR1,