FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
pamenc.c
Go to the documentation of this file.
1
/*
2
* PAM image format
3
* Copyright (c) 2002, 2003 Fabrice Bellard
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
#include "
avcodec.h
"
23
#include "
internal.h
"
24
#include "
pnm.h
"
25
26
27
static
int
pam_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
28
const
AVFrame
*pict,
int
*got_packet)
29
{
30
PNMContext
*s = avctx->
priv_data
;
31
AVFrame
*
const
p = &s->
picture
;
32
int
i, h, w, n, linesize,
depth
, maxval, ret;
33
const
char
*tuple_type;
34
uint8_t
*ptr;
35
36
h = avctx->
height
;
37
w = avctx->
width
;
38
switch
(avctx->
pix_fmt
) {
39
case
AV_PIX_FMT_MONOBLACK
:
40
n = w;
41
depth = 1;
42
maxval = 1;
43
tuple_type =
"BLACKANDWHITE"
;
44
break
;
45
case
AV_PIX_FMT_GRAY8
:
46
n = w;
47
depth = 1;
48
maxval = 255;
49
tuple_type =
"GRAYSCALE"
;
50
break
;
51
case
AV_PIX_FMT_GRAY16BE
:
52
n = w * 2;
53
depth = 1;
54
maxval = 0xFFFF;
55
tuple_type =
"GRAYSCALE"
;
56
break
;
57
case
AV_PIX_FMT_GRAY8A
:
58
n = w * 2;
59
depth = 2;
60
maxval = 255;
61
tuple_type =
"GRAYSCALE_ALPHA"
;
62
break
;
63
case
AV_PIX_FMT_RGB24
:
64
n = w * 3;
65
depth = 3;
66
maxval = 255;
67
tuple_type =
"RGB"
;
68
break
;
69
case
AV_PIX_FMT_RGBA
:
70
n = w * 4;
71
depth = 4;
72
maxval = 255;
73
tuple_type =
"RGB_ALPHA"
;
74
break
;
75
case
AV_PIX_FMT_RGB48BE
:
76
n = w * 6;
77
depth = 3;
78
maxval = 0xFFFF;
79
tuple_type =
"RGB"
;
80
break
;
81
case
AV_PIX_FMT_RGBA64BE
:
82
n = w * 8;
83
depth = 4;
84
maxval = 0xFFFF;
85
tuple_type =
"RGB_ALPHA"
;
86
break
;
87
default
:
88
return
-1;
89
}
90
91
if
((ret =
ff_alloc_packet2
(avctx, pkt, n*h + 200)) < 0)
92
return
ret;
93
94
*p = *pict;
95
p->
pict_type
=
AV_PICTURE_TYPE_I
;
96
p->
key_frame
= 1;
97
98
s->
bytestream_start
=
99
s->
bytestream
= pkt->
data
;
100
s->
bytestream_end
= pkt->
data
+ pkt->
size
;
101
102
snprintf
(s->
bytestream
, s->
bytestream_end
- s->
bytestream
,
103
"P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLTYPE %s\nENDHDR\n"
,
104
w, h, depth, maxval, tuple_type);
105
s->
bytestream
+= strlen(s->
bytestream
);
106
107
ptr = p->
data
[0];
108
linesize = p->
linesize
[0];
109
110
if
(avctx->
pix_fmt
==
AV_PIX_FMT_MONOBLACK
){
111
int
j;
112
for
(i = 0; i < h; i++) {
113
for
(j = 0; j < w; j++)
114
*s->
bytestream
++ = ptr[j >> 3] >> (7 - j & 7) & 1;
115
ptr += linesize;
116
}
117
}
else
{
118
for
(i = 0; i < h; i++) {
119
memcpy(s->
bytestream
, ptr, n);
120
s->
bytestream
+= n;
121
ptr += linesize;
122
}
123
}
124
125
pkt->
size
= s->
bytestream
- s->
bytestream_start
;
126
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
127
*got_packet = 1;
128
return
0;
129
}
130
131
132
AVCodec
ff_pam_encoder
= {
133
.
name
=
"pam"
,
134
.type =
AVMEDIA_TYPE_VIDEO
,
135
.id =
AV_CODEC_ID_PAM
,
136
.priv_data_size =
sizeof
(
PNMContext
),
137
.
init
=
ff_pnm_init
,
138
.encode2 =
pam_encode_frame
,
139
.pix_fmts = (
const
enum
AVPixelFormat
[]){
140
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_RGBA
,
AV_PIX_FMT_RGB48BE
,
AV_PIX_FMT_RGBA64BE
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_GRAY8A
,
AV_PIX_FMT_GRAY16BE
,
AV_PIX_FMT_MONOBLACK
,
AV_PIX_FMT_NONE
141
},
142
.long_name =
NULL_IF_CONFIG_SMALL
(
"PAM (Portable AnyMap) image"
),
143
};
Generated on Sat May 25 2013 03:58:39 for FFmpeg by
1.8.2