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