Imported Debian version 1.0~trusty
[deb_vid.stab.git] / src / frameinfo.h
1 /*
2 * frameinfo.h
3 *
4 * Copyright (C) Georg Martius - June 2007 - 2011
5 * georg dot martius at web dot de
6 *
7 * This file is part of vid.stab video stabilization library
8 *
9 * vid.stab is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License,
11 * as published by the Free Software Foundation; either version 2, or
12 * (at your option) any later version.
13 *
14 * vid.stab is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with GNU Make; see the file COPYING. If not, write to
21 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 */
24 #ifndef FRAMEINFO_H
25 #define FRAMEINFO_H
26
27 #include <stddef.h>
28 #include <stdlib.h>
29 #include <inttypes.h>
30
31 /// pixel formats
32 typedef enum {PF_NONE = -1,
33 PF_GRAY8, ///< Y , 8bpp
34 PF_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
35 PF_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
36 PF_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
37 PF_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
38 PF_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
39 PF_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
40 PF_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
41 PF_PACKED, ///< dummy: packed formats start here
42 PF_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
43 PF_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
44 PF_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
45 PF_NUMBER ///< number of pixel formats
46 } VSPixelFormat;
47
48 /** frame information for deshaking lib
49 This only works for planar image formats
50 */
51 typedef struct vsframeinfo {
52 int width, height;
53 int planes; // number of planes (1 luma, 2,3 chroma, 4 alpha)
54 int log2ChromaW; // subsampling of width in chroma planes
55 int log2ChromaH; // subsampling of height in chroma planes
56 VSPixelFormat pFormat;
57 int bytesPerPixel; // number of bytes per pixel (for packed formats)
58 } VSFrameInfo;
59
60 /** frame data according to frameinfo
61 */
62 typedef struct vsframe {
63 uint8_t* data[4]; // data in planes. For packed data everthing is in plane 0
64 int linesize[4]; // line size of each line in a the planes
65 } VSFrame;
66
67 // use it to calculate the CHROMA sizes (rounding is correct)
68 #define CHROMA_SIZE(width,log2sub) (-(-(width) >> (log2sub)))
69
70 /// initializes the frameinfo for the given format
71 int vsFrameInfoInit(VSFrameInfo* fi, int width, int height, VSPixelFormat pFormat);
72
73
74 /// returns the subsampling shift amount, horizonatally for the given plane
75 int vsGetPlaneWidthSubS(const VSFrameInfo* fi, int plane);
76
77 /// returns the subsampling shift amount, vertically for the given plane
78 int vsGetPlaneHeightSubS(const VSFrameInfo* fi, int plane);
79
80 /// zero initialization
81 void vsFrameNull(VSFrame* frame);
82
83 /// returns true if frame is null (data[0]==0)
84 int vsFrameIsNull(const VSFrame* frame);
85
86 /// compares two frames for identity (based in data[0])
87 int vsFramesEqual(const VSFrame* frame1,const VSFrame* frame2);
88
89 /// allocates memory for a frame
90 void vsFrameAllocate(VSFrame* frame, const VSFrameInfo* fi);
91
92
93 /// copies the given plane number from src to dest
94 void vsFrameCopyPlane(VSFrame* dest, const VSFrame* src,
95 const VSFrameInfo* fi, int plane);
96
97 /// copies src to dest
98 void vsFrameCopy(VSFrame* dest, const VSFrame* src, const VSFrameInfo* fi);
99
100 /** fills the data pointer so that it corresponds to the img saved in the linear buffer.
101 No copying is performed.
102 Do not call vsFrameFree() on it.
103 */
104 void vsFrameFillFromBuffer(VSFrame* frame, uint8_t* img, const VSFrameInfo* fi);
105
106 /// frees memory
107 void vsFrameFree(VSFrame* frame);
108
109 #endif /* FRAMEINFO_H */
110
111 /*
112 * Local variables:
113 * c-file-style: "stroustrup"
114 * c-file-offsets: ((case-label . *) (statement-case-intro . *))
115 * indent-tabs-mode: nil
116 * c-basic-offset: 2 t
117 * End:
118 *
119 * vim: expandtab shiftwidth=2:
120 */