aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/SideChains/WebRtc.NET/src/TJpeg.h
blob: f645b334cafc336e6665a13bd54c9d567cd65e52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { c
#pragma once

#pragma unmanaged
#include <turbojpeg/turbojpeg.h>
#pragma managed

namespace WebRtc
{
	namespace NET
	{
		using namespace System;

		public ref class TurboJpegEncoder
		{
		private:
			tjhandle jpeg;
			tjhandle jpegc;
			tjscalingfactor * pBestFactor;
			int lwidth;
			int lheight;

			unsigned char * _rgbBuf;

			TurboJpegEncoder(tjhandle jpeg, tjhandle jpegc);

		public:

			~TurboJpegEncoder();

			static TurboJpegEncoder^ CreateEncoder();

			int EncodeJpegToI420(array<Byte> ^ buffer, array<Byte> ^% yuv);

			int EncodeI420(array<System::Byte> ^ buffer, Int32 w, Int32 h, Int32 pxFormat, System::Boolean fast, array<System::Byte> ^% yuv);
			int EncodeI420(Byte * rgbBuf, Int32 w, Int32 h, Int32 pxFormat, Int64 yuvSize, Boolean fast, Byte * yuv);
			int EncodeI420toBGR24(Byte * yuv, UInt32 w, UInt32 h, array<System::Byte> ^% bgrBuffer, Boolean fast);

			int EncodeJpeg(array<Byte> ^ buffer, Int32 bufferSize, array<Byte> ^% rgb, Int32 maxwidth, Double scale, Int32 % jwidth, Int32 % jheight, Int32 % pitch, Int32 pxFormat);
			int DecodeJpeg(array<Byte> ^ buffer, Int32 bufferSize, Int32 maxwidth, Double scale, Int32 % jwidth, Int32 % jheight);

			int EncodeToJpeg(array<System::Byte> ^ buffer, Int32 w, Int32 h, Int32 pxFormat, array<System::Byte> ^% jpegBuffer, Int32 % jpegOutSize, Int32 jpegQual);
			int EncodeGrayToJpeg(array<System::Byte> ^ buffer, Int32 w, Int32 h, array<System::Byte> ^% jpegBuffer, Int32 % jpegOutSize, Int32 jpegQual);

			void ResetScale()
			{
				pBestFactor = nullptr;
				lwidth = 0;
				lheight = 0;
			}

			static property String^ TurboJpegEncoder::LastJpegError
			{
				String^ get()
				{
					return gcnew String(tjGetErrorStr());
				}
			}
		};

		/**
		* Pixel formats
		*/
		public enum class TJPF
		{
			/**
			* RGB pixel format.  The red, green, and blue components in the image are
			* stored in 3-byte pixels in the order R, G, B from lowest to highest byte
			* address within each pixel.
			*/
			TJPF_RGB = 0,
			/**
			* BGR pixel format.  The red, green, and blue components in the image are
			* stored in 3-byte pixels in the order B, G, R from lowest to highest byte
			* address within each pixel.
			*/
			TJPF_BGR,
			/**
			* RGBX pixel format.  The red, green, and blue components in the image are
			* stored in 4-byte pixels in the order R, G, B from lowest to highest byte
			* address within each pixel.  The X component is ignored when compressing
			* and undefined when decompressing.
			*/
			TJPF_RGBX,
			/**
			* BGRX pixel format.  The red, green, and blue components in the image are
			* stored in 4-byte pixels in the order B, G, R from lowest to highest byte
			* address within each pixel.  The X component is ignored when compressing
			* and undefined when decompressing.
			*/
			TJPF_BGRX,
			/**
			* XBGR pixel format.  The red, green, and blue components in the image are
			* stored in 4-byte pixels in the order R, G, B from highest to lowest byte
			* address within each pixel.  The X component is ignored when compressing
			* and undefined when decompressing.
			*/
			TJPF_XBGR,
			/**
			* XRGB pixel format.  The red, green, and blue components in the image are
			* stored in 4-byte pixels in the order B, G, R from highest to lowest byte
			* address within each pixel.  The X component is ignored when compressing
			* and undefined when decompressing.
			*/
			TJPF_XRGB,
			/**
			* Grayscale pixel format.  Each 1-byte pixel represents a luminance
			* (brightness) level from 0 to 255.
			*/
			TJPF_GRAY,
			/**
			* RGBA pixel format.  This is the same as @ref TJPF_RGBX, except that when
			* decompressing, the X component is guaranteed to be 0xFF, which can be
			* interpreted as an opaque alpha channel.
			*/
			TJPF_RGBA,
			/**
			* BGRA pixel format.  This is the same as @ref TJPF_BGRX, except that when
			* decompressing, the X component is guaranteed to be 0xFF, which can be
			* interpreted as an opaque alpha channel.
			*/
			TJPF_BGRA,
			/**
			* ABGR pixel format.  This is the same as @ref TJPF_XBGR, except that when
			* decompressing, the X component is guaranteed to be 0xFF, which can be
			* interpreted as an opaque alpha channel.
			*/
			TJPF_ABGR,
			/**
			* ARGB pixel format.  This is the same as @ref TJPF_XRGB, except that when
			* decompressing, the X component is guaranteed to be 0xFF, which can be
			* interpreted as an opaque alpha channel.
			*/
			TJPF_ARGB,
			/**
			* CMYK pixel format.  Unlike RGB, which is an additive color model used
			* primarily for display, CMYK (Cyan/Magenta/Yellow/Key) is a subtractive
			* color model used primarily for printing.  In the CMYK color model, the
			* value of each color component typically corresponds to an amount of cyan,
			* magenta, yellow, or black ink that is applied to a white background.  In
			* order to convert between CMYK and RGB, it is necessary to use a color
			* management system (CMS.)  A CMS will attempt to map colors within the
			* printer's gamut to perceptually similar colors in the display's gamut and
			* vice versa, but the mapping is typically not 1:1 or reversible, nor can it
			* be defined with a simple formula.  Thus, such a conversion is out of scope
			* for a codec library.  However, the TurboJPEG API allows for compressing
			* CMYK pixels into a YCCK JPEG image (see #TJCS_YCCK) and decompressing YCCK
			* JPEG images into CMYK pixels.
			*/
			TJPF_CMYK
		};
	}
}