Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
tmv.c
Go to the documentation of this file.
1
/*
2
* 8088flex TMV video decoder
3
* Copyright (c) 2009 Daniel Verkamp <daniel at drv.nu>
4
*
5
* This file is part of Libav.
6
*
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.
11
*
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.
16
*
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
20
*/
21
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;
43
unsigned
char_cols = avctx->
width
>> 3;
44
unsigned
char_rows = avctx->
height
>> 3;
45
unsigned
x, 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
if
(avpkt->
size
< 2*char_rows*char_cols) {
56
av_log
(avctx,
AV_LOG_ERROR
,
57
"Input buffer too small, truncated sample?\n"
);
58
*data_size = 0;
59
return
-1;
60
}
61
62
tmv->
pic
.
pict_type
=
AV_PICTURE_TYPE_I
;
63
tmv->
pic
.
key_frame
= 1;
64
dst = tmv->
pic
.
data
[0];
65
66
tmv->
pic
.
palette_has_changed
= 1;
67
memcpy(tmv->
pic
.
data
[1],
ff_cga_palette
, 16 * 4);
68
69
for
(y = 0; y < char_rows; y++) {
70
for
(x = 0; x < char_cols; x++) {
71
c = *src++;
72
bg = *src >> 4;
73
fg = *src++ & 0xF;
74
ff_draw_pc_font
(dst + x * 8, tmv->
pic
.
linesize
[0],
75
ff_cga_font
, 8, c, fg, bg);
76
}
77
dst += tmv->
pic
.
linesize
[0] * 8;
78
}
79
80
*data_size =
sizeof
(
AVFrame
);
81
*(
AVFrame
*)data = tmv->
pic
;
82
return
avpkt->
size
;
83
}
84
85
static
av_cold
int
tmv_decode_init
(
AVCodecContext
*avctx)
86
{
87
avctx->
pix_fmt
=
PIX_FMT_PAL8
;
88
return
0;
89
}
90
91
static
av_cold
int
tmv_decode_close
(
AVCodecContext
*avctx)
92
{
93
TMVContext
*tmv = avctx->
priv_data
;
94
95
if
(tmv->
pic
.
data
[0])
96
avctx->
release_buffer
(avctx, &tmv->
pic
);
97
98
return
0;
99
}
100
101
AVCodec
ff_tmv_decoder
= {
102
.
name
=
"tmv"
,
103
.type =
AVMEDIA_TYPE_VIDEO
,
104
.id =
CODEC_ID_TMV
,
105
.priv_data_size =
sizeof
(
TMVContext
),
106
.
init
=
tmv_decode_init
,
107
.
close
=
tmv_decode_close
,
108
.
decode
=
tmv_decode_frame
,
109
.capabilities =
CODEC_CAP_DR1
,
110
.long_name =
NULL_IF_CONFIG_SMALL
(
"8088flex TMV"
),
111
};