FFmpeg
xwdenc.c
Go to the documentation of this file.
1 /*
2  * XWD image format
3  *
4  * Copyright (c) 2012 Paul B Mahol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg 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  * FFmpeg 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 FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "libavutil/pixdesc.h"
24 #include "avcodec.h"
25 #include "bytestream.h"
26 #include "codec_internal.h"
27 #include "encode.h"
28 #include "xwd.h"
29 
30 #define WINDOW_NAME "lavcxwdenc"
31 #define WINDOW_NAME_SIZE 11
32 
34  const AVFrame *p, int *got_packet)
35 {
36  enum AVPixelFormat pix_fmt = avctx->pix_fmt;
38  uint32_t pixdepth, bpp, bpad, ncolors = 0, lsize, vclass, be = 0;
39  uint32_t rgb[3] = { 0 }, bitorder = 0;
40  uint32_t header_size;
41  int i, out_size, ret;
42  const uint8_t *ptr;
43  uint8_t *buf;
44  uint32_t pal[256];
45 
46  pixdepth = av_get_bits_per_pixel(desc);
47  if (desc->flags & AV_PIX_FMT_FLAG_BE)
48  be = 1;
49  switch (pix_fmt) {
50  case AV_PIX_FMT_ARGB:
51  case AV_PIX_FMT_BGRA:
52  case AV_PIX_FMT_RGBA:
53  case AV_PIX_FMT_ABGR:
54  if (pix_fmt == AV_PIX_FMT_ARGB ||
56  be = 1;
57  if (pix_fmt == AV_PIX_FMT_ABGR ||
59  rgb[0] = 0xFF;
60  rgb[1] = 0xFF00;
61  rgb[2] = 0xFF0000;
62  } else {
63  rgb[0] = 0xFF0000;
64  rgb[1] = 0xFF00;
65  rgb[2] = 0xFF;
66  }
67  bpp = 32;
68  pixdepth = 24;
69  vclass = XWD_TRUE_COLOR;
70  bpad = 32;
71  break;
72  case AV_PIX_FMT_BGR24:
73  case AV_PIX_FMT_RGB24:
75  be = 1;
76  bpp = 24;
77  vclass = XWD_TRUE_COLOR;
78  bpad = 32;
79  rgb[0] = 0xFF0000;
80  rgb[1] = 0xFF00;
81  rgb[2] = 0xFF;
82  break;
89  rgb[0] = 0x1F;
90  rgb[1] = 0x7E0;
91  rgb[2] = 0xF800;
92  } else {
93  rgb[0] = 0xF800;
94  rgb[1] = 0x7E0;
95  rgb[2] = 0x1F;
96  }
97  bpp = 16;
98  vclass = XWD_TRUE_COLOR;
99  bpad = 16;
100  break;
101  case AV_PIX_FMT_RGB555LE:
102  case AV_PIX_FMT_RGB555BE:
103  case AV_PIX_FMT_BGR555LE:
104  case AV_PIX_FMT_BGR555BE:
105  if (pix_fmt == AV_PIX_FMT_BGR555LE ||
107  rgb[0] = 0x1F;
108  rgb[1] = 0x3E0;
109  rgb[2] = 0x7C00;
110  } else {
111  rgb[0] = 0x7C00;
112  rgb[1] = 0x3E0;
113  rgb[2] = 0x1F;
114  }
115  bpp = 16;
116  vclass = XWD_TRUE_COLOR;
117  bpad = 16;
118  break;
119  case AV_PIX_FMT_RGB8:
120  case AV_PIX_FMT_BGR8:
123  case AV_PIX_FMT_PAL8:
124  bpp = 8;
125  vclass = XWD_PSEUDO_COLOR;
126  bpad = 8;
127  ncolors = 256;
128  break;
129  case AV_PIX_FMT_GRAY8:
130  bpp = 8;
131  bpad = 8;
132  vclass = XWD_STATIC_GRAY;
133  break;
135  be = 1;
136  bitorder = 1;
137  bpp = 1;
138  bpad = 8;
139  vclass = XWD_STATIC_GRAY;
140  break;
141  default:
142  av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
143  return AVERROR(EINVAL);
144  }
145 
146  lsize = FFALIGN(bpp * avctx->width, bpad) / 8;
147  header_size = XWD_HEADER_SIZE + WINDOW_NAME_SIZE;
148  out_size = header_size + ncolors * XWD_CMAP_SIZE + avctx->height * lsize;
149 
150  if ((ret = ff_get_encode_buffer(avctx, pkt, out_size, 0)) < 0)
151  return ret;
152  buf = pkt->data;
153 
154  bytestream_put_be32(&buf, header_size);
155  bytestream_put_be32(&buf, XWD_VERSION); // file version
156  bytestream_put_be32(&buf, XWD_Z_PIXMAP); // pixmap format
157  bytestream_put_be32(&buf, pixdepth); // pixmap depth in pixels
158  bytestream_put_be32(&buf, avctx->width); // pixmap width in pixels
159  bytestream_put_be32(&buf, avctx->height); // pixmap height in pixels
160  bytestream_put_be32(&buf, 0); // bitmap x offset
161  bytestream_put_be32(&buf, be); // byte order
162  bytestream_put_be32(&buf, 32); // bitmap unit
163  bytestream_put_be32(&buf, bitorder); // bit-order of image data
164  bytestream_put_be32(&buf, bpad); // bitmap scan-line pad in bits
165  bytestream_put_be32(&buf, bpp); // bits per pixel
166  bytestream_put_be32(&buf, lsize); // bytes per scan-line
167  bytestream_put_be32(&buf, vclass); // visual class
168  bytestream_put_be32(&buf, rgb[0]); // red mask
169  bytestream_put_be32(&buf, rgb[1]); // green mask
170  bytestream_put_be32(&buf, rgb[2]); // blue mask
171  bytestream_put_be32(&buf, 8); // size of each bitmask in bits
172  bytestream_put_be32(&buf, ncolors); // number of colors
173  bytestream_put_be32(&buf, ncolors); // number of entries in color map
174  bytestream_put_be32(&buf, avctx->width); // window width
175  bytestream_put_be32(&buf, avctx->height); // window height
176  bytestream_put_be32(&buf, 0); // window upper left X coordinate
177  bytestream_put_be32(&buf, 0); // window upper left Y coordinate
178  bytestream_put_be32(&buf, 0); // window border width
180 
181  if (pix_fmt == AV_PIX_FMT_PAL8) {
182  memcpy(pal, p->data[1], sizeof(pal));
183  } else {
185  }
186 
187  for (i = 0; i < ncolors; i++) {
188  uint32_t val;
189  uint8_t red, green, blue;
190 
191  val = pal[i];
192  red = (val >> 16) & 0xFF;
193  green = (val >> 8) & 0xFF;
194  blue = val & 0xFF;
195 
196  bytestream_put_be32(&buf, i); // colormap entry number
197  bytestream_put_be16(&buf, red << 8);
198  bytestream_put_be16(&buf, green << 8);
199  bytestream_put_be16(&buf, blue << 8);
200  bytestream_put_byte(&buf, 0x7); // bitmask flag
201  bytestream_put_byte(&buf, 0); // padding
202  }
203 
204  ptr = p->data[0];
205  for (i = 0; i < avctx->height; i++) {
206  bytestream_put_buffer(&buf, ptr, lsize);
207  ptr += p->linesize[0];
208  }
209 
210  *got_packet = 1;
211  return 0;
212 }
213 
215  .p.name = "xwd",
216  CODEC_LONG_NAME("XWD (X Window Dump) image"),
217  .p.type = AVMEDIA_TYPE_VIDEO,
218  .p.id = AV_CODEC_ID_XWD,
219  .p.capabilities = AV_CODEC_CAP_DR1,
221  .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_BGRA,
242  AV_PIX_FMT_NONE },
243 };
be
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it be(in the first position) for now. Options ------- Then comes the options array. This is what will define the user accessible options. For example
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2858
out_size
int out_size
Definition: movenc.c:55
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
pixdesc.h
AVPacket::data
uint8_t * data
Definition: packet.h:374
encode.h
AV_PIX_FMT_MONOWHITE
@ AV_PIX_FMT_MONOWHITE
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb.
Definition: pixfmt.h:75
FFCodec
Definition: codec_internal.h:119
WINDOW_NAME
#define WINDOW_NAME
Definition: xwdenc.c:30
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:95
av_get_bits_per_pixel
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
Definition: pixdesc.c:2810
XWD_Z_PIXMAP
#define XWD_Z_PIXMAP
Definition: xwd.h:32
AV_PIX_FMT_RGB555BE
@ AV_PIX_FMT_RGB555BE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
Definition: pixfmt.h:107
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:346
rgb
Definition: rpzaenc.c:59
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:123
val
static double val(void *priv, double ch)
Definition: aeval.c:77
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:307
AV_PIX_FMT_BGR8
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition: pixfmt.h:83
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demuxing_decoding.c:41
avpriv_set_systematic_pal2
int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt)
Definition: imgutils.c:178
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:264
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:93
xwd.h
AV_PIX_FMT_RGB565LE
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
Definition: pixfmt.h:106
AV_CODEC_ID_XWD
@ AV_CODEC_ID_XWD
Definition: codec_id.h:210
AV_PIX_FMT_BGR565LE
@ AV_PIX_FMT_BGR565LE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
Definition: pixfmt.h:111
AV_PIX_FMT_RGB8
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
Definition: pixfmt.h:86
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
AV_PIX_FMT_BGR555BE
@ AV_PIX_FMT_BGR555BE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
Definition: pixfmt.h:112
AV_PIX_FMT_ABGR
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:94
AV_PIX_FMT_BGR4_BYTE
@ AV_PIX_FMT_BGR4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
Definition: pixfmt.h:85
xwd_encode_frame
static int xwd_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *p, int *got_packet)
Definition: xwdenc.c:33
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:68
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
codec_internal.h
XWD_HEADER_SIZE
#define XWD_HEADER_SIZE
Definition: xwd.h:27
AV_PIX_FMT_BGR565BE
@ AV_PIX_FMT_BGR565BE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
Definition: pixfmt.h:110
AV_PIX_FMT_ARGB
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:92
bytestream_put_buffer
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
Definition: bytestream.h:372
AV_PIX_FMT_RGB555LE
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:108
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AV_PIX_FMT_FLAG_BE
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
Definition: pixdesc.h:116
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:211
AV_PIX_FMT_RGB4_BYTE
@ AV_PIX_FMT_RGB4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
Definition: pixfmt.h:88
AVCodecContext::height
int height
Definition: avcodec.h:571
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:608
avcodec.h
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:77
XWD_TRUE_COLOR
#define XWD_TRUE_COLOR
Definition: xwd.h:38
ret
ret
Definition: filter_design.txt:187
XWD_PSEUDO_COLOR
#define XWD_PSEUDO_COLOR
Definition: xwd.h:37
ff_xwd_encoder
const FFCodec ff_xwd_encoder
Definition: xwdenc.c:214
AVCodecContext
main external API structure.
Definition: avcodec.h:398
ff_get_encode_buffer
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition: encode.c:79
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
XWD_STATIC_GRAY
#define XWD_STATIC_GRAY
Definition: xwd.h:34
AV_PIX_FMT_RGB565BE
@ AV_PIX_FMT_RGB565BE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
Definition: pixfmt.h:105
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AV_PIX_FMT_BGR555LE
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:113
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:351
XWD_VERSION
#define XWD_VERSION
Definition: xwd.h:26
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:571
bytestream.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:370
XWD_CMAP_SIZE
#define XWD_CMAP_SIZE
Definition: xwd.h:28
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
WINDOW_NAME_SIZE
#define WINDOW_NAME_SIZE
Definition: xwdenc.c:31