Mercurial > libavcodec.hg
comparison tmv.c @ 9616:fe6e82906aa8 libavcodec
Add 8088flex TMV video decoder.
Patch by Daniel Verkamp name at drv ... nu.
author | stefano |
---|---|
date | Wed, 06 May 2009 21:57:20 +0000 |
parents | |
children | 041c635d0f69 |
comparison
equal
deleted
inserted
replaced
9615:5b75e6e974c7 | 9616:fe6e82906aa8 |
---|---|
1 /* | |
2 * 8088flex TMV video decoder | |
3 * Copyright (c) 2009 Daniel Verkamp <daniel at drv.nu> | |
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 * 8088flex TMV video decoder | |
24 * @file libavcodec/tmv.c | |
25 * @author Daniel Verkamp | |
26 * @sa http://www.oldskool.org/pc/8088_Corruption | |
27 */ | |
28 | |
29 #include "avcodec.h" | |
30 | |
31 #include "cga_data.h" | |
32 | |
33 typedef struct TMVContext { | |
34 AVFrame pic; | |
35 } TMVContext; | |
36 | |
37 static int tmv_decode_frame(AVCodecContext *avctx, void *data, | |
38 int *data_size, AVPacket *avpkt) | |
39 { | |
40 TMVContext *tmv = avctx->priv_data; | |
41 const uint8_t *src = avpkt->data; | |
42 uint8_t *dst, *dst_char; | |
43 unsigned char_cols = avctx->width >> 3; | |
44 unsigned char_rows = avctx->height >> 3; | |
45 unsigned x, y, mask, char_y, fg, bg, c; | |
46 | |
47 if (tmv->pic.data[0]) | |
48 avctx->release_buffer(avctx, &tmv->pic); | |
49 | |
50 if (avctx->get_buffer(avctx, &tmv->pic) < 0) { | |
51 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
52 return -1; | |
53 } | |
54 | |
55 tmv->pic.pict_type = FF_I_TYPE; | |
56 tmv->pic.key_frame = 1; | |
57 dst = tmv->pic.data[0]; | |
58 | |
59 tmv->pic.palette_has_changed = 1; | |
60 memcpy(tmv->pic.data[1], ff_cga_palette, 16 * 4); | |
61 | |
62 for (y = 0; y < char_rows; y++) { | |
63 for (x = 0; x < char_cols; x++) { | |
64 c = *src++ * 8; | |
65 bg = *src >> 4; | |
66 fg = *src++ & 0xF; | |
67 | |
68 dst_char = dst + x * 8; | |
69 for (char_y = 0; char_y < 8; char_y++) { | |
70 for (mask = 0x80; mask; mask >>= 1) { | |
71 *dst_char++ = ff_cga_font[c + char_y] & mask ? fg : bg; | |
72 } | |
73 dst_char += tmv->pic.linesize[0] - 8; | |
74 } | |
75 } | |
76 dst += tmv->pic.linesize[0] * 8; | |
77 } | |
78 | |
79 *data_size = sizeof(AVFrame); | |
80 *(AVFrame *)data = tmv->pic; | |
81 return avpkt->size; | |
82 } | |
83 | |
84 static av_cold int tmv_decode_close(AVCodecContext *avctx) | |
85 { | |
86 TMVContext *tmv = avctx->priv_data; | |
87 | |
88 if (tmv->pic.data[0]) | |
89 avctx->release_buffer(avctx, &tmv->pic); | |
90 | |
91 return 0; | |
92 } | |
93 | |
94 AVCodec tmv_decoder = { | |
95 .name = "tmv", | |
96 .type = CODEC_TYPE_VIDEO, | |
97 .id = CODEC_ID_TMV, | |
98 .priv_data_size = sizeof(TMVContext), | |
99 .close = tmv_decode_close, | |
100 .decode = tmv_decode_frame, | |
101 .long_name = NULL_IF_CONFIG_SMALL("8088flex TMV"), | |
102 }; |