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 <string.h>
30
31
#include "
avcodec.h
"
32
#include "
internal.h
"
33
#include "
libavutil/internal.h
"
34
35
#include "
cga_data.h
"
36
37
typedef
struct
TMVContext
{
38
AVFrame
pic
;
39
}
TMVContext
;
40
41
static
int
tmv_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
42
int
*got_frame,
AVPacket
*avpkt)
43
{
44
TMVContext
*tmv = avctx->
priv_data
;
45
const
uint8_t
*src = avpkt->
data
;
46
uint8_t
*dst;
47
unsigned
char_cols = avctx->
width
>> 3;
48
unsigned
char_rows = avctx->
height
>> 3;
49
unsigned
x, y, fg, bg, c;
50
51
if
(tmv->
pic
.
data
[0])
52
avctx->
release_buffer
(avctx, &tmv->
pic
);
53
54
if
(
ff_get_buffer
(avctx, &tmv->
pic
) < 0) {
55
av_log
(avctx,
AV_LOG_ERROR
,
"get_buffer() failed\n"
);
56
return
-1;
57
}
58
59
if
(avpkt->
size
< 2*char_rows*char_cols) {
60
av_log
(avctx,
AV_LOG_ERROR
,
61
"Input buffer too small, truncated sample?\n"
);
62
*got_frame = 0;
63
return
-1;
64
}
65
66
tmv->
pic
.
pict_type
=
AV_PICTURE_TYPE_I
;
67
tmv->
pic
.
key_frame
= 1;
68
dst = tmv->
pic
.
data
[0];
69
70
tmv->
pic
.
palette_has_changed
= 1;
71
memcpy(tmv->
pic
.
data
[1],
ff_cga_palette
, 16 * 4);
72
73
for
(y = 0; y < char_rows; y++) {
74
for
(x = 0; x < char_cols; x++) {
75
c = *src++;
76
bg = *src >> 4;
77
fg = *src++ & 0xF;
78
ff_draw_pc_font
(dst + x * 8, tmv->
pic
.
linesize
[0],
79
ff_cga_font
, 8, c, fg, bg);
80
}
81
dst += tmv->
pic
.
linesize
[0] * 8;
82
}
83
84
*got_frame = 1;
85
*(
AVFrame
*)data = tmv->
pic
;
86
return
avpkt->
size
;
87
}
88
89
static
av_cold
int
tmv_decode_init
(
AVCodecContext
*avctx)
90
{
91
avctx->
pix_fmt
=
AV_PIX_FMT_PAL8
;
92
return
0;
93
}
94
95
static
av_cold
int
tmv_decode_close
(
AVCodecContext
*avctx)
96
{
97
TMVContext
*tmv = avctx->
priv_data
;
98
99
if
(tmv->
pic
.
data
[0])
100
avctx->
release_buffer
(avctx, &tmv->
pic
);
101
102
return
0;
103
}
104
105
AVCodec
ff_tmv_decoder
= {
106
.
name
=
"tmv"
,
107
.type =
AVMEDIA_TYPE_VIDEO
,
108
.id =
AV_CODEC_ID_TMV
,
109
.priv_data_size =
sizeof
(
TMVContext
),
110
.
init
=
tmv_decode_init
,
111
.
close
=
tmv_decode_close
,
112
.
decode
=
tmv_decode_frame
,
113
.capabilities =
CODEC_CAP_DR1
,
114
.long_name =
NULL_IF_CONFIG_SMALL
(
"8088flex TMV"
),
115
};