Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
pnmenc.c
Go to the documentation of this file.
1
/*
2
* PNM image format
3
* Copyright (c) 2002, 2003 Fabrice Bellard
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
22
#include "
avcodec.h
"
23
#include "
bytestream.h
"
24
#include "
internal.h
"
25
#include "
pnm.h
"
26
27
28
static
int
pnm_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*pkt,
29
const
AVFrame
*pict,
int
*got_packet)
30
{
31
PNMContext
*s = avctx->
priv_data
;
32
AVFrame
*
const
p = &s->
picture
;
33
int
i, h, h1, c, n, linesize, ret;
34
uint8_t
*ptr, *ptr1, *ptr2;
35
36
if
((ret =
ff_alloc_packet
(pkt,
avpicture_get_size
(avctx->
pix_fmt
,
37
avctx->
width
,
38
avctx->
height
) + 200)) < 0) {
39
av_log
(avctx,
AV_LOG_ERROR
,
"encoded frame too large\n"
);
40
return
ret;
41
}
42
43
*p = *pict;
44
p->
pict_type
=
AV_PICTURE_TYPE_I
;
45
p->
key_frame
= 1;
46
47
s->
bytestream_start
=
48
s->
bytestream
= pkt->
data
;
49
s->
bytestream_end
= pkt->
data
+ pkt->
size
;
50
51
h = avctx->
height
;
52
h1 = h;
53
switch
(avctx->
pix_fmt
) {
54
case
AV_PIX_FMT_MONOWHITE
:
55
c =
'4'
;
56
n = (avctx->
width
+ 7) >> 3;
57
break
;
58
case
AV_PIX_FMT_GRAY8
:
59
c =
'5'
;
60
n = avctx->
width
;
61
break
;
62
case
AV_PIX_FMT_GRAY16BE
:
63
c =
'5'
;
64
n = avctx->
width
* 2;
65
break
;
66
case
AV_PIX_FMT_RGB24
:
67
c =
'6'
;
68
n = avctx->
width
* 3;
69
break
;
70
case
AV_PIX_FMT_RGB48BE
:
71
c =
'6'
;
72
n = avctx->
width
* 6;
73
break
;
74
case
AV_PIX_FMT_YUV420P
:
75
c =
'5'
;
76
n = avctx->
width
;
77
h1 = (h * 3) / 2;
78
break
;
79
default
:
80
return
-1;
81
}
82
snprintf(s->
bytestream
, s->
bytestream_end
- s->
bytestream
,
83
"P%c\n%d %d\n"
, c, avctx->
width
, h1);
84
s->
bytestream
+= strlen(s->
bytestream
);
85
if
(avctx->
pix_fmt
!=
AV_PIX_FMT_MONOWHITE
) {
86
snprintf(s->
bytestream
, s->
bytestream_end
- s->
bytestream
,
87
"%d\n"
, (avctx->
pix_fmt
!=
AV_PIX_FMT_GRAY16BE
&& avctx->
pix_fmt
!=
AV_PIX_FMT_RGB48BE
) ? 255 : 65535);
88
s->
bytestream
+= strlen(s->
bytestream
);
89
}
90
91
ptr = p->
data
[0];
92
linesize = p->
linesize
[0];
93
for
(i = 0; i < h; i++) {
94
memcpy(s->
bytestream
, ptr, n);
95
s->
bytestream
+= n;
96
ptr += linesize;
97
}
98
99
if
(avctx->
pix_fmt
==
AV_PIX_FMT_YUV420P
) {
100
h >>= 1;
101
n >>= 1;
102
ptr1 = p->
data
[1];
103
ptr2 = p->
data
[2];
104
for
(i = 0; i < h; i++) {
105
memcpy(s->
bytestream
, ptr1, n);
106
s->
bytestream
+= n;
107
memcpy(s->
bytestream
, ptr2, n);
108
s->
bytestream
+= n;
109
ptr1 += p->
linesize
[1];
110
ptr2 += p->
linesize
[2];
111
}
112
}
113
pkt->
size
= s->
bytestream
- s->
bytestream_start
;
114
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
115
*got_packet = 1;
116
117
return
0;
118
}
119
120
121
#if CONFIG_PGM_ENCODER
122
AVCodec
ff_pgm_encoder = {
123
.
name
=
"pgm"
,
124
.type =
AVMEDIA_TYPE_VIDEO
,
125
.id =
AV_CODEC_ID_PGM
,
126
.priv_data_size =
sizeof
(
PNMContext
),
127
.
init
=
ff_pnm_init
,
128
.encode2 =
pnm_encode_frame
,
129
.pix_fmts = (
const
enum
AVPixelFormat
[]){
130
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_GRAY16BE
,
AV_PIX_FMT_NONE
131
},
132
.long_name =
NULL_IF_CONFIG_SMALL
(
"PGM (Portable GrayMap) image"
),
133
};
134
#endif
135
136
#if CONFIG_PGMYUV_ENCODER
137
AVCodec
ff_pgmyuv_encoder = {
138
.
name
=
"pgmyuv"
,
139
.type =
AVMEDIA_TYPE_VIDEO
,
140
.id =
AV_CODEC_ID_PGMYUV
,
141
.priv_data_size =
sizeof
(
PNMContext
),
142
.
init
=
ff_pnm_init
,
143
.encode2 =
pnm_encode_frame
,
144
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
145
.long_name =
NULL_IF_CONFIG_SMALL
(
"PGMYUV (Portable GrayMap YUV) image"
),
146
};
147
#endif
148
149
#if CONFIG_PPM_ENCODER
150
AVCodec
ff_ppm_encoder = {
151
.
name
=
"ppm"
,
152
.type =
AVMEDIA_TYPE_VIDEO
,
153
.id =
AV_CODEC_ID_PPM
,
154
.priv_data_size =
sizeof
(
PNMContext
),
155
.
init
=
ff_pnm_init
,
156
.encode2 =
pnm_encode_frame
,
157
.pix_fmts = (
const
enum
AVPixelFormat
[]){
158
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_RGB48BE
,
AV_PIX_FMT_NONE
159
},
160
.long_name =
NULL_IF_CONFIG_SMALL
(
"PPM (Portable PixelMap) image"
),
161
};
162
#endif
163
164
#if CONFIG_PBM_ENCODER
165
AVCodec
ff_pbm_encoder = {
166
.
name
=
"pbm"
,
167
.type =
AVMEDIA_TYPE_VIDEO
,
168
.id =
AV_CODEC_ID_PBM
,
169
.priv_data_size =
sizeof
(
PNMContext
),
170
.
init
=
ff_pnm_init
,
171
.encode2 =
pnm_encode_frame
,
172
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_MONOWHITE
,
173
AV_PIX_FMT_NONE
},
174
.long_name =
NULL_IF_CONFIG_SMALL
(
"PBM (Portable BitMap) image"
),
175
};
176
#endif