Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
xbmenc.c
Go to the documentation of this file.
1
/*
2
* XBM image format
3
*
4
* Copyright (c) 2012 Paul B Mahol
5
*
6
* This file is part of Libav.
7
*
8
* Libav is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* Libav is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
avcodec.h
"
24
#include "
internal.h
"
25
#include "
mathops.h
"
26
27
static
av_cold
int
xbm_encode_init
(
AVCodecContext
*avctx)
28
{
29
avctx->
coded_frame
=
av_frame_alloc
();
30
if
(!avctx->
coded_frame
)
31
return
AVERROR
(ENOMEM);
32
avctx->
coded_frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
33
34
return
0;
35
}
36
37
static
int
xbm_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*pkt,
38
const
AVFrame
*p,
int
*got_packet)
39
{
40
int
i, j, ret,
size
, linesize;
41
uint8_t
*ptr, *buf;
42
43
linesize = (avctx->
width
+ 7) / 8;
44
size = avctx->
height
* (linesize * 7 + 2) + 110;
45
if
((ret =
ff_alloc_packet
(pkt, size)) < 0) {
46
av_log
(avctx,
AV_LOG_ERROR
,
"Error getting output packet.\n"
);
47
return
ret;
48
}
49
50
buf = pkt->
data
;
51
ptr = p->
data
[0];
52
53
buf += snprintf(buf, 32,
"#define image_width %u\n"
, avctx->
width
);
54
buf += snprintf(buf, 33,
"#define image_height %u\n"
, avctx->
height
);
55
buf += snprintf(buf, 40,
"static unsigned char image_bits[] = {\n"
);
56
for
(i = 0; i < avctx->
height
; i++) {
57
for
(j = 0; j < linesize; j++)
58
buf += snprintf(buf, 7,
" 0x%02X,"
,
ff_reverse
[*ptr++]);
59
ptr += p->
linesize
[0] - linesize;
60
buf += snprintf(buf, 2,
"\n"
);
61
}
62
buf += snprintf(buf, 5,
" };\n"
);
63
64
pkt->
size
= buf - pkt->
data
;
65
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
66
*got_packet = 1;
67
return
0;
68
}
69
70
static
av_cold
int
xbm_encode_close
(
AVCodecContext
*avctx)
71
{
72
av_freep
(&avctx->
coded_frame
);
73
74
return
0;
75
}
76
77
AVCodec
ff_xbm_encoder
= {
78
.
name
=
"xbm"
,
79
.long_name =
NULL_IF_CONFIG_SMALL
(
"XBM (X BitMap) image"
),
80
.type =
AVMEDIA_TYPE_VIDEO
,
81
.id =
AV_CODEC_ID_XBM
,
82
.init =
xbm_encode_init
,
83
.encode2 =
xbm_encode_frame
,
84
.close =
xbm_encode_close
,
85
.pix_fmts = (
const
enum
AVPixelFormat
[]) {
AV_PIX_FMT_MONOWHITE
,
86
AV_PIX_FMT_NONE
},
87
};
Generated on Sun Jun 1 2014 17:55:35 for Libav by
1.8.1.2