annotate ansi.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents fb2f04f70afe
children a08f20066719
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12186
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
1 /*
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
2 * ASCII/ANSI art decoder
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
3 * Copyright (c) 2010 Peter Ross <pross@xvid.org>
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
4 *
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
5 * This file is part of FFmpeg.
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
6 *
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
11 *
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
15 * Lesser General Public License for more details.
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
16 *
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
20 */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
21
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
22 /**
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
23 * @file
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
24 * ASCII/ANSI art decoder
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
25 */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
26
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
27 #include "avcodec.h"
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
28 #include "cga_data.h"
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
29 #include <libavutil/lfg.h>
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
30
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
31 #define ATTR_BOLD 0x01 /** Bold/Bright-foreground (mode 1) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
32 #define ATTR_FAINT 0x02 /** Faint (mode 2) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
33 #define ATTR_UNDERLINE 0x08 /** Underline (mode 4) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
34 #define ATTR_BLINK 0x10 /** Blink/Bright-background (mode 5) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
35 #define ATTR_REVERSE 0x40 /** Reverse (mode 7) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
36 #define ATTR_CONCEALED 0x80 /** Concealed (mode 8) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
37
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
38 #define DEFAULT_FG_COLOR 7 /** CGA color index */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
39 #define DEFAULT_BG_COLOR 0
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
40 #define DEFAULT_SCREEN_MODE 3 /** 80x25 */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
41
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
42 #define FONT_WIDTH 8 /** Font width */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
43
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
44 /** map ansi color index to cga palette index */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
45 static const uint8_t ansi_to_cga[16] = {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
46 0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
47 };
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
48
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
49 typedef struct {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
50 AVFrame frame;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
51 int x, y; /** cursor position (pixels) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
52 int sx, sy; /** saved cursor position (pixels) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
53 const uint8_t* font; /** font */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
54 int font_height; /** font height */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
55 int attributes; /** attribute flags */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
56 int fg, bg; /** foreground and background color */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
57
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
58 /* ansi parser state machine */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
59 enum {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
60 STATE_NORMAL = 0,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
61 STATE_ESCAPE,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
62 STATE_CODE,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
63 STATE_MUSIC_PREAMBLE
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
64 } state;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
65 #define MAX_NB_ARGS 4
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
66 int args[MAX_NB_ARGS];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
67 int nb_args; /** number of arguments (may exceed MAX_NB_ARGS) */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
68 } AnsiContext;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
69
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
70 static av_cold int decode_init(AVCodecContext *avctx)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
71 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
72 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
73 avctx->pix_fmt = PIX_FMT_PAL8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
74
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
75 /* defaults */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
76 s->font = ff_vga16_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
77 s->font_height = 16;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
78 s->fg = DEFAULT_FG_COLOR;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
79 s->bg = DEFAULT_BG_COLOR;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
80
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
81 if (!avctx->width || !avctx->height)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
82 avcodec_set_dimensions(avctx, 80<<3, 25<<4);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
83
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
84 return 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
85 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
86
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
87 static void hscroll(AVCodecContext *avctx)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
88 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
89 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
90 int i;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
91
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
92 if (s->y < avctx->height - s->font_height) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
93 s->y += s->font_height;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
94 return;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
95 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
96
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
97 i = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
98 for (; i < avctx->height - s->font_height; i++)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
99 memcpy(s->frame.data[0] + i * s->frame.linesize[0],
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
100 s->frame.data[0] + (i + s->font_height) * s->frame.linesize[0],
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
101 avctx->width);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
102 for (; i < avctx->height; i++)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
103 memset(s->frame.data[0] + i * s->frame.linesize[0],
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
104 DEFAULT_BG_COLOR, avctx->width);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
105 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
106
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
107 static void erase_line(AVCodecContext * avctx, int xoffset, int xlength)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
108 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
109 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
110 int i;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
111 for (i = 0; i < s->font_height; i++)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
112 memset(s->frame.data[0] + (s->y + i)*s->frame.linesize[0] + xoffset,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
113 DEFAULT_BG_COLOR, xlength);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
114 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
115
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
116 static void erase_screen(AVCodecContext *avctx)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
117 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
118 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
119 int i;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
120 for (i = 0; i < avctx->height; i++)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
121 memset(s->frame.data[0] + i * s->frame.linesize[0], DEFAULT_BG_COLOR, avctx->width);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
122 s->x = s->y = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
123 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
124
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
125 /**
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
126 * Draw character to screen
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
127 */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
128 static void draw_char(AVCodecContext *avctx, int c)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
129 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
130 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
131 int fg = s->fg;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
132 int bg = s->bg;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
133
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
134 if ((s->attributes & ATTR_BOLD))
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
135 fg += 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
136 if ((s->attributes & ATTR_BLINK))
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
137 bg += 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
138 if ((s->attributes & ATTR_REVERSE))
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
139 FFSWAP(int, fg, bg);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
140 if ((s->attributes & ATTR_CONCEALED))
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
141 fg = bg;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
142 ff_draw_pc_font(s->frame.data[0] + s->y * s->frame.linesize[0] + s->x,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
143 s->frame.linesize[0], s->font, s->font_height, c, fg, bg);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
144 s->x += FONT_WIDTH;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
145 if (s->x >= avctx->width) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
146 s->x = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
147 hscroll(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
148 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
149 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
150
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
151 /**
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
152 * Execute ANSI escape code
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
153 * @param <0 error
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
154 */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
155 static int execute_code(AVCodecContext * avctx, int c)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
156 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
157 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
158 int ret, i, width, height;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
159 switch(c) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
160 case 'A': //Cursor Up
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
161 s->y = FFMAX(s->y - (s->nb_args > 0 ? s->args[0]*s->font_height : s->font_height), 0);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
162 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
163 case 'B': //Cursor Down
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
164 s->y = FFMIN(s->y + (s->nb_args > 0 ? s->args[0]*s->font_height : s->font_height), avctx->height - s->font_height);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
165 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
166 case 'C': //Cursor Right
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
167 s->x = FFMIN(s->x + (s->nb_args > 0 ? s->args[0]*FONT_WIDTH : FONT_WIDTH), avctx->width - FONT_WIDTH);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
168 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
169 case 'D': //Cursor Left
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
170 s->x = FFMAX(s->x - (s->nb_args > 0 ? s->args[0]*FONT_WIDTH : FONT_WIDTH), 0);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
171 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
172 case 'H': //Cursor Position
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
173 case 'f': //Horizontal and Vertical Position
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
174 s->y = s->nb_args > 0 ? av_clip((s->args[0] - 1)*s->font_height, 0, avctx->height - s->font_height) : 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
175 s->x = s->nb_args > 1 ? av_clip((s->args[1] - 1)*FONT_WIDTH, 0, avctx->width - FONT_WIDTH) : 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
176 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
177 case 'h': //set creen mode
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
178 case 'l': //reset screen mode
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
179 if (s->nb_args < 2)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
180 s->args[0] = DEFAULT_SCREEN_MODE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
181 switch(s->args[0]) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
182 case 0: case 1: case 4: case 5: case 13: case 19: //320x200 (25 rows)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
183 s->font = ff_cga_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
184 s->font_height = 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
185 width = 40<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
186 height = 25<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
187 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
188 case 2: case 3: //640x400 (25 rows)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
189 s->font = ff_vga16_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
190 s->font_height = 16;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
191 width = 80<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
192 height = 25<<4;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
193 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
194 case 6: case 14: //640x200 (25 rows)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
195 s->font = ff_cga_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
196 s->font_height = 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
197 width = 80<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
198 height = 25<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
199 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
200 case 7: //set line wrapping
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
201 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
202 case 15: case 16: //640x350 (43 rows)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
203 s->font = ff_cga_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
204 s->font_height = 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
205 width = 80<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
206 height = 43<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
207 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
208 case 17: case 18: //640x480 (60 rows)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
209 s->font = ff_cga_font;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
210 s->font_height = 8;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
211 width = 80<<3;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
212 height = 60<<4;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
213 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
214 default:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
215 av_log_ask_for_sample(avctx, "unsupported screen mode\n");
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
216 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
217 if (width != avctx->width || height != avctx->height) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
218 if (s->frame.data[0])
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
219 avctx->release_buffer(avctx, &s->frame);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
220 avcodec_set_dimensions(avctx, width, height);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
221 ret = avctx->get_buffer(avctx, &s->frame);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
222 if (ret < 0) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
223 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
224 return ret;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
225 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
226 s->frame.pict_type = FF_I_TYPE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
227 s->frame.palette_has_changed = 1;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
228 memcpy(s->frame.data[1], ff_cga_palette, 16 * 4);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
229 erase_screen(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
230 } else if (c == 'l') {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
231 erase_screen(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
232 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
233 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
234 case 'J': //Erase in Page
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
235 switch (s->args[0]) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
236 case 0:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
237 erase_line(avctx, s->x, avctx->width - s->x);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
238 if (s->y < avctx->height - s->font_height)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
239 memset(s->frame.data[0] + (s->y + s->font_height)*s->frame.linesize[0],
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
240 DEFAULT_BG_COLOR, (avctx->height - s->y - s->font_height)*s->frame.linesize[0]);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
241 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
242 case 1:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
243 erase_line(avctx, 0, s->x);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
244 if (s->y > 0)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
245 memset(s->frame.data[0], DEFAULT_BG_COLOR, s->y * s->frame.linesize[0]);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
246 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
247 case 2:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
248 erase_screen(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
249 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
250 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
251 case 'K': //Erase in Line
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
252 switch(s->args[0]) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
253 case 0:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
254 erase_line(avctx, s->x, avctx->width - s->x);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
255 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
256 case 1:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
257 erase_line(avctx, 0, s->x);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
258 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
259 case 2:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
260 erase_line(avctx, 0, avctx->width);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
261 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
262 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
263 case 'm': //Select Graphics Rendition
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
264 if (s->nb_args == 0) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
265 s->nb_args = 1;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
266 s->args[0] = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
267 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
268 for (i = 0; i < FFMIN(s->nb_args, MAX_NB_ARGS); i++) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
269 int m = s->args[i];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
270 if (m == 0) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
271 s->attributes = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
272 s->fg = DEFAULT_FG_COLOR;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
273 s->bg = DEFAULT_BG_COLOR;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
274 } else if (m == 1 || m == 2 || m == 4 || m == 5 || m == 7 || m == 8) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
275 s->attributes |= 1 << (m - 1);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
276 } else if (m >= 30 && m <= 38) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
277 s->fg = ansi_to_cga[m - 30];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
278 } else if (m == 39) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
279 s->fg = ansi_to_cga[DEFAULT_FG_COLOR];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
280 } else if (m >= 40 && m <= 47) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
281 s->bg = ansi_to_cga[m - 40];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
282 } else if (m == 49) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
283 s->fg = ansi_to_cga[DEFAULT_BG_COLOR];
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
284 } else {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
285 av_log_ask_for_sample(avctx, "unsupported rendition parameter\n");
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
286 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
287 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
288 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
289 case 'n': //Device Status Report
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
290 case 'R': //report current line and column
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
291 /* ignore */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
292 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
293 case 's': //Save Cursor Position
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
294 s->sx = s->x;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
295 s->sy = s->y;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
296 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
297 case 'u': //Restore Cursor Position
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
298 s->x = av_clip(s->sx, 0, avctx->width - FONT_WIDTH);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
299 s->y = av_clip(s->sy, 0, avctx->height - s->font_height);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
300 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
301 default:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
302 av_log_ask_for_sample(avctx, "unsupported escape code\n");
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
303 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
304 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
305 return 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
306 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
307
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
308 static int decode_frame(AVCodecContext *avctx,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
309 void *data, int *data_size,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
310 AVPacket *avpkt)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
311 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
312 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
313 uint8_t *buf = avpkt->data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
314 int buf_size = avpkt->size;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
315 const uint8_t *buf_end = buf+buf_size;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
316 int ret, i, count;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
317
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
318 ret = avctx->reget_buffer(avctx, &s->frame);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
319 if (ret < 0){
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
320 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
321 return ret;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
322 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
323 s->frame.pict_type = FF_I_TYPE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
324 s->frame.palette_has_changed = 1;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
325 memcpy(s->frame.data[1], ff_cga_palette, 16 * 4);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
326
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
327 while(buf < buf_end) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
328 switch(s->state) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
329 case STATE_NORMAL:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
330 switch (buf[0]) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
331 case 0x00: //NUL
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
332 case 0x07: //BEL
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
333 case 0x1A: //SUB
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
334 /* ignore */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
335 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
336 case 0x08: //BS
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
337 s->x = FFMAX(s->x - 1, 0);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
338 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
339 case 0x09: //HT
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
340 i = s->x / FONT_WIDTH;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
341 count = ((i + 8) & ~7) - i;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
342 for (i = 0; i < count; i++)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
343 draw_char(avctx, ' ');
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
344 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
345 case 0x0A: //LF
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
346 hscroll(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
347 case 0x0D: //CR
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
348 s->x = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
349 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
350 case 0x0C: //FF
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
351 erase_screen(avctx);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
352 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
353 case 0x1B: //ESC
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
354 s->state = STATE_ESCAPE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
355 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
356 default:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
357 draw_char(avctx, buf[0]);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
358 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
359 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
360 case STATE_ESCAPE:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
361 if (buf[0] == '[') {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
362 s->state = STATE_CODE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
363 s->nb_args = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
364 s->args[0] = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
365 } else {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
366 s->state = STATE_NORMAL;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
367 draw_char(avctx, 0x1B);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
368 return -1;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
369 continue;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
370 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
371 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
372 case STATE_CODE:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
373 switch(buf[0]) {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
374 case '0': case '1': case '2': case '3': case '4':
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
375 case '5': case '6': case '7': case '8': case '9':
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
376 if (s->nb_args < MAX_NB_ARGS)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
377 s->args[s->nb_args] = s->args[s->nb_args] * 10 + buf[0] - '0';
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
378 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
379 case ';':
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
380 s->nb_args++;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
381 if (s->nb_args < MAX_NB_ARGS)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
382 s->args[s->nb_args] = 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
383 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
384 case 'M':
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
385 s->state = STATE_MUSIC_PREAMBLE;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
386 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
387 case '=': case '?':
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
388 /* ignore */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
389 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
390 default:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
391 if (s->nb_args > MAX_NB_ARGS)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
392 av_log(avctx, AV_LOG_WARNING, "args overflow (%i)\n", s->nb_args);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
393 if (s->nb_args < MAX_NB_ARGS && s->args[s->nb_args])
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
394 s->nb_args++;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
395 if (execute_code(avctx, buf[0]) < 0)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
396 return -1;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
397 s->state = STATE_NORMAL;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
398 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
399 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
400 case STATE_MUSIC_PREAMBLE:
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
401 if (buf[0] == 0x0E || buf[0] == 0x1B)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
402 s->state = STATE_NORMAL;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
403 /* ignore music data */
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
404 break;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
405 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
406 buf++;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
407 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
408
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
409 *data_size = sizeof(AVFrame);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
410 *(AVFrame*)data = s->frame;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
411 return buf_size;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
412 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
413
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
414 static av_cold int decode_close(AVCodecContext *avctx)
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
415 {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
416 AnsiContext *s = avctx->priv_data;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
417 if (s->frame.data[0])
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
418 avctx->release_buffer(avctx, &s->frame);
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
419 return 0;
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
420 }
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
421
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
422 AVCodec ansi_decoder = {
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
423 .name = "ansi",
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
424 .type = CODEC_TYPE_VIDEO,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
425 .id = CODEC_ID_ANSI,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
426 .priv_data_size = sizeof(AnsiContext),
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
427 .init = decode_init,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
428 .close = decode_close,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
429 .decode = decode_frame,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
430 .capabilities = CODEC_CAP_DR1,
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
431 .long_name = NULL_IF_CONFIG_SMALL("ASCII/ANSI art"),
fb2f04f70afe ASCII/ANSI art decoder
pross
parents:
diff changeset
432 };