FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
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
22
/**
23
* @file
24
* 8088flex TMV video decoder
25
* @author Daniel Verkamp
26
* @see http://www.oldskool.org/pc/8088_Corruption
27
*/
28
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
static
int
tmv_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
39
int
*got_frame,
AVPacket
*avpkt)
40
{
41
AVFrame
*
frame
=
data
;
42
const
uint8_t
*
src
= avpkt->
data
;
43
uint8_t
*dst;
44
unsigned
char_cols = avctx->
width
>> 3;
45
unsigned
char_rows = avctx->
height
>> 3;
46
unsigned
x,
y
, fg, bg,
c
;
47
int
ret
;
48
49
if
((ret =
ff_get_buffer
(avctx, frame, 0)) < 0)
50
return
ret
;
51
52
if
(avpkt->
size
< 2*char_rows*char_cols) {
53
av_log
(avctx,
AV_LOG_ERROR
,
54
"Input buffer too small, truncated sample?\n"
);
55
*got_frame = 0;
56
return
AVERROR_INVALIDDATA
;
57
}
58
59
frame->
pict_type
=
AV_PICTURE_TYPE_I
;
60
frame->
key_frame
= 1;
61
dst = frame->
data
[0];
62
63
frame->
palette_has_changed
= 1;
64
memcpy(frame->
data
[1],
ff_cga_palette
, 16 * 4);
65
memset(frame->
data
[1] + 16 * 4, 0,
AVPALETTE_SIZE
- 16 * 4);
66
67
for
(y = 0; y < char_rows; y++) {
68
for
(x = 0; x < char_cols; x++) {
69
c = *src++;
70
bg = *src >> 4;
71
fg = *src++ & 0xF;
72
ff_draw_pc_font
(dst + x * 8, frame->
linesize
[0],
73
avpriv_cga_font
, 8, c, fg, bg);
74
}
75
dst += frame->
linesize
[0] * 8;
76
}
77
78
*got_frame = 1;
79
80
return
avpkt->
size
;
81
}
82
83
static
av_cold
int
tmv_decode_init
(
AVCodecContext
*avctx)
84
{
85
avctx->
pix_fmt
=
AV_PIX_FMT_PAL8
;
86
return
0;
87
}
88
89
AVCodec
ff_tmv_decoder
= {
90
.
name
=
"tmv"
,
91
.long_name =
NULL_IF_CONFIG_SMALL
(
"8088flex TMV"
),
92
.type =
AVMEDIA_TYPE_VIDEO
,
93
.id =
AV_CODEC_ID_TMV
,
94
.init =
tmv_decode_init
,
95
.decode =
tmv_decode_frame
,
96
.capabilities =
CODEC_CAP_DR1
,
97
};
Generated on Fri Dec 5 2014 04:42:03 for FFmpeg by
1.8.2