35 #define ATTR_BOLD 0x01
36 #define ATTR_FAINT 0x02
37 #define ATTR_ITALICS 0x04
38 #define ATTR_UNDERLINE 0x08
39 #define ATTR_BLINK 0x10
40 #define ATTR_REVERSE 0x40
41 #define ATTR_CONCEALED 0x80
43 #define DEFAULT_FG_COLOR 7
44 #define DEFAULT_BG_COLOR 0
45 #define DEFAULT_SCREEN_MODE 3
51 0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15
111 #define COLOR(x) ((x) * 40 + 55)
112 for (
r = 0;
r < 6;
r++)
113 for (
g = 0;
g < 6;
g++)
114 for (
b = 0;
b < 6;
b++)
116 #define GRAY(x) ((x) * 10 + 8)
117 for (
g = 0;
g < 24;
g++)
126 if (
s->y <= avctx->
height - 2*
s->font_height) {
127 s->y +=
s->font_height;
132 for (;
i < avctx->
height -
s->font_height;
i++)
133 memcpy(
s->frame->data[0] +
i *
s->frame->linesize[0],
134 s->frame->data[0] + (
i +
s->font_height) *
s->frame->linesize[0],
137 memset(
s->frame->data[0] +
i *
s->frame->linesize[0],
145 for (
i = 0;
i <
s->font_height;
i++)
146 memset(
s->frame->data[0] + (
s->y +
i)*
s->frame->linesize[0] + xoffset,
177 s->frame->linesize[0],
s->font,
s->font_height,
c, fg, bg);
198 s->y =
FFMAX(
s->y - (
s->nb_args > 0 ?
s->args[0]*
s->font_height :
s->font_height), 0);
201 s->y =
FFMIN(
s->y + (
s->nb_args > 0 ?
s->args[0]*
s->font_height :
s->font_height), avctx->
height -
s->font_height);
211 s->y =
s->nb_args > 0 ?
av_clip((
s->args[0] - 1)*
s->font_height, 0, avctx->
height -
s->font_height) : 0;
219 case 0:
case 1:
case 4:
case 5:
case 13:
case 19:
265 s->frame->palette_has_changed = 1;
268 }
else if (
c ==
'l') {
273 switch (
s->args[0]) {
276 if (
s->y < avctx->
height -
s->font_height)
277 memset(
s->frame->data[0] + (
s->y +
s->font_height)*
s->frame->linesize[0],
302 if (
s->nb_args == 0) {
312 }
else if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 7 || m == 8) {
313 s->attributes |= 1 << (m - 1);
314 }
else if (m >= 30 && m <= 37) {
316 }
else if (m == 38 &&
i + 2 <
FFMIN(
s->nb_args,
MAX_NB_ARGS) &&
s->args[
i + 1] == 5 &&
s->args[
i + 2] < 256) {
320 }
else if (m == 39) {
322 }
else if (m >= 40 && m <= 47) {
324 }
else if (m == 48 &&
i + 2 <
FFMIN(
s->nb_args,
MAX_NB_ARGS) &&
s->args[
i + 1] == 5 &&
s->args[
i + 2] < 256) {
328 }
else if (m == 49) {
357 void *
data,
int *got_frame,
362 int buf_size = avpkt->
size;
363 const uint8_t *buf_end = buf+buf_size;
370 memset(
s->frame->data[0]+
i*
s->frame->linesize[0], 0, avctx->
width);
375 s->frame->palette_has_changed = 1;
377 if (!
s->first_frame) {
382 while(buf < buf_end) {
396 count = ((
i + 8) & ~7) -
i;
397 for (
i = 0;
i < count;
i++)
409 s->state = STATE_ESCAPE;
417 s->state = STATE_CODE;
421 s->state = STATE_NORMAL;
428 case '0':
case '1':
case '2':
case '3':
case '4':
429 case '5':
case '6':
case '7':
case '8':
case '9':
431 s->args[
s->nb_args] =
FFMAX(
s->args[
s->nb_args], 0) * 10 + buf[0] -
'0';
437 s->args[
s->nb_args] = 0;
440 s->state = STATE_MUSIC_PREAMBLE;
452 s->state = STATE_NORMAL;
455 case STATE_MUSIC_PREAMBLE:
456 if (buf[0] == 0x0E || buf[0] == 0x1B)
457 s->state = STATE_NORMAL;
479 {
"max_pixels",
"640*480" },
static const AVCodecDefault defaults[]
static int execute_code(AVCodecContext *avctx, int c)
Execute ANSI escape code.
#define ATTR_CONCEALED
Concealed (mode 8)
#define DEFAULT_FG_COLOR
CGA color index.
#define ATTR_BLINK
Blink/Bright-background (mode 5)
static av_cold int decode_close(AVCodecContext *avctx)
#define ATTR_BOLD
Bold/Bright-foreground (mode 1)
static const AVCodecDefault ansi_defaults[]
static av_cold int decode_init(AVCodecContext *avctx)
static void hscroll(AVCodecContext *avctx)
#define FONT_WIDTH
Font width.
static void draw_char(AVCodecContext *avctx, int c)
Draw character to screen.
static void erase_screen(AVCodecContext *avctx)
#define DEFAULT_SCREEN_MODE
80x25
static void erase_line(AVCodecContext *avctx, int xoffset, int xlength)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#define ATTR_REVERSE
Reverse (mode 7)
static const uint8_t ansi_to_cga[16]
map ansi color index to cga palette index
static void set_palette(uint32_t *pal)
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
void ff_draw_pc_font(uint8_t *dst, int linesize, const uint8_t *font, int font_height, int ch, int fg, int bg)
Draw CGA/EGA/VGA font to 8-bit pixel buffer.
const uint32_t ff_cga_palette[16]
common internal and external API header
#define FFSWAP(type, a, b)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
reference-counted frame API
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_PICTURE_TYPE_I
Intra.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int frame_number
Frame counter, set by libavcodec.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
int sy
saved y cursor position (pixels)
int y
y cursor position (pixels)
enum AnsiContext::@13 state
int x
x cursor position (pixels)
int sx
saved x cursor position (pixels)
int nb_args
number of arguments (may exceed MAX_NB_ARGS)
int attributes
attribute flags
int font_height
font height
#define avpriv_request_sample(...)
const uint8_t avpriv_vga16_font[4096]
const uint8_t avpriv_cga_font[2048]
CGA/EGA/VGA ROM font data.