From ffa627e2bfecb0f4a62f1bcdb691dd1c73a85820 Mon Sep 17 00:00:00 2001 From: xyy <544939200@qq.com> Date: Tue, 6 Jan 2026 13:34:31 +0800 Subject: [PATCH] --- .../BasicDemo/AutoCameraForm.cs | 183 +- .../BasicDemo/AutoCameraForm.resx | 120 + .../BasicDemo/BasicDemo.csproj | 3 + .../bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.dll | Bin 113664 -> 0 bytes .../bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.xml | 9413 -------------- .../bin/Debug/net8.0-windows7.0/Accord.dll | Bin 151552 -> 0 bytes .../bin/Debug/net8.0-windows7.0/Accord.xml | 10253 ---------------- .../bin/Debug/net8.0-windows7.0/BasicDemo_CS.exe | Bin 131584 -> 129536 bytes .../bin/Debug/net8.0-windows7.0/BasicDemo_CS.pdb | Bin 155136 -> 153088 bytes .../bin/Debug/net8.0-windows7.0/en-US/BasicDemo_CS.resources.dll | Bin 9728 -> 9728 bytes .../bin/Debug/net8.0-windows7.0/zh-CHS/BasicDemo_CS.resources.dll | Bin 25600 -> 25600 bytes .../bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.dll | Bin 178176 -> 178176 bytes .../bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.exe | Bin 150016 -> 150016 bytes .../bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb | Bin 61140 -> 61140 bytes .../obj/Debug/net8.0-windows7.0/apphost.exe | Bin 150016 -> 150016 bytes .../obj/Debug/net8.0-windows7.0/ref/外科辅料和患者防护罩激光抗性测试仪.dll | Bin 17920 -> 17920 bytes .../obj/Debug/net8.0-windows7.0/refint/外科辅料和患者防护罩激光抗性测试仪.dll | Bin 17920 -> 17920 bytes .../Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.AssemblyInfo.cs | 2 +- .../外科辅料和患者防护罩激光抗性测试仪.AssemblyInfoInputs.cache | 2 +- .../外科辅料和患者防护罩激光抗性测试仪.csproj.AssemblyReference.cache | Bin 6757 -> 3505 bytes .../外科辅料和患者防护罩激光抗性测试仪.csproj.FileListAbsolute.txt | 4 - .../obj/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.dll | Bin 178176 -> 178176 bytes .../obj/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb | Bin 61140 -> 61140 bytes 23 files changed, 135 insertions(+), 19845 deletions(-) create mode 100644 外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.resx delete mode 100644 外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.dll delete mode 100644 外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.xml delete mode 100644 外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.dll delete mode 100644 外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.xml diff --git a/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.cs b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.cs index b44260e..2cedd68 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.cs @@ -60,10 +60,6 @@ namespace BasicDemo - // 视频录制相关(新增) - private VideoFileWriter[] videoWriters = new VideoFileWriter[MAX_CAMERAS]; - private string[] videoFilePaths = new string[MAX_CAMERAS]; - private bool[] isRecording = new bool[MAX_CAMERAS]; // 构造函数 @@ -76,14 +72,14 @@ namespace BasicDemo OnReturnRequested += returnCallback; } - // 设置视频保存路径 - if (!string.IsNullOrEmpty(videoSavePath)) - { - _videoSavePath = videoSavePath; - } + //// 设置视频保存路径 + //if (!string.IsNullOrEmpty(videoSavePath)) + //{ + // _videoSavePath = videoSavePath; + //} - // 确保保存目录存在 - Directory.CreateDirectory(_videoSavePath); + //// 确保保存目录存在 + //Directory.CreateDirectory(_videoSavePath); InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; @@ -482,8 +478,7 @@ namespace BasicDemo return; } - // 2. 初始化视频录制(新增) - InitializeVideoRecording(cameraIndex); + // 2. 设置采集标志 @@ -510,8 +505,6 @@ namespace BasicDemo return; } - // 6. 开始录制视频(新增) - StartVideoRecording(cameraIndex); UpdateCameraStatus(cameraIndex, "正在采集...", Color.Green); } @@ -524,81 +517,6 @@ namespace BasicDemo - /// - /// 初始化视频录制(新增) - /// - private void InitializeVideoRecording(int cameraIndex) - { - try - { - // 生成唯一的视频文件名 - string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); - string fileName = $"Camera{cameraIndex + 1}_{timestamp}.mp4"; - videoFilePaths[cameraIndex] = Path.Combine(_videoSavePath, fileName); - - // 创建 VideoFileWriter 实例 - videoWriters[cameraIndex] = new VideoFileWriter(); - - // 从相机获取帧率(如果支持) - try - { - MyCamera.MVCC_FLOATVALUE frameRate = new MyCamera.MVCC_FLOATVALUE(); - int ret = cameras[cameraIndex].MV_CC_GetFloatValue_NET("AcquisitionFrameRate", ref frameRate); - if (ret == MyCamera.MV_OK && frameRate.fCurValue > 0) - { - _frameRate = frameRate.fCurValue; - } - } - catch - { - // 如果获取失败,使用默认帧率 - _frameRate = 30.0; - } - - Console.WriteLine($"相机 {cameraIndex + 1} 准备录制到: {videoFilePaths[cameraIndex]}, 帧率: {_frameRate}FPS"); - } - catch (Exception ex) - { - Console.WriteLine($"初始化视频录制失败: {ex.Message}"); - videoWriters[cameraIndex] = null; - } - } - - /// - /// 开始录制视频(新增)- 简化版本 - /// - private void StartVideoRecording(int cameraIndex) - { - if (videoWriters[cameraIndex] == null || displayBitmaps[cameraIndex] == null) - return; - - try - { - int width = displayBitmaps[cameraIndex].Width; - int height = displayBitmaps[cameraIndex].Height; - - // 将帧率转换为整数(四舍五入) - int fps = (int)Math.Round(_frameRate); - - // 确保帧率至少为1 - if (fps < 1) fps = 30; - - // 创建 Rational 帧率 - Accord.Math.Rational frameRateRational = new Accord.Math.Rational(fps, 1); - - // 打开视频文件 - videoWriters[cameraIndex].Open(videoFilePaths[cameraIndex], width, height, frameRateRational, VideoCodec.H264); - isRecording[cameraIndex] = true; - - UpdateCameraStatus(cameraIndex, $"录制中: {Path.GetFileName(videoFilePaths[cameraIndex])}", Color.Green); - } - catch (Exception ex) - { - Console.WriteLine($"开始录制视频失败: {ex.Message}"); - isRecording[cameraIndex] = false; - } - } - /// /// 检查相机是否有效 @@ -636,8 +554,6 @@ namespace BasicDemo // 3. 停止相机采集 cameras[cameraIndex].MV_CC_StopGrabbing_NET(); - // 4. 停止视频录制(新增) - StopVideoRecording(cameraIndex); // 4. 清理资源 CleanupCameraResources(cameraIndex); @@ -651,37 +567,7 @@ namespace BasicDemo } - /// - /// 停止视频录制(新增) - /// - private void StopVideoRecording(int cameraIndex) - { - try - { - if (videoWriters[cameraIndex] != null && isRecording[cameraIndex]) - { - videoWriters[cameraIndex].Close(); - isRecording[cameraIndex] = false; - Console.WriteLine($"相机 {cameraIndex + 1} 视频已保存到: {videoFilePaths[cameraIndex]}"); - - // 可选:显示保存路径 - UpdateCameraStatus(cameraIndex, $"视频已保存", Color.Blue); - } - } - catch (Exception ex) - { - Console.WriteLine($"停止视频录制异常: {ex.Message}"); - } - finally - { - if (videoWriters[cameraIndex] != null) - { - videoWriters[cameraIndex].Dispose(); - videoWriters[cameraIndex] = null; - } - } - } private bool PrepareForGrabbing(int cameraIndex) { @@ -920,36 +806,7 @@ namespace BasicDemo displayBitmaps[cameraIndex].UnlockBits(bitmapData); } - // 录制视频(新增) - if (isRecording[cameraIndex] && videoWriters[cameraIndex] != null && videoWriters[cameraIndex].IsOpen) - { - // 简单的帧率控制 - DateTime now = DateTime.Now; - if ((now - lastWriteTime).TotalMilliseconds >= (1000.0 / _frameRate) || framesWritten == 0) - { - try - { - // 锁定以避免线程冲突 - Bitmap frameToWrite; - lock (locks[cameraIndex]) - { - // 克隆Bitmap用于写入,避免资源冲突 - frameToWrite = (Bitmap)displayBitmaps[cameraIndex].Clone(); - } - - videoWriters[cameraIndex].WriteVideoFrame(frameToWrite); - frameToWrite.Dispose(); - - framesWritten++; - lastWriteTime = now; - } - catch (Exception ex) - { - Console.WriteLine($"写入视频帧失败: {ex.Message}"); - } - } - } - + // 使用SDK显示 displayInfo.hWnd = pictureBoxes[cameraIndex].Handle; displayInfo.pData = frameOut.pBufAddr; @@ -1004,27 +861,7 @@ namespace BasicDemo displayBufSizes[cameraIndex] = 0; - // 清理视频录制资源(新增) - if (videoWriters[cameraIndex] != null) - { - try - { - if (isRecording[cameraIndex]) - { - videoWriters[cameraIndex].Close(); - isRecording[cameraIndex] = false; - } - videoWriters[cameraIndex].Dispose(); - } - catch (Exception ex) - { - Console.WriteLine($"清理视频录制资源异常: {ex.Message}"); - } - finally - { - videoWriters[cameraIndex] = null; - } - } + } /// diff --git a/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.resx b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/AutoCameraForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/BasicDemo.csproj b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/BasicDemo.csproj index 789676a..f457fab 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/BasicDemo.csproj +++ b/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/BasicDemo.csproj @@ -140,6 +140,9 @@ + + AutoCameraForm.cs + BasicDemo.cs diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.dll b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.dll deleted file mode 100644 index 52f44d535714aa3c9e86077e9966a3dd99381851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113664 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 A^8f$< diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.xml b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.xml deleted file mode 100644 index aad008a..0000000 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.Video.FFMPEG.xml +++ /dev/null @@ -1,9413 +0,0 @@ - - - - "Accord.Video.FFMPEG (GPL)" - - - - -Close currently opened video file if any. - - - - -Flushes the current write buffer to disk. - - - - -Write new audio frame into currently opened video file. - - - - -Write new video frame with a specific timestamp into currently opened video file. - - Bitmap to add as a new video frame. - Frame timestamp, total time since recording started. - - The specified bitmap must be either color 24 or 32 bpp image or grayscale 8 bpp (indexed) image. - - The parameter allows user to specify presentation -time of the frame being saved. However, it is user's responsibility to make sure the value is increasing -over time. - - - Thrown if no video file was open. - The provided bitmap must be 24 or 32 bpp color image or 8 bpp grayscale image. - Bitmap size must be of the same as video size, which was specified on opening video file. - A error occurred while writing new video frame. See exception message. - - - -Write new video frame into currently opened video file. - - Bitmap to add as a new video frame. - - The specified bitmap must be either color 24 or 32 bpp image or grayscale 8 bpp (indexed) image. - - Thrown if no video file was open. - The provided bitmap must be 24 or 32 bpp color image or 8 bpp grayscale image. - Bitmap size must be of the same as video size, which was specified on opening video file. - A error occurred while writing new video frame. See exception message. - - - -Write new video frame into currently opened video file. - - Bitmap to add as a new video frame. - - The specified bitmap must be either color 24 or 32 bpp image or grayscale 8 bpp (indexed) image. - - Thrown if no video file was open. - The provided bitmap must be 24 or 32 bpp color image or 8 bpp grayscale image. - Bitmap size must be of the same as video size, which was specified on opening video file. - A error occurred while writing new video frame. See exception message. - - - -Create video file with the specified name and attributes. - - Video file name to create. - Frame width of the video file. - Frame height of the video file. - Frame rate of the video file. - Video codec to use for compression. - Bit rate of the video stream. - Audio codec for the audio stream. - Bit rate for the audio stream. - Frame rate of the audio stream. - Number of audio channels in the audio stream. - - The methods creates new video file with the specified name. -If a file with such name already exists in the file system, it will be overwritten. - When adding new video frames using method, -the video frame must have width and height as specified during file opening. - - The bit rate parameter represents a trade-off value between video quality -and video file size. Higher bit rate value increase video quality and result in larger -file size. Smaller values result in opposite – worse quality and small video files. - - - Video file resolution must be a multiple of two. - Invalid video codec is specified. - A error occurred while creating new video file. See exception message. - Cannot open video file with the specified name. - - - -Create video file with the specified name and attributes. - - Video file name to create. - Frame width of the video file. - Frame height of the video file. - Frame rate of the video file. - Video codec to use for compression. - Bit rate of the video stream. - - The methods creates new video file with the specified name. -If a file with such name already exists in the file system, it will be overwritten. - When adding new video frames using method, -the video frame must have width and height as specified during file opening. - - The bit rate parameter represents a trade-off value between video quality -and video file size. Higher bit rate value increase video quality and result in larger -file size. Smaller values result in opposite – worse quality and small video files. - - - Video file resolution must be a multiple of two. - Invalid video codec is specified. - A error occurred while creating new video file. See exception message. - Cannot open video file with the specified name. - - - -Create video file with the specified name and attributes. - - Video file name to create. - Frame width of the video file. - Frame height of the video file. - Frame rate of the video file. - Video codec to use for compression. - - The methods creates new video file with the specified name. -If a file with such name already exists in the file system, it will be overwritten. - When adding new video frames using method, -the video frame must have width and height as specified during file opening. - - Video file resolution must be a multiple of two. - Invalid video codec is specified. - A error occurred while creating new video file. See exception message. - Cannot open video file with the specified name. - - - -Create video file with the specified name and attributes. - - Video file name to create. - Frame width of the video file. - Frame height of the video file. - Frame rate of the video file. - - See documentation to the -for more information and the list of possible exceptions. - - The method opens the video file using -codec. - - - - - -Create video file with the specified name and attributes. - - Video file name to create. - Frame width of the video file. - Frame height of the video file. - - See documentation to the -for more information and the list of possible exceptions. - - The method opens the video file using -codec and 25 fps frame rate. - - - - - -Disposes the object and frees its resources. - - - - -Initializes a new instance of the class. - - - - -The property specifies if a video file is opened or not by this instance of the class. - - - - -Codec to use for the video file. - - Thrown if no video file was open. - - - -Bit rate of the video stream. - - Thrown if no video file was open. - - - -Frame rate of the opened video file. - - Thrown if no video file was open. - - - -Frame height of the opened video file. - - Thrown if no video file was open. - - - -Frame width of the opened video file. - - Thrown if no video file was open. - - - -Object's finalizer. - - - - -Class for writing video files utilizing FFmpeg library. - - - The class allows to write video files using FFmpeg library. - - Make sure you have FFmpeg binaries (DLLs) in the output folder of your application in order -to use this class successfully. FFmpeg binaries can be found in Externals folder provided with AForge.NET -framework's distribution. - - Sample usage: - -int width = 320; -int height = 240; - -// create instance of video writer -VideoFileWriter writer = new VideoFileWriter(); - -// create new video file -writer.Open("test.avi", width, height, 25, VideoCodec.MPEG4); - -// create a bitmap to save into the video file -Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); - -// write 1000 video frames -for (int i = 0; i < 1000; i++) -{ - image.SetPixel(i % width, i % height, Color.Red); - writer.WriteVideoFrame(image); -} - -writer.Close(); - - - - - - Enumeration of some audio codecs from FFmpeg library, which are available for writing audio files. - - - - -MPEG-4 Audio Lossless Coding, also known as MPEG-4 ALS. - - - - - Please use instead. - - - - -AAC - - - - -MPEG-3 - - - - -No audio - - - - Get the AVClass for swsContext. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - - Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. - - With the palette format "ABCD", the destination frame ends up with the format "ABC". - - @param src source frame buffer - @param dst destination frame buffer - @param num_pixels number of pixels to convert - @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src - - - - Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. - - The output frame will have the same packed format as the palette. - - @param src source frame buffer - @param dst destination frame buffer - @param num_pixels number of pixels to convert - @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src - - - -Scale all the coefficients of a so that their sum equals height. - - - -Scale all the coefficients of a by the scalar value. - - - -Return a normalized Gaussian curve used to filter stuff -quality = 3 is high quality, lower is lower quality. - - - -Allocate and return an uninitialized vector with length coefficients. - - - -Allocate an empty SwsContext. This must be filled and passed to -sws_init_context(). For filling see AVOptions, options.c and -sws_setColorspaceDetails(). - - - Initialize the swscaler context sws_context. - - @return zero or positive value on success, a negative value on - error - - -Free the swscaler context swsContext. -If swsContext is NULL, then does nothing. - - - Allocate and return an SwsContext. You need it to perform - scaling/conversion operations using sws_scale(). - - @param srcW the width of the source image - @param srcH the height of the source image - @param srcFormat the source image format - @param dstW the width of the destination image - @param dstH the height of the destination image - @param dstFormat the destination image format - @param flags specify which algorithm and options to use for rescaling - @param param extra parameters to tune the used scaler - For SWS_BICUBIC param[0] and [1] tune the shape of the basis - function, param[0] tunes f(1) and param[1] f´(1) - For SWS_GAUSS param[0] tunes the exponent and thus cutoff - frequency - For SWS_LANCZOS param[0] tunes the width of the window function - @return a pointer to an allocated context, or NULL in case of error - @note this function is to be removed after a saner alternative is - written - - - Scale the image slice in srcSlice and put the resulting scaled - slice in the image in dst. A slice is a sequence of consecutive - rows in an image. - - Slices have to be provided in sequential order, either in - top-bottom or bottom-top order. If slices are provided in - non-sequential order the behavior of the function is undefined. - - @param c the scaling context previously created with - sws_getContext() - @param srcSlice the array containing the pointers to the planes of - the source slice - @param srcStride the array containing the strides for each plane of - the source image - @param srcSliceY the position in the source image of the slice to - process, that is the number (counted starting from - zero) in the image of the first row of the slice - @param srcSliceH the height of the source slice, that is the number - of rows in the slice - @param dst the array containing the pointers to the planes of - the destination image - @param dstStride the array containing the strides for each plane of - the destination image - @return the height of the output slice - - -@param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) -@param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) -@param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] -@param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] -@param brightness 16.16 fixed point brightness correction -@param contrast 16.16 fixed point contrast correction -@param saturation 16.16 fixed point saturation correction -@return -1 if not supported - - -@return -1 if not supported - - - Check if context can be reused, otherwise reallocate a new one. - - If context is NULL, just calls sws_getContext() to get a new - context. Otherwise, checks if the parameters are the ones already - saved in context. If that is the case, returns the current - context. Otherwise, frees context and gets a new context with - the new parameters. - - Be warned that srcFilter and dstFilter are not checked, they - are assumed to remain the same. - - - -Return the libswscale license. - - - -Return the libswscale build-time configuration. - - - -@} - -@file -@ingroup libsws -external API header - -@file -swscale version macros - -FF_API_* defines may be placed below to indicate public API that will be -dropped at a future version bump. The defines themselves are not part of -the public API and may change, break or disappear at any time. - - @defgroup libsws libswscale - Color conversion and scaling library. - - @{ - - Return the LIBSWSCALE_VERSION_INT constant. - - - - Get the internal codec timebase from a stream. - - @param st input stream to extract the timebase from - - - - Transfer internal timing information from one stream to another. - - This function is useful when doing stream copy. - - @param ofmt target output format for ost - @param ost output stream which needs timings copy and adjustments - @param ist reference input stream to copy timings from - @param copy_tb define from where the stream codec timebase needs to be imported - - - - Apply a list of bitstream filters to a packet. - - @param codec AVCodecContext, usually from an AVStream - @param pkt the packet to apply filters to. If, on success, the returned - packet has size == 0 and side_data_elems == 0, it indicates that - the packet should be dropped - @param bsfc a NULL-terminated list of filters to apply - @return >=0 on success; - AVERROR code on failure - - - - Check if the stream st contained in s is matched by the stream specifier - spec. - - See the "stream specifiers" chapter in the documentation for the syntax - of spec. - - @return >0 if st is matched by spec; - 0 if st is not matched by spec; - AVERROR code if spec is invalid - - @note A stream specifier can match several streams in the format. - - - - Guess the frame rate, based on both the container and codec information. - - @param ctx the format context which the stream is part of - @param stream the stream which the frame is part of - @param frame the frame for which the frame rate should be determined, may be NULL - @return the guessed (valid) frame rate, 0/1 if no idea - - - -@} - - Guess the sample aspect ratio of a frame, based on both the stream and the - frame aspect ratio. - - Since the frame aspect ratio is set by the codec but the stream aspect ratio - is set by the demuxer, these two may not be equal. This function tries to - return the value that you should use if you would like to display the frame. - - Basic logic is to use the stream aspect ratio if it is set to something sane - otherwise use the frame aspect ratio. This way a container setting, which is - usually easy to modify can override the coded value in the frames. - - @param format the format context which the stream is part of - @param stream the stream which the frame is part of - @param frame the frame with the aspect ratio to be determined - @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea - - - - Return a positive value if the given filename has one of the given - extensions, 0 otherwise. - - @param filename file name to check against the given extensions - @param extensions a comma-separated list of filename extensions - - - - Generate an SDP for an RTP session. - - Note, this overwrites the id values of AVStreams in the muxer contexts - for getting unique dynamic payload types. - - @param ac array of AVFormatContexts describing the RTP streams. If the - array is composed by only one context, such context can contain - multiple AVStreams (one AVStream per RTP stream). Otherwise, - all the contexts in the array (an AVCodecContext per RTP stream) - must contain only one AVStream. - @param n_files number of AVCodecContexts contained in ac - @param buf buffer where the SDP will be stored (must be allocated by - the caller) - @param size the size of the buffer - @return 0 if OK, AVERROR_xxx on error - - - - Check whether filename actually is a numbered sequence generator. - - @param filename possible numbered sequence string - @return 1 if a valid numbered sequence string, 0 otherwise - - - - Return in 'buf' the path with '%d' replaced by a number. - - Also handles the '%0nd' format where 'n' is the total number - of digits and '%%'. - - @param buf destination buffer - @param buf_size destination buffer size - @param path numbered sequence string - @param number frame number - @param flags AV_FRAME_FILENAME_FLAGS_* - @return 0 if OK, -1 on format error - - - - Print detailed information about the input or output format, such as - duration, bitrate, streams, container, programs, metadata, side data, - codec and time base. - - @param ic the context to analyze - @param index index of the stream to dump information about - @param url the URL to print, such as source or destination file - @param is_output Select whether the specified context is an input(0) or output(1) - - - - Split a URL string into components. - - The pointers to buffers for storing individual components may be null, - in order to ignore that component. Buffers for components not found are - set to empty strings. If the port is not found, it is set to a negative - value. - - @param proto the buffer for the protocol - @param proto_size the size of the proto buffer - @param authorization the buffer for the authorization - @param authorization_size the size of the authorization buffer - @param hostname the buffer for the host name - @param hostname_size the size of the hostname buffer - @param port_ptr a pointer to store the port number in - @param path the buffer for the path - @param path_size the size of the path buffer - @param url the URL to split - - - - Add an index entry into a sorted list. Update the entry if the list - already contains it. - - @param timestamp timestamp in the time base of the given stream - - - - Send a nice dump of a packet to the log. - - @param avcl A pointer to an arbitrary struct of which the first field is a - pointer to an AVClass struct. - @param level The importance level of the message, lower values signifying - higher importance. - @param pkt packet to dump - @param dump_payload True if the payload must be displayed, too. - @param st AVStream that the packet belongs to - - - - Send a nice dump of a packet to the specified file stream. - - @param f The file stream pointer where the dump should be sent to. - @param pkt packet to dump - @param dump_payload True if the payload must be displayed, too. - @param st AVStream that the packet belongs to - - - - Send a nice hexadecimal dump of a buffer to the log. - - @param avcl A pointer to an arbitrary struct of which the first field is a - pointer to an AVClass struct. - @param level The importance level of the message, lower values signifying - higher importance. - @param buf buffer - @param size buffer size - - @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 - - - -@} - - @defgroup lavf_misc Utility functions - @ingroup libavf - @{ - - Miscellaneous utility functions related to both muxing and demuxing - (or neither). - - Send a nice hexadecimal dump of a buffer to the specified file stream. - - @param f The file stream pointer where the dump should be sent to. - @param buf buffer - @param size buffer size - - @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 - - - - Return the output format in the list of registered output formats - which best matches the provided parameters, or return NULL if - there is no match. - - @param short_name if non-NULL checks if short_name matches with the - names of the registered formats - @param filename if non-NULL checks if filename terminates with the - extensions of the registered formats - @param mime_type if non-NULL checks if mime_type matches with the - MIME type of the registered formats - - - - Write the stream trailer to an output media file and free the - file private data. - - May only be called after a successful call to avformat_write_header. - - @param s media file handle - @return 0 if OK, AVERROR_xxx on error - - - - Write an uncoded frame to an output media file. - - If the muxer supports it, this function makes it possible to write an AVFrame - structure directly, without encoding it into a packet. - It is mostly useful for devices and similar special muxers that use raw - video or PCM data and will not serialize it into a byte stream. - - To test whether it is possible to use it with a given muxer and stream, - use av_write_uncoded_frame_query(). - - The caller gives up ownership of the frame and must not access it - afterwards. - - @return >=0 for success, a negative code on error - - - - Write an uncoded frame to an output media file. - - The frame must be correctly interleaved according to the container - specification; if not, then av_interleaved_write_frame() must be used. - - See av_interleaved_write_frame() for details. - - - - Allocate the stream private data and initialize the codec, but do not write the header. - May optionally be used before avformat_write_header to initialize stream parameters - before actually writing the header. - If using this function, do not pass the same options to avformat_write_header. - - @param s Media file handle, must be allocated with avformat_alloc_context(). - Its oformat field must be set to the desired output format; - Its pb field must be set to an already opened AVIOContext. - @param options An AVDictionary filled with AVFormatContext and muxer-private options. - On return this parameter will be destroyed and replaced with a dict containing - options that were not found. May be NULL. - - @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, - AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, - negative AVERROR on failure. - - @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. - - - -@} - -@addtogroup lavf_encoding -@{ - - Allocate the stream private data and write the stream header to - an output media file. - - @param s Media file handle, must be allocated with avformat_alloc_context(). - Its oformat field must be set to the desired output format; - Its pb field must be set to an already opened AVIOContext. - @param options An AVDictionary filled with AVFormatContext and muxer-private options. - On return this parameter will be destroyed and replaced with a dict containing - options that were not found. May be NULL. - - @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, - AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, - negative AVERROR on failure. - - @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. - - - -Close an opened input AVFormatContext. Free it and all its contents -and set *s to NULL. - - - - Pause a network-based stream (e.g. RTSP stream). - - Use av_read_play() to resume it. - - - -Start playing a network-based stream (e.g. RTSP stream) at the -current position. - - - - Discard all internally buffered data. This can be useful when dealing with - discontinuities in the byte stream. Generally works only with formats that - can resync. This includes headerless formats like MPEG-TS/TS but should also - work with NUT, Ogg and in a limited way AVI for example. - - The set of streams, the detected duration, stream parameters and codecs do - not change when calling this function. If you want a complete reset, it's - better to open a new AVFormatContext. - - This does not flush the AVIOContext (s->pb). If necessary, call - avio_flush(s->pb) before calling this function. - - @param s media file handle - @return >=0 on success, error code otherwise - - - - Seek to the keyframe at timestamp. - 'timestamp' in 'stream_index'. - - @param s media file handle - @param stream_index If stream_index is (-1), a default - stream is selected, and timestamp is automatically converted - from AV_TIME_BASE units to the stream specific time_base. - @param timestamp Timestamp in AVStream.time_base units - or, if no stream is specified, in AV_TIME_BASE units. - @param flags flags which select direction and seeking mode - @return >= 0 on success - - - - Find the programs which belong to a given stream. - - @param ic media file handle - @param last the last found program, the search will start after this - program, or from the beginning if it is NULL - @param s stream index - @return the next program which belongs to s, NULL if no program is found or - the last program is not among the programs of ic. - - - - Read packets of a media file to get stream information. This - is useful for file formats with no headers such as MPEG. This - function also computes the real framerate in case of MPEG-2 repeat - frame mode. - The logical file position is not changed by this function; - examined packets may be buffered for later processing. - - @param ic media file handle - @param options If non-NULL, an ic.nb_streams long array of pointers to - dictionaries, where i-th member contains options for - codec corresponding to i-th stream. - On return each dictionary will be filled with options that were not found. - @return >=0 if OK, AVERROR_xxx on error - - @note this function isn't guaranteed to open all the codecs, so - options being non-empty at return is a perfectly normal behavior. - - @todo Let the user decide somehow what information is needed so that - we do not waste time getting stuff the user does not need. - - - - Open an input stream and read the header. The codecs are not opened. - The stream must be closed with avformat_close_input(). - - @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). - May be a pointer to NULL, in which case an AVFormatContext is allocated by this - function and written into ps. - Note that a user-supplied AVFormatContext will be freed on failure. - @param url URL of the stream to open. - @param fmt If non-NULL, this parameter forces a specific input format. - Otherwise the format is autodetected. - @param options A dictionary filled with AVFormatContext and demuxer-private options. - On return this parameter will be destroyed and replaced with a dict containing - options that were not found. May be NULL. - - @return 0 on success, a negative AVERROR on failure. - - @note If you want to use custom IO, preallocate the format context and set its pb field. - - - -Like av_probe_input_buffer2() but returns 0 on success - - - - Probe a bytestream to determine the input format. Each time a probe returns - with a score that is too low, the probe buffer size is increased and another - attempt is made. When the maximum probe size is reached, the input format - with the highest score is returned. - - @param pb the bytestream to probe - @param fmt the input format is put here - @param url the url of the stream - @param logctx the log context - @param offset the offset within the bytestream to probe from - @param max_probe_size the maximum probe buffer size (zero for default) - @return the score in case of success, a negative value corresponding to an - the maximal score is AVPROBE_SCORE_MAX - AVERROR code otherwise - - - - Guess the file format. - - @param is_opened Whether the file is already opened; determines whether - demuxers with or without AVFMT_NOFILE are probed. - @param score_ret The score of the best detection. - - - - Guess the file format. - - @param pd data to be probed - @param is_opened Whether the file is already opened; determines whether - demuxers with or without AVFMT_NOFILE are probed. - - - -@addtogroup lavf_decoding -@{ - -Find AVInputFormat based on the short name of the input format. - - - -@} - - Allocate an AVFormatContext for an output format. - avformat_free_context() can be used to free the context and - everything allocated by the framework within it. - - @param *ctx is set to the created format context, or to NULL in - case of failure - @param oformat format to use for allocating the context, if NULL - format_name and filename are used instead - @param format_name the name of output format to use for allocating the - context, if NULL filename is used instead - @param filename the name of the filename to use for allocating the - context, may be NULL - @return >= 0 in case of success, a negative AVERROR code in case of - failure - - - - Add a new stream to a media file. - - When demuxing, it is called by the demuxer in read_header(). If the - flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also - be called in read_packet(). - - When muxing, should be called by the user before avformat_write_header(). - - User is required to call avcodec_close() and avformat_free_context() to - clean up the allocation by avformat_new_stream(). - - @param s media file handle - @param c If non-NULL, the AVCodecContext corresponding to the new stream - will be initialized to use this codec. This is needed for e.g. codec-specific - defaults to be set, so codec should be provided if it is known. - - @return newly created stream or NULL on error. - - - - Get the AVClass for AVFormatContext. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - -Free an AVFormatContext and all its streams. -@param s context to free - - - -Allocate an AVFormatContext. -avformat_free_context() can be used to free the context and everything -allocated by the framework within it. - - - -If f is NULL, returns the first registered output format, -if f is non-NULL, returns the next registered output format after f -or NULL if f is the last one. - - - -If f is NULL, returns the first registered input format, -if f is non-NULL, returns the next registered input format after f -or NULL if f is the last one. - - - -Undo the initialization done by avformat_network_init. - - - - Do global initialization of network components. This is optional, - but recommended, since it avoids the overhead of implicitly - doing the setup for each session. - - Calling this function will become mandatory if using network - protocols at some major version bump. - - - - Initialize libavformat and register all the muxers, demuxers and - protocols. If you do not call this function, then you can select - exactly which formats you want to support. - - @see av_register_input_format() - @see av_register_output_format() - - - -Return the libavformat license. - - - -Return the libavformat build-time configuration. - - - - @defgroup lavf_core Core functions - @ingroup libavf - - Functions for querying libavformat capabilities, allocating core structures, - etc. - @{ - -Return the LIBAVFORMAT_VERSION_INT constant. - - - -This function will cause global side data to be injected in the next packet -of each stream as well as after any subsequent seek. - - - -',' separated list of disallowed protocols. -- encoding: unused -- decoding: set by user through AVOptions (NO direct access) - - - -',' separated list of allowed protocols. -- encoding: unused -- decoding: set by user through AVOptions (NO direct access) - - - -dump format separator. -can be ", " or "\n " or anything else -Code outside libavformat should access this field using AVOptions -(NO direct access). -- muxing: Set by user. -- demuxing: Set by user. - - - -Output timestamp offset, in microseconds. -Muxing: set by user via AVOptions (NO direct access) - - - -Callback used by devices to communicate with application. - - - -User data. -This is a place for some private data of the user. - - - -Number of bytes to be written as padding in a metadata header. -Demuxing: Unused. -Muxing: Set by user via av_format_set_metadata_header_padding. - - - -Forced data codec. -This allows forcing a specific decoder, even when there are multiple with -the same codec_id. -Demuxing: Set by user via av_format_set_data_codec (NO direct access). - - - -Forced subtitle codec. -This allows forcing a specific decoder, even when there are multiple with -the same codec_id. -Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access). - - - -Forced audio codec. -This allows forcing a specific decoder, even when there are multiple with -the same codec_id. -Demuxing: Set by user via av_format_set_audio_codec (NO direct access). - - - -Forced video codec. -This allows forcing a specific decoder, even when there are multiple with -the same codec_id. -Demuxing: Set by user via av_format_set_video_codec (NO direct access). - - - -IO repositioned flag. -This is set by avformat when the underlaying IO context read pointer -is repositioned, for example when doing byte based seeking. -Demuxers can use the flag to detect such changes. - - - -An opaque field for libavformat internal usage. -Must not be accessed in any way by callers. - - - -',' separated list of allowed demuxers. -If NULL then all are allowed -- encoding: unused -- decoding: set by user through AVOptions (NO direct access) - - - -',' separated list of allowed decoders. -If NULL then all are allowed -- encoding: unused -- decoding: set by user through AVOptions (NO direct access) - - - -number of bytes to read maximally to identify format. -- encoding: unused -- decoding: set by user through AVOPtions (NO direct access) - - - -format probing score. -The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes -the format. -- encoding: unused -- decoding: set by avformat, read by user via av_format_get_probe_score() (NO direct access) - - - -Flush the I/O context after each packet. -- encoding: Set by user via AVOptions (NO direct access) -- decoding: unused - - - -Force seeking to any (also non key) frames. -- encoding: unused -- decoding: Set by user via AVOptions (NO direct access) - - - -Correct single timestamp overflows -- encoding: unused -- decoding: Set by user via AVOptions (NO direct access) - - - -Skip initial bytes when opening stream -- encoding: unused -- decoding: Set by user via AVOptions (NO direct access) - - - -avio flags, used to force AVIO_FLAG_DIRECT. -- encoding: unused -- decoding: Set by user via AVOptions (NO direct access) - - - -forces the use of wallclock timestamps as pts/dts of packets -This has undefined results in the presence of B frames. -- encoding: unused -- decoding: Set by user via AVOptions (NO direct access) - - - -Max chunk size in bytes -Note, not all formats support this and unpredictable things may happen if it is used when not supported. -- encoding: Set by user via AVOptions (NO direct access) -- decoding: unused - - - -Max chunk time in microseconds. -Note, not all formats support this and unpredictable things may happen if it is used when not supported. -- encoding: Set by user via AVOptions (NO direct access) -- decoding: unused - - - -Audio preload in microseconds. -Note, not all formats support this and unpredictable things may happen if it is used when not supported. -- encoding: Set by user via AVOptions (NO direct access) -- decoding: unused - - - -Transport stream id. -This will be moved into demuxer private options. Thus no API/ABI compatibility - - - -Avoid negative timestamps during muxing. -Any value of the AVFMT_AVOID_NEG_TS_* constants. -Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) -- muxing: Set by user -- demuxing: unused - - - -Maximum number of packets to read while waiting for the first timestamp. -Decoding only. - - - -Flags for the user to detect events happening on the file. Flags must -be cleared by the user once the event has been handled. -A combination of AVFMT_EVENT_FLAG_*. - - - -Allow non-standard and experimental extension -@see AVCodecContext.strict_std_compliance - - - - Maximum buffering duration for interleaving. - - To ensure all the streams are interleaved correctly, - av_interleaved_write_frame() will wait until it has at least one packet - for each stream before actually writing any packets to the output file. - When some streams are "sparse" (i.e. there are large gaps between - successive packets), this can result in excessive buffering. - - This field specifies the maximum difference between the timestamps of the - first and the last packet in the muxing queue, above which libavformat - will output a packet regardless of whether it has queued a packet for all - the streams. - - Muxing only, set by the caller before avformat_write_header(). - - - -Flags to enable debugging. - - - - Custom interrupt callbacks for the I/O layer. - - demuxing: set by the user before avformat_open_input(). - muxing: set by the user before avformat_write_header() - (mainly useful for AVFMT_NOFILE formats). The callback - should also be passed to avio_open2() if it's used to - open the file. - - - -Error recognition; higher values will detect more errors but may -misdetect some more or less valid parts as errors. -Demuxing only, set by the caller before avformat_open_input(). - - - -The number of frames used for determining the framerate in -avformat_find_stream_info(). -Demuxing only, set by the caller before avformat_find_stream_info(). - - - -Start time of the stream in real world time, in microseconds -since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the -stream was captured at this real world time. -- muxing: Set by the caller before avformat_write_header(). If set to - either 0 or AV_NOPTS_VALUE, then the current wall-time will - be used. -- demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that - the value may become known after some number of frames - have been received. - - - - Metadata that applies to the whole file. - - - demuxing: set by libavformat in avformat_open_input() - - muxing: may be set by the caller before avformat_write_header() - - Freed by libavformat in avformat_free_context(). - - - -Number of chapters in AVChapter array. -When muxing, chapters are normally written in the file header, -so nb_chapters should normally be initialized before write_header -is called. Some muxers (e.g. mov and mkv) can also write chapters -in the trailer. To write chapters in the trailer, nb_chapters -must be zero when write_header is called and non-zero when -write_trailer is called. -- muxing: set by user -- demuxing: set by libavformat - - - -Maximum amount of memory in bytes to use for buffering frames -obtained from realtime capture devices. - - - -Maximum amount of memory in bytes to use for the index of each stream. -If the index exceeds this size, entries will be discarded as -needed to maintain a smaller size. This can lead to slower or less -accurate seeking (depends on demuxer). -Demuxers for which a full in-memory index is mandatory will ignore -this. -- muxing: unused -- demuxing: set by user - - - -Maximum duration (in AV_TIME_BASE units) of the data read -from input in avformat_find_stream_info(). -Demuxing only, set by the caller before avformat_find_stream_info(). -Can be set to 0 to let avformat choose using a heuristic. - - - - When muxing, try to avoid writing any random/volatile data to the output. - This includes any random IDs, real-time timestamps/dates, muxer version, etc. - - This flag is mainly intended for testing. - -Maximum size of the data read from input for determining -the input container format. -Demuxing only, set by the caller before avformat_open_input(). - - - -Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. -Set by the user before avformat_open_input() / avformat_write_header(). - - - -Total stream bitrate in bit/s, 0 if not -available. Never set it directly if the file_size and the -duration are known as FFmpeg can compute it automatically. - - - - Duration of the stream, in AV_TIME_BASE fractional - seconds. Only set this value if you know none of the individual stream - durations and also do not set any of them. This is deduced from the - AVStream values if not set. - - Demuxing only, set by libavformat. - - - - Position of the first frame of the component, in - AV_TIME_BASE fractional seconds. NEVER set this value directly: - It is deduced from the AVStream values. - - Demuxing only, set by libavformat. - - - - input or output filename - - - demuxing: set by avformat_open_input() - - muxing: may be set by the caller before avformat_write_header() - - - - A list of all streams in the file. New streams are created with - avformat_new_stream(). - - - demuxing: streams are created by libavformat in avformat_open_input(). - If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also - appear in av_read_frame(). - - muxing: streams are created by the user before avformat_write_header(). - - Freed by libavformat in avformat_free_context(). - - - - Number of elements in AVFormatContext.streams. - - Set by avformat_new_stream(), must not be modified by any other code. - - - -Flags signalling stream properties. A combination of AVFMTCTX_*. -Set by libavformat. - - - - I/O context. - - - demuxing: either set by the user before avformat_open_input() (then - the user must close it manually) or set by avformat_open_input(). - - muxing: set by the user before avformat_write_header(). The caller must - take care of closing / freeing the IO context. - - Do NOT set this field if AVFMT_NOFILE flag is set in - iformat/oformat.flags. In such a case, the (de)muxer will handle - I/O in some other way and this field will be NULL. - - - - Format private data. This is an AVOptions-enabled struct - if and only if iformat/oformat.priv_class is not NULL. - - - muxing: set by avformat_write_header() - - demuxing: set by avformat_open_input() - - - -A class for logging and @ref avoptions. Set by avformat_alloc_context(). -Exports (de)muxer private options if they exist. - - - -The duration of a video can be estimated through various ways, and this enum can be used -to know how the duration was estimated. - - -The duration field can be estimated through various ways, and this field can be used -to know how the duration was estimated. -- encoding: unused -- decoding: Read by user via AVOptions (NO direct access) - - - Returns the method used to set ctx->duration. - - @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. - - - -New fields can be added to the end with minor version bumps. -Removal, reordering and changes to existing fields require a major -version bump. -sizeof(AVProgram) must not be used outside libav*. - - - - Returns the pts of the last muxed packet + its duration - - the retuned value is undefined when used with a demuxer. - - - -An opaque field for libavformat internal usage. -Must not be accessed in any way by callers. - - - -display aspect ratio (0 if unknown) -- encoding: unused -- decoding: Set by libavformat to calculate sample_aspect_ratio internally - - - -String containing paris of key and values describing recommended encoder configuration. -Paris are separated by ','. -Keys are separated from values by '='. - - - -Internal data to inject global side data - - - -Internal data to analyze DTS and detect faulty mpeg streams - - - -Internal data to generate dts from pts - - - -Internal data to prevent doing update_initial_durations() twice - - - - Options for behavior, when a wrap is detected. - - Defined by AV_PTS_WRAP_ values. - - If correction is enabled, there are two possibilities: - If the first time stamp is near the wrap point, the wrap offset - will be subtracted, which will create negative time stamps. - Otherwise the offset will be added. - - - -Internal data to check for wrapping of the time stamp - - - -Timestamp offset added to timestamps before muxing -NOT PART OF PUBLIC API - - - -Number of internally decoded frames, used internally in libavformat, do not access -its lifetime differs from info which is why it is not in that structure. - - - -The sample after last sample that is intended to be discarded after -first_discard_sample. Works on frame boundaries only. Used to prevent -early EOF if the gapless info is broken (considered concatenated mp3s). - - - -If not 0, the first audio sample that should be discarded from the stream. -This is broken by design (needs global sample count), but can't be -avoided for broken by design formats such as mp3 with ad-hoc gapless -audio support. - - - -If not 0, the number of samples that should be skipped from the start of -the stream (the samples are removed from packets with pts==0, which also -assumes negative timestamps do not happen). -Intended for use with formats such as mp3 with ad-hoc gapless audio -support. - - - -Number of samples to skip at the start of the frame decoded from the next packet. - - - -Indicates that everything up to the next keyframe -should be discarded. - - - -stream probing state --1 -> probing finished - 0 -> no probing requested -rest -> perform probing with request_probe being the minimum score to accept. -NOT PART OF PUBLIC API - - - -Stream Identifier -This is the MPEG-TS stream identifier +1 -0 means unknown - - - - Real base framerate of the stream. - This is the lowest framerate with which all timestamps can be - represented accurately (it is the least common multiple of all - framerates in the stream). Note, this value is just a guess! - For example, if the time base is 1/90000 and all frames have either - approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. - - Code outside avformat should access this field using: - av_stream_get/set_r_frame_rate(stream) - - - -last packet in packet_buffer for this stream when muxing. - - - -Number of frames that have been demuxed during av_find_stream_info() - - - -Number of packets to buffer for codec probing - - - - Timestamp corresponding to the last dts sync point. - - Initialized when AVCodecParserContext.dts_sync_point >= 0 and - a DTS is received from the underlying container. Otherwise set to - AV_NOPTS_VALUE by default. - - - -Flags for the user to detect events happening on the stream. Flags must -be cleared by the user once the event has been handled. -A combination of AVSTREAM_EVENT_FLAG_*. - - - -The number of elements in the AVStream.side_data array. - - - - An array of side data that applies to the whole stream (i.e. the - container does not allow it to change between packets). - - There may be no overlap between the side data in this array and side data - in the packets. I.e. a given side data is either exported by the muxer - (demuxing) / set by the caller (muxing) in this array, then it never - appears in the packets, or the side data is exported / sent through - the packets (always in the first packet where the value becomes known or - changes), then it does not appear in this array. - - - demuxing: Set by libavformat when the stream is created. - - muxing: May be set by the caller before avformat_write_header(). - - Freed by libavformat in avformat_free_context(). - - @see av_format_inject_global_side_data() - - - - For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet - will contain the attached picture. - - decoding: set by libavformat, must not be modified by the caller. - encoding: unused - - - - Average framerate - - - demuxing: May be set by libavformat when creating the stream or in - avformat_find_stream_info(). - - muxing: May be set by the caller before avformat_write_header(). - - - -sample aspect ratio (0 if unknown) -- encoding: Set by user. -- decoding: Set by libavformat. - - - -Decoding: duration of the stream, in stream time base. -If a source file does not specify a duration, but does specify -a bitrate, this value will be estimated from bitrate and file size. - - - -Decoding: pts of the first frame of the stream in presentation order, in stream time base. -Only set this if you are absolutely 100% sure that the value you set -it to really is the pts of the first frame. -This may be undefined (AV_NOPTS_VALUE). -@note The ASF header does NOT contain a correct start_time the ASF -demuxer must NOT set this. - - - - This is the fundamental unit of time (in seconds) in terms - of which frame timestamps are represented. - - decoding: set by libavformat - encoding: May be set by the caller before avformat_write_header() to - provide a hint to the muxer about the desired timebase. In - avformat_write_header(), the muxer will overwrite this field - with the timebase that will actually be used for the timestamps - written into the file (which may or may not be related to the - user-provided one, depending on the format). - - - -@deprecated this field is unused - - - -@deprecated use the codecpar struct instead - - - -Format-specific stream ID. -decoding: set by libavformat -encoding: set by the user, replaced by libavformat if left unset - - - -To specify text track kind (different from subtitles default). - -Options for behavior on timestamp wrap detection. - -Stream structure. -New fields can be added to the end with minor version bumps. -Removal, reordering and changes to existing fields require a major -version bump. -sizeof(AVStream) must not be used outside libav*. - - - -Track should be used during playback by default. -Useful for subtitle track that should be displayed -even when user did not explicitly ask for subtitles. - -The stream is stored in the file as an attached picture/"cover art" (e.g. -APIC frame in ID3v2). The first (usually only) packet associated with it -will be returned among the first few packets read from the file unless -seeking takes place. It can also be accessed at any time in -AVStream.attached_pic. - -The stream is sparse, and contains thumbnail images, often corresponding -to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. - - - -@} - - - -Tell if a given file has a chance of being parsed as this format. -The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes -big so you do not have to check for that unless you need more. - - - -Size of private data so that it can be allocated in the wrapper. - - - -Raw demuxers store their codec ID here. - - - -Comma-separated list of mime types. -It is used check for matching mime types while probing. -@see av_probe_input_format2 - - - -If extensions are defined, then no probe is done. You should -usually not use extension format guessing because it is not -reliable enough - - - -Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, -AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, -AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. - - - -Descriptive name for the format, meant to be more human-readable -than name. You should use the NULL_IF_CONFIG_SMALL() macro -to define it. - - - -A comma separated list of short names for the format. New names -may be appended with a minor bump. - - - -@} - -@addtogroup lavf_decoding -@{ - - - The input container format. - - Demuxing only, set by avformat_open_input(). - - - -Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, -pkt can be NULL in order to flush data buffered in the muxer. -When flushing, return 0 if there still is more data to flush, -or 1 if everything was flushed and there is no more buffered -data. - - -Currently only used to set pixel format if not YUV420P. - - -Allows sending messages from application to device. - - - Write an uncoded AVFrame. - - See av_write_uncoded_frame() for details. - - The library will free *frame afterwards, but the muxer can prevent it - by setting the pointer to NULL. - - -Returns device list with it properties. -@see avdevice_list_devices() for more details. - - -Initialize device capabilities submodule. -@see avdevice_capabilities_create() for more details. - - -Free device capabilities submodule. -@see avdevice_capabilities_free() for more details. - - - Initialize format. May allocate data here, and set any AVFormatContext or - AVStream parameters that need to be set before packets are sent. - This method must not write output. - - Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure - - Any allocations made here must be freed in deinit(). - - - Deinitialize format. If present, this is called whenever the muxer is being - destroyed, regardless of whether or not the header has been written. - - If a trailer is being written, this is called after write_trailer(). - - This is called if init() fails as well. - - -Set up any necessary bitstream filtering and extract any extra data needed -for the global header. -Return 0 if more packets from this stream must be checked; 1 if not. - - -Read the format header and initialize the AVFormatContext -structure. Return 0 if OK. 'avformat_new_stream' should be -called to create new streams. - - -Close the stream. The AVFormatContext and AVStreams are not -freed by this function - - -Seek to a given timestamp relative to the frames in -stream component stream_index. -@param stream_index Must not be -1. -@param flags Selects which direction should be preferred if no exact - match is available. -@return >= 0 on success (but not necessarily the new offset) - - -Get the next timestamp in stream[stream_index].time_base units. -@return the timestamp or AV_NOPTS_VALUE if an error occurred - - -Start/resume playing - only meaningful if using a network-based format -(RTSP). - - -Pause playing - only meaningful if using a network-based format -(RTSP). - - -Returns device list with it properties. -@see avdevice_list_devices() for more details. - - -Initialize device capabilities submodule. -@see avdevice_capabilities_create() for more details. - - -Free device capabilities submodule. -@see avdevice_capabilities_free() for more details. - - -Callback used by devices to communicate with application. - - - Format I/O context. - New fields can be added to the end with minor version bumps. - Removal, reordering and changes to existing fields require a major - version bump. - sizeof(AVFormatContext) must not be used outside libav*, use - avformat_alloc_context() to create an AVFormatContext. - - Fields can be accessed through AVOptions (av_opt*), - the name string used matches the associated command line parameter name and - can be found in libavformat/options_table.h. - The AVOption/command line parameter names differ in some cases from the C - structure field names for historic reasons or brevity. - - - Called to open further IO contexts when needed for demuxing. - - This can be set by the user application to perform security checks on - the URLs before opening them. - The function should behave like avio_open2(), AVFormatContext is provided - as contextual information and to reach AVFormatContext.opaque. - - If NULL then some simple checks are used together with avio_open2(). - - Must not be accessed directly from outside avformat. - @See av_format_set_open_cb() - - Demuxing: Set by user. - - @deprecated Use io_open and io_close. - - -A callback for closing the streams opened with AVFormatContext.io_open(). - - -Get timing information for the data currently output. -The exact meaning of "currently output" depends on the format. -It is mostly relevant for devices that have an internal buffer and/or -work in real time. -@param s media file handle -@param stream stream in the media file -@param[out] dts DTS of the last packet output for the stream, in stream - time_base units -@param[out] wall absolute time when that packet whas output, - in microsecond -@return 0 if OK, AVERROR(ENOSYS) if the format does not support it -Note: some formats or devices may not allow to measure dts and wall -atomically. - - - -size of private data so that it can be allocated in the wrapper - - - -List of supported codec_id-codec_tag pairs, ordered by "better -choice first". The arrays are all terminated by AV_CODEC_ID_NONE. - - - Get the codec tag for the given codec id id. - If no codec tag is found returns 0. - - @param tags list of supported codec_id-codec_tag pairs, as stored - in AVInputFormat.codec_tag and AVOutputFormat.codec_tag - @param id codec ID to match to a codec tag - - - Get the codec tag for the given codec id. - - @param tags list of supported codec_id - codec_tag pairs, as stored - in AVInputFormat.codec_tag and AVOutputFormat.codec_tag - @param id codec id that should be searched for in the list - @param tag A pointer to the found tag - @return 0 if id was not found in tags, > 0 if it was found - - -@defgroup riff_fourcc RIFF FourCCs -@{ -Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are -meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the -following code: -@code -uint32_t tag = MKTAG('H', '2', '6', '4'); -const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; -enum AVCodecID id = av_codec_get_id(table, tag); -@endcode - -@return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. - - -@return the table mapping RIFF FourCCs for audio to AVCodecID. - - -@return the table mapping MOV FourCCs for video to libavcodec AVCodecID. - - -@return the table mapping MOV FourCCs for audio to AVCodecID. - - - -can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, -AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, -AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, -AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE - - - -Descriptive name for the format, meant to be more human-readable -than name. You should use the NULL_IF_CONFIG_SMALL() macro -to define it. - - - -Demuxer will use avio_open, no opened file should be provided by the caller. -@addtogroup lavf_encoding -@{ - - - The output container format. - - Muxing only, must be set by the caller before avformat_write_header(). - - - -This structure contains the data a format has to probe a file. - - - - Read data and append it to the current content of the AVPacket. - If pkt->size is 0 this is identical to av_get_packet. - Note that this uses av_grow_packet and thus involves a realloc - which is inefficient. Thus this function should only be used - when there is no reasonable way to know (an upper bound of) - the final size. - - @param s associated IO context - @param pkt packet - @param size amount of data to read - @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data - will not be lost even if an error occurs. - - - -Accept and allocate a client context on a server context. -@param s the server context -@param c the client context, must be unallocated -@return >= 0 on success or a negative value corresponding - to an AVERROR on failure - - - - Seek to a given timestamp relative to some component stream. - Only meaningful if using a network streaming protocol (e.g. MMS.). - - @param h IO context from which to call the seek function pointers - @param stream_index The stream index that the timestamp is relative to. - If stream_index is (-1) the timestamp should be in AV_TIME_BASE - units from the beginning of the presentation. - If a stream_index >= 0 is used and the protocol does not support - seeking based on component streams, the call will fail. - @param timestamp timestamp in AVStream.time_base units - or if there is no stream specified then in AV_TIME_BASE units. - @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE - and AVSEEK_FLAG_ANY. The protocol may silently ignore - AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will - fail if used and not supported. - @return >= 0 on success - @see AVInputFormat::read_seek - - - - Pause and resume playing - only meaningful if using a network streaming - protocol (e.g. MMS). - - @param h IO context from which to call the read_pause function pointer - @param pause 1 for pause, 0 for resume - - - - Iterate through names of available protocols. - - @param opaque A private pointer representing current protocol. - It must be a pointer to NULL on first iteration and will - be updated by successive calls to avio_enum_protocols. - @param output If set to 1, iterate over output protocols, - otherwise over input protocols. - - @return A static string containing the name of current protocol or NULL - - - - Return the written size and a pointer to the buffer. The buffer - must be freed with av_free(). - Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. - - @param s IO context - @param pbuffer pointer to a byte buffer - @return the length of the byte buffer - - - - Open a write only memory stream. - - @param s new IO context - @return zero if no error. - - - - Create and initialize a AVIOContext for accessing the - resource indicated by url. - @note When the resource indicated by url has been opened in - read+write mode, the AVIOContext can be used only for writing. - - @param s Used to return the pointer to the created AVIOContext. - In case of failure the pointed to value is set to NULL. - @param url resource to access - @param flags flags which control how the resource indicated by url - is to be opened - @param int_cb an interrupt callback to be used at the protocols level - @param options A dictionary filled with protocol-private options. On return - this parameter will be destroyed and replaced with a dict containing options - that were not found. May be NULL. - @return >= 0 in case of success, a negative value corresponding to an - AVERROR code in case of failure - - - -@name URL open modes -The flags argument to avio_open must be one of the following -constants, optionally ORed with other flags. -@{ - -@} - -Use non-blocking mode. -If this flag is set, operations on the context will return -AVERROR(EAGAIN) if they can not be performed immediately. -If this flag is not set, operations on the context will never return -AVERROR(EAGAIN). -Note that this flag does not affect the opening/connecting of the -context. Connecting a protocol will always block if necessary (e.g. on -network protocols) but never hang (e.g. on busy devices). -Warning: non-blocking protocols is work-in-progress; this flag may be -silently ignored. - -Use direct mode. -avio_read and avio_write should if possible be satisfied directly -instead of going through a buffer, and avio_seek will always -call the underlying seek function directly. - - Create and initialize a AVIOContext for accessing the - resource indicated by url. - @note When the resource indicated by url has been opened in - read+write mode, the AVIOContext can be used only for writing. - - @param s Used to return the pointer to the created AVIOContext. - In case of failure the pointed to value is set to NULL. - @param url resource to access - @param flags flags which control how the resource indicated by url - is to be opened - @return >= 0 in case of success, a negative value corresponding to an - AVERROR code in case of failure - - - - @name Functions for reading from AVIOContext - @{ - - @note return 0 if EOF, so you cannot use it if EOF handling is - necessary - - - -Read size bytes from AVIOContext into buf. -@return number of bytes read or AVERROR - - - - Force flushing of buffered data. - - For write streams, force the buffered data to be immediately written to the output, - without to wait to fill the internal buffer. - - For read streams, discard all currently buffered data, and advance the - reported file position to that of the underlying stream. This does not - read new data, and does not perform any seeks. - - - -@warning Writes up to 4 KiB per call - - -@deprecated use avio_feof() - - - -feof() equivalent for AVIOContext. -@return non zero if and only if end of file - - - -Get the filesize. -@return filesize or AVERROR - - - -ftell() equivalent for AVIOContext. -@return position or AVERROR. - - - -Skip given number of bytes forward -@return new position or AVERROR. - - - - Convert an UTF-8 string to UTF-16BE and write it. - @param s the AVIOContext - @param str NULL-terminated UTF-8 string - - @return number of bytes written. - - - - Convert an UTF-8 string to UTF-16LE and write it. - @param s the AVIOContext - @param str NULL-terminated UTF-8 string - - @return number of bytes written. - - - -Write a NULL-terminated string. -@return number of bytes written. - - - - Allocate and initialize an AVIOContext for buffered I/O. It must be later - freed with av_free(). - - @param buffer Memory block for input/output operations via AVIOContext. - The buffer must be allocated with av_malloc() and friends. - It may be freed and replaced with a new buffer by libavformat. - AVIOContext.buffer holds the buffer currently in use, - which must be later freed with av_free(). - @param buffer_size The buffer size is very important for performance. - For protocols with fixed blocksize it should be set to this blocksize. - For others a typical size is a cache page, e.g. 4kb. - @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. - @param opaque An opaque pointer to user-specific data. - @param read_packet A function for refilling the buffer, may be NULL. - @param write_packet A function for writing the buffer contents, may be NULL. - The function may not change the input buffers content. - @param seek A function for seeking to specified byte position, may be NULL. - - @return Allocated AVIOContext or NULL on failure. - - - - Free entry allocated by avio_read_dir(). - - @param entry entry to be freed. - - - - Close directory. - - @note Entries created using avio_read_dir() are not deleted and must be - freeded with avio_free_directory_entry(). - - @param s directory read context. - @return >=0 on success or negative on error. - - - - Get next directory entry. - - Returned entry must be freed with avio_free_directory_entry(). In particular - it may outlive AVIODirContext. - - @param s directory read context. - @param[out] next next entry or NULL when no more entries. - @return >=0 on success or negative on error. End of list is not considered an - error. - - - - Open directory for reading. - - @param s directory read context. Pointer to a NULL pointer must be passed. - @param url directory to be listed. - @param options A dictionary filled with protocol-private options. On return - this parameter will be destroyed and replaced with a dictionary - containing options that were not found. May be NULL. - @return >=0 on success or negative on error. - - - - Delete a resource. - - @param url resource to be deleted. - @return >=0 on success or negative on error. - - - - Move or rename a resource. - - @note url_src and url_dst should share the same protocol and authority. - - @param url_src url to resource to be moved - @param url_dst new url to resource if the operation succeeded - @return >=0 on success or negative on error. - - - - Return AVIO_FLAG_* access flags corresponding to the access permissions - of the resource in url, or a negative value corresponding to an - AVERROR code in case of failure. The returned access flags are - masked by the value in flags. - - @note This function is intrinsically unsafe, in the sense that the - checked resource may change its existence or permission status from - one call to another. Thus you should not trust the returned value, - unless you are sure that no other processes are accessing the - checked resource. - - - - Return the name of the protocol that will handle the passed URL. - - NULL is returned if no protocol could be found for the given URL. - - @return Name of the protocol or NULL. - - - -If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, -but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly -small chunks of data returned from the callback). - - - -',' separated list of disallowed protocols. - - - -',' separated list of allowed protocols. - - - -Threshold to favor readahead over seek. -This is current internal only, do not use from outside. - - - -Original buffer size -used internally after probing and ensure seekback to reset the buffer size -This field is internal to libavformat and access from outside is not allowed. - - - -writeout statistic -This field is internal to libavformat and access from outside is not allowed. - - - -seek statistic -This field is internal to libavformat and access from outside is not allowed. - - - -Bytes read statistic -This field is internal to libavformat and access from outside is not allowed. - - - -avio_read and avio_write should if possible be satisfied directly -instead of going through a buffer, and avio_seek will always -call the underlying seek function directly. - - - -max filesize, used to limit allocations -This field is internal to libavformat and access from outside is not allowed. - - - -A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. - - - -Seek to a given timestamp in stream with the specified stream_index. -Needed for some network streaming protocols which don't support seeking -to byte position. - - - -Pause or resume playback for network streaming protocols - e.g. MMS. - - - - A class for private options. - - If this AVIOContext is created by avio_open2(), av_class is set and - passes the options down to protocols. - - If this AVIOContext is manually allocated, then av_class may be set by - the caller. - - warning -- this field can be NULL, be sure to not pass this AVIOContext - to any av_opt_* functions in that case. - - - - Bytestream IO Context. - New fields can be added to the end with minor version bumps. - Removal, reordering and changes to existing fields require a major - version bump. - sizeof(AVIOContext) must not be used outside libav*. - - @note None of the function pointers in AVIOContext should be called - directly, they should only be set by the client application - when implementing custom I/O. Normally these are set to the - function pointers specified in avio_alloc_context() - - - -Different data types that can be returned via the AVIO -write_data_type callback. - - -A callback that is used instead of write_packet. - - -Internal, not meant to be used from outside of AVIOContext. - - - Mark the written bytestream as a specific type. - - Zero-length ranges are omitted from the output. - - @param time the stream time the current bytestream pos corresponds to - (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not - applicable - @param type the kind of data written starting at the current pos - - - -Trailer data, which doesn't contain actual content, but only for -finalizing the output file. - - - -This is any, unlabelled data. It can either be a muxer not marking -any positions at all, it can be an actual boundary/sync point -that the muxer chooses not to mark, or a later part of a packet/fragment -that is cut into multiple write callbacks due to limited IO buffer size. - - - -A point in the output bytestream where a demuxer can start parsing -(for non self synchronizing bytestream formats). That is, any -non-keyframe packet start point. - - - -A point in the output bytestream where a decoder can start decoding -(i.e. a keyframe). A demuxer/decoder given the data flagged with -AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, -should give decodeable results. - - - -Header data; this needs to be present for the stream to be decodeable. - - - - Describes single entry of the directory. - - Only name and type fields are guaranteed be set. - Rest of fields are protocol or/and platform dependent and might be unknown. - - - -Directory entry types. - - - -@} - -@file -@ingroup lavf_io -Buffered I/O operations - -@file -common internal and external API header - -@file -@ingroup libavf -Libavformat version macros - - FF_API_* defines may be placed below to indicate public API that will be - dropped at a future version bump. The defines themselves are not part of - the public API and may change, break or disappear at any time. - - @note, when bumping the major version it is recommended to manually - disable each FF_API_* in its own commit instead of disabling them all - at once through the bump. This improves the git bisect-ability of the change. - - - Callback for checking whether to abort blocking functions. - AVERROR_EXIT is returned in this case by the interrupted - function. During blocking operations, callback is called with - opaque as parameter. If the callback returns 1, the - blocking operation will be aborted. - - No members can be added to this struct without a major bump, if - new elements have been added after this struct in AVFormatContext - or AVIOContext. - - - - Allocate a CPB properties structure and initialize its fields to default - values. - - @param size if non-NULL, the size of the allocated struct will be written - here. This is useful for embedding it in side data. - - @return the newly allocated struct or NULL on failure - - - -@return codec descriptor with the given name or NULL if no such descriptor - exists. - - - - Iterate over all codec descriptors known to libavcodec. - - @param prev previous descriptor. NULL to get the first descriptor. - - @return next descriptor or NULL after the last descriptor - - - -@return a non-zero number if codec is a decoder, zero otherwise - - - -@return a non-zero number if codec is an encoder, zero otherwise - - - -@return a positive value if s is open (i.e. avcodec_open2() was called on it -with no corresponding avcodec_close()), 0 otherwise. - - - -Lock operation used by lockmgr - - - Register a user provided lock manager supporting the operations - specified by AVLockOp. The "mutex" argument to the function points - to a (void *) where the lockmgr should store/get a pointer to a user - allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the - value left by the last call for all other ops. If the lock manager is - unable to perform the op then it should leave the mutex in the same - state as when it was called and return a non-zero value. However, - when called with AV_LOCK_DESTROY the mutex will always be assumed to - have been successfully destroyed. If av_lockmgr_register succeeds - it will return a non-negative value, if it fails it will return a - negative value and destroy all mutex and unregister all callbacks. - av_lockmgr_register is not thread-safe, it must be called from a - single thread before any calls which make use of locking are used. - - @param cb User defined callback. av_lockmgr_register invokes calls - to this callback and the previously registered callback. - The callback will be used to create more than one mutex - each of which must be backed by its own underlying locking - mechanism (i.e. do not use a single static object to - implement your lock manager). If cb is set to NULL the - lockmgr will be unregistered. - - - -If hwaccel is NULL, returns the first registered hardware accelerator, -if hwaccel is non-NULL, returns the next registered hardware accelerator -after hwaccel, or NULL if hwaccel is the last one. - - - -Register the hardware accelerator hwaccel. - - - -Log a generic warning message asking for a sample. This function is -intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) -only, and would normally not be used by applications. -@param[in] avc a pointer to an arbitrary struct of which the first field is -a pointer to an AVClass struct -@param[in] msg string containing an optional message, or NULL if no message -@deprecated Use avpriv_request_sample() instead. - - - -Log a generic warning message about a missing feature. This function is -intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) -only, and would normally not be used by applications. -@param[in] avc a pointer to an arbitrary struct of which the first field is -a pointer to an AVClass struct -@param[in] feature string containing the name of the missing feature -@param[in] want_sample indicates if samples are wanted which exhibit this feature. -If want_sample is non-zero, additional verbiage will be added to the log -message which tells the user how to report samples to the development -mailing list. -@deprecated Use avpriv_report_missing_feature() instead. - - - - Encode extradata length to a buffer. Used by xiph codecs. - - @param s buffer to write to; must be at least (v/255+1) bytes long - @param v size of extradata in bytes - @return number of bytes written to the buffer. - - - -Same behaviour av_fast_padded_malloc except that buffer will always -be 0-initialized after call. - - - - Same behaviour av_fast_malloc but the buffer has additional - AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. - - In addition the whole buffer will initially and after resizes - be 0-initialized so that no uninitialized data will ever appear. - - - - Get null/pass-through bitstream filter. - - @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter - - @return - - - - Parse string describing list of bitstream filters and create single - @ref AVBSFContext describing the whole chain of bitstream filters. - Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly - allocated by av_bsf_alloc(). - - @param str String describing chain of bitstream filters in format - `bsf1[=opt1=val1:opt2=val2][,bsf2]` - @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure - representing the chain of bitstream filters - - @return >=0 on success, negative AVERROR in case of failure - - - - Finalize list of bitstream filters. - - This function will transform @ref AVBSFList to single @ref AVBSFContext, - so the whole chain of bitstream filters can be treated as single filter - freshly allocated by av_bsf_alloc(). - If the call is successful, @ref AVBSFList structure is freed and lst - will be set to NULL. In case of failure, caller is responsible for - freeing the structure by av_bsf_list_free() - - @param lst Filter list structure to be transformed - @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure - representing the chain of bitstream filters - - @return >=0 on success, negative AVERROR in case of failure - - - - Construct new bitstream filter context given it's name and options - and append it to the list of bitstream filters. - - @param lst List to append to - @param bsf_name Name of the bitstream filter - @param options Options for the bitstream filter, can be set to NULL - - @return >=0 on success, negative AVERROR in case of failure - - - - Append bitstream filter to the list of bitstream filters. - - @param lst List to append to - @param bsf Filter context to be appended - - @return >=0 on success, negative AVERROR in case of failure - - - - Free list of bitstream filters. - - @param lst Pointer to pointer returned by av_bsf_list_alloc() - - - - Allocate empty list of bitstream filters. - The list must be later freed by av_bsf_list_free() - or finalized by av_bsf_list_finalize(). - - @return Pointer to @ref AVBSFList on success, NULL in case of failure - - - -Structure for chain/list of bitstream filters. -Empty list can be allocated by av_bsf_list_alloc(). - - - - Get the AVClass for AVBSFContext. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - -Free a bitstream filter context and everything associated with it; write NULL -into the supplied pointer. - - - - Retrieve a filtered packet. - - @param[out] pkt this struct will be filled with the contents of the filtered - packet. It is owned by the caller and must be freed using - av_packet_unref() when it is no longer needed. - This parameter should be "clean" (i.e. freshly allocated - with av_packet_alloc() or unreffed with av_packet_unref()) - when this function is called. If this function returns - successfully, the contents of pkt will be completely - overwritten by the returned data. On failure, pkt is not - touched. - - @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the - filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there - will be no further output from the filter. Another negative AVERROR value if - an error occurs. - - @note one input packet may result in several output packets, so after sending - a packet with av_bsf_send_packet(), this function needs to be called - repeatedly until it stops returning 0. It is also possible for a filter to - output fewer packets than were sent to it, so this function may return - AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. - - - - Submit a packet for filtering. - - After sending each packet, the filter must be completely drained by calling - av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or - AVERROR_EOF. - - @param pkt the packet to filter. pkt must contain some payload (i.e data or - side data must be present in pkt). The bitstream filter will take ownership of - the packet and reset the contents of pkt. pkt is not touched if an error occurs. - This parameter may be NULL, which signals the end of the stream (i.e. no more - packets will be sent). That will cause the filter to output any packets it - may have buffered internally. - - @return 0 on success, a negative AVERROR on error. - - - -Prepare the filter for use, after all the parameters and options have been -set. - - - - Allocate a context for a given bitstream filter. The caller must fill in the - context parameters as described in the documentation and then call - av_bsf_init() before sending any data to the filter. - - @param filter the filter for which to allocate an instance. - @param ctx a pointer into which the pointer to the newly-allocated context - will be written. It must be freed with av_bsf_free() after the - filtering is done. - - @return 0 on success, a negative AVERROR code on failure - - - - Iterate over all registered bitstream filters. - - @param opaque a pointer where libavcodec will store the iteration state. Must - point to NULL to start the iteration. - - @return the next registered bitstream filter or NULL when the iteration is - finished - - - -@return a bitstream filter with the specified name or NULL if no such - bitstream filter exists. - - - - If f is NULL, return the first registered bitstream filter, - if f is non-NULL, return the next registered bitstream filter - after f, or NULL if f is the last one. - - This function can be used to iterate over all registered bitstream - filters. - - - - Release bitstream filter context. - - @param bsf the bitstream filter context created with - av_bitstream_filter_init(), can be NULL - - - - Filter bitstream. - - This function filters the buffer buf with size buf_size, and places the - filtered buffer in the buffer pointed to by poutbuf. - - The output buffer must be freed by the caller. - - @param bsfc bitstream filter context created by av_bitstream_filter_init() - @param avctx AVCodecContext accessed by the filter, may be NULL. - If specified, this must point to the encoder context of the - output stream the packet is sent to. - @param args arguments which specify the filter configuration, may be NULL - @param poutbuf pointer which is updated to point to the filtered buffer - @param poutbuf_size pointer which is updated to the filtered buffer size in bytes - @param buf buffer containing the data to filter - @param buf_size size in bytes of buf - @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data - @return >= 0 in case of success, or a negative error code in case of failure - - If the return value is positive, an output buffer is allocated and - is available in *poutbuf, and is distinct from the input buffer. - - If the return value is 0, the output buffer is not allocated and - should be considered identical to the input buffer, or in case - *poutbuf was set it points to the input buffer (not necessarily to - its starting address). A special case is if *poutbuf was set to NULL and - *poutbuf_size was set to 0, which indicates the packet should be dropped. - - - - Create and initialize a bitstream filter context given a bitstream - filter name. - - The returned context must be freed with av_bitstream_filter_close(). - - @param name the name of the bitstream filter - @return a bitstream filter context if a matching filter was found - and successfully initialized, NULL otherwise - - - - Register a bitstream filter. - - The filter will be accessible to the application code through - av_bitstream_filter_next() or can be directly initialized with - av_bitstream_filter_init(). - - @see avcodec_register_all() - - - - A class for the private data, used to declare bitstream filter private - AVOptions. This field is NULL for bitstream filters that do not declare - any options. - - If this field is non-NULL, the first member of the filter private data - must be a pointer to AVClass, which will be set by libavcodec generic - code to this class. - - - -The timebase used for the timestamps of the output packets. Set by the -filter in av_bsf_init(). - - - -The timebase used for the timestamps of the input packets. Set by the -caller before av_bsf_init(). - - - -Parameters of the output stream. Set by the filter in av_bsf_init(). - - - -Parameters of the input stream. Set by the caller before av_bsf_init(). - - - -Opaque filter-specific private data. If filter->priv_class is non-NULL, -this is an AVOptions-enabled struct. - - - -Opaque libavcodec internal data. Must not be touched by the caller in any -way. - - - -The bitstream filter this context is an instance of. - - - -A class for logging and AVOptions - - - - The bitstream filter state. - - This struct must be allocated with av_bsf_alloc() and freed with - av_bsf_free(). - - The fields in the struct will only be changed (by the caller or by the - filter) as described in their documentation, and are to be considered - immutable otherwise. - - - -Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). -Not for access by library users. - - - -This function is the same as av_get_audio_frame_duration(), except it works -with AVCodecParameters instead of an AVCodecContext. - - - - Return audio frame duration. - - @param avctx codec context - @param frame_bytes size of the frame, or 0 if unknown - @return frame duration, in samples, if known. 0 if not able to - determine. - - - - Reset the internal decoder state / flush internal buffers. Should be called - e.g. when seeking or when switching to a different stream. - - @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), - this invalidates the frames previously returned from the decoder. When - refcounted frames are used, the decoder just releases any references it might - keep internally, but the caller's reference remains valid. - - - - Return a name for the specified profile, if available. - - @param codec the codec that is searched for the given profile - @param profile the profile value for which a name is requested - @return A name for the profile if found, NULL otherwise. - - - - Put a string representing the codec tag codec_tag in buf. - - @param buf buffer to place codec tag in - @param buf_size size in bytes of buf - @param codec_tag codec tag to assign - @return the length of the string that would have been generated if - enough space had been available, excluding the trailing null - - - -@} - -@deprecated this function is not supposed to be used from outside of lavc - - - -@deprecated unused - - - - * Initialize an audio resampler. - * Note, if either rate is not an integer then simply scale both rates up so they are. - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq - * @param log2_phase_count log2 of the number of entries in the polyphase filterbank - * @param linear If 1 then the used FIR filter will be linearly interpolated - between the 2 closest, if 0 the closest will be used - * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate - - -Resample an array of samples using a previously configured context. -@param src an array of unconsumed samples -@param consumed the number of samples of src which have been consumed are returned here -@param src_size the number of unconsumed samples available -@param dst_size the amount of space in samples available in dst -@param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. -@return the number of samples written in dst or -1 if an error occurred - - - Compensate samplerate/timestamp drift. The compensation is done by changing - the resampler parameters, so no audible clicks or similar distortions occur - @param compensation_distance distance in output samples over which the compensation should be performed - @param sample_delta number of output samples which should be output less - - example: av_resample_compensate(c, 10, 500) - here instead of 510 samples only 500 samples would be output - - note, due to rounding the actual compensation might be slightly different, - especially if the compensation_distance is large and the in_rate used during init is small - - - - Free resample context. - - @param s a non-NULL pointer to a resample context previously - created with av_audio_resample_init() - - - -@} - - @defgroup lavc_resample Audio resampling - @ingroup libavc - @deprecated use libswresample instead - - @{ - - - - Encode a frame of video. - - Takes input raw video data from frame and writes the next output packet, if - available, to avpkt. The output packet does not necessarily contain data for - the most recent frame, as encoders can delay and reorder input frames - internally as needed. - - @param avctx codec context - @param avpkt output AVPacket. - The user can supply an output buffer by setting - avpkt->data and avpkt->size prior to calling the - function, but if the size of the user-provided data is not - large enough, encoding will fail. All other AVPacket fields - will be reset by the encoder using av_init_packet(). If - avpkt->data is NULL, the encoder will allocate it. - The encoder will set avpkt->size to the size of the - output packet. The returned data (if any) belongs to the - caller, he is responsible for freeing it. - - If this function fails or produces no output, avpkt will be - freed using av_packet_unref(). - @param[in] frame AVFrame containing the raw video data to be encoded. - May be NULL when flushing an encoder that has the - AV_CODEC_CAP_DELAY capability set. - @param[out] got_packet_ptr This field is set to 1 by libavcodec if the - output packet is non-empty, and to 0 if it is - empty. If the function returns an error, the - packet can be assumed to be invalid, and the - value of got_packet_ptr is undefined and should - not be used. - @return 0 on success, negative error code on failure - - @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead - - - - Encode a frame of audio. - - Takes input samples from frame and writes the next output packet, if - available, to avpkt. The output packet does not necessarily contain data for - the most recent frame, as encoders can delay, split, and combine input frames - internally as needed. - - @param avctx codec context - @param avpkt output AVPacket. - The user can supply an output buffer by setting - avpkt->data and avpkt->size prior to calling the - function, but if the size of the user-provided data is not - large enough, encoding will fail. If avpkt->data and - avpkt->size are set, avpkt->destruct must also be set. All - other AVPacket fields will be reset by the encoder using - av_init_packet(). If avpkt->data is NULL, the encoder will - allocate it. The encoder will set avpkt->size to the size - of the output packet. - - If this function fails or produces no output, avpkt will be - freed using av_packet_unref(). - @param[in] frame AVFrame containing the raw audio data to be encoded. - May be NULL when flushing an encoder that has the - AV_CODEC_CAP_DELAY capability set. - If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame - can have any number of samples. - If it is not set, frame->nb_samples must be equal to - avctx->frame_size for all frames except the last. - The final frame may be smaller than avctx->frame_size. - @param[out] got_packet_ptr This field is set to 1 by libavcodec if the - output packet is non-empty, and to 0 if it is - empty. If the function returns an error, the - packet can be assumed to be invalid, and the - value of got_packet_ptr is undefined and should - not be used. - @return 0 on success, negative error code on failure - - @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead - - - - Find a registered encoder with the specified name. - - @param name name of the requested encoder - @return An encoder if one was found, NULL otherwise. - - - -@return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed -@deprecated use AVBitStreamFilter - - - - The format of the coded data, corresponds to enum AVPixelFormat for video - and for enum AVSampleFormat for audio. - - Note that a decoder can have considerable freedom in how exactly it - decodes the data, so the format reported here might be different from the - one returned by a decoder. - - - -Dimensions of the coded video. - - - -Dimensions of the decoded video intended for presentation. - - - - Picture number incremented in presentation or output order. - This field may be reinitialized at the first picture of a new sequence. - - For example, this corresponds to H.264 PicOrderCnt. - - - -Duration of the current frame. -For audio, this is in units of 1 / AVCodecContext.sample_rate. -For all other types, this is in units of AVCodecContext.time_base. - - - -Previous frame byte position. - - - -Byte position of currently parsed frame in stream. - - - - Position of the packet in file. - - Analogous to cur_frame_pts/dts - - - - Presentation delay of current frame in units of AVCodecContext.time_base. - - Set to INT_MIN when dts_sync_point unused. Otherwise, it must - contain valid non-negative timestamp delta (presentation time of a frame - must not lie in the past). - - This delay represents the difference between decoding and presentation - time of the frame. - - For example, this corresponds to H.264 dpb_output_delay. - - - - Offset of the current timestamp against last timestamp sync point in - units of AVCodecContext.time_base. - - Set to INT_MIN when dts_sync_point unused. Otherwise, it must - contain a valid timestamp offset. - - Note that the timestamp of sync point has usually a nonzero - dts_ref_dts_delta, which refers to the previous sync point. Offset of - the next frame after timestamp sync point will be usually 1. - - For example, this corresponds to H.264 cpb_removal_delay. - - - -@deprecated unused - - - -Set by parser to 1 for key frames and 0 for non-key frames. -It is initialized to -1, so if the parser doesn't set this flag, -old-style fallback using AV_PICTURE_TYPE_I picture type as key frames -will be used. - - - -Set if the parser has a valid file offset - - - This field is used for proper frame duration computation in lavf. - It signals, how much longer the frame duration of the current frame - is compared to normal frame duration. - - frame_duration = (1 + repeat_pict) * time_base - - It is used by codecs like H.264 to display telecined material. - - - -@defgroup lavc_parsing Frame parsing -@{ - - - Indicate whether a picture is coded as a frame, top field or bottom field. - - For example, H.264 field_pic_flag equal to 0 corresponds to - AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag - equal to 1 and bottom_field_flag equal to 0 corresponds to - AV_PICTURE_STRUCTURE_TOP_FIELD. - - - - Read encoded data from the encoder. - - @param avctx codec context - @param avpkt This will be set to a reference-counted packet allocated by the - encoder. Note that the function will always call - av_frame_unref(frame) before doing anything else. - @return 0 on success, otherwise negative error code: - AVERROR(EAGAIN): output is not available right now - user must try - to send input - AVERROR_EOF: the encoder has been fully flushed, and there will be - no more output packets - AVERROR(EINVAL): codec not opened, or it is an encoder - other errors: legitimate decoding errors - - - - Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() - to retrieve buffered output packets. - - @param avctx codec context - @param[in] frame AVFrame containing the raw audio or video frame to be encoded. - Ownership of the frame remains with the caller, and the - encoder will not write to the frame. The encoder may create - a reference to the frame data (or copy it if the frame is - not reference-counted). - It can be NULL, in which case it is considered a flush - packet. This signals the end of the stream. If the encoder - still has packets buffered, it will return them after this - call. Once flushing mode has been entered, additional flush - packets are ignored, and sending frames will return - AVERROR_EOF. - - For audio: - If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame - can have any number of samples. - If it is not set, frame->nb_samples must be equal to - avctx->frame_size for all frames except the last. - The final frame may be smaller than avctx->frame_size. - @return 0 on success, otherwise negative error code: - AVERROR(EAGAIN): input is not accepted right now - the frame must be - resent after trying to read output packets - AVERROR_EOF: the encoder has been flushed, and no new frames can - be sent to it - AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a - decoder, or requires flush - AVERROR(ENOMEM): failed to add packet to internal queue, or similar - other errors: legitimate decoding errors - - - - Return decoded output data from a decoder. - - @param avctx codec context - @param frame This will be set to a reference-counted video or audio - frame (depending on the decoder type) allocated by the - decoder. Note that the function will always call - av_frame_unref(frame) before doing anything else. - - @return - 0: success, a frame was returned - AVERROR(EAGAIN): output is not available right now - user must try - to send new input - AVERROR_EOF: the decoder has been fully flushed, and there will be - no more output frames - AVERROR(EINVAL): codec not opened, or it is an encoder - other negative values: legitimate decoding errors - - - - Supply raw packet data as input to a decoder. - - Internally, this call will copy relevant AVCodecContext fields, which can - influence decoding per-packet, and apply them when the packet is actually - decoded. (For example AVCodecContext.skip_frame, which might direct the - decoder to drop the frame contained by the packet sent with this function.) - - @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE - larger than the actual read bytes because some optimized bitstream - readers read 32 or 64 bits at once and could read over the end. - - @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) - on the same AVCodecContext. It will return unexpected results now - or in future libavcodec versions. - - @note The AVCodecContext MUST have been opened with @ref avcodec_open2() - before packets may be fed to the decoder. - - @param avctx codec context - @param[in] avpkt The input AVPacket. Usually, this will be a single video - frame, or several complete audio frames. - Ownership of the packet remains with the caller, and the - decoder will not write to the packet. The decoder may create - a reference to the packet data (or copy it if the packet is - not reference-counted). - Unlike with older APIs, the packet is always fully consumed, - and if it contains multiple frames (e.g. some audio codecs), - will require you to call avcodec_receive_frame() multiple - times afterwards before you can send a new packet. - It can be NULL (or an AVPacket with data set to NULL and - size set to 0); in this case, it is considered a flush - packet, which signals the end of the stream. Sending the - first flush packet will return success. Subsequent ones are - unnecessary and will return AVERROR_EOF. If the decoder - still has frames buffered, it will return them after sending - a flush packet. - - @return 0 on success, otherwise negative error code: - AVERROR(EAGAIN): input is not accepted right now - the packet must be - resent after trying to read output - AVERROR_EOF: the decoder has been flushed, and no new packets can - be sent to it (also returned if more than 1 flush - packet is sent) - AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush - AVERROR(ENOMEM): failed to add packet to internal queue, or similar - other errors: legitimate decoding errors - - - - Decode a subtitle message. - Return a negative value on error, otherwise return the number of bytes used. - If no subtitle could be decompressed, got_sub_ptr is zero. - Otherwise, the subtitle is stored in *sub. - Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for - simplicity, because the performance difference is expect to be negligible - and reusing a get_buffer written for video codecs would probably perform badly - due to a potentially very different allocation pattern. - - Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input - and output. This means that for some packets they will not immediately - produce decoded output and need to be flushed at the end of decoding to get - all the decoded data. Flushing is done by calling this function with packets - with avpkt->data set to NULL and avpkt->size set to 0 until it stops - returning subtitles. It is safe to flush even those decoders that are not - marked with CODEC_CAP_DELAY, then no subtitles will be returned. - - @note The AVCodecContext MUST have been opened with @ref avcodec_open2() - before packets may be fed to the decoder. - - @param avctx the codec context - @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, - must be freed with avsubtitle_free if *got_sub_ptr is set. - @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. - @param[in] avpkt The input AVPacket containing the input buffer. - - - - * Decode the audio frame of size avpkt->size from avpkt->data into frame. - * - * Some decoders may support multiple frames in a single AVPacket. Such - * decoders would then just decode the first frame and the return value would be - * less than the packet size. In this case, avcodec_decode_audio4 has to be - * called again with an AVPacket containing the remaining data in order to - * decode the second frame, etc... Even if no frames are returned, the packet - * needs to be fed to the decoder with remaining data until it is completely - * consumed or an error occurs. - * - * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input - * and output. This means that for some packets they will not immediately - * produce decoded output and need to be flushed at the end of decoding to get - * all the decoded data. Flushing is done by calling this function with packets - * with avpkt->data set to NULL and avpkt->size set to 0 until it stops - * returning samples. It is safe to flush even those decoders that are not - * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. - * - * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE - * larger than the actual read bytes because some optimized bitstream - * readers read 32 or 64 bits at once and could read over the end. - * - * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() - * before packets may be fed to the decoder. - * - * @param avctx the codec context - * @param[out] frame The AVFrame in which to store decoded audio samples. - * The decoder will allocate a buffer for the decoded frame by - * calling the AVCodecContext.get_buffer2() callback. - * When AVCodecContext.refcounted_frames is set to 1, the frame is - * reference counted and the returned reference belongs to the - * caller. The caller must release the frame using av_frame_unref() - * when the frame is no longer needed. The caller may safely write - * to the frame if av_frame_is_writable() returns 1. - * When AVCodecContext.refcounted_frames is set to 0, the returned - * reference belongs to the decoder and is valid only until the - * next call to this function or until closing or flushing the - * decoder. The caller may not write to it. - * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is - * non-zero. Note that this field being set to zero - * does not mean that an error has occurred. For - * decoders with AV_CODEC_CAP_DELAY set, no given decode - * call is guaranteed to produce a frame. - * @param[in] avpkt The input AVPacket containing the input buffer. - * At least avpkt->data and avpkt->size should be set. Some - * decoders might also require additional fields to be set. - * @return A negative error code is returned if an error occurred during - * decoding, otherwise the number of bytes consumed from the input - * AVPacket is returned. - * -* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). - - - - Modify width and height values so that they will result in a memory - buffer that is acceptable for the codec if you also ensure that all - line sizes are a multiple of the respective linesize_align[i]. - - May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. - - - - Modify width and height values so that they will result in a memory - buffer that is acceptable for the codec if you do not use any horizontal - padding. - - May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. - - - - Return the amount of padding in pixels which the get_buffer callback must - provide around the edge of the image for codecs which do not have the - CODEC_FLAG_EMU_EDGE flag. - - @return Required padding in pixels. - - @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer - needed - - - -The default callback for AVCodecContext.get_buffer2(). It is made public so -it can be called by custom get_buffer2() implementations for decoders without -AV_CODEC_CAP_DR1 set. - - - - Find a registered decoder with the specified name. - - @param name name of the requested decoder - @return A decoder if one was found, NULL otherwise. - - - - Convert valid timing fields (timestamps / durations) in a packet from one - timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be - ignored. - - @param pkt packet on which the conversion will be performed - @param tb_src source timebase, in which the timing fields in pkt are - expressed - @param tb_dst destination timebase, to which the timing fields will be - converted - - - - Copy only "properties" fields from src to dst. - - Properties for the purpose of this function are all the fields - beside those related to the packet data (buf, data, size) - - @param dst Destination packet - @param src Source packet - - @return 0 on success AVERROR on failure. - - - - Move every field in src to dst and reset src. - - @see av_packet_unref - - @param src Source packet, will be reset - @param dst Destination packet - - - - Wipe the packet. - - Unreference the buffer referenced by the packet and reset the - remaining packet fields to their default values. - - @param pkt The packet to be unreferenced. - - - - Setup a new reference to the data described by a given packet - - If src is reference-counted, setup dst as a new reference to the - buffer in src. Otherwise allocate a new buffer in dst and copy the - data from src into it. - - All the other fields are copied from src. - - @see av_packet_unref - - @param dst Destination packet - @param src Source packet - - @return 0 on success, a negative AVERROR on error. - - - - Convenience function to free all the side data stored. - All the other fields stay untouched. - - @param pkt packet - - - - Pack a dictionary for use in side_data. - - @param dict The dictionary to pack. - @param size pointer to store the size of the returned data - @return pointer to data if successful, NULL otherwise - - - - Free a packet. - - @deprecated Use av_packet_unref - - @param pkt packet to free - - - - Copy packet side data - - @return 0 on success, negative AVERROR on fail - - - - Copy packet, including contents - - @return 0 on success, negative AVERROR on fail - - - - @warning This is a hack - the packet memory allocation stuff is broken. The - packet is allocated if it was not really allocated. - - @deprecated Use av_packet_ref - - - - Initialize a reference-counted packet from av_malloc()ed data. - - @param pkt packet to be initialized. This function will set the data, size, - buf and destruct fields, all others are left untouched. - @param data Data allocated by av_malloc() to be used as packet data. If this - function returns successfully, the data is owned by the underlying AVBuffer. - The caller may not access the data through other means. - @param size size of data in bytes, without the padding. I.e. the full buffer - size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. - - @return 0 on success, a negative AVERROR on error - - - - Increase packet size, correctly zeroing padding - - @param pkt packet - @param grow_by number of bytes by which to increase the size of the packet - - - - Reduce packet size, correctly zeroing padding - - @param pkt packet - @param size new size - - - - Allocate the payload of a packet and initialize its fields with - default values. - - @param pkt packet - @param size wanted payload size - @return 0 if OK, AVERROR_xxx otherwise - - - - Initialize optional fields of a packet with default values. - - Note, this does not touch the data and size members, which have to be - initialized separately. - - @param pkt packet - - - - Free the packet, if the packet is reference counted, it will be - unreferenced first. - - @param packet packet to be freed. The pointer will be set to NULL. - @note passing NULL is a no-op. - - - - Create a new packet that references the same data as src. - - This is a shortcut for av_packet_alloc()+av_packet_ref(). - - @return newly created AVPacket on success, NULL on error. - - @see av_packet_alloc - @see av_packet_ref - - - -@} - -@addtogroup lavc_packet -@{ - - Allocate an AVPacket and set its fields to default values. The resulting - struct must be freed using av_packet_free(). - - @return An AVPacket filled with default values or NULL on failure. - - @note this only allocates the AVPacket itself, not the data buffers. Those - must be allocated through other means such as av_new_packet. - - @see av_new_packet - - - - Free all allocated data in the given subtitle struct. - - @param sub AVSubtitle to free. - - - - Close a given AVCodecContext and free all the data associated with it - (but not the AVCodecContext itself). - - Calling this function on an AVCodecContext that hasn't been opened will free - the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL - codec. Subsequent calls will do nothing. - - @note Do not use this function. Use avcodec_free_context() to destroy a - codec context (either open or closed). Opening and closing a codec context - multiple times is not supported anymore -- use multiple codec contexts - instead. - - - - Fill the codec context based on the values from the supplied codec - parameters. Any allocated fields in codec that have a corresponding field in - par are freed and replaced with duplicates of the corresponding field in par. - Fields in codec that do not have a counterpart in par are not touched. - - @return >= 0 on success, a negative AVERROR code on failure. - - - - Fill the parameters struct based on the values from the supplied codec - context. Any allocated fields in par are freed and replaced with duplicates - of the corresponding fields in codec. - - @return >= 0 on success, a negative AVERROR code on failure - - - - Copy the contents of src to dst. Any allocated fields in dst are freed and - replaced with newly allocated duplicates of the corresponding fields in src. - - @return >= 0 on success, a negative AVERROR code on failure. - - - -Free an AVCodecParameters instance and everything associated with it and -write NULL to the supplied pointer. - - - -Allocate a new AVCodecParameters and set its fields to default values -(unknown/invalid/0). The returned struct must be freed with -avcodec_parameters_free(). - - - - Copy the settings of the source AVCodecContext into the destination - AVCodecContext. The resulting destination codec context will be - unopened, i.e. you are required to call avcodec_open2() before you - can use this AVCodecContext to decode/encode video/audio data. - - @param dest target codec context, should be initialized with - avcodec_alloc_context3(NULL), but otherwise uninitialized - @param src source codec context - @return AVERROR() on error (e.g. memory allocation error), 0 on success - - @deprecated The semantics of this function are ill-defined and it should not - be used. If you need to transfer the stream parameters from one codec context - to another, use an intermediate AVCodecParameters instance and the - avcodec_parameters_from_context() / avcodec_parameters_to_context() - functions. - - - - Get the AVClass for AVSubtitleRect. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - - Get the AVClass for AVFrame. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - - Get the AVClass for AVCodecContext. It can be used in combination with - AV_OPT_SEARCH_FAKE_OBJ for examining options. - - @see av_opt_find(). - - - -@deprecated This function should not be used, as closing and opening a codec -context multiple time is not supported. A new codec context should be -allocated for each new use. - - - -Free the codec context and everything associated with it and write NULL to -the provided pointer. - - - - Allocate an AVCodecContext and set its fields to default values. The - resulting struct should be freed with avcodec_free_context(). - - @param codec if non-NULL, allocate private data and initialize defaults - for the given codec. It is illegal to then call avcodec_open2() - with a different codec. - If NULL, then the codec-specific defaults won't be initialized, - which may result in suboptimal default settings (this is - important mainly for encoders, e.g. libx264). - - @return An AVCodecContext filled with default values or NULL on failure. - - - - Register all the codecs, parsers and bitstream filters which were enabled at - configuration time. If you do not call this function you can select exactly - which formats you want to support, by using the individual registration - functions. - - @see avcodec_register - @see av_register_codec_parser - @see av_register_bitstream_filter - - - - Register the codec codec and initialize libavcodec. - - @warning either this function or avcodec_register_all() must be called - before any other libavcodec functions. - - @see avcodec_register_all() - - - -Return the libavcodec license. - - - -Return the libavcodec build-time configuration. - - - -Return the LIBAVCODEC_VERSION_INT constant. - - - -If c is NULL, returns the first registered codec, -if c is non-NULL, returns the next registered codec after c, -or NULL if c is the last one. - - - -Audio only. Number of samples to skip after a discontinuity. - - - -Audio only. The amount of padding (in samples) appended by the encoder to -the end of the audio. I.e. this number of decoded samples must be -discarded by the caller from the end of the stream to get the original -audio without any trailing padding. - - - -Audio only. The amount of padding (in samples) inserted by the encoder at -the beginning of the audio. I.e. this number of leading decoded samples -must be discarded by the caller to get the original audio without leading -padding. - - - -Audio only. Audio frame size, if known. Required by some formats to be static. - - - - Audio only. The number of bytes per coded audio frame, required by some - formats. - - Corresponds to nBlockAlign in WAVEFORMATEX. - - - -Audio only. The number of audio samples per second. - - - -Audio only. The number of audio channels. - - - -Audio only. The channel layout bitmask. May be 0 if the channel layout is -unknown or unspecified, otherwise the number of bits set must be equal to -the channels field. - - - -Video only. Number of delayed frames. - - - - Video only. The aspect ratio (width / height) which a single pixel - should have when displayed. - - When the aspect ratio is unknown / undefined, the numerator should be - set to 0 (the denominator may have any value). - - - -Video only. The dimensions of the video frame in pixels. - - - -Codec-specific bitstream restrictions that the stream conforms to. - - - - This is the number of valid bits in each output sample. If the - sample format has more bits, the least significant bits are additional - padding bits, which are always 0. Use right shifts to reduce the sample - to its actual size. For example, audio formats with 24 bit samples will - have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. - To get the original sample use "(int32_t)sample >> 8"." - - For ADPCM this might be 12 or 16 or similar - Can be 0 - - - - The number of bits per sample in the codedwords. - - This is basically the bitrate per sample. It is mandatory for a bunch of - formats to actually decode them. It's the number of bits for one sample in - the actual coded bitstream. - - This could be for example 4 for ADPCM - For PCM formats this matches bits_per_raw_sample - Can be 0 - - - -The average bitrate of the encoded data (in bits per second). - - - -- video: the pixel format, the value corresponds to enum AVPixelFormat. -- audio: the sample format, the value corresponds to enum AVSampleFormat. - - - -Size of the extradata content in bytes. - - - - Extra binary data needed for initializing the decoder, codec-dependent. - - Must be allocated with av_malloc() and will be freed by - avcodec_parameters_free(). The allocated size of extradata must be at - least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding - bytes zeroed. - - - -Additional information about the codec (corresponds to the AVI FOURCC). - - - - This struct describes the properties of an encoded stream. - - sizeof(AVCodecParameters) is not a part of the public ABI, this struct must - be allocated with avcodec_parameters_alloc() and freed with - avcodec_parameters_free(). - - - -0 terminated ASS/SSA compatible event line. -The presentation of this is unaffected by the other values in this -struct. - - - -data+linesize for the bitmap of this subtitle. -Can be set for text/ass as well once they are rendered. - - - -@deprecated unused - - - -@} - - - -Formatted text, the ass field must be set by the decoder and is -authoritative. pict and text fields may contain approximations. - - - -Plain text, the text field must be set by the decoder and is -authoritative. ass and pict fields may contain approximations. - - - - Hardware acceleration should be used for decoding even if the codec level - used is unknown or higher than the maximum supported level reported by the - hardware driver. - - It's generally a good idea to pass this flag unless you have a specific - reason not to, as hardware tends to under-report supported levels. - -Hardware acceleration can output YUV pixel formats with a different chroma -sampling than 4:2:0 and/or other than 8 bits per component. - -@} - - @defgroup lavc_picture AVPicture - - Functions for working with AVPicture - @{ - - Picture data structure. - - Up to four components can be stored into it, the last component is - alpha. - @deprecated use AVFrame or imgutils functions instead - - - -Size of the private data to allocate in -AVCodecInternal.hwaccel_priv_data. - - - - Uninitialize the hwaccel private data. - - This will be called from get_format() or avcodec_close(), after hwaccel - and hwaccel_context are already uninitialized. - - - - Initialize the hwaccel private data. - - This will be called from ff_get_format(), after hwaccel and - hwaccel_context are set and the hwaccel private data in AVCodecInternal - is allocated. - - - - Called for every Macroblock in a slice. - - XvMC uses it to replace the ff_mpv_decode_mb(). - Instead of decoding to raw picture, MB parameters are - stored in an array provided by the video driver. - - @param s the mpeg context - - - - Size of per-frame hardware accelerator private data. - - Private data is allocated with av_mallocz() before - AVCodecContext.get_buffer() and deallocated after - AVCodecContext.release_buffer(). - - - - Called at the end of each frame or field picture. - - The whole picture is parsed at this point and can now be sent - to the hardware accelerator. This function is mandatory. - - @param avctx the codec context - @return zero if successful, a negative value otherwise - - - - Callback for each slice. - - Meaningful slice information (codec specific) is guaranteed to - be parsed at this point. This function is mandatory. - The only exception is XvMC, that works on MB level. - - @param avctx the codec context - @param buf the slice data buffer base - @param buf_size the size of the slice in bytes - @return zero if successful, a negative value otherwise - - - - Called at the beginning of each frame or field picture. - - Meaningful frame information (codec specific) is guaranteed to - be parsed at this point. This function is mandatory. - - Note that buf can be NULL along with buf_size set to 0. - Otherwise, this means the whole frame is available at this point. - - @param avctx the codec context - @param buf the frame data buffer base - @param buf_size the size of the frame in bytes - @return zero if successful, a negative value otherwise - - - -Allocate a custom buffer - - - -Hardware accelerated codec capabilities. -see HWACCEL_CODEC_CAP_* - - - -Name of the hardware accelerated codec. -The name is globally unique among encoders and among decoders (but an -encoder and a decoder can share the same name). - - - -Internal codec capabilities. -See FF_CODEC_CAP_* in internal.h - - - -Flush buffers. -Will be called when seeking - - - -Decode/encode API with decoupled packet/frame dataflow. The API is the -same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except -that: -- never called if the codec is closed or the wrong type, -- AVPacket parameter change side data is applied right before calling - AVCodec->send_packet, -- if AV_CODEC_CAP_DELAY is not set, drain packets or frames are never sent, -- only one drain packet is ever passed down (until the next flush()), -- a drain AVPacket is always NULL (no need to check for avpkt->size). - - - - Encode data to an AVPacket. - - @param avctx codec context - @param avpkt output AVPacket (may contain a user-provided buffer) - @param[in] frame AVFrame containing the raw data to be encoded - @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a - non-empty packet was returned in avpkt. - @return 0 on success, negative error code on failure - - - -@} -Private codec-specific defaults. - - - - Copy necessary context variables from a previous thread context to the current one. - If not defined, the next thread will start automatically; otherwise, the codec - must call ff_thread_finish_setup(). - - dst and src will (rarely) point to the same context, in which case memcpy should be skipped. - - - -@name Frame-level threading support functions -@{ - -If defined, called on thread contexts when they are created. -If the codec allocates writable tables in init(), re-allocate them here. -priv_data will be set to a copy of the original. - - - -Codec capabilities. -see AV_CODEC_CAP_* - - - -Descriptive name for the codec, meant to be more human readable than name. -You should use the NULL_IF_CONFIG_SMALL() macro to define it. - - - -Name of the codec implementation. -The name is globally unique among encoders and among decoders (but an -encoder and a decoder can share the same name). -This is the primary way to find a codec from the user perspective. - - - -AVCodec. - - -Initialize codec static data, called from avcodec_register(). - - - - Audio only. The amount of padding (in samples) appended by the encoder to - the end of the audio. I.e. this number of decoded samples must be - discarded by the caller from the end of the stream to get the original - audio without any trailing padding. - - - decoding: unused - - encoding: unused - - - -Control the form of AVSubtitle.rects[N]->ass -- decoding: set by user -- encoding: unused - - - - A reference to the AVHWFramesContext describing the input (for encoding) - or output (decoding) frames. The reference is set by the caller and - afterwards owned (and freed) by libavcodec. - - - decoding: This field should be set by the caller from the get_format() - callback. The previous reference (if any) will always be - unreffed by libavcodec before the get_format() call. - - If the default get_buffer2() is used with a hwaccel pixel - format, then this AVHWFramesContext will be used for - allocating the frame buffers. - - - encoding: For hardware encoders configured to use a hwaccel pixel - format, this field should be set by the caller to a reference - to the AVHWFramesContext describing input frames. - AVHWFramesContext.format must be equal to - AVCodecContext.pix_fmt. - - This field should be set before avcodec_open2() is called. - - - - Additional data associated with the entire coded stream. - - - decoding: unused - - encoding: may be set by libavcodec after avcodec_open2(). - - - -',' separated list of allowed decoders. -If NULL then all are allowed -- encoding: unused -- decoding: set by user through AVOPtions (NO direct access) - - - -dump format separator. -can be ", " or "\n " or anything else -Code outside libavcodec should access this field using AVOptions -(NO direct access). -- encoding: Set by user. -- decoding: Set by user. - - - -custom intra quantization matrix -Code outside libavcodec should access this field using av_codec_g/set_chroma_intra_matrix() -- encoding: Set by user, can be NULL. -- decoding: unused. - - - -Number of samples to skip after a discontinuity -- decoding: unused -- encoding: set by libavcodec - - - - Skip processing alpha if supported by codec. - Note that if the format uses pre-multiplied alpha (common with VP6, - and recommended due to better video quality/compression) - the image will look as if alpha-blended onto a black background. - However for formats that do not use pre-multiplied alpha - there might be serious artefacts (though e.g. libswscale currently - assumes pre-multiplied alpha anyway). - Code outside libavcodec should access this field using AVOptions - - - decoding: set by user - - encoding: unused - - - -Subtitles character encoding mode. Formats or codecs might be adjusting -this setting (if they are doing the conversion themselves for instance). -- decoding: set by libavcodec -- encoding: unused - - - -Character encoding of the input subtitles file. -- decoding: set by user -- encoding: unused - - - -Current statistics for PTS correction. -- decoding: maintained and used by libavcodec, not intended to be used by user apps -- encoding: unused - - - -AVCodecDescriptor -Code outside libavcodec should access this field using: -av_codec_{get,set}_codec_descriptor(avctx) -- encoding: unused. -- decoding: set by libavcodec. - - - -Timebase in which pkt_dts/pts and AVPacket.dts/pts are. -Code outside libavcodec should access this field using: -av_codec_{get,set}_pkt_timebase(avctx) -- encoding unused. -- decoding set by user. - - - -- decoding: For codecs that store a framerate value in the compressed - bitstream, the decoder may export it here. { 0, 1} when - unknown. -- encoding: May be used to signal the framerate of CFR content to an - encoder. - - - - Audio only. The number of "priming" samples (padding) inserted by the - encoder at the beginning of the audio. I.e. this number of leading - decoded samples must be discarded by the caller to get the original audio - without leading padding. - - - decoding: unused - - encoding: Set by libavcodec. The timestamps on the output packets are - adjusted by the encoder so that they always refer to the - first sample of the data actually contained in the packet, - including any added padding. E.g. if the timebase is - 1/samplerate and the timestamp of the first input sample is - 0, the timestamp of the first output packet will be - -initial_padding. - - - - Encoding only and set by default. Allow encoders to output packets - that do not contain any encoded data, only side data. - - Some encoders need to output such packets, e.g. to update some stream - parameters at the end of encoding. - - @deprecated this field disables the default behaviour and - it is kept only for compatibility. - - - -VBV delay coded in the last frame (in periods of a 27 MHz clock). -Used for compliant TS muxing. -- encoding: Set by libavcodec. -- decoding: unused. -@deprecated this value is now exported as a part of -AV_PKT_DATA_CPB_PROPERTIES packet side data - - - -@deprecated use the 'error_rate' private AVOption of the mpegvideo -encoders - - - -Header containing style information for text subtitles. -For SUBTITLE_ASS subtitle type, it should contain the whole ASS -[Script Info] and [V4+ Styles] section, plus the [Events] line and -the Format line following. It shouldn't include any Dialogue line. -- encoding: Set/allocated/freed by user (before avcodec_open2()) -- decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) - - - -level -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -profile -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -noise vs. sse weight for the nsse comparison function -- encoding: Set by user. -- decoding: unused - - - -Set by the client if its custom get_buffer() callback can be called -synchronously from another thread, which allows faster multithreaded decoding. -draw_horiz_band() will be called from other threads regardless of this setting. -Ignored if the default get_buffer() is used. -- encoding: Set by user. -- decoding: Set by user. - - - -Which multithreading methods are in use by the codec. -- encoding: Set by libavcodec. -- decoding: Set by libavcodec. - - - - Which multithreading methods to use. - Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, - so clients which cannot provide future frames should not use it. - - - encoding: Set by user, otherwise the default is used. - - decoding: Set by user, otherwise the default is used. - - - -thread count -is used to decide how many independent tasks should be passed to execute() -- encoding: Set by user. -- decoding: Set by user. - - - - the picture in the bitstream - - encoding: Set by libavcodec. - - decoding: unused - - @deprecated use the quality factor packet side data instead - - - -low resolution decoding, 1-> 1/2 size, 2->1/4 size -- encoding: unused -- decoding: Set by user. -Code outside libavcodec should access this field using: -av_codec_{get,set}_lowres(avctx) - - - -Bits per sample/pixel of internal libavcodec pixel/sample format. -- encoding: set by user. -- decoding: set by libavcodec. - - - -bits per sample/pixel from the demuxer (needed for huffyuv). -- encoding: Set by libavcodec. -- decoding: Set by user. - - - -IDCT algorithm, see FF_IDCT_* below. -- encoding: Set by user. -- decoding: Set by user. - - - -DCT algorithm, see FF_DCT_* below -- encoding: Set by user. -- decoding: unused - - - -Hardware accelerator context. -For some hardware accelerators, a global context needs to be -provided by the user. In that case, this holds display-dependent -data FFmpeg cannot instantiate itself. Please refer to the -FFmpeg HW accelerator documentation to know how to fill this -is. e.g. for VA API, this is a struct vaapi_context. -- encoding: unused -- decoding: Set by user - - - -Hardware accelerator in use -- encoding: unused. -- decoding: Set by libavcodec - - -@defgroup lavc_hwaccel AVHWAccel -@{ - - - -Verify checksums embedded in the bitstream (could be of either encoded or -decoded data, depending on the codec) and print an error message on mismatch. -If AV_EF_EXPLODE is also set, a mismatching checksum will result in the -decoder returning an error. - -opaque 64-bit number (generally a PTS) that will be reordered and -output in AVFrame.reordered_opaque -- encoding: unused -- decoding: Set by user. - - - -Error recognition; may misdetect some more or less valid parts as errors. -- encoding: unused -- decoding: Set by user. - - - -@deprecated this option does nothing - -debug -Code outside libavcodec should access this field using AVOptions -- encoding: Set by user. -- decoding: Set by user. - - - -debug -- encoding: Set by user. -- decoding: Set by user. - - - -error concealment flags -- encoding: unused -- decoding: Set by user. - - - -strictly follow the standard (MPEG-4, ...). -- encoding: Set by user. -- decoding: Set by user. -Setting this to STRICT or higher means the encoder and decoder will -generally do stupid things, whereas setting it to unofficial or lower -will mean the encoder might produce output that is not supported by all -spec-compliant decoders. Decoders don't differentiate between normal, -unofficial and experimental (that is, they always try to decode things -when they can) unless they are explicitly asked to behave stupidly -(=strictly conform to the specs) - - - -Work around bugs in encoders which sometimes cannot be detected automatically. -- encoding: Set by user -- decoding: Set by user - - - -pass2 encoding statistics input buffer -Concatenated stuff from stats_out of pass1 should be placed here. -- encoding: Allocated/set/freed by user. -- decoding: unused - - - -pass1 encoding statistics output buffer -- encoding: Set by libavcodec. -- decoding: unused - - - -@deprecated this field is unused - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -trellis RD quantization -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - - -@deprecated use encoder private options instead - - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - - -Number of bits which should be loaded into the rc buffer before decoding starts. -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - - -minimum bitrate -- encoding: Set by user. -- decoding: unused - - - -maximum bitrate -- encoding: Set by user. -- decoding: Set by user, may be overwritten by libavcodec. - - - -@deprecated use encoder private options instead - - - -ratecontrol override, see RcOverride -- encoding: Allocated/set/freed by user. -- decoding: unused - - - -decoder bitstream buffer size -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - - -maximum quantizer difference between frames -- encoding: Set by user. -- decoding: unused - - - -maximum quantizer -- encoding: Set by user. -- decoding: unused - - - -minimum quantizer -- encoding: Set by user. -- decoding: unused - - - - If non-zero, the decoded audio and video frames returned from - avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted - and are valid indefinitely. The caller must free them with - av_frame_unref() when they are not needed anymore. - Otherwise, the decoded frames must not be freed by the caller and are - only valid until the next decode call. - - This is always automatically enabled if avcodec_receive_frame() is used. - - - encoding: unused - - decoding: set by the caller before avcodec_open2(). - - - -Type of service that the audio stream conveys. -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -Request decoder to use this channel layout if it can (0 for default) -- encoding: unused -- decoding: Set by user. - - - -Audio channel layout. -- encoding: set by user. -- decoding: set by user, may be overwritten by libavcodec. - - - -Audio cutoff bandwidth (0 means "automatic") -- encoding: Set by user. -- decoding: unused - - - -number of bytes per packet if constant and known or 0 -Used by some WAV based audio codecs. - - - - Frame counter, set by libavcodec. - - - decoding: total number of frames returned from the decoder so far. - - encoding: total number of frames passed to the encoder so far. - - @note the counter is not incremented if encoding/decoding resulted in - an error. - - - - Number of samples per channel in an audio frame. - - - encoding: set by libavcodec in avcodec_open2(). Each submitted frame - except the last must contain exactly frame_size samples per channel. - May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the - frame size is not restricted. - - decoding: may be set by some decoders to indicate constant frame size - - - -Field order - * - encoding: set by libavcodec - * - decoding: Set by user. - - -Video only. The order of the fields in interlaced video. - - - -Number of slices. -Indicates number of picture subdivisions. Used for parallelized -decoding. -- encoding: Set by user -- decoding: unused - - - -@deprecated use encoder private options instead - - -Note: Value depends upon the compare function used for fullpel ME. -- encoding: Set by user. -- decoding: unused - - - -Multiplied by qscale for each frame and added to scene_change_score. -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -number of reference frames -- encoding: Set by user. -- decoding: Set by lavc. - - - -minimum GOP size -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - - -maximum MB Lagrange multiplier -- encoding: Set by user. -- decoding: unused - - - -minimum MB Lagrange multiplier -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - - -Number of macroblock rows at the bottom which are skipped. -- encoding: unused -- decoding: Set by user. - - - -Number of macroblock rows at the top which are skipped. -- encoding: unused -- decoding: Set by user. - - - -precision of the intra DC coefficient - 8 -- encoding: Set by user. -- decoding: Set by libavcodec - - - -@deprecated this field is unused - - - -@deprecated this field is unused - - - -@deprecated use encoder private options instead - - -@deprecated use encoder private options instead - - -custom inter quantization matrix -- encoding: Set by user, can be NULL. -- decoding: Set by libavcodec. - - - -custom intra quantization matrix -- encoding: Set by user, can be NULL. -- decoding: Set by libavcodec. - - - -macroblock decision mode -- encoding: Set by user. -- decoding: unused - - - -XVideo Motion Acceleration -- encoding: forbidden -- decoding: set by decoder -@deprecated XvMC doesn't need it anymore. - - - -slice flags -- encoding: unused -- decoding: Set by user. - - - -@deprecated use encoder private option instead - - - -@deprecated use encoder private option instead - - - - maximum motion estimation search range in subpel units - If 0 then no limit. - - - encoding: Set by user. - - decoding: unused - - - - DTG active format information (additional aspect ratio - information only used in DVB MPEG-2 transport streams) - 0 if not set. - - - encoding: unused - - decoding: Set by decoder. - @deprecated Deprecated in favor of AVSideData - - - -subpel ME quality -- encoding: Set by user. -- decoding: unused - - - -motion estimation prepass comparison function -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -amount of previous MV predictors (2a+1 x 2a+1 square) -- encoding: Set by user. -- decoding: unused - - - -interlaced DCT comparison function -- encoding: Set by user. -- decoding: unused - - - -macroblock comparison function (not supported yet) -- encoding: Set by user. -- decoding: unused - - - -subpixel motion estimation comparison function -- encoding: Set by user. -- decoding: unused - - - -motion estimation comparison function -- encoding: Set by user. -- decoding: unused - - - -sample aspect ratio (0 if unknown) -That is the width of a pixel divided by the height of the pixel. -Numerator and denominator must be relatively prime and smaller than 256 for some video standards. -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -slice offsets in the frame in bytes -- encoding: Set/allocated by libavcodec. -- decoding: Set/allocated by user (or NULL). - - - -@deprecated use encoder private options instead - - -slice count -- encoding: Set by libavcodec. -- decoding: Set by user (or 0). - - - -darkness masking (0-> disabled) -- encoding: Set by user. -- decoding: unused - - - -p block masking (0-> disabled) -- encoding: Set by user. -- decoding: unused - - - -spatial complexity masking (0-> disabled) -- encoding: Set by user. -- decoding: unused - - - -temporary complexity masking (0-> disabled) -- encoding: Set by user. -- decoding: unused - - - -luminance masking (0-> disabled) -- encoding: Set by user. -- decoding: unused - - - -qscale offset between P and I-frames -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -Size of the frame reordering buffer in the decoder. -For MPEG-2 it is 1 IPB or 0 low delay IP. -- encoding: Set by libavcodec. -- decoding: Set by libavcodec. - - - -qscale offset between IP and B-frames -- encoding: Set by user. -- decoding: unused - - - -@deprecated use encoder private options instead - - -@deprecated use codec private option instead - - -maximum number of B-frames between non-B-frames -Note: The output will be delayed by max_b_frames+1 relative to the input. -- encoding: Set by user. -- decoding: unused - - - -This option does nothing -@deprecated use codec private options instead - - - - Pixel format, see AV_PIX_FMT_xxx. - May be set by the demuxer if known from headers. - May be overridden by the decoder if it knows better. - - @note This field may not match the value of the last - AVFrame output by avcodec_receive_frame() due frame - reordering. - - - encoding: Set by user. - - decoding: Set by user if known, overridden by libavcodec while - parsing the data. - - -callback to negotiate the pixelFormat -@param fmt is the list of formats which are supported by the codec, -it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. -The first is always the native one. -@note The callback may be called again immediately if initialization for -the selected (hardware-accelerated) pixel format failed. -@warning Behavior is undefined if the callback returns a value not -in the fmt list of formats. -@return the chosen format -- encoding: unused -- decoding: Set by user, if not set the native format will be chosen. - - -Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. -- encoding: unused. -- decoding: Set by libavcodec before calling get_format() - - - Supported pixel format. - - Only hardware accelerated formats are supported here. - - -@} - -@addtogroup lavc_picture -@{ - -@deprecated unused - - -@deprecated use av_image_fill_arrays() instead. - - -@deprecated use av_image_copy_to_buffer() instead. - - -@deprecated use av_image_get_buffer_size() instead. - - -@deprecated av_image_copy() instead. - - -@deprecated unused - - -@deprecated unused - - -@} - - @defgroup lavc_misc Utility functions - @ingroup libavc - - Miscellaneous utility functions related to both encoding and decoding - (or neither). - @{ - - @defgroup lavc_misc_pixfmt Pixel formats - - Functions for working with pixel formats. - @{ - - Utility function to access log2_chroma_w log2_chroma_h from - the pixel format AVPixFmtDescriptor. - - This function asserts that pix_fmt is valid. See av_pix_fmt_get_chroma_sub_sample - for one that returns a failure code and continues in case of invalid - pix_fmts. - - @param[in] pix_fmt the pixel format - @param[out] h_shift store log2_chroma_w - @param[out] v_shift store log2_chroma_h - - @see av_pix_fmt_get_chroma_sub_sample - - -Return a value representing the fourCC code associated to the -pixel format pix_fmt, or 0 if no associated fourCC code can be -found. - - -@deprecated see av_get_pix_fmt_loss() - - - Find the best pixel format to convert to given a certain source pixel - format. When converting from one pixel format to another, information loss - may occur. For example, when converting from RGB24 to GRAY, the color - information will be lost. Similarly, other losses occur when converting from - some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of - the given pixel formats should be used to suffer the least amount of loss. - The pixel formats from which it chooses one, are determined by the - pix_fmt_list parameter. - - - @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from - @param[in] src_pix_fmt source pixel format - @param[in] has_alpha Whether the source pixel format alpha channel is used. - @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. - @return The best pixel format to convert to or -1 if none was found. - - -@deprecated see av_find_best_pix_fmt_of_2() - - -Return a positive value if pix_fmt is a supported input format, 0 -otherwise. - - -Return a positive value if pix_fmt is a supported output format, 0 -otherwise. - - -@param[in] pix_fmt the pixel format -@return a positive value if an endianness conversion for pix_fmt is -supported, 0 otherwise. - - - -the number of pictures in a group of pictures, or 0 for intra_only -- encoding: Set by user. -- decoding: unused - - - - Bitstream width / height, may be different from width/height e.g. when - the decoded frame is cropped before being output or lowres is enabled. - - @note Those field may not match the value of the last - AVFrame output by avcodec_receive_frame() due frame - reordering. - - - encoding: unused - - decoding: May be set by the user before opening the decoder if known - e.g. from the container. During decoding, the decoder may - overwrite those values as required while parsing the data. - - - - picture width / height. - - @note Those fields may not match the values of the last - AVFrame output by avcodec_decode_video2 due frame - reordering. - - - encoding: MUST be set by user. - - decoding: May be set by the user before opening the decoder if known e.g. - from the container. Some decoders will require the dimensions - to be set by the caller. During decoding, the decoder may - overwrite those values as required while parsing the data. - - - - Codec delay. - - Encoding: Number of frames delay there will be from the encoder input to - the decoder output. (we assume the decoder matches the spec) - Decoding: Number of frames delay in addition to what a standard decoder - as specified in the spec would produce. - - Video: - Number of frames the decoded output will be delayed relative to the - encoded input. - - Audio: - For encoding, this field is unused (see initial_padding). - - For decoding, this is the number of samples the decoder needs to - output before the decoder's output is valid. When seeking, you should - start decoding this many samples prior to your desired seek point. - - - encoding: Set by libavcodec. - - decoding: Set by libavcodec. - - - - For some codecs, the time base is closer to the field rate than the frame rate. - Most notably, H.264 and MPEG-2 specify time_base as half of frame duration - if no telecine is used ... - - Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. - - - - This is the fundamental unit of time (in seconds) in terms - of which frame timestamps are represented. For fixed-fps content, - timebase should be 1/framerate and timestamp increments should be - identically 1. - This often, but not always is the inverse of the frame rate or field rate - for video. 1/time_base is not the average frame rate if the frame rate is not - constant. - - Like containers, elementary streams also can store timestamps, 1/time_base - is the unit in which these timestamps are specified. - As example of such codec time base see ISO/IEC 14496-2:2001(E) - vop_time_increment_resolution and fixed_vop_rate - (fixed_vop_rate == 0 implies that it is different from the framerate) - - - encoding: MUST be set by user. - - decoding: the use of this field for decoding is deprecated. - Use framerate instead. - - - -some codecs need / can use extradata like Huffman tables. -MJPEG: Huffman tables -rv10: additional flags -MPEG-4: global headers (they can be in the bitstream or here) -The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger -than extradata_size to avoid problems if it is read with the bitstream reader. -The bytewise contents of extradata must not depend on the architecture or CPU endianness. -- encoding: Set/allocated/freed by libavcodec. -- decoding: Set/allocated/freed by user. - - - -AV_CODEC_FLAG2_* -- encoding: Set by user. -- decoding: Set by user. - - - -AV_CODEC_FLAG_*. -- encoding: Set by user. -- decoding: Set by user. - - - -- encoding: Set by user. -- decoding: unused - - - -Global quality for codecs which cannot change it per frame. -This should be proportional to MPEG-1/2/4 qscale. -- encoding: Set by user. -- decoding: unused - - - -number of bits the bitstream is allowed to diverge from the reference. - the reference can be CBR (for CBR pass1) or VBR (for pass2) -- encoding: Set by user; unused for constant quantizer encoding. -- decoding: unused - - - -the average bitrate -- encoding: Set by user; unused for constant quantizer encoding. -- decoding: Set by user, may be overwritten by libavcodec - if this info is available in the stream - - - -Private data of the user, can be used to carry app specific stuff. -- encoding: Set by user. -- decoding: Set by user. - - - -@deprecated this field is unused - - - -@deprecated this field is not used for anything in libavcodec - - - -information on struct for av_log -- set by avcodec_alloc_context3 - - - -main external API structure. -New fields can be added to the end with minor version bumps. -Removal, reordering and changes to existing fields require a major -version bump. -Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user -applications. -The name string for AVOptions options matches the associated command line -parameter name and can be found in libavcodec/options_table.h -The AVOption/command line parameter names differ in some cases from the C -structure field names for historic reasons or brevity. -sizeof(AVCodecContext) must not be used outside libav*. - - -If non NULL, 'draw_horiz_band' is called by the libavcodec -decoder to draw a horizontal band. It improves cache usage. Not -all codecs can do that. You must check the codec capabilities -beforehand. -When multithreading is used, it may be called from multiple threads -at the same time; threads might draw different parts of the same AVFrame, -or multiple AVFrames, and there is no guarantee that slices will be drawn -in order. -The function is also used by hardware acceleration APIs. -It is called at least once during frame decoding to pass -the data needed for hardware render. -In that mode instead of pixel data, AVFrame points to -a structure specific to the acceleration API. The application -reads the structure and can change some fields to indicate progress -or mark state. -- encoding: unused -- decoding: Set by user. -@param height the height of the slice -@param y the y position of the slice -@param type 1->top field, 2->bottom field, 3->frame -@param offset offset into the AVFrame.data from which the slice should be read - - - This callback is called at the beginning of each frame to get data - buffer(s) for it. There may be one contiguous buffer for all the data or - there may be a buffer per each data plane or anything in between. What - this means is, you may set however many entries in buf[] you feel necessary. - Each buffer must be reference-counted using the AVBuffer API (see description - of buf[] below). - - The following fields will be set in the frame before this callback is - called: - - format - - width, height (video only) - - sample_rate, channel_layout, nb_samples (audio only) - Their values may differ from the corresponding values in - AVCodecContext. This callback must use the frame values, not the codec - context values, to calculate the required buffer size. - - This callback must fill the following fields in the frame: - - data[] - - linesize[] - - extended_data: - * if the data is planar audio with more than 8 channels, then this - callback must allocate and fill extended_data to contain all pointers - to all data planes. data[] must hold as many pointers as it can. - extended_data must be allocated with av_malloc() and will be freed in - av_frame_unref(). - * otherwise extended_data must point to data - - buf[] must contain one or more pointers to AVBufferRef structures. Each of - the frame's data and extended_data pointers must be contained in these. That - is, one AVBufferRef for each allocated chunk of memory, not necessarily one - AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), - and av_buffer_ref(). - - extended_buf and nb_extended_buf must be allocated with av_malloc() by - this callback and filled with the extra buffers if there are more - buffers than buf[] can hold. extended_buf will be freed in - av_frame_unref(). - - If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call - avcodec_default_get_buffer2() instead of providing buffers allocated by - some other means. - - Each data plane must be aligned to the maximum required by the target - CPU. - - @see avcodec_default_get_buffer2() - - Video: - - If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused - (read and/or written to if it is writable) later by libavcodec. - - avcodec_align_dimensions2() should be used to find the required width and - height, as they normally need to be rounded up to the next multiple of 16. - - Some decoders do not support linesizes changing between frames. - - If frame multithreading is used and thread_safe_callbacks is set, - this callback may be called from a different thread, but not from more - than one at once. Does not need to be reentrant. - - @see avcodec_align_dimensions2() - - Audio: - - Decoders request a buffer of a particular size by setting - AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, - however, utilize only part of the buffer by setting AVFrame.nb_samples - to a smaller value in the output frame. - - As a convenience, av_samples_get_buffer_size() and - av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() - functions to find the required data size and to fill data pointers and - linesize. In AVFrame.linesize, only linesize[0] may be set for audio - since all planes must be the same size. - - @see av_samples_get_buffer_size(), av_samples_fill_arrays() - - - encoding: unused - - decoding: Set by libavcodec, user can override. - - -@deprecated unused - - -The codec may call this to execute several independent things. -It will return only after finishing all tasks. -The user may replace this with some multithreaded implementation, -the default implementation will execute the parts serially. -@param count the number of things to execute -- encoding: Set by libavcodec, user can override. -- decoding: Set by libavcodec, user can override. - - - -@} - - - Private context used for internal data. - - Unlike priv_data, this is not codec-specific. It is used in general - libavcodec functions. - - - - Flag is used to discard packets which are required to maintain valid - decoder state but are not required for output and should be dropped - after decoding. - - - -@deprecated Same as the duration field, but as int64_t. This was required -for Matroska subtitles, whose duration values could overflow when the -duration field was still an int. - - - -Duration of this packet in AVStream->time_base units, 0 if unknown. -Equals next_pts - this_pts in presentation order. - - - -Additional packet data that can be provided by the container. -Packet can contain several types of side information. - - - -A combination of AV_PKT_FLAG values - - - -Decompression timestamp in AVStream->time_base units; the time at which -the packet is decompressed. -Can be AV_NOPTS_VALUE if it is not stored in the file. - - - -Presentation timestamp in AVStream->time_base units; the time at which -the decompressed packet will be presented to the user. -Can be AV_NOPTS_VALUE if it is not stored in the file. -pts MUST be larger or equal to dts as presentation cannot happen before -decompression, unless one wants to view hex dumps. Some formats misuse -the terms dts and pts/cts to mean something different. Such timestamps -must be converted to true pts/dts before they are stored in AVPacket. - - - -A reference to the reference-counted buffer where the packet data is -stored. -May be NULL, then the packet data is not reference-counted. - - - - This structure stores compressed data. It is typically exported by demuxers - and then passed as input to decoders, or received as output from encoders and - then passed to muxers. - - For video, it should typically contain one compressed frame. For audio it may - contain several compressed frames. Encoders are allowed to output empty - packets, with no compressed data, containing only side data - (e.g. to update some stream parameters at the end of encoding). - - AVPacket is one of the few structs in FFmpeg, whose size is a part of public - ABI. Thus it may be allocated on stack and no new fields can be added to it - without libavcodec and libavformat major bump. - - The semantics of data ownership depends on the buf field. - If it is set, the packet data is dynamically allocated and is - valid indefinitely until a call to av_packet_unref() reduces the - reference count to 0. - - If the buf field is not set av_packet_ref() would make a copy instead - of increasing the reference count. - - The side data is always allocated with av_malloc(), copied by - av_packet_ref() and freed by av_packet_unref(). - - @see av_packet_ref - @see av_packet_unref - - - -The decoder will keep a reference to the frame and may reuse it later. - - @defgroup lavc_packet AVPacket - - Types and functions for working with AVPacket. - @{ - - - Allocate new information of a packet. - - @param pkt packet - @param type side information type - @param size side information size - @return pointer to fresh allocated data or NULL otherwise - - - Wrap an existing array as a packet side data. - - @param pkt packet - @param type side information type - @param data the side data array. It must be allocated with the av_malloc() - family of functions. The ownership of the data is transferred to - pkt. - @param size side information size - @return a non-negative number on success, a negative AVERROR code on - failure. On failure, the packet is unchanged and the data remains - owned by the caller. - - - Get side information from packet. - - @param pkt packet - @param type desired side information type - @param size pointer for side information size to store (optional) - @return pointer to data if present or NULL otherwise - - - Allocate new information from stream. - - @param stream stream - @param type desired side information type - @param size side information size - @return pointer to fresh allocated data or NULL otherwise - - - Get side information from stream. - - @param stream stream - @param type desired side information type - @param size pointer for side information size to store (optional) - @return pointer to data if present or NULL otherwise - - - -Mastering display metadata (based on SMPTE-2086:2014). This metadata -should be associated with a video stream and containts data in the form -of the AVMasteringDisplayMetadata struct. - - - -MPEGTS stream ID, this is required to pass the stream ID -information from the demuxer to the corresponding muxer. - - - -A list of zero terminated key/value strings. There is no end marker for -the list, so it is required to rely on the side data size to stop. This -side data includes updated metadata which appeared in the stream. - - - -The optional settings (rendering instructions) that immediately -follow the timestamp specifier of a WebVTT cue. - - - -The optional first identifier line of a WebVTT cue. - - - -Data found in BlockAdditional element of matroska container. There is -no end marker for the data, so it is required to rely on the side data -size to recognize the end. 8 byte id (as found in BlockAddId) followed -by data. - - - -Subtitle event position -@code -u32le x1 -u32le y1 -u32le x2 -u32le y2 -@endcode - - - -A list of zero terminated key/value strings. There is no end marker for -the list, so it is required to rely on the side data size to stop. - - - -An AV_PKT_DATA_JP_DUALMONO side data packet indicates that -the packet may contain "dual mono" audio specific to Japanese DTV -and if it is true, recommends only the selected channel to be used. -@code -u8 selected channels (0=mail/left, 1=sub/right, 2=both) -@endcode - - - -Recommmends skipping the specified number of samples -@code -u32le number of samples to skip from start of this packet -u32le number of samples to skip from end of this packet -u8 reason for start skip -u8 reason for end skip (0=padding silence, 1=convergence) -@endcode - - - -This side data corresponds to the AVCPBProperties struct. - - - -This side data contains an integer value representing the stream index -of a "fallback" track. A fallback track indicates an alternate -track to use when the current track can not be decoded for some reason. -e.g. no decoder available for codec. - - - -This side data contains quality related information from the encoder. -@code -u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). -u8 picture type -u8 error count -u16 reserved -u64le[error count] sum of squared differences between encoder in and output -@endcode - - - -This side data should be associated with an audio stream and corresponds -to enum AVAudioServiceType. - - - -This side data should be associated with a video stream and contains -Stereoscopic 3D information in form of the AVStereo3D struct. - - - - This side data contains a 3x3 transformation matrix describing an affine - transformation that needs to be applied to the decoded video frames for - correct presentation. - - See libavutil/display.h for a detailed description of the data. - - - -This side data should be associated with an audio stream and contains -ReplayGain information in form of the AVReplayGain struct. - - - -An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of -structures with info about macroblocks relevant to splitting the -packet into smaller packets on macroblock edges (e.g. as for RFC 2190). -That is, it does not necessarily contain info about all macroblocks, -as long as the distance between macroblocks in the info is smaller -than the target payload size. -Each MB info structure is 12 bytes, and is laid out as follows: -@code -u32le bit offset from the start of the packet -u8 current quantizer at the start of the macroblock -u8 GOB number -u16le macroblock address within the GOB -u8 horizontal MV predictor -u8 vertical MV predictor -u8 horizontal MV predictor for block number 3 -u8 vertical MV predictor for block number 3 -@endcode - - - -The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format -that the extradata buffer was changed and the receiving side should -act upon it appropriately. The new extradata is embedded in the side -data buffer and should be immediately used for processing the current -frame or packet. - - - - The delay between the time the packet this structure is associated with - is received and the time when it should be decoded, in periods of a 27MHz - clock. - - UINT64_MAX when unknown or unspecified. - - - -The size of the buffer to which the ratecontrol is applied, in bits. -Zero if unknown or unspecified. - - - -Average bitrate of the stream, in bits per second. -Zero if unknown or unspecified. - - - -Minimum bitrate of the stream, in bits per second. -Zero if unknown or unspecified. - - - -Maximum bitrate of the stream, in bits per second. -Zero if unknown or unspecified. - - - -This structure describes the bitrate properties of an encoded bitstream. It -roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD -parameters for H.264/HEVC. - - - -position of the top left corner in 1/16 pel for up to 3 fields/frames -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -width and height in 1/16 pel -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -id -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -@deprecated there is no libavcodec-wide limit on the number of B-frames - -Allow decoders to produce frames with data planes that are not aligned -to CPU requirements (e.g. due to cropping). - -Use fixed qscale. - -4 MV per MB allowed / advanced prediction for H.263. - -Output even those frames that might be corrupted. - -Use qpel MC. - -Use internal 2pass ratecontrol in first pass mode. - -Use internal 2pass ratecontrol in second pass mode. - -loop filter. - -Only decode/encode grayscale. - -error[?] variables will be set during encoding. - -Input bitstream might be truncated at a random location -instead of only at frame boundaries. - -Use interlaced DCT. - -Force low delay. - -Place global headers in extradata instead of every keyframe. - -Use only bitexact stuff (except (I)DCT). - -H.263 advanced intra coding / MPEG-4 AC prediction - -interlaced motion estimation - -Allow non spec compliant speedup tricks. - -Skip bitstream encoding. - -Place global headers at every keyframe instead of in extradata. - -timecode is in drop frame format. DEPRECATED!!!! - -Input bitstream might be truncated at a packet boundaries -instead of only at frame boundaries. - -Discard cropping information from SPS. - -Show all frames before the first keyframe - -Export motion vectors through frame side data - -Do not skip samples and export skip information as frame side data - -Do not reset ASS ReadOrder field on flush (subtitles decoding) - -Decoder can use draw_horiz_band callback. - -Codec uses get_buffer() for allocating buffers and supports custom allocators. -If not set, it might not use get_buffer() at all or use operations that -assume the buffer was allocated by avcodec_default_get_buffer. - - Encoder or decoder requires flushing with NULL input at the end in order to - give the complete and correct output. - - NOTE: If this flag is not set, the codec is guaranteed to never be fed with - with NULL data. The user can still send NULL data to the public encode - or decode function, but libavcodec will not pass it along to the codec - unless this flag is set. - - Decoders: - The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, - avpkt->size=0 at the end to get the delayed data until the decoder no longer - returns frames. - - Encoders: - The encoder needs to be fed with NULL data at the end of encoding until the - encoder no longer returns data. - - NOTE: For encoders implementing the AVCodec.encode2() function, setting this - flag also means that the encoder must set the pts and duration for - each output packet. If this flag is not set, the pts and duration will - be determined by libavcodec from the input frame. - -Codec can be fed a final frame with a smaller size. -This can be used to prevent truncation of the last audio samples. - -Codec can export data for HW decoding (VDPAU). - -Codec can output multiple frames per AVPacket -Normally demuxers return one frame at a time, demuxers which do not do -are connected to a parser to split what they return into proper frames. -This flag is reserved to the very rare category of codecs which have a -bitstream that cannot be split into frames without timeconsuming -operations like full decoding. Demuxers carrying such bitstreams thus -may return multiple frames in a packet. This has many disadvantages like -prohibiting stream copy in many cases thus it should only be considered -as a last resort. - -Codec is experimental and is thus avoided in favor of non experimental -encoders - -Codec should fill in channel configuration and samplerate instead of container - -Codec supports frame-level multithreading. - -Codec supports slice-based (or partition-based) multithreading. - -Codec supports changed parameters at any point. - -Codec supports avctx->thread_count == 0 (auto). - -Audio encoder supports receiving a different number of samples in each call. - -Decoder is not a preferred choice for probing. -This indicates that the decoder is not a good choice for probing. -It could for example be an expensive to spin up hardware decoder, -or it could simply not provide a lot of useful information about -the stream. -A decoder marked with this flag should only be used as last resort -choice for probing. - -Codec is intra only. - -Codec is lossless. - -Allow decoders to produce frames with data planes that are not aligned -to CPU requirements (e.g. due to cropping). - -@deprecated use the "gmc" private option of the libxvid encoder - -@deprecated use the flag "mv0" in the "mpv_flags" private option of the -mpegvideo encoders - -@deprecated passing reference-counted frames to the encoders replaces this -flag - -@deprecated edges are not used/required anymore. I.e. this flag is now always -set. - -@deprecated use the flag "naq" in the "mpv_flags" private option of the -mpegvideo encoders - -Codec uses get_buffer() for allocating buffers and supports custom allocators. -If not set, it might not use get_buffer() at all or use operations that -assume the buffer was allocated by avcodec_default_get_buffer. - - Encoder or decoder requires flushing with NULL input at the end in order to - give the complete and correct output. - - NOTE: If this flag is not set, the codec is guaranteed to never be fed with - with NULL data. The user can still send NULL data to the public encode - or decode function, but libavcodec will not pass it along to the codec - unless this flag is set. - - Decoders: - The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, - avpkt->size=0 at the end to get the delayed data until the decoder no longer - returns frames. - - Encoders: - The encoder needs to be fed with NULL data at the end of encoding until the - encoder no longer returns data. - - NOTE: For encoders implementing the AVCodec.encode2() function, setting this - flag also means that the encoder must set the pts and duration for - each output packet. If this flag is not set, the pts and duration will - be determined by libavcodec from the input frame. - -Codec can be fed a final frame with a smaller size. -This can be used to prevent truncation of the last audio samples. - -Codec can export data for HW decoding (VDPAU). - -Codec can output multiple frames per AVPacket -Normally demuxers return one frame at a time, demuxers which do not do -are connected to a parser to split what they return into proper frames. -This flag is reserved to the very rare category of codecs which have a -bitstream that cannot be split into frames without timeconsuming -operations like full decoding. Demuxers carrying such bitstreams thus -may return multiple frames in a packet. This has many disadvantages like -prohibiting stream copy in many cases thus it should only be considered -as a last resort. - -Codec is experimental and is thus avoided in favor of non experimental -encoders - -Codec should fill in channel configuration and samplerate instead of container - -@deprecated no codecs use this capability - -Codec supports frame-level multithreading. - -Codec supports slice-based (or partition-based) multithreading. - -Codec supports changed parameters at any point. - -Codec supports avctx->thread_count == 0 (auto). - -Audio encoder supports receiving a different number of samples in each call. - -Codec is intra only. - -Codec is lossless. - -HWAccel is experimental and is thus avoided in favor of non experimental -codecs - -Pan Scan area. -This specifies the area which should be displayed. -Note there may be multiple such areas for one frame. - - - -@ingroup lavc_encoding - - - -@ingroup lavc_decoding - - -Skip loop filtering for selected frames. -- encoding: unused -- decoding: Set by user. - - -Skip IDCT/dequantization for selected frames. -- encoding: unused -- decoding: Set by user. - - -Skip decoding for selected frames. -- encoding: unused -- decoding: Set by user. - - - -If non-NULL, an array of profiles recognized for this codec. -Terminated with FF_PROFILE_UNKNOWN. - - -AVProfile. - - - -MIME type(s) associated with the codec. -May be NULL; if not, a NULL-terminated array of MIME types. -The first item is always non-NULL and is the preferred MIME type. - - - -Codec properties, a combination of AV_CODEC_PROP_* flags. - - - -A more descriptive name for this codec. May be NULL. - - - -Name of the codec described by this descriptor. It is non-empty and -unique for each codec descriptor. It should contain alphanumeric -characters and '_' only. - - - -This struct describes the properties of a single codec described by an -AVCodecID. -@see avcodec_descriptor_get() - - - -@} - -@file -@ingroup libavc -Libavcodec version macros. - - FF_API_* defines may be placed below to indicate public API that will be - dropped at a future version bump. The defines themselves are not part of - the public API and may change, break or disappear at any time. - - @note, when bumping the major version it is recommended to manually - disable each FF_API_* in its own commit instead of disabling them all - at once through the bump. This improves the git bisect-ability of the change. - - @defgroup libavc libavcodec - Encoding/Decoding Library - - @{ - - @defgroup lavc_decoding Decoding - @{ - @} - - @defgroup lavc_encoding Encoding - @{ - @} - - @defgroup lavc_codec Codecs - @{ - @defgroup lavc_codec_native Native Codecs - @{ - @} - @defgroup lavc_codec_wrappers External library wrappers - @{ - @} - @defgroup lavc_codec_hwaccel Hardware Accelerators bridge - @{ - @} - @} - @defgroup lavc_internal Internal - @{ - @} - @} - - @ingroup libavc - @defgroup lavc_encdec send/receive encoding and decoding API overview - @{ - - The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ - avcodec_receive_packet() functions provide an encode/decode API, which - decouples input and output. - - The API is very similar for encoding/decoding and audio/video, and works as - follows: - - Set up and open the AVCodecContext as usual. - - Send valid input: - - For decoding, call avcodec_send_packet() to give the decoder raw - compressed data in an AVPacket. - - For encoding, call avcodec_send_frame() to give the decoder an AVFrame - containing uncompressed audio or video. - In both cases, it is recommended that AVPackets and AVFrames are - refcounted, or libavcodec might have to copy the input data. (libavformat - always returns refcounted AVPackets, and av_frame_get_buffer() allocates - refcounted AVFrames.) - - Receive output in a loop. Periodically call one of the avcodec_receive_*() - functions and process their output: - - For decoding, call avcodec_receive_frame(). On success, it will return - an AVFrame containing uncompressed audio or video data. - - For encoding, call avcodec_receive_packet(). On success, it will return - an AVPacket with a compressed frame. - Repeat this call until it returns AVERROR(EAGAIN) or an error. The - AVERROR(EAGAIN) return value means that new input data is required to - return new output. In this case, continue with sending input. For each - input frame/packet, the codec will typically return 1 output frame/packet, - but it can also be 0 or more than 1. - - At the beginning of decoding or encoding, the codec might accept multiple - input frames/packets without returning a frame, until its internal buffers - are filled. This situation is handled transparently if you follow the steps - outlined above. - - End of stream situations. These require "flushing" (aka draining) the codec, - as the codec might buffer multiple frames or packets internally for - performance or out of necessity (consider B-frames). - This is handled as follows: - - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) - or avcodec_send_frame() (encoding) functions. This will enter draining - mode. - - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() - (encoding) in a loop until AVERROR_EOF is returned. The functions will - not return AVERROR(EAGAIN), unless you forgot to enter draining mode. - - Before decoding can be resumed again, the codec has to be reset with - avcodec_flush_buffers(). - - Using the API as outlined above is highly recommended. But it is also - possible to call functions outside of this rigid schema. For example, you can - call avcodec_send_packet() repeatedly without calling - avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed - until the codec's internal buffer has been filled up (which is typically of - size 1 per output frame, after initial input), and then reject input with - AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to - read at least some output. - - Not all codecs will follow a rigid and predictable dataflow; the only - guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on - one end implies that a receive/send call on the other end will succeed. In - general, no codec will permit unlimited buffering of input or output. - - This API replaces the following legacy functions: - - avcodec_decode_video2() and avcodec_decode_audio4(): - Use avcodec_send_packet() to feed input to the decoder, then use - avcodec_receive_frame() to receive decoded frames after each packet. - Unlike with the old video decoding API, multiple frames might result from - a packet. For audio, splitting the input packet into frames by partially - decoding packets becomes transparent to the API user. You never need to - feed an AVPacket to the API twice. - Additionally, sending a flush/draining packet is required only once. - - avcodec_encode_video2()/avcodec_encode_audio2(): - Use avcodec_send_frame() to feed input to the encoder, then use - avcodec_receive_packet() to receive encoded packets. - Providing user-allocated buffers for avcodec_receive_packet() is not - possible. - - The new API does not handle subtitles yet. - - Mixing new and old function calls on the same AVCodecContext is not allowed, - and will result in undefined behavior. - - Some codecs might require using the new API; using the old API will return - an error when calling it. - @} - - @defgroup lavc_core Core functions/structures. - @ingroup libavc - - Basic definitions, functions for querying libavcodec capabilities, - allocating core structures, etc. - @{ - - Identify the syntax and semantics of the bitstream. - The principle is roughly: - Two decoders with the same ID can decode the same streams. - Two encoders with the same ID can encode compatible streams. - There may be slight deviations from the principle due to implementation - details. - - If you add a codec ID to this list, add it so that - 1. no value of an existing codec ID changes (that would break ABI), - 2. it is as close as possible to similar codecs - - After adding new codec IDs, do not forget to add an entry to the codec - descriptor list and bump libavcodec minor version. - - - Codec implemented by the hardware accelerator. - - See AV_CODEC_ID_xxx - - -Specific type of the encoded data (the codec used). - - -@} - -@addtogroup lavc_decoding -@{ - - Find a registered decoder with a matching codec ID. - - @param id AVCodecID of the requested decoder - @return A decoder if one was found, NULL otherwise. - - -@} -@} - -@addtogroup lavc_encoding -@{ - - Find a registered encoder with a matching codec ID. - - @param id AVCodecID of the requested encoder - @return An encoder if one was found, NULL otherwise. - - - Return a name for the specified profile, if available. - - @param codec_id the ID of the codec to which the requested profile belongs - @param profile the profile value for which a name is requested - @return A name for the profile if found, NULL otherwise. - - @note unlike av_get_profile_name(), which searches a list of profiles - supported by a specific decoder or encoder implementation, this - function searches the list of profiles from the AVCodecDescriptor - - - Return codec bits per sample. - - @param[in] codec_id the codec - @return Number of bits per sample or zero if unknown for the given codec. - - -Return the PCM codec associated with a sample format. -@param be endianness, 0 for little, 1 for big, - -1 (or anything else) for native -@return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE - - - Return codec bits per sample. - Only return non-zero if the bits per sample is exactly correct, not an - approximation. - - @param[in] codec_id the codec - @return Number of bits per sample or zero if unknown for the given codec. - - -A list of codec ids supported by the filter, terminated by -AV_CODEC_ID_NONE. -May be NULL, in that case the bitstream filter works with any codec id. - - -Get the name of a codec. -@return a static string identifying the codec; never NULL - - -@return descriptor for given codec ID or NULL if no descriptor exists. - - - Test if the given codec can be stored in this container. - - @return 1 if the codec is supported, 0 if it is not. - A negative number if unknown. - MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC - - -Forced video codec_id. -Demuxing: Set by user. - - -Forced audio codec_id. -Demuxing: Set by user. - - -Forced subtitle codec_id. -Demuxing: Set by user. - - -Forced Data codec_id. -Demuxing: Set by user. - - -Guess the codec ID based upon muxer and filename. - - - Get the AVCodecID for the given codec tag tag. - If no codec id is found returns AV_CODEC_ID_NONE. - - @param tags list of supported codec_id-codec_tag pairs, as stored - in AVInputFormat.codec_tag and AVOutputFormat.codec_tag - @param tag codec tag to match to a codec ID - - - Test if the given container can store a codec. - - @param ofmt container to check for compatibility - @param codec_id codec to potentially store in container - @param std_compliance standards compliance level, one of FF_COMPLIANCE_* - - @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. - A negative number if this information is not available. - - - - Get the buffer reference a given data plane is stored in. - - @param plane index of the data plane of interest in frame->extended_data. - - @return the buffer reference that contains the plane or NULL if the input - frame is not valid. - - - - Copy only "metadata" fields from src to dst. - - Metadata for the purpose of this function are those fields that do not affect - the data layout in the buffers. E.g. pts, sample rate (for audio) or sample - aspect ratio (for video), but not width/height or channel layout. - Side data is also copied. - - - - Copy the frame data from src to dst. - - This function does not allocate anything, dst must be already initialized and - allocated with the same parameters as src. - - This function only copies the frame data (i.e. the contents of the data / - extended data arrays), not any other properties. - - @return >= 0 on success, a negative AVERROR on error. - - - - Ensure that the frame data is writable, avoiding data copy if possible. - - Do nothing if the frame is writable, allocate new buffers and copy the data - if it is not. - - @return 0 on success, a negative AVERROR on error. - - @see av_frame_is_writable(), av_buffer_is_writable(), - av_buffer_make_writable() - - - - Check if the frame data is writable. - - @return A positive value if the frame data is writable (which is true if and - only if each of the underlying buffers has only one reference, namely the one - stored in this frame). Return 0 otherwise. - - If 1 is returned the answer is valid until av_buffer_ref() is called on any - of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). - - @see av_frame_make_writable(), av_buffer_is_writable() - - - - Allocate new buffer(s) for audio or video data. - - The following fields must be set on frame before calling this function: - - format (pixel format for video, sample format for audio) - - width and height for video - - nb_samples and channel_layout for audio - - This function will fill AVFrame.data and AVFrame.buf arrays and, if - necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. - For planar formats, one buffer will be allocated for each plane. - - @warning: if frame already has been allocated, calling this function will - leak memory. In addition, undefined behavior can occur in certain - cases. - - @param frame frame in which to store the new buffers. - @param align required buffer size alignment - - @return 0 on success, a negative AVERROR on error. - - - - Move everything contained in src to dst and reset src. - - @warning: dst is not unreferenced, but directly overwritten without reading - or deallocating its contents. Call av_frame_unref(dst) manually - before calling this function to ensure that no memory is leaked. - - - -Unreference all the buffers referenced by frame and reset the frame fields. - - - - Create a new frame that references the same data as src. - - This is a shortcut for av_frame_alloc()+av_frame_ref(). - - @return newly created AVFrame on success, NULL on error. - - - - Set up a new reference to the data described by the source frame. - - Copy frame properties from src to dst and create a new reference for each - AVBufferRef from src. - - If src is not reference counted, new buffers are allocated and the data is - copied. - - @warning: dst MUST have been either unreferenced with av_frame_unref(dst), - or newly allocated with av_frame_alloc() before calling this - function, or undefined behavior will occur. - - @return 0 on success, a negative AVERROR on error - - - - Free the frame and any dynamically allocated objects in it, - e.g. extended_data. If the frame is reference counted, it will be - unreferenced first. - - @param frame frame to be freed. The pointer will be set to NULL. - - - - Allocate an AVFrame and set its fields to default values. The resulting - struct must be freed using av_frame_free(). - - @return An AVFrame filled with default values or NULL on failure. - - @note this only allocates the AVFrame itself, not the data buffers. Those - must be allocated through other means, e.g. with av_frame_get_buffer() or - manually. - - - -Accessors for some AVFrame fields. -The position of these field in the structure is not part of the ABI, -they should not be accessed directly outside libavutil. - - - -For hwaccel-format frames, this should be a reference to the -AVHWFramesContext describing the frame. - - - -Not to be accessed directly from outside libavutil - - - -QP store stride -Not to be accessed directly from outside libavutil - - - -QP table -Not to be accessed directly from outside libavutil - - - -size of the corresponding packet containing the compressed -frame. It must be accessed using av_frame_get_pkt_size() and -av_frame_set_pkt_size(). -It is set to a negative value if unknown. -- encoding: unused -- decoding: set by libavcodec, read by user. - - - -number of audio channels, only used for audio. -Code outside libavutil should access this field using: -av_frame_get_channels(frame) -- encoding: unused -- decoding: Read by user. - - - -decode error flags of the frame, set to a combination of -FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there -were errors during the decoding. -Code outside libavutil should access this field using: -av_frame_get_decode_error_flags(frame) -- encoding: unused -- decoding: set by libavcodec, read by user. - - - -metadata. -Code outside libavutil should access this field using: -av_frame_get_metadata(frame) -- encoding: Set by user. -- decoding: Set by libavcodec. - - - -duration of the corresponding packet, expressed in -AVStream->time_base units, 0 if unknown. -Code outside libavutil should access this field using: -av_frame_get_pkt_duration(frame) -- encoding: unused -- decoding: Read by user. - - - -reordered pos from the last AVPacket that has been input into the decoder -Code outside libavutil should access this field using: -av_frame_get_pkt_pos(frame) -- encoding: unused -- decoding: Read by user. - - - -frame timestamp estimated using various heuristics, in stream time base -Code outside libavutil should access this field using: -av_frame_get_best_effort_timestamp(frame) -- encoding: unused -- decoding: set by libavcodec, read by user. - - - - @defgroup lavu_frame_flags AV_FRAME_FLAGS - @ingroup lavu_frame - Flags describing additional frame properties. - - @{ - -The frame data may be corrupted, e.g. due to decoding errors. - -A flag to mark the frames which need to be decoded, but shouldn't be output. - -@} - -Frame flags, a combination of @ref lavu_frame_flags - - - -Number of elements in extended_buf. - - - - For planar audio which requires more than AV_NUM_DATA_POINTERS - AVBufferRef pointers, this array will hold all the references which - cannot fit into AVFrame.buf. - - Note that this is different from AVFrame.extended_data, which always - contains all the pointers. This array only contains the extra pointers, - which cannot fit into AVFrame.buf. - - This array is always allocated using av_malloc() by whoever constructs - the frame. It is freed in av_frame_unref(). - - - -Channel layout of the audio data. - - - -Sample rate of the audio data. - - - -reordered opaque 64 bits (generally an integer or a double precision float -PTS but can be anything). -The user sets AVCodecContext.reordered_opaque to represent the input at -that time, -the decoder reorders values as needed and sets AVFrame.reordered_opaque -to exactly one of the values provided by the user through AVCodecContext.reordered_opaque -@deprecated in favor of pkt_pts - - - -Tell user application that palette has changed from previous frame. - - - -If the content is interlaced, is top field displayed first. - - - -The content of the picture is interlaced. - - - -When decoding, this signals how much the picture must be delayed. -extra_delay = repeat_pict / (2*fps) - - - -@deprecated unused - - - -for some private data of the user - - - -quality (between 1 (good) and FF_LAMBDA_MAX (bad)) - - - -picture number in display order - - - -picture number in bitstream order - - - -DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) -This is also the Presentation time of this AVFrame calculated from -only AVPacket.dts values without pts values. - - - -PTS copied from the AVPacket that was decoded to produce this frame. -@deprecated use the pts field instead - - - -Presentation timestamp in time_base units (time when frame should be shown to user). - - - -Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. - - - -1 -> keyframe, 0-> not - - - -format of the frame, -1 if unknown or unset -Values correspond to enum AVPixelFormat for video frames, -enum AVSampleFormat for audio) - - - -number of audio samples (per channel) described by this frame - - - -width and height of the video frame - - - - pointers to the data planes/channels. - - For video, this should simply point to data[]. - - For planar audio, each channel has a separate data pointer, and - linesize[0] contains the size of each channel buffer. - For packed audio, there is just one data pointer, and linesize[0] - contains the total size of the buffer for all channels. - - Note: Both data and extended_data should always be set in a valid frame, - but for planar audio with more channels that can fit in data, - extended_data must be used in order to access all channels. - - - - For video, size in bytes of each picture line. - For audio, size in bytes of each plane. - - For audio, only linesize[0] may be set. For planar audio, each channel - plane must be the same size. - - For video the linesizes should be multiples of the CPUs alignment - preference, this is 16 or 32 for modern desktop CPUs. - Some code requires such alignment other code can be slower without - correct alignment, for yet other it makes no difference. - - @note The linesize may be larger than the size of usable data -- there - may be extra padding present for performance reasons. - - - - pointer to the picture/channel planes. - This might be different from the first allocated byte - - Some decoders access areas outside 0,0 - width,height, please - see avcodec_align_dimensions2(). Some filters and swscale can read - up to 16 bytes beyond the planes, if these filters are to be used, - then 16 extra bytes must be allocated. - - NOTE: Except for hwaccel formats, pointers not needed by the format - MUST be set to NULL. - - - - This structure describes decoded (raw) audio or video data. - - AVFrame must be allocated using av_frame_alloc(). Note that this only - allocates the AVFrame itself, the buffers for the data must be managed - through other means (see below). - AVFrame must be freed with av_frame_free(). - - AVFrame is typically allocated once and then reused multiple times to hold - different data (e.g. a single AVFrame to hold frames received from a - decoder). In such a case, av_frame_unref() will free any references held by - the frame and reset it to its original clean state before it - is reused again. - - The data described by an AVFrame is usually reference counted through the - AVBuffer API. The underlying buffer references are stored in AVFrame.buf / - AVFrame.extended_buf. An AVFrame is considered to be reference counted if at - least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, - every single data plane must be contained in one of the buffers in - AVFrame.buf or AVFrame.extended_buf. - There may be a single buffer for all the data, or one separate buffer for - each plane, or anything in between. - - sizeof(AVFrame) is not a part of the public ABI, so new fields may be added - to the end with a minor bump. - Similarly fields that are marked as to be only accessed by - av_opt_ptr() can be reordered. This allows 2 forks to add fields - without breaking compatibility with each other. - - Fields can be accessed through AVOptions, the name string used, matches the - C structure field name for fields accessible through AVOptions. The AVClass - for AVFrame can be obtained from avcodec_get_frame_class() - - - - Structure to hold side data for an AVFrame. - - sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added - to the end with a minor bump. - - - -@} - -@file -@ingroup lavu_frame -reference-counted frame API - - @defgroup lavu_frame AVFrame - @ingroup lavu_data - - @{ - AVFrame is an abstraction for reference-counted raw multimedia data. - - - Add a new side data to a frame. - - @param frame a frame to which the side data should be added - @param type type of the added side data - @param size size of the side data - - @return newly added side data on success, NULL on error - - -@return a pointer to the side data of a given type on success, NULL if there -is no side data with such type in this frame. - - -If side data of the supplied type exists in the frame, free it and remove it -from the frame. - - -@return a string identifying the side data type - - - -The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. -This is set on the first frame of a GOP that has a temporal reference of 0. - - - -Mastering display metadata associated with a video frame. The payload is -an AVMasteringDisplayMetadata type and contains information about the -mastering display color volume. - - - -This side data must be associated with an audio frame and corresponds to -enum AVAudioServiceType defined in avcodec.h. - - - -Recommmends skipping the specified number of samples. This is exported -only if the "skip_manual" AVOption is set in libavcodec. -This has the same format as AV_PKT_DATA_SKIP_SAMPLES. -@code -u32le number of samples to skip from start of this packet -u32le number of samples to skip from end of this packet -u8 reason for start skip -u8 reason for end skip (0=padding silence, 1=convergence) -@endcode - - - -Motion vectors exported by some codecs (on demand through the export_mvs -flag set in the libavcodec AVCodecContext flags2 option). -The data is the AVMotionVector struct defined in -libavutil/motion_vector.h. - - - -Active Format Description data consisting of a single byte as specified -in ETSI TS 101 154 using AVActiveFormatDescription enum. - - - - This side data contains a 3x3 transformation matrix describing an affine - transformation that needs to be applied to the frame for correct - presentation. - - See libavutil/display.h for a detailed description of the data. - - - -ReplayGain information in the form of the AVReplayGain struct. - - - -Metadata relevant to a downmix procedure. -The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. - - - -The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. - - - -Stereoscopic 3d metadata. -The data is the AVStereo3D struct defined in libavutil/stereo3d.h. - - - -ATSC A53 Part 4 Closed Captions. -A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. -The number of bytes of CC data is AVFrameSideData.size. - - - -The data is the AVPanScan struct defined in libavcodec. - - - - Get dictionary entries as a string. - - Create a string containing dictionary's entries. - Such string may be passed back to av_dict_parse_string(). - @note String is escaped with backslashes ('\'). - - @param[in] m dictionary - @param[out] buffer Pointer to buffer that will be allocated with string containg entries. - Buffer must be freed by the caller when is no longer needed. - @param[in] key_val_sep character used to separate key from value - @param[in] pairs_sep character used to separate two pairs from each other - @return >= 0 on success, negative on error - @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. - - - -Free all the memory allocated for an AVDictionary struct -and all keys and values. - - - -Copy entries from one AVDictionary struct into another. -@param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, - this function will allocate a struct for you and put it in *dst -@param src pointer to source AVDictionary struct -@param flags flags to use when setting entries in *dst -@note metadata is read using the AV_DICT_IGNORE_SUFFIX flag -@return 0 on success, negative AVERROR code on failure. If dst was allocated - by this function, callers should free the associated memory. - - - - Parse the key/value pairs list and add the parsed entries to a dictionary. - - In case of failure, all the successfully set entries are stored in - *pm. You may need to manually free the created dictionary. - - @param key_val_sep a 0-terminated list of characters used to separate - key from value - @param pairs_sep a 0-terminated list of characters used to separate - two pairs from each other - @param flags flags to use when adding to dictionary. - AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL - are ignored since the key/value tokens will always - be duplicated. - @return 0 on success, negative AVERROR code on failure - - - - Convenience wrapper for av_dict_set that converts the value to a string - and stores it. - - Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. - - - - Get number of entries in dictionary. - - @param m dictionary - @return number of entries in dictionary - - - - Get a dictionary entry with matching key. - - The returned entry key or value must not be changed, or it will - cause undefined behavior. - - To iterate through all the dictionary entries, you can set the matching key - to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. - - @param prev Set to the previous matching element to find the next. - If set to NULL the first matching element is returned. - @param key matching key - @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved - @return found entry or NULL in case no matching entry was found in the dictionary - - - - Get the description of a given channel. - - @param channel a channel layout with a single channel - @return channel description on success, NULL on error - - - - Get the name of a given channel. - - @return channel name on success, NULL on error. - - - -Get the channel with the given index in channel_layout. - - - - Get the index of a channel in channel_layout. - - @param channel a channel layout describing exactly one channel which must be - present in channel_layout. - - @return index of channel in channel_layout on success, a negative AVERROR - on error. - - - -Return default channel layout for a given number of channels. - - - -Return the number of channels in the channel layout. - - - -Append a description of a channel layout to a bprint buffer. - - - Read contents of h into print buffer, up to max_size bytes, or up to EOF. - - @return 0 for success (max_size bytes read or EOF reached), negative error - code otherwise - - - - Return a channel layout id that matches name, or 0 if no match is found. - - name can be one or several of the following notations, - separated by '+' or '|': - - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, - 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); - - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, - SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); - - a number of channels, in decimal, optionally followed by 'c', yielding - the default channel layout for that number of channels (@see - av_get_default_channel_layout); - - a channel layout mask, in hexadecimal starting with "0x" (see the - AV_CH_* macros). - - @warning Starting from the next major bump the trailing character - 'c' to specify a number of channels will be required, while a - channel layout mask could also be specified as a decimal number - (if and only if not followed by "c"). - - Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" - - - -@file -audio channel layout utility functions - -@addtogroup lavu_audio -@{ - - @defgroup channel_masks Audio channel masks - - A channel layout is a 64-bits integer with a bit set for every channel. - The number of bits set must be equal to the number of channels. - The value 0 means that the channel layout is not known. - @note this data structure is not powerful enough to handle channels - combinations that have the same channel multiple times, such as - dual-mono. - - @{ - -Channel mask value used for AVCodecContext.request_channel_layout - to indicate that the user requests the channel order of the decoder output - to be the native codec channel order. -@} -@defgroup channel_mask_c Audio channel layouts -@{ - - - -@return the number of logical CPU cores present. - - - - Parse CPU caps from a string and update the given AV_CPU_* flags based on that. - - @return negative on error. - - - - Parse CPU flags from a string. - - The returned flags contain the specified flags as well as related unspecified flags. - - This function exists only for compatibility with libav. - Please use av_parse_cpu_caps() when possible. - @return a combination of AV_CPU_* flags, negative on error. - - - - Set a mask on flags returned by av_get_cpu_flags(). - This function is mainly useful for testing. - Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible - - @warning this function is not thread safe. - - - -Disables cpu detection and forces the specified flags. --1 is a special case that disables forcing of specific flags. - - - - Allocate a new AVBuffer, reusing an old buffer from the pool when available. - This function may be called simultaneously from multiple threads. - - @return a reference to the new buffer on success, NULL on error. - - - - Mark the pool as being available for freeing. It will actually be freed only - once all the allocated buffers associated with the pool are released. Thus it - is safe to call this function while some of the allocated buffers are still - in use. - - @param pool pointer to the pool to be freed. It will be set to NULL. - - - - Allocate and initialize a buffer pool with a more complex allocator. - - @param size size of each buffer in this pool - @param opaque arbitrary user data used by the allocator - @param alloc a function that will be used to allocate new buffers when the - pool is empty. - @param pool_free a function that will be called immediately before the pool - is freed. I.e. after av_buffer_pool_can_uninit() is called - by the pool and all the frames are returned to the pool and - freed. It is intended to uninitialize the user opaque data. - @return newly created buffer pool on success, NULL on error. - - - - Allocate and initialize a buffer pool. - - @param size size of each buffer in this pool - @param alloc a function that will be used to allocate new buffers when the - pool is empty. May be NULL, then the default allocator will be used - (av_buffer_alloc()). - @return newly created buffer pool on success, NULL on error. - - - -@} - - @defgroup lavu_bufferpool AVBufferPool - @ingroup lavu_data - - @{ - AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. - - Frequently allocating and freeing large buffers may be slow. AVBufferPool is - meant to solve this in cases when the caller needs a set of buffers of the - same size (the most obvious use case being buffers for raw video or audio - frames). - - At the beginning, the user must call av_buffer_pool_init() to create the - buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to - get a reference to a new buffer, similar to av_buffer_alloc(). This new - reference works in all aspects the same way as the one created by - av_buffer_alloc(). However, when the last reference to this buffer is - unreferenced, it is returned to the pool instead of being freed and will be - reused for subsequent av_buffer_pool_get() calls. - - When the caller is done with the pool and no longer needs to allocate any new - buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. - Once all the buffers are released, it will automatically be freed. - - Allocating and releasing buffers with this API is thread-safe as long as - either the default alloc callback is used, or the user-supplied one is - thread-safe. - -The buffer pool. This structure is opaque and not meant to be accessed -directly. It is allocated with av_buffer_pool_init() and freed with -av_buffer_pool_uninit(). - - - - Reallocate a given buffer. - - @param buf a buffer reference to reallocate. On success, buf will be - unreferenced and a new reference with the required size will be - written in its place. On failure buf will be left untouched. *buf - may be NULL, then a new buffer is allocated. - @param size required new buffer size. - @return 0 on success, a negative AVERROR on failure. - - @note the buffer is actually reallocated with av_realloc() only if it was - initially allocated through av_buffer_realloc(NULL) and there is only one - reference to it (i.e. the one passed to this function). In all other cases - a new buffer is allocated and the data is copied. - - - - Create a writable reference from a given buffer reference, avoiding data copy - if possible. - - @param buf buffer reference to make writable. On success, buf is either left - untouched, or it is unreferenced and a new writable AVBufferRef is - written in its place. On failure, buf is left untouched. - @return 0 on success, a negative AVERROR on failure. - - - -@return the opaque parameter set by av_buffer_create. - - - -@return 1 if the caller may write to the data referred to by buf (which is -true if and only if buf is the only reference to the underlying AVBuffer). -Return 0 otherwise. -A positive answer is valid until av_buffer_ref() is called on buf. - - - - Free a given reference and automatically free the buffer if there are no more - references to it. - - @param buf the reference to be freed. The pointer is set to NULL on return. - - - - Create a new reference to an AVBuffer. - - @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on - failure. - - - -Default free callback, which calls av_free() on the buffer data. -This function is meant to be passed to av_buffer_create(), not called -directly. - - - -Always treat the buffer as read-only, even when it has only one -reference. - - Create an AVBuffer from an existing array. - - If this function is successful, data is owned by the AVBuffer. The caller may - only access data through the returned AVBufferRef and references derived from - it. - If this function fails, data is left untouched. - @param data data array - @param size size of data in bytes - @param free a callback for freeing this buffer's data - @param opaque parameter to be got for processing or passed to free - @param flags a combination of AV_BUFFER_FLAG_* - - @return an AVBufferRef referring to data on success, NULL on failure. - - - -Same as av_buffer_alloc(), except the returned buffer will be initialized -to zero. - - - - Allocate an AVBuffer of the given size using av_malloc(). - - @return an AVBufferRef of given size or NULL when out of memory - - - -Size of data in bytes. - - - -The data buffer. It is considered writable if and only if -this is the only reference to the buffer, in which case -av_buffer_is_writable() returns 1. - - - - A reference to a data buffer. - - The size of this struct is not a part of the public ABI and it is not meant - to be allocated directly. - - - -@} -@} - -@file -@ingroup lavu_buffer -refcounted data buffer API - - @defgroup lavu_buffer AVBuffer - @ingroup lavu_data - - @{ - AVBuffer is an API for reference-counted data buffers. - - There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer - represents the data buffer itself; it is opaque and not meant to be accessed - by the caller directly, but only through AVBufferRef. However, the caller may - e.g. compare two AVBuffer pointers to check whether two different references - are describing the same data buffer. AVBufferRef represents a single - reference to an AVBuffer and it is the object that may be manipulated by the - caller directly. - - There are two functions provided for creating a new AVBuffer with a single - reference -- av_buffer_alloc() to just allocate a new buffer, and - av_buffer_create() to wrap an existing array in an AVBuffer. From an existing - reference, additional references may be created with av_buffer_ref(). - Use av_buffer_unref() to free a reference (this will automatically free the - data once all the references are freed). - - The convention throughout this API and the rest of FFmpeg is such that the - buffer is considered writable if there exists only one reference to it (and - it has not been marked as read-only). The av_buffer_is_writable() function is - provided to check whether this is true and av_buffer_make_writable() will - automatically create a new writable buffer when necessary. - Of course nothing prevents the calling code from violating this convention, - however that is safe only when all the existing references are under its - control. - - @note Referencing and unreferencing the buffers is thread-safe and thus - may be done from multiple threads simultaneously without any need for - additional locking. - - @note Two different references to the same buffer can point to different - parts of the buffer (i.e. their AVBufferRef.data will not be equal). - -A reference counted buffer type. It is opaque and is meant to be used through -references (AVBufferRef). - - - -@} -@} - - @addtogroup lavu_audio - @{ - - @defgroup lavu_sampfmts Audio sample formats - - Audio sample format enumeration and related convenience functions. - @{ - - Audio sample formats - - - The data described by the sample format is always in native-endian order. - Sample values can be expressed by native C types, hence the lack of a signed - 24-bit sample format even though it is a common raw audio data format. - - - The floating-point formats are based on full volume being in the range - [-1.0, 1.0]. Any values outside this range are beyond full volume level. - - - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg - (such as AVFrame in libavcodec) is as follows: - - @par - For planar sample formats, each audio channel is in a separate data plane, - and linesize is the buffer size, in bytes, for a single plane. All data - planes must be the same size. For packed sample formats, only the first data - plane is used, and samples for each channel are interleaved. In this case, - linesize is the buffer size, in bytes, for the 1 plane. - - - -Return the name of sample_fmt, or NULL if sample_fmt is not -recognized. - - -Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE -on error. - - - * Get the packed alternative form of the given sample format. - * - * If the passed sample_fmt is already in packed format, the format returned is - * the same as the input. - * - * @return the packed alternative form of the given sample format or - AV_SAMPLE_FMT_NONE on error. - - - * Get the planar alternative form of the given sample format. - * - * If the passed sample_fmt is already in planar format, the format returned is - * the same as the input. - * - * @return the planar alternative form of the given sample format or - AV_SAMPLE_FMT_NONE on error. - - - Generate a string corresponding to the sample format with - sample_fmt, or a header if sample_fmt is negative. - - @param buf the buffer where to write the string - @param buf_size the size of buf - @param sample_fmt the number of the sample format to print the - corresponding info string, or a negative value to print the - corresponding header. - @return the pointer to the filled buffer or NULL if sample_fmt is - unknown or in case of other errors - - - Return number of bytes per sample. - - @param sample_fmt the sample format - @return number of bytes per sample or zero if unknown for the given - sample format - - - Check if the sample format is planar. - - @param sample_fmt the sample format to inspect - @return 1 if the sample format is planar, 0 if it is interleaved - - - Get the required buffer size for the given audio parameters. - - @param[out] linesize calculated linesize, may be NULL - @param nb_channels the number of channels - @param nb_samples the number of samples in a single channel - @param sample_fmt the sample format - @param align buffer size alignment (0 = default, 1 = no alignment) - @return required buffer size, or negative error code on failure - - - @} - - @defgroup lavu_sampmanip Samples manipulation - - Functions that manipulate audio samples - @{ - - Fill plane data pointers and linesize for samples with sample - format sample_fmt. - - The audio_data array is filled with the pointers to the samples data planes: - for planar, set the start point of each channel's data within the buffer, - for packed, set the start point of the entire buffer only. - - The value pointed to by linesize is set to the aligned size of each - channel's data buffer for planar layout, or to the aligned size of the - buffer for all channels for packed layout. - - The buffer in buf must be big enough to contain all the samples - (use av_samples_get_buffer_size() to compute its minimum size), - otherwise the audio_data pointers will point to invalid data. - - @see enum AVSampleFormat - The documentation for AVSampleFormat describes the data layout. - - @param[out] audio_data array to be filled with the pointer for each channel - @param[out] linesize calculated linesize, may be NULL - @param buf the pointer to a buffer containing the samples - @param nb_channels the number of channels - @param nb_samples the number of samples in a single channel - @param sample_fmt the sample format - @param align buffer size alignment (0 = default, 1 = no alignment) - @return >=0 on success or a negative error code on failure - @todo return minimum size in bytes required for the buffer in case - of success at the next bump - - - Allocate a data pointers array, samples buffer for nb_samples - samples, and fill data pointers and linesize accordingly. - - This is the same as av_samples_alloc(), but also allocates the data - pointers array. - - @see av_samples_alloc() - - - Copy samples from src to dst. - - @param dst destination array of pointers to data planes - @param src source array of pointers to data planes - @param dst_offset offset in samples at which the data will be written to dst - @param src_offset offset in samples at which the data will be read from src - @param nb_samples number of samples to be copied - @param nb_channels number of audio channels - @param sample_fmt audio sample format - - - Fill an audio buffer with silence. - - @param audio_data array of pointers to data planes - @param offset offset in samples at which to start filling - @param nb_samples number of samples to fill - @param nb_channels number of audio channels - @param sample_fmt audio sample format - - -audio sample format -- encoding: Set by user. -- decoding: Set by libavcodec. - - -desired sample format -- encoding: Not used. -- decoding: Set by user. -Decoder will decode to this format if it can. - - - * Initialize audio resampling context. - * - * @param output_channels number of output channels - * @param input_channels number of input channels - * @param output_rate output sample rate - * @param input_rate input sample rate - * @param sample_fmt_out requested output sample format - * @param sample_fmt_in input sample format - * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency - * @param log2_phase_count log2 of the number of entries in the polyphase filterbank - * @param linear if 1 then the used FIR filter will be linearly interpolated - between the 2 closest, if 0 the closest will be used - * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate - * @return allocated ReSampleContext, NULL if error occurred - - - Fill AVFrame audio data and linesize pointers. - - The buffer buf must be a preallocated buffer with a size big enough - to contain the specified samples amount. The filled AVFrame data - pointers will point to this buffer. - - AVFrame extended_data channel pointers are allocated if necessary for - planar audio. - - @param frame the AVFrame - frame->nb_samples must be set prior to calling the - function. This function fills in frame->data, - frame->extended_data, frame->linesize[0]. - @param nb_channels channel count - @param sample_fmt sample format - @param buf buffer to use for frame data - @param buf_size size of buffer - @param align plane size sample alignment (0 = default) - @return >=0 on success, negative error code on failure - @todo return the size in bytes required to store the samples in - case of success, at the next libavutil bump - - - -Return the fractional representation of the internal time base. - - - - Compute the length of an integer list. - - @param term list terminator (usually 0 or -1) - @param list pointer to the list - @return length of the list, in elements, not counting the terminator - -Open a file using a UTF-8 filename. -The API of this function matches POSIX fopen(), errors are returned through -errno. - - - - Compute the length of an integer list. - - @param elsize size in bytes of each list element (only 1, 2, 4 or 8) - @param term list terminator (usually 0 or -1) - @param list pointer to the list - @return length of the list, in elements, not counting the terminator - - - -Return x default pointer in case p is NULL. - - - - Location of chroma samples. - - Illustration showing the location of the first (top left) chroma sample of the - image, the left shows only luma, the right - shows the location of the chroma sample, the 2 could be imagined to overlay - each other but are drawn separately due to limitations of ASCII - - 1st 2nd 1st 2nd horizontal luma sample positions - v v v v - ______ ______ -1st luma line > |X X ... |3 4 X ... X are luma samples, - | |1 2 1-6 are possible chroma positions -2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position - - -This defines the location of chroma samples. -- encoding: Set by user -- decoding: Set by libavcodec - - - Converts AVChromaLocation to swscale x/y chroma position. - - The positions represent the chroma (0,0) position in a coordinates system - with luma (0,0) representing the origin and luma(1,1) representing 256,256 - - @param xpos horizontal chroma sample position - @param ypos vertical chroma sample position - - - Converts swscale x/y chroma position to AVChromaLocation. - - The positions represent the chroma (0,0) position in a coordinates system - with luma (0,0) representing the origin and luma(1,1) representing 256,256 - - @param xpos horizontal chroma sample position - @param ypos vertical chroma sample position - - - -MPEG vs JPEG YUV range. - - -MPEG vs JPEG YUV range. -It must be accessed using av_frame_get_color_range() and -av_frame_set_color_range(). -- encoding: Set by user -- decoding: Set by libavcodec - - -MPEG vs JPEG YUV range. -- encoding: Set by user -- decoding: Set by libavcodec - - -Video only. Additional colorspace characteristics. - - - -YUV colorspace type. - - -YUV colorspace type. -It must be accessed using av_frame_get_colorspace() and -av_frame_set_colorspace(). -- encoding: Set by user -- decoding: Set by libavcodec - - -Get the name of a colorspace. -@return a static string identifying the colorspace; can be NULL. - - -YUV colorspace type. -- encoding: Set by user -- decoding: Set by libavcodec - - - -Color Transfer Characteristic. - - -Color Transfer Characteristic. -- encoding: Set by user -- decoding: Set by libavcodec - - - -Chromaticity coordinates of the source primaries. - - -Chromaticity coordinates of the source primaries. -- encoding: Set by user -- decoding: Set by libavcodec - - - -HW acceleration through CUDA. data[i] contain CUdeviceptr pointers -exactly as for system memory frames. - - - -HW acceleration though MMAL, data[3] contains a pointer to the -MMAL_BUFFER_HEADER_T structure. - - - -HW acceleration through QSV, data[3] contains a pointer to the -mfxFrameSurface1 structure. - - - -The following 12 formats have the disadvantage of needing 1 format for each bit depth. -Notice that each 9/10 bits sample is stored in 16 bits with extra padding. -If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. - - - -@} - - -@name Deprecated pixel formats -@{ - - -av_dlog macros -@deprecated unused -Useful to print debug messages that shouldn't get compiled in normally. - -Skip repeated messages, this requires the user app to use av_log() instead of -(f)printf as the 2 would otherwise interfere and lead to -"Last message repeated x times" messages below (f)printf messages with some -bad luck. -Also to receive the last, "last repeated" line if any, the user app must -call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end - - Include the log severity in messages originating from codecs. - - Results in messages such as: - [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts - - - -Format a line of log the same way as the default callback. -@param line buffer to receive the formatted line; - may be NULL if line_size is 0 -@param line_size size of the buffer; at most line_size-1 characters will - be written to the buffer, plus one null terminator -@param print_prefix used to store whether the prefix must be printed; - must point to a persistent integer initially set to 1 -@return Returns a negative value if an error occurred, otherwise returns - the number of characters that would have been written for a - sufficiently large buffer, not including the terminating null - character. If the return value is not less than line_size, it means - that the log message was truncated to fit the buffer. - - - -Format a line of log the same way as the default callback. -@param line buffer to receive the formatted line -@param line_size size of the buffer -@param print_prefix used to store whether the prefix must be printed; - must point to a persistent integer initially set to 1 - - - - Return the context name - - @param ctx The AVClass context - - @return The AVClass class_name - - - - Default logging callback - - It prints the message to stderr, optionally colorizing it. - - @param avcl A pointer to an arbitrary struct of which the first field is a - pointer to an AVClass struct. - @param level The importance level of the message expressed using a @ref - lavu_log_constants "Logging Constant". - @param fmt The format string (printf-compatible) that specifies how - subsequent arguments are converted to output. - @param vl The arguments referenced by the format string. - - - - Set the logging callback - - @note The callback must be thread safe, even if the application does not use - threads itself as some codecs are multithreaded. - - @see av_log_default_callback - - @param callback A logging function with a compatible signature. - - - - Set the log level - - @see lavu_log_constants - - @param level Logging level - - - - Get the current log level - - @see lavu_log_constants - - @return Current log level - - - - Send the specified message to the log if the level is less than or equal - to the current av_log_level. By default, all logging messages are sent to - stderr. This behavior can be altered by setting a different logging callback - function. - @see av_log_set_callback - - @param avcl A pointer to an arbitrary struct of which the first field is a - pointer to an AVClass struct. - @param level The importance level of the message expressed using a @ref - lavu_log_constants "Logging Constant". - @param fmt The format string (printf-compatible) that specifies how - subsequent arguments are converted to output. - @param vl The arguments referenced by the format string. - - - - @addtogroup lavu_log - - @{ - - @defgroup lavu_log_constants Logging Constants - - @{ - -Print no output. - -Something went really wrong and we will crash now. - -Something went wrong and recovery is not possible. -For example, no header was found for a format which depends -on headers or an illegal combination of parameters is used. - -Something went wrong and cannot losslessly be recovered. -However, not all future data is affected. - -Something somehow does not look correct. This may or may not -lead to problems. An example would be the use of '-vstrict -2'. - -Standard information. - -Detailed information. - -Stuff which is only useful for libav* developers. - -Extremely verbose debugging, useful for libav* development. - -@} - - * Sets additional colors for extended debugging sessions. - * @code - av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); - @endcode - * Requires 256color terminal support. Uses outside debugging is not - * recommended. - - Send the specified message to the log if the level is less than or equal - to the current av_log_level. By default, all logging messages are sent to - stderr. This behavior can be altered by setting a different logging callback - function. - @see av_log_set_callback - - @param avcl A pointer to an arbitrary struct of which the first field is a - pointer to an AVClass struct or NULL if general log. - @param level The importance level of the message expressed using a @ref - lavu_log_constants "Logging Constant". - @param fmt The format string (printf-compatible) that specifies how - subsequent arguments are converted to output. - - - -Callback to return the supported/allowed ranges. -available since version (52.12) - - - -Return next AVOptions-enabled child or NULL - - - -Offset in the structure where a pointer to the parent context for -logging is stored. For example a decoder could pass its AVCodecContext -to eval as such a parent context, which an av_log() implementation -could then leverage to display the parent context. -The offset can be NULL. - - - -Offset in the structure where log_level_offset is stored. -0 means there is no such variable - - - -LIBAVUTIL_VERSION with which this structure was created. -This is used to allow fields to be added without requiring major -version bumps everywhere. - - - - a pointer to the first option specified in the class if any or NULL - - @see av_set_default_options() - - - -A pointer to a function which returns the name of a context -instance ctx associated with the class. - - - -The name of the class; usually it is the same name as the -context structure type to which the AVClass is associated. - - - -Describe the class of an AVClass context structure. That is an -arbitrary struct of which the first field is a pointer to an -AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). - - - Return an AVClass corresponding to the next potential - AVOptions-enabled child. - - The difference between child_next and this is that - child_next iterates over _already existing_ objects, while - child_class_next iterates over _all possible_ children. - - - - Add a value to a timestamp. - - This function guarantees that when the same value is repeatly added that - no accumulation of rounding errors occurs. - - @param[in] ts Input timestamp - @param[in] ts_tb Input timestamp time base - @param[in] inc Value to be added - @param[in] inc_tb Time base of `inc` - - - - Rescale a timestamp while preserving known durations. - - This function is designed to be called per audio packet to scale the input - timestamp to a different time base. Compared to a simple av_rescale_q() - call, this function is robust against possible inconsistent frame durations. - - The `last` parameter is a state variable that must be preserved for all - subsequent calls for the same stream. For the first call, `*last` should be - initialized to #AV_NOPTS_VALUE. - - @param[in] in_tb Input time base - @param[in] in_ts Input timestamp - @param[in] fs_tb Duration time base; typically this is finer-grained - (greater) than `in_tb` and `out_tb` - @param[in] duration Duration till the next call to this function (i.e. - duration of the current packet/frame) - @param[in,out] last Pointer to a timestamp expressed in terms of - `fs_tb`, acting as a state variable - @param[in] out_tb Output timebase - @return Timestamp expressed in terms of `out_tb` - - @note In the context of this function, "duration" is in term of samples, not - seconds. - - - - Compare two timestamps each in its own time base. - - @return One of the following values: - - -1 if `ts_a` is before `ts_b` - - 1 if `ts_a` is after `ts_b` - - 0 if they represent the same position - - @warning - The result of the function is undefined if one of the timestamps is outside - the `int64_t` range when represented in the other's timebase. - - - - Rescale a 64-bit integer by 2 rational numbers. - - The operation is mathematically equivalent to `a * bq / cq`. - - This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. - - @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() - - - - Rescale a 64-bit integer with rounding to nearest. - - The operation is mathematically equivalent to `a * b / c`, but writing that - directly can overflow. - - This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. - - @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() - - - - Compute the greatest common divisor of two integer operands. - - @param a,b Operands - @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; - if a == 0 and b == 0, returns 0. - - - - @addtogroup lavu_math - - @{ - -Rounding methods. - - - Rescale a 64-bit integer with specified rounding. - - The operation is mathematically equivalent to `a * b / c`, but writing that - directly can overflow, and does not support different rounding methods. - - @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() - - - Rescale a 64-bit integer by 2 rational numbers with specified rounding. - - The operation is mathematically equivalent to `a * bq / cq`. - - @see av_rescale(), av_rescale_rnd(), av_rescale_q() - - - - Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through - unchanged, avoiding special cases for #AV_NOPTS_VALUE. - - Unlike other values of the enumeration AVRounding, this value is a - bitmask that must be used in conjunction with another value of the - enumeration through a bitwise OR, in order to set behavior for normal - cases. - - @code{.c} - av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); - // Rescaling 3: - // Calculating 3 * 1 / 2 - // 3 / 2 is rounded up to 2 - // => 2 - - av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); - // Rescaling AV_NOPTS_VALUE: - // AV_NOPTS_VALUE == INT64_MIN - // AV_NOPTS_VALUE is passed through - // => AV_NOPTS_VALUE - @endcode - - - -Reinterpret a double as a 64-bit integer. - - - -Reinterpret a 64-bit integer as a double. - - - -Reinterpret a float as a 32-bit integer. - - - -Reinterpret a 32-bit integer as a float. - - - -@} - -@file -@addtogroup lavu_math -Mathematical utilities for working with timestamp and time base. - - - - Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point - format. - - @param q Rational to be converted - @return Equivalent floating-point value, expressed as an unsigned 32-bit - integer. - @note The returned value is platform-indepedant. - - - - Find the value in a list of rationals nearest a given reference rational. - - @param q Reference rational - @param q_list Array of rationals terminated by `{0, 0}` - @return Index of the nearest value found in the array - - - - Find which of the two rationals is closer to another rational. - - @param q Rational to be compared against - @param q1,q2 Rationals to be tested - @return One of the following values: - - 1 if `q1` is nearer to `q` than `q2` - - -1 if `q2` is nearer to `q` than `q1` - - 0 if they have the same distance - - - - Convert a double precision floating point number to a rational. - - In case of infinity, the returned value is expressed as `{1, 0}` or - `{-1, 0}` depending on the sign. - - @param d `double` to convert - @param max Maximum allowed numerator and denominator - @return `d` in AVRational form - @see av_q2d() - - - -Invert a rational. -@param q value -@return 1 / q - - - -Subtract one rational from another. -@param b First rational -@param c Second rational -@return b-c - - - -Add two rationals. -@param b First rational -@param c Second rational -@return b+c - - - -Divide one rational by another. -@param b First rational -@param c Second rational -@return b/c - - - -Multiply two rationals. -@param b First rational -@param c Second rational -@return b*c - - - -Convert an AVRational to a `double`. -@param a AVRational to convert -@return `a` in floating-point form -@see av_d2q() - - - - Create an AVRational. - - Useful for compilers that do not support compound literals. - - @note The return value is not reduced. - @see av_reduce() - - - - Set the maximum size that may be allocated in one block. - - The value specified with this function is effective for all libavutil's @ref - lavu_mem_funcs "heap management functions." - - By default, the max value is defined as `INT_MAX`. - - @param max Value to be set as the new maximum size - - @warning Exercise extreme caution when using this function. Don't touch - this if you do not understand the full consequence of doing so. - - - -@} - - @defgroup lavu_mem_misc Miscellaneous Functions - - Other functions related to memory allocation. - - @{ - - Multiply two `size_t` values checking for overflow. - - @param[in] a,b Operands of multiplication - @param[out] r Pointer to the result of the operation - @return 0 on success, AVERROR(EINVAL) on overflow - - - - Add an element of size `elem_size` to a dynamic array. - - The array is reallocated when its number of elements reaches powers of 2. - Therefore, the amortized cost of adding an element is constant. - - In case of success, the pointer to the array is updated in order to - point to the new grown array, and the number pointed to by `nb_ptr` - is incremented. - In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and - `*nb_ptr` is set to 0. - - @param[in,out] tab_ptr Pointer to the array to grow - @param[in,out] nb_ptr Pointer to the number of elements in the array - @param[in] elem_size Size in bytes of an element in the array - @param[in] elem_data Pointer to the data of the element to add. If - `NULL`, the space of the newly added element is - allocated but left uninitialized. - - @return Pointer to the data of the element to copy in the newly allocated - space - @see av_dynarray_add(), av_dynarray_add_nofree() - - - - Add an element to a dynamic array. - - Function has the same functionality as av_dynarray_add(), - but it doesn't free memory on fails. It returns error code - instead and leave current buffer untouched. - - @return >=0 on success, negative otherwise - @see av_dynarray_add(), av_dynarray2_add() - - - - Overlapping memcpy() implementation. - - @param dst Destination buffer - @param back Number of bytes back to start copying (i.e. the initial size of - the overlapping window); must be > 0 - @param cnt Number of bytes to copy; must be >= 0 - - @note `cnt > back` is valid, this will copy the bytes we just copied, - thus creating a repeating pattern with a period length of `back`. - - - - Duplicate a buffer with av_malloc(). - - @param p Buffer to be duplicated - @param size Size in bytes of the buffer copied - @return Pointer to a newly allocated buffer containing a - copy of `p` or `NULL` if the buffer cannot be allocated - - - - Duplicate a substring of a string. - - @param s String to be duplicated - @param len Maximum length of the resulting string (not counting the - terminating byte) - @return Pointer to a newly-allocated string containing a - substring of `s` or `NULL` if the string cannot be allocated - - - - Duplicate a string. - - @param s String to be duplicated - @return Pointer to a newly-allocated string containing a - copy of `s` or `NULL` if the string cannot be allocated - @see av_strndup() - - - - Free a memory block which has been allocated with a function of av_malloc() - or av_realloc() family. - - @param ptr Pointer to the memory block which should be freed. - - @note `ptr = NULL` is explicitly allowed. - @note It is recommended that you use av_freep() instead, to prevent leaving - behind dangling pointers. - @see av_freep() - - - - Allocate and clear a buffer, reusing the given one if large enough. - - Like av_fast_malloc(), but all newly allocated space is initially cleared. - Reused buffer is not cleared. - - `*ptr` is allowed to be `NULL`, in which case allocation always happens if - `size_needed` is greater than 0. - - @param[in,out] ptr Pointer to pointer to an already allocated buffer. - `*ptr` will be overwritten with pointer to new - buffer on success or `NULL` on failure - @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is - changed to `min_size` in case of success or 0 in - case of failure - @param[in] min_size New size of buffer `*ptr` - @see av_fast_malloc() - - - - Allocate, reallocate, or free an array through a pointer to a pointer. - - If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is - zero, free the memory block pointed to by `*ptr`. - - @param[in,out] ptr Pointer to a pointer to a memory block already - allocated with av_realloc(), or a pointer to `NULL`. - The pointer is updated on success, or freed on failure. - @param[in] nmemb Number of elements - @param[in] size Size of the single element - - @return Zero on success, an AVERROR error code on failure - - @warning Unlike av_malloc(), the allocated memory is not guaranteed to be - correctly aligned. - - - - Allocate, reallocate, or free an array. - - If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If - `nmemb` is zero, free the memory block pointed to by `ptr`. - - @param ptr Pointer to a memory block already allocated with - av_realloc() or `NULL` - @param nmemb Number of elements in the array - @param size Size of the single element of the array - - @return Pointer to a newly-reallocated block or NULL if the block - cannot be reallocated or the function is used to free the memory block - - @warning Unlike av_malloc(), the allocated memory is not guaranteed to be - correctly aligned. - @see av_reallocp_array() - - - - Allocate, reallocate, or free a block of memory. - - This function does the same thing as av_realloc(), except: - - It takes two size arguments and allocates `nelem * elsize` bytes, - after checking the result of the multiplication for integer overflow. - - It frees the input block in case of failure, thus avoiding the memory - leak with the classic - @code{.c} - buf = realloc(buf); - if (!buf) - return -1; - @endcode - pattern. - - - - Allocate, reallocate, or free a block of memory through a pointer to a - pointer. - - If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is - zero, free the memory block pointed to by `*ptr`. Otherwise, expand or - shrink that block of memory according to `size`. - - @param[in,out] ptr Pointer to a pointer to a memory block already allocated - with av_realloc(), or a pointer to `NULL`. The pointer - is updated on success, or freed on failure. - @param[in] size Size in bytes for the memory block to be allocated or - reallocated - - @return Zero on success, an AVERROR error code on failure - - @warning Unlike av_malloc(), the allocated memory is not guaranteed to be - correctly aligned. - - - - Allocate, reallocate, or free a block of memory. - - If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is - zero, free the memory block pointed to by `ptr`. Otherwise, expand or - shrink that block of memory according to `size`. - - @param ptr Pointer to a memory block already allocated with - av_realloc() or `NULL` - @param size Size in bytes of the memory block to be allocated or - reallocated - - @return Pointer to a newly-reallocated block or `NULL` if the block - cannot be reallocated or the function is used to free the memory block - - @warning Unlike av_malloc(), the returned pointer is not guaranteed to be - correctly aligned. - @see av_fast_realloc() - @see av_reallocp() - - - - Non-inlined equivalent of av_mallocz_array(). - - Created for symmetry with the calloc() C function. - - - - Allocate a memory block for an array with av_mallocz(). - - The allocated memory will have size `size * nmemb` bytes. - - @param nmemb Number of elements - @param size Size of the single element - @return Pointer to the allocated block, or `NULL` if the block cannot - be allocated - - @see av_mallocz() - @see av_malloc_array() - - - - Allocate a memory block for an array with av_malloc(). - - The allocated memory will have size `size * nmemb` bytes. - - @param nmemb Number of element - @param size Size of a single element - @return Pointer to the allocated block, or `NULL` if the block cannot - be allocated - @see av_malloc() - - - - Allocate a memory block with alignment suitable for all memory accesses - (including vectors if available on the CPU) and zero all the bytes of the - block. - - @param size Size in bytes for the memory block to be allocated - @return Pointer to the allocated block, or `NULL` if it cannot be allocated - @see av_malloc() - - - -Convenience macro, the return value should be used only directly in -function arguments but never stand-alone. - -@} - - @addtogroup lavu_mem - Utilities for manipulating memory. - - FFmpeg has several applications of memory that are not required of a typical - program. For example, the computing-heavy components like video decoding and - encoding can be sped up significantly through the use of aligned memory. - - However, for each of FFmpeg's applications of memory, there might not be a - recognized or standardized API for that specific use. Memory alignment, for - instance, varies wildly depending on operating systems, architectures, and - compilers. Hence, this component of @ref libavutil is created to make - dealing with memory consistently possible on all platforms. - - @{ - - @defgroup lavu_mem_macros Alignment Macros - Helper macros for declaring aligned variables. - @{ - - @def DECLARE_ALIGNED(n,t,v) - Declare a variable that is aligned in memory. - - @code{.c} - DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; - DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; - - // The default-alignment equivalent would be - uint16_t aligned_int = 42; - uint8_t aligned_array[128]; - @endcode - - @param n Minimum alignment in bytes - @param t Type of the variable (or array element) - @param v Name of the variable - - @def DECLARE_ASM_CONST(n,t,v) - Declare a static constant aligned variable appropriate for use in inline - assembly code. - - @code{.c} - DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); - @endcode - - @param n Minimum alignment in bytes - @param t Type of the variable (or array element) - @param v Name of the variable - -@} - - @defgroup lavu_mem_attrs Function Attributes - Function attributes applicable to memory handling functions. - - These function attributes can help compilers emit more useful warnings, or - generate better code. - @{ - - @def av_malloc_attrib - Function attribute denoting a malloc-like function. - - @see Function attribute `malloc` in GCC's documentation - - @def av_alloc_size(...) - Function attribute used on a function that allocates memory, whose size is - given by the specified parameter(s). - - @code{.c} - void *av_malloc(size_t size) av_alloc_size(1); - void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); - @endcode - - @param ... One or two parameter indexes, separated by a comma - - @see Function attribute `alloc_size` in GCC's documentation - -@} - - @defgroup lavu_mem_funcs Heap Management - Functions responsible for allocating, freeing, and copying memory. - - All memory allocation functions have a built-in upper limit of `INT_MAX` - bytes. This may be changed with av_max_alloc(), although exercise extreme - caution when doing so. - - @{ - - Allocate a memory block with alignment suitable for all memory accesses - (including vectors if available on the CPU). - - @param size Size in bytes for the memory block to be allocated - @return Pointer to the allocated block, or `NULL` if the block cannot - be allocated - @see av_mallocz() - - - - Fill the provided buffer with a string containing an error string - corresponding to the AVERROR code errnum. - - @param errbuf a buffer - @param errbuf_size size in bytes of errbuf - @param errnum error code to describe - @return the buffer in input, filled with the error description - @see av_strerror() - - - - Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. - - @param val Output value, must be an lvalue of type uint32_t. - @param GET_BYTE Expression reading one byte from the input. - Evaluated up to 7 times (4 for the currently - assigned Unicode range). With a memory buffer - input, this could be *ptr++. - @param ERROR Expression to be evaluated on invalid input, - typically a goto statement. - - @warning ERROR should not contain a loop control statement which - could interact with the internal while loop, and should force an - exit from the macro code (e.g. through a goto or a return) in order - to prevent undefined results. - - Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. - - @param val Output value, must be an lvalue of type uint32_t. - @param GET_16BIT Expression returning two bytes of UTF-16 data converted - to native byte order. Evaluated one or two times. - @param ERROR Expression to be evaluated on invalid input, - typically a goto statement. - -@def PUT_UTF8(val, tmp, PUT_BYTE) -Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). -@param val is an input-only argument and should be of type uint32_t. It holds -a UCS-4 encoded Unicode character that is to be converted to UTF-8. If -val is given as a function it is executed only once. -@param tmp is a temporary variable and should be of type uint8_t. It -represents an intermediate value during conversion that is to be -output by PUT_BYTE. -@param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. -It could be a function or a statement, and uses tmp as the input byte. -For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be -executed up to 4 times for values in the valid UTF-8 range and up to -7 times in the general case, depending on the length of the converted -Unicode character. - -@def PUT_UTF16(val, tmp, PUT_16BIT) -Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). -@param val is an input-only argument and should be of type uint32_t. It holds -a UCS-4 encoded Unicode character that is to be converted to UTF-16. If -val is given as a function it is executed only once. -@param tmp is a temporary variable and should be of type uint16_t. It -represents an intermediate value during conversion that is to be -output by PUT_16BIT. -@param PUT_16BIT writes the converted UTF-16 data to any proper destination -in desired endianness. It could be a function or a statement, and uses tmp -as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" -PUT_BYTE will be executed 1 or 2 times depending on input character. - -@file -@ingroup lavu_mem -Memory handling functions - -@file -error code definitions - - @addtogroup lavu_error - - @{ - -This is semantically identical to AVERROR_BUG -it has been introduced in Libav after our AVERROR_BUG and with a modified value. - - Put a description of the AVERROR code errnum in errbuf. - In case of failure the global variable errno is set to indicate the - error. Even in case of failure av_strerror() will print a generic - error message indicating the errnum provided to errbuf. - - @param errnum error code to describe - @param errbuf buffer to which description is written - @param errbuf_size the size in bytes of errbuf - @return 0 on success, a negative value if a description for errnum - cannot be found - - - -Count number of bits set to one in x -@param x value to count bits of -@return the number of bits set to one in x - - - -Count number of bits set to one in x -@param x value to count bits of -@return the number of bits set to one in x - - - -Compute ceil(log2(x)). - * @param x value used to compute ceil(log2(x)) - * @return computed ceiling of log2(x) - - - -Clip a double value into the amin-amax range. -@param a value to clip -@param amin minimum value of the clip range -@param amax maximum value of the clip range -@return clipped value - - - -Clip a float value into the amin-amax range. -@param a value to clip -@param amin minimum value of the clip range -@param amax maximum value of the clip range -@return clipped value - - - - Add a doubled value to another value with saturation at both stages. - - @param a first value - @param b value doubled and added to a - @return sum with signed saturation - - - - Add two signed 32-bit values with saturation. - - @param a one value - @param b another value - @return sum with signed saturation - - - -Clear high bits from an unsigned integer starting with specific bit position -@param a value to clip -@param p bit position to clip at -@return clipped value - - - -Clip a signed integer to an unsigned power of two range. -@param a value to clip -@param p bit position to clip at -@return clipped value - - - -Clip a signed integer into the -(2^p),(2^p-1) range. -@param a value to clip -@param p bit position to clip at -@return clipped value - - - -Clip a signed 64-bit integer value into the -2147483648,2147483647 range. -@param a value to clip -@return clipped value - - - -Clip a signed integer value into the -32768,32767 range. -@param a value to clip -@return clipped value - - - -Clip a signed integer value into the 0-65535 range. -@param a value to clip -@return clipped value - - - -Clip a signed integer value into the -128,127 range. -@param a value to clip -@return clipped value - - - -Clip a signed integer value into the 0-255 range. -@param a value to clip -@return clipped value - - - -Clip a signed 64bit integer value into the amin-amax range. -@param a value to clip -@param amin minimum value of the clip range -@param amax maximum value of the clip range -@return clipped value - - - -Clip a signed integer value into the amin-amax range. -@param a value to clip -@param amin minimum value of the clip range -@param amax maximum value of the clip range -@return clipped value - - - - @defgroup lavu_const Constants - @{ - - @defgroup lavu_enc Encoding specific - - @note those definition should move to avcodec - @{ - - @} - @defgroup lavu_time Timestamp specific - - FFmpeg internal timebase and timestamp definitions - - @{ - - @brief Undefined timestamp value - - Usually reported by demuxer that work on containers that do not provide - either pts or dts. - -Internal time base represented as integer - -Internal time base represented as fractional value - - @} - @} - @defgroup lavu_picture Image related - - AVPicture types, pixel formats and basic image planes manipulation. - - @{ - - - Return a single letter to describe the given picture type - pict_type. - - @param[in] pict_type the picture type @return a single character - representing the picture type, '?' if pict_type is unknown - - -Picture type of the frame. - - - -@} - -@addtogroup lavu_media Media Type -@brief Media Type - - -Return a string describing the media_type enum, NULL if media_type -is unknown. - - - Type of codec implemented by the hardware accelerator. - - See AVMEDIA_TYPE_xxx - - -General type of the encoded data. - - -Get the type of the given codec. - - - Find the "best" stream in the file. - The best stream is determined according to various heuristics as the most - likely to be what the user expects. - If the decoder parameter is non-NULL, av_find_best_stream will find the - default decoder for the stream's codec; streams for which no decoder can - be found are ignored. - - @param ic media file handle - @param type stream type: video, audio, subtitles, etc. - @param wanted_stream_nb user-requested stream number, - or -1 for automatic selection - @param related_stream try to find a stream related (eg. in the same - program) to this one, or -1 if none - @param decoder_ret if non-NULL, returns the decoder for the - selected stream - @param flags flags; none are currently defined - @return the non-negative stream number in case of success, - AVERROR_STREAM_NOT_FOUND if no stream with the requested type - could be found, - AVERROR_DECODER_NOT_FOUND if streams were found but no decoder - @note If av_find_best_stream returns successfully and decoder_ret is not - NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. - - - -Return the libavutil license. - - - -Return the libavutil build-time configuration. - - - -Return an informative version string. This usually is the actual release -version number or a git commit description. This string has no fixed format -and can change any time. It should never be parsed by code. - - - -@file -@ingroup libavc -Libavcodec external API header - -@file -@ingroup lavu -Convenience header that includes @ref lavu "libavutil"'s core. - - @mainpage - - @section ffmpeg_intro Introduction - - This document describes the usage of the different libraries - provided by FFmpeg. - - @li @ref libavc "libavcodec" encoding/decoding library - @li @ref lavfi "libavfilter" graph-based frame editing library - @li @ref libavf "libavformat" I/O and muxing/demuxing library - @li @ref lavd "libavdevice" special devices muxing/demuxing library - @li @ref lavu "libavutil" common utility library - @li @ref lswr "libswresample" audio resampling, format conversion and mixing - @li @ref lpp "libpostproc" post processing library - @li @ref libsws "libswscale" color conversion and scaling library - - @section ffmpeg_versioning Versioning and compatibility - - Each of the FFmpeg libraries contains a version.h header, which defines a - major, minor and micro version number with the - LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version - number is incremented with backward incompatible changes - e.g. removing - parts of the public API, reordering public struct members, etc. The minor - version number is incremented for backward compatible API changes or major - new features - e.g. adding a new public function or a new decoder. The micro - version number is incremented for smaller changes that a calling program - might still want to check for - e.g. changing behavior in a previously - unspecified situation. - - FFmpeg guarantees backward API and ABI compatibility for each library as long - as its major version number is unchanged. This means that no public symbols - will be removed or renamed. Types and names of the public struct members and - values of public macros and enums will remain the same (unless they were - explicitly declared as not part of the public API). Documented behavior will - not change. - - In other words, any correct program that works with a given FFmpeg snapshot - should work just as well without any changes with any later snapshot with the - same major versions. This applies to both rebuilding the program against new - FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program - links against. - - However, new public symbols may be added and new members may be appended to - public structs whose size is not part of public ABI (most public structs in - FFmpeg). New macros and enum values may be added. Behavior in undocumented - situations may change slightly (and be documented). All those are accompanied - by an entry in doc/APIchanges and incrementing either the minor or micro - version number. - - @defgroup lavu libavutil - Common code shared across all FFmpeg libraries. - - @note - libavutil is designed to be modular. In most cases, in order to use the - functions provided by one component of libavutil you must explicitly include - the specific header containing that feature. If you are only using - media-related components, you could simply include libavutil/avutil.h, which - brings in most of the "core" components. - - @{ - - @defgroup lavu_crypto Crypto and Hashing - - @{ - @} - - @defgroup lavu_math Mathematics - @{ - - @} - - @defgroup lavu_string String Manipulation - - @{ - - @} - - @defgroup lavu_mem Memory Management - - @{ - - @} - - @defgroup lavu_data Data Structures - @{ - - @} - - @defgroup lavu_audio Audio related - - @{ - - @} - - @defgroup lavu_error Error Codes - - @{ - - @} - - @defgroup lavu_log Logging Facility - - @{ - - @} - - @defgroup lavu_misc Other - - @{ - - @defgroup preproc_misc Preprocessor String Macros - - @{ - - @} - - @defgroup version_utils Library Version Macros - - @{ - - @} - -@addtogroup lavu_ver -@{ - -Return the LIBAVUTIL_VERSION_INT constant. - - - - - Enumeration of some video codecs from FFmpeg library, which are available for writing video files. - - - - -VP-9. - - - - -VP-8. - - - - -H.264/MPEG-4 Part 10. - - - - -H.265 - - - - -H.264/MPEG-4 Part 10. - - - - -FFmpeg's HuffYUV lossless codec. - - - - -FF video codec 1 lossless codec. - - - - -Raw (uncompressed) video. - - - - -MPEG-2 part 2. - - - - -Flash Video (FLV) / Sorenson Spark / Sorenson H.263. - - - - -H.263+ / H.263-1998 / H.263 version 2. - - - - -MPEG-4 part 2 Microsoft variant version 3. - - - - -MPEG-4 part 2 Microsoft variant version 2. - - - - - Windows Media Video 8. - - - - - Windows Media Video 7. - - - - - MPEG-4 part 2. - - - - - Default video codec, which FFmpeg library selects for the specified file format. - - - - -Close currently opened video file if any. - - - - -Read next video frame of the currently opened video file. - - Returns next video frame of the opened file or if end of -file was reached. The returned video frame has 24 bpp color format. - Thrown if no video file was open. - A error occurred while reading next video frame. See exception message. - - - -Open video file with the specified name. - - Video file name to open. - Cannot open video file with the specified name. - A error occurred while opening the video file. See exception message. - - - -Disposes the object and frees its resources. - - - - -Initializes a new instance of the class. - - - - -The property specifies if a video file is opened or not by this instance of the class. - - - - -Name of codec used for encoding the opened video file. - - Thrown if no video file was open. - - - -Bit rate of the video stream. - - Thrown if no video file was open. - - - -Number of video frames in the opened video file. - - - - - Warning: some video file formats may report different value -from the actual number of video frames in the file (subject to fix/investigate). - - - Thrown if no video file was open. - - - -Frame rate of the opened video file. - - Thrown if no video file was open. - - - -Frame height of the opened video file. - - Thrown if no video file was open. - - - -Frame width of the opened video file. - - Thrown if no video file was open. - - - -Object's finalizer. - - - - -Class for reading video files utilizing FFmpeg library. - - - The class allows to read video files using FFmpeg library. - - Make sure you have FFmpeg binaries (DLLs) in the output folder of your application in order -to use this class successfully. FFmpeg binaries can be found in Externals folder provided with AForge.NET -framework's distribution. - - Sample usage: - -// create instance of video reader -VideoFileReader reader = new VideoFileReader( ); -// open video file -reader.Open( "test.avi" ); -// check some of its attributes -Console.WriteLine( "width: " + reader.Width ); -Console.WriteLine( "height: " + reader.Height ); -Console.WriteLine( "fps: " + reader.FrameRate ); -Console.WriteLine( "codec: " + reader.CodecName ); -// read 100 video frames out of it -for ( int i = 0; i < 100; i++ ) -{ - Bitmap videoFrame = reader.ReadVideoFrame( ); - // process the frame somehow - // ... - - // dispose the frame when it is no longer required - videoFrame.Dispose( ); -} -reader.Close( ); - - - - - -Stop video source. - - - Stops video source aborting its thread. - - Since the method aborts background thread, its usage is highly not preferred -and should be done only if there are no other options. The correct way of stopping camera -is signaling it stop and then -waiting for background thread's completion. - - - - - -Wait for video source has stopped. - - Waits for source stopping after it was signalled to stop using - method. - - - -Signal video source to stop its work. - - Signals video source to stop its background thread, stop to -provide new frames and free resources. - - - -Start video source. - - Starts video source and return execution to caller. Video source -object creates background thread and notifies about new frames with the -help of event. - Video source is not specified. - - - -Initializes a new instance of the class. - - - - -Get frame interval from source or use manually specified. - - - The property specifies which frame rate to use for video playing. -If the property is set to , then video is played -with original frame rate, which is set in source video file. If the property is -set to , then custom frame rate is used, which is -calculated based on the manually specified frame interval. - Default value is set to . - - - - -Frame interval. - - - The property sets the interval in milliseconds between frames. If the property is -set to 100, then the desired frame rate will be 10 frames per second. - - Setting this property to 0 leads to no delay between video frames - frames -are read as fast as possible. - - - Setting this property has effect only when -is set to . - - Default value is set to 0. - - - - -State of the video source. - - Current state of video source object - running or not. - - - -Received bytes count. - - Number of bytes the video source provided from the moment of the last -access to the property. - - - - -Received frames count. - - Number of frames the video source provided from the moment of the last -access to the property. - - - - -Video source. - - - Video file name to play. - - - - -Video playing finished event. - - - This event is used to notify clients that the video playing has finished. - - - - -Video source error event. - - This event is used to notify clients about any type of errors occurred in -video source object, for example internal exceptions. - - - -New frame event. - - - Notifies clients about new available frame from video source. - - Since video source may have multiple clients, each client is responsible for -making a copy (cloning) of the passed video frame, because the video source disposes its -own original copy after notifying of clients. - - - - - -Video source for video files. - - - The video source provides access to video files using FFmpeg library. - - The class provides video only. Sound is not supported. - - - The class ignores presentation time of video frames while retrieving them from -video file. Instead it provides video frames according to the FPS rate of the video file -or the configured . - - - Make sure you have FFmpeg binaries (DLLs) in the output folder of your application in order -to use this class successfully. FFmpeg binaries can be found in Externals folder provided with AForge.NET -framework's distribution. - - Sample usage: - -// create video source -VideoFileSource videoSource = new VideoFileSource( fileName ); -// set NewFrame event handler -videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame ); -// start the video source -videoSource.Start( ); -// ... - -// New frame event handler, which is invoked on each new available video frame -private void video_NewFrame( object sender, NewFrameEventArgs eventArgs ) -{ - // get new frame - Bitmap bitmap = eventArgs.Frame; - // process the frame -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.dll b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.dll deleted file mode 100644 index 7374a2c308a46c75a1668b53413f98533a398b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151552 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 z 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 G@P7fr%l5GV diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.xml b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.xml deleted file mode 100644 index ad28b7f..0000000 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/Accord.xml +++ /dev/null @@ -1,10253 +0,0 @@ - - - - Accord - - - - - A delegate which is used by events notifying abount sent/received message. - - - Event sender. - Event arguments containing details about the transferred message. - - - - - Structure for representing a pair of coordinates of double type. - - - The structure is used to store a pair of floating point - coordinates with double precision. - - Sample usage: - - // assigning coordinates in the constructor - DoublePoint p1 = new DoublePoint( 10, 20 ); - // creating a point and assigning coordinates later - DoublePoint p2; - p2.X = 30; - p2.Y = 40; - // calculating distance between two points - double distance = p1.DistanceTo( p2 ); - - - - - - - X coordinate. - - - - - - Y coordinate. - - - - - - Initializes a new instance of the structure. - - - X axis coordinate. - Y axis coordinate. - - - - - Calculate Euclidean distance between two points. - - - Point to calculate distance to. - - Returns Euclidean distance between this point and - points. - - - - - Calculate squared Euclidean distance between two points. - - - Point to calculate distance to. - - Returns squared Euclidean distance between this point and - points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Equality operator - checks if two points have equal coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are equal. - - - - - Inequality operator - checks if two points have different coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are not equal. - - - - - Check if this instance of equal to the specified one. - - - Another point to check equalty to. - - Return if objects are equal. - - - - - Get hash code for this instance. - - - Returns the hash code for this instance. - - - - - Explicit conversion to . - - - Double precision point to convert to integer point. - - Returns new integer point which coordinates are explicitly converted - to integers from coordinates of the specified double precision point by - casting double values to integers value. - - - - - Explicit conversion to . - - - Double precision point to convert to single precision point. - - Returns new single precision point which coordinates are explicitly converted - to floats from coordinates of the specified double precision point by - casting double values to float value. - - - - - Rounds the double precision point. - - - Returns new integer point, which coordinates equal to whole numbers - nearest to the corresponding coordinates of the double precision point. - - - - - Get string representation of the class. - - - Returns string, which contains values of the point in readable form. - - - - - Calculate Euclidean norm of the vector comprised of the point's - coordinates - distance from (0, 0) in other words. - - - Returns point's distance from (0, 0) point. - - - - - Specifies that a class can be used to decode a particular file type. - - - - - - Gets or sets the file extension that this format decoder applies to (i.e. "wav"). - - - - - - Initializes a new instance of the class. - - - - - - Populates the dictionary with available decoders of a particular category by - inspecting types from all referenced assemblies. Note: calling this method - will force all referenced assemblies to be loaded into the current AppDomain. - - - The base type for the decoders. This should be an interface such as IImageDecoder or IAudioDecoder. - - The dictionary where the found decoders will be stored. - The extension we are interested in. - - - - - Specifies that an argument, in a method or function, - must be greater than zero. - - - - - - Gets or sets the type of the source. - - - - The type of the source. - - - - - - Initializes a new instance of the class. - - - - - - Specifies a serialization binder to be used whenever a class is - being deserialized by the framework. This can be used to ensure - binary compatibility when the framework code changes. - - - - - - The binder to be used for the class marked with this attribute. - - - - - - Initializes a new instance of the class. - - - The binder to be used to deserialize objects of this type. - - - - - Specifies a serialization surrogate to be used whenever a class is - being deserialized by the framework. This can be used to ensure - binary compatibility when the framework code changes. - - - - - - The binder to be used for the class marked with this attribute. - - - - - - Initializes a new instance of the class. - - - The surrogate selector to be used to deserialize objects of this type. - - - - - Tree node for binary trees. - - - The class type for the nodes of the tree. - - - - - Gets or sets the left subtree of this node. - - - - - - Gets or sets the right subtree of this node. - - - - - - Gets whether this node is a leaf (has no children). - - - - - - Indicates whether the current object is equal to another object of the same type. - - An object to compare with this object. - - true if the current object is equal to the parameter; otherwise, false. - - - - - - Gets or sets the collection of child nodes - under this node. - - - - - - Base class for binary trees. This class does not implement a binary search - tree, but can used to implement one. For binary search trees, please refer - to , KDTree and VPTree. - - - - - The class is a base class for other tree classes - such as , KDTree and VPTree. For examples on how to - use those classes, please see their respective documentation pages. - - - If you would like to implement your own binary tree that inherits from this class, - then you can do so as shown in the following example. First, make sure your custom - node class inherits from and passes itself as the generic - argument of : - - - - Now, once the tree node has been implemented, we can create a new - and explore the tree in different ways as shown below: - - - - The class type for the nodes of the tree. - - - - - Gets the root node of this tree. - - - - - - Returns an enumerator that iterates through the tree. - - - - An object - that can be used to iterate through the collection. - - - - - - Traverse the tree using a tree traversal - method. Can be iterated with a foreach loop. - - - The tree traversal method. Common methods are - available in the static class. - - An object which can be used to - traverse the tree using the chosen traversal method. - - - - - Returns an enumerator that iterates through the tree. - - - - An object that can be used to iterate through the collection. - - - - - - Common interface for tree nodes, such as and . - - - The type of the tree node. - - - - - - - - - Gets or sets the collection of child nodes - under this node. - - - - - - Gets whether this node is a leaf (has no children). - - - - - - Priority order for . - - - - - - Minimum order. In Minimum Priority Queues, items with smaller - priority numbers receive higher priority and are the ones that will - be dequeued first (i.e. similar to NICE number in UNIX systems). - - - - - - MAximum order. In Maximum Priority Queues, items with higher - priority numbers receive higher priority and are the ones that will - be dequeued first. - - - - - - Priority queue. - - - The values in the queue. - - - The code for this class has been based on the original "High-speed Priority Queue" - project originally developed by Daniel "Blue Raja" Pflughoeft. It was originally - shared under a free MIT license, as shown below: - - The MIT License (MIT) - - Copyright (c) 2013 Daniel "BlueRaja" Pflughoeft - https://github.com/BlueRaja/High-Speed-Priority-Queue-for-C-Sharp - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - - - - - - Initializes a new instance of the class. - - - The initial capacity for the queue. - The sort order for the queue. If set to , - items that have a smaller priority number are the next to be dequeued. If set to - , items with larger priority numbers are the ones - with higher priority and will be the next to be dequeued. Default is . - - New queue size cannot be smaller than 1. - - - - - Gets the number of nodes in the queue. This is an O(1) operation. - - - - - - Gets the current capacity of this queue. - - - - - - Gets or sets the ordering of this priority queue. - - - - - - Removes every node from the queue. This is an O(1) operation. - - - - - Returns whether the given node is in the queue. This is an O(1) operation. - - - - - - Enqueue a node to the priority queue. Lower values are placed in front. - Ties are broken by first-in-first-out. This is an O(log n) operation. - - - - - - Returns true if 'higher' has higher priority than 'lower', false otherwise. Note that - calling HasHigherPriority(node, node) (ie. both arguments the same node) will return false. - - - - - Removes the head of the queue (node with minimum priority; ties are broken by order - of insertion), and returns it. This is an O(log n) operation. - - - - - - Resize the queue so it can accept more nodes. All currently enqueued nodes are kept. - Attempting to decrease the queue size to a size too small to hold the existing nodes - results in undefined behavior. This is an O(n) operation. - - - - - - Returns the head of the queue, without removing it (use Dequeue() for that). - If the queue is empty, behavior is undefined. This is an O(1) operation. - - - - - - Gets a value indicating whether this instance is read only (returns false). - - - - Returns false, as instances of this class are not read only. - - - - - - This method must be called on a node every time its priority changes while it is in the queue. - Forgetting to call this method will result in a corrupted queue!. This is an O(log n) operation. - - - - - Removes a node from the queue. The node does not need to be the head of the - queue. This is an O(log n) operation. - - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - - - - - Returns an array containing the items in this list, - optionally in in priority order. - - - Whether to return the items in priority order. - - - - - Checks to make sure the queue is still in a valid state. - - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Represents the node of a priority queue. - - - The type for the values stored in the queue. - - - - - Initializes a new instance of the struct. - - - The value to store in the node. - A double value representing the priority for the node. - The index of the node in the priority queue. - The original index of the node in the priority queue, at time of first insertion. - - - - - Gets a double-value representing the - current priority for the node. - - - - - - Gets or sets the current value associated with this node. - - - - - - Gets the original position at which this node was inserted. - - - - - - Gets the current position of this node in its containing queue. - - - - - - Determines whether the specified , is equal to this instance. - - - The to compare with this instance. - - - true if the specified is equal to this instance; otherwise, false. - - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Gets a value indicating whether this node is empty (does not belong to any queue). - - - - - - Indicates whether the current object is equal to another object of the same type. - - An object to compare with this object. - - true if the current object is equal to the parameter; otherwise, false. - - - - - Compares the current object with another object of the same type. - - An object to compare with this object. - - A value that indicates the relative order of the objects being compared. The return value has the following meanings: Value Meaning Less than zero This object is less than the parameter.Zero This object is equal to . Greater than zero This object is greater than . - - - - - Implements the equals operator. - - - - - - Implements the not equals operator. - - - - - - Implements the greater than operator. - - - - - - Implements the less than operator. - - - - - - Gets an instance representing an empty node. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Ordered dictionary. - - - - This class provides a ordered dictionary implementation for C#/.NET. Unlike the rest - of the framework, this class is available under a MIT license, so please feel free to - re-use its source code in your own projects. - - - The types of the keys in the dictionary. - The type of values in the dictionary. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - - The initial number of elements that the can contain. - - - - - Initializes a new instance of the class. - - - The IEqualityComparer implementation to use when comparing keys, or null to use - the default EqualityComparer for the type of the key. - - - - - Initializes a new instance of the class. - - - The initial number of elements that the can contain. - The IEqualityComparer implementation to use when comparing keys, or null to use - the default EqualityComparer for the type of the key. - - - - - Initializes a new instance of the class. - - - The System.Collections.Generic.IDictionary`2 whose elements are copied to the - new . - The IEqualityComparer implementation to use when comparing keys, or null to use - the default EqualityComparer for the type of the key. - - - - - Gets the at the specified index. - - - The index. - - - - - Gets the at the specified index. - - - The index. - - - - - Gets or sets the with the specified key. - - - The key. - - - - - Gets an containing the keys of the . - - - The keys. - - - - - Gets an containing the values in the . - - - - - - Gets the number of elements contained in the . - - - - - - Gets a value indicating whether the is read-only. - - - true if this instance is read only; otherwise, false. - - - - - Adds an element with the provided key and value to the . - - - The object to use as the key of the element to add. - The object to use as the value of the element to add. - - - - - Adds an item to the . - - - The object to add to the . - - - - - Removes all items from the . - - - - - - Determines whether the contains a specific value. - - - The object to locate in the . - - true if is found in the ; otherwise, false. - - - - - Determines whether the contains an element with the specified key. - - - The key to locate in the . - - true if the contains an element with the key; otherwise, false. - - - - - Copies the elements of the to an , starting at a particular index. - - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - - - - Returns an enumerator that iterates through the collection. - - - An enumerator that can be used to iterate through the collection. - - - - - Removes the element with the specified key from the . - - - The key of the element to remove. - - true if the element is successfully removed; otherwise, false. This method also returns false if was not found in the original . - - - - - Removes the first occurrence of a specific object from the . - - - The object to remove from the . - - true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . - - - - - Gets the value associated with the specified key. - - - The key whose value to get. - When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the parameter. This parameter is passed uninitialized. - - true if the object that implements contains an element with the specified key; otherwise, false. - - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Base class for tree structures. - - - The class type for the nodes of the tree. - - - - - Gets the root node of this tree. - - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - - - - - Traverse the tree using a tree traversal - method. Can be iterated with a foreach loop. - - - The tree traversal method. Common methods are - available in the static class. - - An object which can be used to - traverse the tree using the chosen traversal method. - - - - - Returns an enumerator that iterates through the tree. - - - - An object that can be used to iterate through the collection. - - - - - - Tree node with arbitrary number of children. - - - The class type for the nodes of the tree. - - - - - Gets or sets the parent of this node. - - - - - - Gets or sets the index of this node in the - collection of children nodes of its parent. - - - - - - Gets or sets the collection of child nodes - under this node. - - - - - - Gets the next sibling of this node (the node - immediately next to it in its parent's collection). - - - - - - Gets the previous sibling of this node. - - - - - - Gets whether this node is a leaf (has no children). - - - - - - Initializes a new instance of the class. - - - The index of this node in the children collection of its parent node. - - - - - Tree enumeration method delegate. - - - The class type for the nodes of the tree. - - The binary tree to be traversed. - - An enumerator traversing the tree. - - - - - Tree enumeration method delegate. - - - The class type for the nodes of the tree. - - An enumerator traversing the tree. - - - - - Static class with tree traversal methods. - - - - - - Breadth-first tree traversal method. - - - - - - Pre-order tree traversal method. - - - - - - In-order tree traversal method. - - - - - - Post-order tree traversal method. - - - - - - Depth-first tree traversal method. - - - - - - Depth-first tree traversal method. - - - - - - Red-black tree specialized for key-based value retrieval. - - - - See . - - - The type of the key. - The type of the value. - - - - - Constructs a new using the default - for the key type . - - - - - - Constructs a new using - the provided implementation. - - - - The element comparer to be used to order elements in the tree. - - - - - Constructs a new using the default - for the key type . - - - - Pass true to allow duplicate elements - in the tree; false otherwise. - - - - - Constructs a new using - the provided implementation. - - - - The element comparer to be used to order elements in the tree. - - Pass true to allow duplicate elements - in the tree; false otherwise. - - - - - Vanilla key-based comparer for . - - - The key type in the key-value pair. - The value type in the key-value pair. - - - - - Initializes a new instance of the class. - - - The comparer to be used to compare keys. - - - - - Initializes a new instance of the class. - - - - - - Compares two objects and returns a value indicating whether - one is less than, equal to, or greater than the other. - - - The first object to compare. - The second object to compare. - - - - - Compares two objects and returns a value indicating whether - one is less than, equal to, or greater than the other. - - - The first object to compare. - The second object to compare. - - - - - Returns a default sort order comparer for the - key-value pair specified by the generic argument. - - - - - - Two-way dictionary for efficient lookups by both key and value. This - can be used to represent a one-to-one relation among two object types. - - - The type of right keys in the dictionary. - The type of left keys in the dictionary. - - - - - Initializes a new instance of the class - that is empty, has the default initial capacity, and uses the default equality comparer - for the key type. - - - - - - Initializes a new instance of the class - that is empty, has the specified initial capacity, and uses the default equality comparer - for the key type. - - - The initial number of elements that this dictionary can contain. - - - - - Initializes a new instance of the class - that contains elements copied from the specified dictionary and uses the default equality - comparer for the key type. - - - The dictionary whose elements are copied to the new . - - - - - Gets the reverse dictionary that maps values back to keys. - - - - - - Gets the number of elements contained in this . - - - - - - Gets an object that can be used to synchronize access to the . - - - - - - Gets a value indicating whether access to the is synchronized (thread safe). - - - - - - Gets a value indicating whether the object has a fixed size. - - - - - - Gets a value indicating whether the is read-only. - - - - - - Gets or sets the element with the specified key. - - - The left key. - - - - - Gets or sets the element with the specified key. - - - The left key. - - - - - Gets an containing the keys of the . - - - - - - Gets an containing the keys of the . - - - - - - Gets an containing the keys of the . - - - - - - Gets an containing the values in the . - - - - - - Gets an containing the values in the . - - - - - - Gets an containing the values in the . - - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Returns an object for the object. - - - - An object for the object. - - - - - - Adds an element with the provided key and value to the . - - - The object to use as the key of the element to add. - The object to use as the value of the element to add. - - - - - Adds an element with the provided key and value to the object. - - - The to use as the key of the element to add. - The to use as the value of the element to add. - - - - - Adds an item to the . - - - The object to add to the . - - - - - Determines whether the contains an element with the specified key. - - - The key to locate in the . - - - true if the contains an element with the key; otherwise, false. - - - - - - Determines whether the contains a specific value. - - - The object to locate in the . - - - true if is found in the ; otherwise, false. - - - - - - Gets the value associated with the specified key. - - - The key whose value to get. - When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the parameter. This parameter is passed uninitialized. - - - true if the object that implements contains an element with the specified key; otherwise, false. - - - - - - Removes the element with the specified key from the . - - - The key of the element to remove. - - - true if the element is successfully removed; otherwise, false. This method also returns false if was not found in the original . - - - - - - Removes the element with the specified key from the object. - - - The key of the element to remove. - - - - - Removes the first occurrence of a specific object from the . - - - The object to remove from the . - - - true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . - - - - - - Determines whether the object contains an element with the specified key. - - - The key to locate in the object. - - - true if the contains an element with the key; otherwise, false. - - - - - - Removes all items from the . - - - - - - Read-only keyed collection wrapper. - - - - This collection implements a read-only keyed collection. Read-only collections - can not be changed once they are created and are useful for presenting information - to the user without allowing alteration. A keyed collection is a collection whose - elements can be retrieved by key or by index. - - - The types of the keys in the dictionary. - The type of values in the dictionary. - - - - - Initializes a new instance of the - class. - - - - - - When implemented in a derived class, extracts the key from the specified element. - - - The element from which to extract the key. - - The key for the specified element. - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - - - - - Determines whether the contains an element with the specified key. - - - The key to locate in the . - - - true if the contains an element with the key; otherwise, false. - - - - - - Gets an containing the keys of the . - - - An containing the keys of the object that implements . - - - - - Gets an containing the values in the . - - - An containing the values in the object that implements . - - - - - Gets the value associated with the specified key. - - - The key whose value to get. - When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the parameter. This parameter is passed uninitialized. - - - true if the object that implements contains an element with the specified key; otherwise, false. - - - - - - Gets or sets the element with the specified key. - - - The key. - - This collection is read-only - - - - - Determines whether the contains a specific value. - - - The object to locate in the . - - - true if is found in the ; otherwise, false. - - - - - - Copies the elements of the ICollection to an Array, starting at a particular Array index. - - - The one-dimensional Array that is the destination of the elements copied from ICollection. The Array must have zero-based indexing. - The zero-based index in array at which copying begins. - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - This method is not supported, as this is a read-only collection. - - - This collection is read-only - - - - - Not supported. - - - This collection is read-only - - - - - Returns true. - - - - - - Sorted dictionary based on a red-black tree. - - - The type of keys in the collection. - The type of the values in the collection - - - - - Creates a new - using the default comparer for the key - type. - - - - - - Creates a new . - - - - - - Adds an element with the provided key and value to the . - - - The object to use as the key of the element to add. - The object to use as the value of the element to add. - - - - - Adds an element with the provided key and value to the dictionary. - - - - The key-value pair - containing the desired key and the value to be added. - - - - - - Removes the element with the specified key from the dictionary. - - - The key of the element to remove. - - - true if the element is successfully removed; otherwise, false. - This method also returns false if was not found - in the original dictionary. - - - - - - Removes the first occurrence of a specific object from the dictionary. - - - The object to remove from the dictionary. - - - true if was successfully removed from - the dictionary; otherwise, false. This method also returns false if - is not found in the original dictionary. - - - - - - Determines whether the dictionary contains an element with the specified key. - - - The key to locate in the dictionary. - - - true if the dictionary contains an element with the key; otherwise, false. - - - - - - Determines whether the dictionary contains a specific value. - - - The object to locate in the dictionary. - - - true if is found in the dictionary; otherwise, false. - - - - - - Gets an - containing the keys of the . - - - - - - Gets an - containing the values of the . - - - - - - Gets the value associated with the specified key. - - - The key whose value to get. - - When this method returns, the value associated with the specified key, - if the key is found; otherwise, the default value for the type of the - parameter. This parameter is passed - uninitialized. - - - - true if the dictionary contains an element with the specified key; otherwise, false. - - - - - - Gets or sets the element with the specified key. - - - The key. - - The requested key was not found in the present tree. - - - - - Removes all elements from the dictionary. - - - - - - Copies the elements of this dictionary to an array, starting at a particular array index. - - - - The one-dimensional Array that is the destination of the elements - copied from ICollection. The array must have zero-based indexing. - The zero-based index in array at which copying begins. - - - - - Gets the number of elements on this dictionary. - - - - - - Gets a value indicating whether this instance is read only. - - - - Returns false. - - - - - - Returns an enumerator that iterates through the dictionary. - - - - An - object that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through the dictionary. - - - - An object that can be used to iterate through the collection. - - - - - - Gets the pair with the minimum key stored in the dictionary. - - - - The with - the minimum key present in the dictionary. - - - - - - Gets the pair with the maximum key stored in the dictionary. - - - - The with - the minimum key present in the dictionary. - - - - - - Gets the next key-value pair in the dictionary whose key is - the immediate ancestor of the given . - - - The key whose ancestor must be found. - - - The key-value pair whose key is the immediate ancestor of . - - - - - - Gets the next key-value pair in the dictionary whose key is - the immediate ancestor of the given . - - - The key whose ancestor must be found. - - The key-value pair whose key is the immediate ancestor of - , returned as an out parameter. - - - - True if there was an ancestor in the dictionary; false otherwise. - - - - - - Gets the next key-value pair in the dictionary whose key is - the immediate successor to the given . - - - The key whose successor must be found. - - - The key-value pair whose key is the immediate successor of . - - - - - - Gets the next key-value pair in the dictionary whose key is - the immediate successor to the given . - - - The key whose successor must be found. - - The key-value pair whose key is the immediate sucessor of - , returned as an out parameter. - - - - True if there was a successor in the dictionary; false otherwise. - - - - - - Possible node colors for s. - - - - - - Red node. - - - - - - Black node. - - - - - - node. - - - The type of the value to be stored. - - - - - Constructs a new empty node. - - - - - - Constructs a node containing the given . - - - - - - Gets or sets a reference to this node's parent node. - - - - - - Gets or sets this node's color. - - - - - - Gets or sets the value associated with this node. - - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - node. - - - The type of the key that identifies the value. - The type of the values stored in this node. - - - - - Constructs a new empty node. - - - - - - Constructs a new node containing the given - key and value pair. - - - - - - Constructs a new node containing the given - key and value pair. - - - - - - Red-black tree. - - - - - A red–black tree is a data structure which is a type of self-balancing binary - search tree. Balance is preserved by painting each node of the tree with one of - two colors (typically called 'red' and 'black') in a way that satisfies certain - properties, which collectively constrain how unbalanced the tree can become in - the worst case. When the tree is modified, the new tree is subsequently rearranged - and repainted to restore the coloring properties. The properties are designed in - such a way that this rearranging and recoloring can be performed efficiently. - - - The balancing of the tree is not perfect but it is good enough to allow it to - guarantee searching in O(log n) time, where n is the total number of elements - in the tree. The insertion and deletion operations, along with the tree rearrangement - and recoloring, are also performed in O(log n) time. - - - Tracking the color of each node requires only 1 bit of information per node because - there are only two colors. The tree does not contain any other data specific to its - being a red–black tree so its memory footprint is almost identical to a classic - (uncolored) binary search tree. - - - References: - - - Steven G. Johnson, The NLopt nonlinear-optimization package, - http://ab-initio.mit.edu/nlopt - - Wikipedia, The Free Encyclopedia. Red-black tree. Available on: - http://en.wikipedia.org/wiki/Red%E2%80%93black_tree - - - - The type of the value to be stored. - - - - - Constructs a new using the - default for type . - - - - - - Constructs a new using - the provided implementation. - - - - The element comparer to be used to order elements in the tree. - - - - - Constructs a new using the - default for type . - - - - Pass true to allow duplicate elements - in the tree; false otherwise. - - - - - Constructs a new using - the provided implementation. - - - - The element comparer to be used to order elements in the tree. - - Pass true to allow duplicate elements - in the tree; false otherwise. - - - - - Gets the number of nodes contained in this red-black tree. - - - - - - Gets the for this red black tree. - - - - - - Removes all nodes from the tree. - - - - - - Adds a new item to the tree. If the element already - belongs to this tree, no new element will be added. - - - The item to be added. - - The node containing the added item. - - - - - Adds a new item to the tree. If the element already - belongs to this tree, no new element will be added. - - - The node to be added to the tree. - - - - - Attempts to remove an element from the tree. - - - The item to be removed. - - - True if the element was in the tree and was removed; false otherwise. - - - - - - Removes a node from the tree. - - - The node to be removed. - - - True if the element was in the tree and was removed; false otherwise. - - - - - - Removes a node from the tree. - - - The key of the node to be removed. - - - A reference to the removed node, if the item was in the tree; otherwise, null. - - - - - - Removes a node from the tree. - - - The node to be removed. - - - A reference to the removed node. - - - - - - Copies the nodes of this tree to an array, starting at a - particular array index. - - - - The one-dimensional array that is the destination of the elements - copied from this tree. The array must have zero-based indexing. - - - - The zero-based index in at which copying begins. - - - - - - Copies the elements of this tree to an array, starting at a - particular array index. - - - - The one-dimensional array that is the destination of the elements - copied from this tree. The array must have zero-based indexing. - - - - The zero-based index in at which copying begins. - - - - - - Gets a value indicating whether this instance is read only. - In a , this returns false. - - - - Returns false. - - - - - - Returns an enumerator that iterates through this tree in-order. - - - - An object that can - be used to traverse through this tree using in-order traversal. - - - - - - Returns an enumerator that iterates through this tree in-order. - - - - An object that can - be used to traverse through this tree using in-order traversal. - - - - - - Determines whether this tree contains the specified item. - - - The item to be looked for. - - - true if the element was found inside the tree; otherwise, false. - - - - - - Determines whether this tree contains the specified item. - - - The item to be looked for. - - - true if the element was found inside the tree; otherwise, false. - - - - - - Attempts to find a node that contains the specified key. - - - The key whose node is to be found. - - - A containing the desired - if it is present in the dictionary; otherwise, returns null. - - - - - - Finds the greatest point in the subtree rooted at - that is less than or equal to (<=) k. In other words, finds either - k or a number immediately below it. - - - The subtree where search will take place. - A reference value to be found. - - - The node containing the given value or - its immediately smaller neighboring number present in the tree. - - - - - - Finds the greatest point in the - tree that is less than or equal to (<=) k. - In other words, finds either k or a number immediately - below it. - - - A reference for the value to be found. - - - The node containing the given value or - its immediately smaller neighboring number present in the tree. - - - - - - Finds the greatest point in the subtree rooted at - that is less than (<) k. In other words, finds a number stored in - the tree that is immediately below k. - - - The subtree where search will take place. - A reference value to be found. - - - The node containing an element that is immediately below . - - - - - - Finds the greatest point in the - tree that is less than (<) k. In other words, finds - a number stored in the tree that is immediately below k. - - - A reference value to be found. - - - The node containing an element that is immediately below . - - - - - - Finds the smallest point in the subtree rooted at - that is greater than (>) k. In other words, finds a number stored in - the tree that is immediately above k. - - - The subtree where search will take place. - A reference value to be found. - - - The node containing an element that is immediately below . - - - - - - Finds the smallest point in the in the - tree that is greater than (>) k. In other words, finds a - number stored in the tree that is immediately above k. - - - A reference value to be found. - - - The node containing an element that is immediately below . - - - - - - Finds the minimum element stored in the tree. - - - - The that - holds the minimum element in the tree. - - - - - - Finds the maximum element stored in the tree. - - - - The that - holds the maximum element in the tree. - - - - - - Gets the node that contains the next in-order value coming - after the value contained in the given . - - - The current node. - - - The node that contains a value that is immediately greater than - the current value contained in the given . - - - - - - Gets the node that contains the previous in-order value coming - before the value contained in the given . - - - The current node. - - - The node that contains a value that is immediately less than - the current value contained in the given . - - - - - - Forces a re-balance of the tree by removing and inserting the same node. - - - The node to be re-balanced. - - The same node, or a new one if it had to be recreated. - - - - - Set of methods necessary to make Accord.NET work in .NET 3.5 and .NET 4.0. - Those methods are not available in other versions of the framework and should - not be called by user code. - - - - - - Gets the 32-bit system path. - - - - - Gets the 64-bit system path. - - - - - Gets wether the process (not the system) is running in 64-bits. - - - - - Minimum CancellationToken implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets or sets a value indicating whether this instance can be cancelled. - - - - - - Gets or sets a value indicating whether cancellation has been requested. - - - - - - Gets an empty token. - - - - - - Complex number wrapper class. - - - The class encapsulates complex number and provides - set of different operators to manipulate it, like adding, subtraction, - multiplication, etc. - - Sample usage: - - // define two complex numbers - Complex c1 = new Complex( 3, 9 ); - Complex c2 = new Complex( 8, 3 ); - // sum - Complex s1 = Complex.Add( c1, c2 ); - Complex s2 = c1 + c2; - Complex s3 = c1 + 5; - // difference - Complex d1 = Complex.Subtract( c1, c2 ); - Complex d2 = c1 - c2; - Complex d3 = c1 - 2; - - - - - - - Real part of the complex number. - - - - - Imaginary part of the complex number. - - - - - A double-precision complex number that represents zero. - - - - - A double-precision complex number that represents one. - - - - - A double-precision complex number that represents the squere root of (-1). - - - - - Magnitude value of the complex number. - - - Magnitude of the complex number, which equals to Sqrt( Re * Re + Im * Im ). - - - - - Phase value of the complex number. - - - Phase of the complex number, which equals to Atan( Im / Re ). - - - - - Squared magnitude value of the complex number. - - - - - Initializes a new instance of the class. - - - Real part. - Imaginary part. - - - - - Initializes a new instance of the class. - - - Source complex number. - - - - - Adds two complex numbers. - - - A instance. - A instance. - - Returns new instance containing the sum of specified - complex numbers. - - - - - Adds scalar value to a complex number. - - - A instance. - A scalar value. - - Returns new instance containing the sum of specified - complex number and scalar value. - - - - - Adds two complex numbers and puts the result into the third complex number. - - - A instance. - A instance. - A instance to hold the result. - - - - - Adds scalar value to a complex number and puts the result into another complex number. - - - A instance. - A scalar value. - A instance to hold the result. - - - - - Subtracts one complex number from another. - - - A instance to subtract from. - A instance to be subtracted. - - Returns new instance containing the subtraction result (a - b). - - - - - Subtracts a scalar from a complex number. - - - A instance to subtract from. - A scalar value to be subtracted. - - Returns new instance containing the subtraction result (a - s). - - - - - Subtracts a complex number from a scalar value. - - - A scalar value to subtract from. - A instance to be subtracted. - - Returns new instance containing the subtraction result (s - a). - - - - - Subtracts one complex number from another and puts the result in the third complex number. - - - A instance to subtract from. - A instance to be subtracted. - A instance to hold the result. - - - - - Subtracts a scalar value from a complex number and puts the result into another complex number. - - - A instance to subtract from. - A scalar value to be subtracted. - A instance to hold the result. - - - - - Subtracts a complex number from a scalar value and puts the result into another complex number. - - - A scalar value to subtract from. - A instance to be subtracted. - A instance to hold the result. - - - - - Multiplies two complex numbers. - - - A instance. - A instance. - - Returns new instance containing the result of multiplication. - - - - - Multiplies a complex number by a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the result of multiplication. - - - - - Multiplies two complex numbers and puts the result in a third complex number. - - - A instance. - A instance. - A instance to hold the result. - - - - - Multiplies a complex number by a scalar value and puts the result into another complex number. - - - A instance. - A scalar value. - A instance to hold the result. - - - - - Divides one complex number by another complex number. - - - A instance. - A instance. - - Returns new instance containing the result. - - Can not divide by zero. - - - - - Divides a complex number by a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the result. - - Can not divide by zero. - - - - - Divides a scalar value by a complex number. - - - A scalar value. - A instance. - - Returns new instance containing the result. - - Can not divide by zero. - - - - - Divides one complex number by another complex number and puts the result in a third complex number. - - - A instance. - A instance. - A instance to hold the result. - - Can not divide by zero. - - - - - Divides a complex number by a scalar value and puts the result into another complex number. - - - A instance. - A scalar value. - A instance to hold the result. - - Can not divide by zero. - - - - - Divides a scalar value by a complex number and puts the result into another complex number. - - - A instance. - A scalar value. - A instance to hold the result. - - Can not divide by zero. - - - - - Negates a complex number. - - - A instance. - - Returns new instance containing the negated values. - - - - - Tests whether two complex numbers are approximately equal using default tolerance value. - - - A instance. - A instance. - - Return if the two vectors are approximately equal or otherwise. - - The default tolerance value, which is used for the test, equals to 8.8817841970012523233891E-16. - - - - - Tests whether two complex numbers are approximately equal given a tolerance value. - - - A instance. - A instance. - The tolerance value used to test approximate equality. - - The default tolerance value, which is used for the test, equals to 8.8817841970012523233891E-16. - - - - - Converts the specified string to its equivalent. - - - A string representation of a complex number. - - Returns new instance that represents the complex number - specified by the parameter. - - String representation of the complex number is not correctly formatted. - - - - - Try to convert the specified string to its equivalent. - - - A string representation of a complex number. - - instance to output the result to. - - Returns boolean value that indicates if the parse was successful or not. - - - - - Calculates square root of a complex number. - - - A instance. - - Returns new instance containing the square root of the specified - complex number. - - - - - Calculates natural (base e) logarithm of a complex number. - - - A instance. - - Returns new instance containing the natural logarithm of the specified - complex number. - - - - - Calculates exponent (e raised to the specified power) of a complex number. - - - A instance. - - Returns new instance containing the exponent of the specified - complex number. - - - - - Calculates Sine value of the complex number. - - - A instance. - - Returns new instance containing the Sine value of the specified - complex number. - - - - - Calculates Cosine value of the complex number. - - - A instance. - - Returns new instance containing the Cosine value of the specified - complex number. - - - - - Calculates Tangent value of the complex number. - - - A instance. - - Returns new instance containing the Tangent value of the specified - complex number. - - - - - Returns the hashcode for this instance. - - - A 32-bit signed integer hash code. - - - - Returns a value indicating whether this instance is equal to the specified object. - - - An object to compare to this instance. - - Returns if is a and has the same values as this instance or otherwise. - - - - - Returns a string representation of this object. - - - A string representation of this object. - - - - - Tests whether two specified complex numbers are equal. - - - The left-hand complex number. - The right-hand complex number. - - Returns if the two complex numbers are equal or otherwise. - - - - - Tests whether two specified complex numbers are not equal. - - - The left-hand complex number. - The right-hand complex number. - - Returns if the two complex numbers are not equal or otherwise. - - - - - Negates the complex number. - - - A instance. - - Returns new instance containing the negated values. - - - - - Adds two complex numbers. - - - A instance. - A instance. - - Returns new instance containing the sum. - - - - - Adds a complex number and a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the sum. - - - - - Adds a complex number and a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the sum. - - - - - Subtracts one complex number from another complex number. - - - A instance. - A instance. - - Returns new instance containing the difference. - - - - - Subtracts a scalar value from a complex number. - - - A instance. - A scalar value. - - Returns new instance containing the difference. - - - - - Subtracts a complex number from a scalar value. - - - A scalar value. - A instance. - - Returns new instance containing the difference. - - - - - Multiplies two complex numbers. - - - A instance. - A instance. - - Returns new instance containing the result of multiplication. - - - - - Multiplies a complex number by a scalar value. - - - A scalar value. - A instance. - - Returns new instance containing the result of multiplication. - - - - - Multiplies a complex number by a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the result of multiplication. - - - - - Divides one complex number by another complex number. - - - A instance. - A instance. - - A new Complex instance containing the result. - Returns new instance containing the result of division. - - - - - Divides a complex number by a scalar value. - - - A instance. - A scalar value. - - Returns new instance containing the result of division. - - - - - Divides a scalar value by a complex number. - - - A instance. - A scalar value. - - Returns new instance containing the result of division. - - - - - Converts from a single-precision real number to a complex number. - - - Single-precision real number to convert to complex number. - - Returns new instance containing complex number with - real part initialized to the specified value. - - - - - Converts from a double-precision real number to a complex number. - - - Double-precision real number to convert to complex number. - - Returns new instance containing complex number with - real part initialized to the specified value. - - - - - Creates an exact copy of this object. - - - Returns clone of the complex number. - - - - - Creates an exact copy of this object. - - - Returns clone of the complex number. - - - - - Populates a with the data needed to serialize the target object. - - - The to populate with data. - The destination (see ) for this serialization. - - - - - Minimum Lazy implementation for .NET 3.5 to make - Accord.NET work. This is not a complete implementation. - - - - - - Initializes a new instance of the class. - - - - - - Adds the specified item. - - - - - - Counts this instance. - - - - - - Gets an object that can be used to synchronize access to the collection. - - - - - - Returns true. - - - - - - Gets the enumerator. - - - - - - Gets the enumerator. - - - - - - Copies the elements in the list to an array. - - - - - Copies all elements to an array. - - - - - - Minimum AggregateException implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exceptions that are the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The - that holds the serialized object data about the exception being thrown. - The - that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Minimum IReadOnlyCollection implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets the number of elements in the collection. - - - - - - Minimum IReadOnlyDictionary implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets the keys. - - - - - - Gets the values. - - - - - - Gets the value associated with the specified key. - - - - - - Determines whether the dictionary contains the specified key. - - - - - - Tries to get a value. - - - - - - Minimum ISet implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - The set. - - - - - Performs an implicit conversion from to ISet. - - - The set. - - - The result of the conversion. - - - - - - Performs an implicit conversion from ISet to . - - - The set. - - - The result of the conversion. - - - - - - Adds the specified item. - - - The item. - - - - - Modifies the current object to contain all elements - that are present in itself, the specified collection, or both. - - - - - - Clears this instance. - - - - - - Determines whether this instance contains the specified item. - - - The item. - - - true if the set contains the specified item; otherwise, false. - - - - - - Copies the elements of this set to an array. - - - The array. - Index of the array. - - - - - Gets the number of elements in this set. - - - - - - Gets a value indicating whether this instance is read only. - - - - true if this instance is read only; otherwise, false. - - - - - - Removes the specified item. - - - The item. - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Determines whether this set contains the - exact same elements as another set. - - - The other set. - - - - - Determines whether this instance is a subset of the specified set. - - - - - Minimum Lazy implementation for .NET 3.5 to make - Accord.NET work. This is not a complete implementation. - - - - - - Initializes a new instance of the class. - - - A function which creates the instance value on first access. - - - - - Initializes a new instance of the class. - - - A function which creates the instance value on first access. - Needs to be true. - - - - - Gets the lazily initialized value for this instance. - - - - - - Gets a value that indicates whether a value has been created for this Lazy{T} instance. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Minimum Parallel Tasks implementation for .NET 3.5 and .NET Standard 1.4 to make - Accord.NET work. This is nowhere a functional implementation and exists only to - provide compile-time compatibility with previous framework versions. - - - - - - Loop body delegate. - - - - - - Loop body delegate. - - - - - - Loop body delegate. - - - - - - Parallel for mock-up. The provided - code will NOT be run in parallel. - - - - - - Parallel foreach mock-up. The provided - code will NOT be run in parallel. - - - - - - Parallel for mock-up. The provided - code will NOT be run in parallel. - - - - - - Parallel for mock-up. The provided - code will NOT be run in parallel. - - - - - - Parallel for mock-up. The provided - code will NOT be run in parallel. - - - - - - Minimum Parallel Tasks implementation for .NET 3.5 to make - Accord.NET work. This is nowhere a functional implementation - and exists only to provide compile-time compatibility with - previous framework versions. - - - - - - Does not have any effect in .NET 3.5 or .NET Standard 1.4. - - - - - - Does not have any effect in .NET 3.5 or .NET Standard 1.4. - - - - - - Minimum SortedSet implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets the maximum. - - - The maximum. - - - - - Gets the minimum. - - - The minimum. - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - - - - Adds the specified value. - - - The value. - - - - - Removes the specified value. - - The value. - - - - Modifies this set to contain all elements both sets. - - - - - Removes the given elements from this set. - - - - - Clears this instance. - - - - - Gets the enumerator. - - - - - - Minimum SpinLock implementation for .NET 3.5 to make - Accord.NET work. This is not a complete implementation. - - - - - - Gets whether the lock is currently held by any thread. - - - - - - Acquires the lock. - - - - - - Releases the lock. - - - - - - Minimum ThreadLocal implementation for .NET 3.5 to make - Accord.NET work. This is not a complete implementation. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - - - - Releases unmanaged resources and performs other cleanup operations before the - is reclaimed by garbage collection. - - - - - - Gets or sets the value. - - - - - - Performs application-defined tasks associated with - freeing, releasing, or resetting unmanaged resources. - - - - - - Releases unmanaged and - optionally - managed resources - - - true to release both managed and unmanaged - resources; false to release only unmanaged resources. - - - - - Minimum Tuple implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets or sets the item 1. - - - - - - Gets or sets the item 2. - - - - - - Initializes a new instance of the class. - - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - The parameter is null. - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Minimum Tuple implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Gets or sets the item 1. - - - - - Gets or sets the item 2. - - - - - - Gets or sets the item 3. - - - - - - Initializes a new instance of the class. - - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - The parameter is null. - - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Minimum Tuple implementation for .NET 3.5 to - make Accord.NET work. This is not a complete implementation. - - - - - - Creates the specified tuple. - - - - - - Creates the specified tuple. - - - - - - Read-only dictionary wrapper. - - - - This collection implements a read-only dictionary. Read-only collections - can not be changed once they are created and are useful for presenting - information to the user without allowing alteration. - - - The types of the keys in the dictionary. - The type of values in the dictionary. - - - - - Constructs a new read-only wrapper around a . - - - The dictionary to wrap. - - - - - Does nothing, as this collection is read-only. - - - - - - Determines whether the - contains an element with the specified key. - - - The key to locate in the . - - - true if the contains - an element with the key; otherwise, false. - - - - - - Gets an containing the keys of - the . - - - The keys. - - - - - Does nothing, as this collection is read-only. - - - - - - Gets the value associated with the specified key. - - - The key whose value to get. - - - When this method returns, the value associated with the specified key, if - the key is found; otherwise, the default value for the type of the value - parameter. This parameter is passed uninitialized. - - - true if the - contains an element with the specified key; otherwise, false. - - - - - Gets an containing the values in - the . - - - - An containing the - values in the . - - - - - - Gets the element with the specified key. Set is not supported. - - - The element with the specified key. - - - - - Does nothing, as this collection is read-only. - - - - - - Does nothing, as this collection is read-only. - - - - - - Determines whether the - contains an element with the specified key. - - - The key to locate in the . - - - true if the - contains an element with the key; otherwise, false. - - - - - - Copies the entire to a - compatible one-dimensional Array, starting at the specified index of - the target array. - - - - The one-dimensional Array that is the destination - of the elements copied from . The - Array must have zero-based indexing. - - - The zero-based index in array at which copying begins. - - - - - Gets the number of elements contained in this - . - - - - - - Always returns true. - - - - - - Does nothing, as this collection is read-only. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Temporary internal framework class for handling debug assertions - while inside unit tests. Will be removed in a future release. - - - - - - Throws an exception if a condition is false. - - - - - - Common interface for feature descriptors. - - - - - - Gets or sets the descriptor vector associated with this point. - - - - - - Common interface for feature extractors. - - - - - - An extension of providing - atomic operations such as Add and Increment to floating point numbers. - - - - - - Adds two 32-bit floating point values and replaces the first - double value with their sum, as an atomic operation. - - - The first variable to be added. - The second variable to be added. - - The updated value of the first variable. - - - - - Increments a specified variable and stores the result, as an atomic operation. - - - The variable to be incremented. - - The updated value of the variable. - - - - - Common interface for classification models. Classification models - learn how to produce a class-label (or a set of class labels) y - from an input vector x. - - - - - - Gets or sets the number of classes expected and recognized by the classifier. - - - - - - Common interface for classification models. Classification models - learn how to produce a class-label (or a set of class labels) y - from an input vector x. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Computes a class-label decision for a given . - - - The input vector that should be classified into - one of the possible classes. - - A class-label that best described according - to this classifier. - - - - - Computes class-label decisions for each vector in the given . - - - The input vectors that should be classified into - one of the possible classes. - - The class-labels that best describe each - vectors according to this classifier. - - - - - Computes class-label decisions for each vector in the given . - - - The input vectors that should be classified into - one of the possible classes. - The location where to store the class-labels. - - The class-labels that best describe each - vectors according to this classifier. - - - - - Common interface for multi-class models. Classification models - learn how to produce a class-label y from an input vector x. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Common interface for multi-class models. Classification models - learn how to produce a class-label y from an input vector x. - - - The data type for the input data. Default is double[]. - - - - - Computes a class-label decision for a given . - - - The input vector that should be classified into - one of the possible classes. - - A class-label that best described according - to this classifier. - - - - - Computes class-label decisions for each vector in the given . - - - The input vectors that should be classified into - one of the possible classes. - - The class-labels that best describe each - vectors according to this classifier. - - - - - Views this instance as a multi-label classifier, - giving access to more advanced methods, such as the prediction - of one-hot vectors. - - - This instance seen as an . - - - - - Common interface for multi-class models. Classification models - learn how to produce a class-label y from an input vector x. - - - - - - Common interface for score-based multi-class classifiers. A multi-class - classifier can predict to which class an instance belongs based - on a decision score (a real number) that measures the association of the - input with each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Predicts a class label for each input vector, returning a - numerical score measuring the strength of association of the - input vector to the most strongly related class. - - - A set of input vectors. - The class labels predicted for each input - vector, as predicted by the classifier. - - - - - Predicts a class label for each input vector, returning a - numerical score measuring the strength of association of the - input vector to the most strongly related class. - - - A set of input vectors. - The class labels predicted for each input - vector, as predicted by the classifier. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for score-based multi-class classifiers. A multi-class - classifier can predict to which class an instance belongs based - on a decision score (a real number) that measures the association of the - input with each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Predicts a class label for the input vector, returning a - numerical score measuring the strength of association of the - input vector to its most strongly related class. - - - The input vector. - The class label predicted by the classifier. - - - - - Common interface for score-based multi-class classifiers. A multi-class - classifier can predict to which class an instance belongs based - on a decision score (a real number) that measures the association of the - input with each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Common interface for score-based multi-class classifiers. A multi-class - classifier can predict to which class an instance belongs based - on a decision score (a real number) that measures the association of the - input with each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Common interface for score-based multi-class classifiers. A multi-class - classifier can predict to which class an instance belongs based - on a decision score (a real number) that measures the association of the - input with each class. - - - The data type for the input data. Default is double[]. - - - - - Computes a class-label decision for a given . - - - The input vector that should be classified into - one of the possible classes. - - A class-label that best described according - to this classifier. - - - - - Computes class-label decisions for each vector in the given . - - - The input vectors that should be classified into - one of the possible classes. - - The class-labels that best describe each - vectors according to this classifier. - - - - - Computes a numerical score measuring the association between - the given vector and its most strongly - associated class (as predicted by the classifier). - - - The input vector. - - - - - Computes a numerical score measuring the association between - each of the given vectors and their - respective most strongly associated classes. - - - A set of input vectors. - - - - - Computes a numerical score measuring the association between - each of the given vectors and their - respective most strongly associated classes. - - - A set of input vectors. - An array where the result will be stored, - avoiding unnecessary memory allocations. - - - - - Views this instance as a multi-label distance classifier, - giving access to more advanced methods, such as the prediction - of one-hot vectors. - - - This instance seen as an . - - - - - Common interface for generative multi-class classifiers. A multi-class - classifier can predicts a class label based on an input instance vector. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Predicts a class label for each input vector, returning the - probability that each vector belongs to its predicted class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label for each input vector, returning the - probability that each vector belongs to its predicted class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the probabilities will be stored, - avoiding unnecessary memory allocations. - - - - - Predicts a class label for each input vector, returning the - log-likelihood that each vector belongs to its predicted class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label for each input vector, returning the - log-likelihood that each vector belongs to its predicted class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the log-likelihoods will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for generative multi-class classifiers. A multi-class - classifier can predicts a class label based on an input instance vector. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Predicts a class label for the given input vector, returning the - probability that the input vector belongs to its predicted class. - - - The input vector. - The class label predicted by the classifier. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihood that the input vector belongs to its predicted class. - - - The input vector. - The class label predicted by the classifier. - - - - - Common interface for generative multi-class classifiers. A multi-class - classifier can predicts a class label based on an input instance vector. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Common interface for generative multi-class classifiers. A multi-class - classifier can predicts a class label based on an input instance vector. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int. - - - - - Common interface for generative multi-class classifiers. A multi-class - classifier can predicts a class label based on an input instance vector. - - - The data type for the input data. Default is double[]. - - - - - Computes a class-label decision for a given . - - - The input vector that should be classified into - one of the possible classes. - - A class-label that best described according - to this classifier. - - - - - Computes class-label decisions for each vector in the given . - - - The input vectors that should be classified into - one of the possible classes. - - The class-labels that best describe each - vectors according to this classifier. - - - - - Predicts a class label for the given input vector, returning the - probability that the input vector belongs to its predicted class. - - - The input vector. - - - - - Predicts a class label for the given input vectors, returning the - probability that the input vector belongs to its predicted class. - - - The input vector. - - - - - Predicts a class label for the given input vectors, returning the - probability that the input vector belongs to its predicted class. - - - The input vector. - An array where the probabilities will be stored, - avoiding unnecessary memory allocations. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihood that the input vector belongs to its predicted class. - - - The input vector. - - - - - Predicts a class label vector for the given input vectors, returning the - log-likelihood that the input vector belongs to its predicted class. - - - The input vector. - - - - - Predicts a class label vector for the given input vectors, returning the - log-likelihood that the input vector belongs to its predicted class. - - - The input vector. - An array where the log-likelihoods will be stored, - avoiding unnecessary memory allocations. - - - - - Views this instance as a multi-label generative classifier, - giving access to more advanced methods, such as the prediction - of one-hot vectors. - - - This instance seen as an . - - - - - Common interface for multi-label classifiers. A multi-label classifier can - predict the occurrence of multiple class labels at once. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Computes class-label decisions for the given . - - - The input vectors that should be classified as - any of the possible classes. - The location where to store the class-labels. - - A set of class-labels that best describe the - vectors according to this classifier. - - - - - Common interface for multi-label classifiers. A multi-label classifier can - predict the occurrence of multiple class labels at once. - - - The data type for the input data. Default is double[]. - - - - - Common interface for multi-label classifiers. A multi-label classifier can - predict the occurrence of multiple class labels at once. - - - - - - Common interface for score-based multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once - based on a decision score (a real number) computed for each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for each input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label vector for each input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for score-based multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once - based on a decision score (a real number) computed for each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for the given input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label vector for the given input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for score-based multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once - based on a decision score (a real number) computed for each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for the given input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - The input vector. - The class label predicted by the classifier. - - - - - Predicts a class label vector for the given input vector, returning a - numerical score measuring the strength of association of the input vector - to each of the possible classes. - - - A set of input vectors. - The class label predicted by the classifier. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for score-based multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once - based on a decision score (a real number) computed for each class. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Common interface for score-based multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once - based on a decision score (a real number) computed for each class. - - - The data type for the input data. Default is double[]. - - - - - Computes a numerical score measuring the association between - the given vector and a given - . - - - The input vector. - The index of the class whose score will be computed. - - - - - Computes a numerical score measuring the association between - each of the given vectors and the - given class indices. - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - - - - - Computes a numerical score measuring the association between - each of the given vectors and the - given class indices. - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes a numerical score measuring the association between - each of the given vectors and the - given class indices. - - - A set of input vectors. - The index of the class whose score will be computed. - - - - - Computes a numerical score measuring the association between - each of the given vectors and the - given class indices. - - - A set of input vectors. - The index of the class whose score will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes a numerical score measuring the association between - the given vector and each class. - - - The input vector. - - - - - Computes a numerical score measuring the association between - the given vector and each class. - - - The input vector. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes a numerical score measuring the association between - each of the given vectors and each - possible class. - - - A set of input vectors. - - - - - Computes a numerical score measuring the association between - each of the given vectors and each - possible class. - - - A set of input vectors. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Views this instance as a multi-class score-based classifier. - - - - This instance seen as an . - - - - - - Views this instance as a multi-class score-based classifier. - - - - This instance seen as an . - - - - - - Common interface for generative multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for each input vector, returning the - probabilities of the input vector belonging to each possible class. - - - A set of input vectors. - The labels predicted by the classifier. - - - - - Predicts a class label vector for each input vector, returning the - probabilities of the input vector belonging to each possible class. - - - A set of input vectors. - The labels predicted by the classifier. - An array where the probabilities will be stored, - avoiding unnecessary memory allocations. - - - - - Predicts a class label vector for each input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - A set of input vectors. - The labels predicted by the classifier. - - - - - Predicts a class label vector for each input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - A set of input vectors. - The labels predicted by the classifier. - An array where the log-likelihoods will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for generative multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once, - as well as their probabilities. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for the given input vector, returning the - probabilities of the input vector belonging to each possible class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label vector for the given input vector, returning the - probabilities of the input vector belonging to each possible class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - A set of input vectors. - The class labels associated with each input - vector, as predicted by the classifier. If passed as null, the classifier - will create a new array. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for generative multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once, - as well as their probabilities. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Predicts a class label vector for the given input vector, returning the - probabilities of the input vector belonging to each possible class. - - - The input vector. - The class label predicted by the classifier. - - - - - Predicts a class label vector for the given input vector, returning the - probabilities of the input vector belonging to each possible class. - - - The input vector. - The class label predicted by the classifier. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - The input vector. - The class label predicted by the classifier. - - - - - Predicts a class label vector for the given input vector, returning the - log-likelihoods of the input vector belonging to each possible class. - - - The input vector. - The class label predicted by the classifier. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Common interface for generative multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once. - - - The data type for the input data. Default is double[]. - The data type for the class labels. Default is int[]. - - - - - Common interface for generative multi-label classifiers. A multi-label - classifier can predict the occurrence of multiple class labels at once, - as well as their probabilities. - - - The data type for the input data. Default is double[]. - - - - - Computes the probability that the given input vector - belongs to the specified . - - - The input vector. - The index of the class whose score will be computed. - - - - - Computes the probability that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - - - - - Computes the probability that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the probability that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - - - - - Computes the probability that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the log-likelihood that the given input vector - belongs to the specified . - - - The input vector. - The index of the class whose score will be computed. - - - - - Computes the log-likelihood that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - - - - - Computes the log-likelihood that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the log-likelihood that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - - - - - Computes the log-likelihood that the given input vectors - belongs to each class specified in . - - - A set of input vectors. - The class indices associated with each - input vector whose scores will be computed. - An array where the distances will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the log-likelihood that the given input - vector belongs to each of the possible classes. - - - The input vector. - - - - - Computes the log-likelihood that the given input - vector belongs to each of the possible classes. - - - The input vector. - An array where the log-likelihoods will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the log-likelihoods that the given input - vectors belongs to each of the possible classes. - - - A set of input vectors. - - - - - Computes the log-likelihoods that the given input - vectors belongs to each of the possible classes. - - - A set of input vectors. - An array where the log-likelihoods will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the probabilities that the given input - vector belongs to each of the possible classes. - - - The input vector. - - - - - Computes the probabilities that the given input - vector belongs to each of the possible classes. - - - The input vector. - An array where the probabilities will be stored, - avoiding unnecessary memory allocations. - - - - - Computes the probabilities that the given input - vectors belongs to each of the possible classes. - - - A set of input vectors. - - - - - Computes the probabilities that the given input - vectors belongs to each of the possible classes. - - - A set of input vectors. - An array where the probabilities will be stored, - avoiding unnecessary memory allocations. - - - - - Views this instance as a multi-class generative classifier. - - - - This instance seen as an . - - - - - - Views this instance as a multi-class generative classifier. - - - - This instance seen as an . - - - - - - Common interface for classification models. Classification models - learn how to produce a class-label (or a set of class labels) y - from an input vector x. - - - The data type for the input data. Default is double[]. - - - - - Views this instance as a multi-class classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Views this instance as a multi-class classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Common interface for classification models. Classification models - learn how to produce a class-label (or a set of class labels) y - from an input vector x. - - - - - - Common interface for score-based binary classifiers. A binary classifier can - predict whether or not an instance belongs to a class based on a decision score - (a real number) that measures the association of the input with the negative - and positive class. - - - The data type for the input data. Default is double[]. - - - - - Views this instance as a multi-class distance classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Views this instance as a multi-class distance classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Common interface for generative binary classifiers. A binary classifier can - predict whether or not an instance belongs to a class, while at the same time - being able to provide the probability of this sample belonging to the positive - class. - - - The data type for the input data. Default is double[]. - - - - - Views this instance as a multi-class generative classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Views this instance as a multi-class generative classifier, - giving access to more advanced methods, such as the prediction - of integer labels. - - - This instance seen as an . - - - - - Common interface for generative observation sequence taggers. A sequence - tagger can predict the class label of each individual observation in a - input sequence vector. - - - The data type for the input data. Default is double[]. - - - - - Common interface for generative observation sequence taggers. A sequence - tagger can predict the class label of each individual observation in a - input sequence vector. - - - The data type for the input data. Default is double[]. - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probability that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the log-likelihood that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the log-likelihood that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the log-likelihood that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the log-likelihood that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the log-likelihood that the sequence vector - has been generated by this log-likelihood tagger. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the probabilities for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Predicts a the log-likelihood for each of the observations in - the sequence vector assuming each of the possible states in the - tagger model. - - - - - - Common interface for observation sequence taggers. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Computes numerical scores measuring the association between - each of the given vectors and each - possible class. - - - - - - Common interface for parallel algorithms. - - - - - - Gets or sets the parallelization options for this algorithm. It can - be used to control the maximum number of cores that should be used - during the algorithm's execution. - - - - The interface is implemented by most machine learning - algorithms in the framework, and it is most common use is to allow the user to - tune how many cores should be used by a multi-threaded learning algorithm. - - - - - In the following example, we will be using the property to limit - the maximum degree of parallelism of a support vector machine learning algorithm to be 1, meaning - the algorithm will be running in a single thread: - - - - - - - Common interface for algorithms that can be canceled - in the middle of execution. - - - - - - Gets or sets a cancellation token that can be used - to cancel the algorithm while it is running. - - - - - - Common interface for data transformation algorithms. Examples of transformations include - classifiers, - regressions and other machine learning techniques. - - - - - - Gets or sets the number of inputs accepted by the model. - - - - - - Gets or sets the number of outputs generated by the model. - - - - - - Common interface for data transformation algorithms. Examples of transformations include - classifiers, regressions - and other machine learning techniques. - - - The type for the output data that enters in the model. Default is double[]. - The type for the input data that exits from the model. Default is double[]. - - - - - Applies the transformation to an input, producing an associated output. - - - The input data to which the transformation should be applied. - - The output generated by applying this transformation to the given input. - - - - - Applies the transformation to a set of input vectors, - producing an associated set of output vectors. - - - The input data to which - the transformation should be applied. - - The output generated by applying this - transformation to the given input. - - - - - Common interface for data transformation algorithms. Examples of transformations include - classifiers, regressions - and other machine learning techniques. - - - The type for the output data that enters in the model. Default is double[]. - The type for the input data that exits from the model. Default is double[]. - - - - - Applies the transformation to a set of input vectors, - producing an associated set of output vectors. - - - The input data to which - the transformation should be applied. - The location to where to store the - result of this transformation. - - The output generated by applying this - transformation to the given input. - - - - - Common interface for data transformation algorithms. Examples of transformations include - classifiers, regressions - and other machine learning techniques. - - - The type for the output data that enters in the model. Default is double[]. - The type for the input data that exits from the model. Default is double[]. - - - - - Applies the transformation to a set of input vectors, - producing an associated set of output vectors. - - - The input data to which - the transformation should be applied. - The location to where to store the - result of this transformation. - - The output generated by applying this - transformation to the given input. - - - - - Common interface for data transformation algorithms. Examples of transformations include - classifiers, regressions - and other machine learning techniques. - - - The type for the output data that enters in the model. - - - - - Common interface for multiple regression models. Multiple regression - models learn how to produce a set of real values (a real-valued vector) - from an input vector x. - - - The data type for the input data. Default is double[]. - The data type for the predicted variables. Default is double. - - - - - Common interface for multiple regression models. Multiple regression - models learn how to produce a set of real values (a real-valued vector) - from an input vector x. - - - The data type for the input data. Default is double[]. - - - - - Common interface for regression models. Regression models - learn how to produce a real value (or a set of real values) y - from an input vector x. - - - The data type for the input data. Default is double[]. - The data type for the predicted variables. Default is double. - - - - - Computes an output value for a given . - - - The input vector whose associated output - value should be computed. - - - - - Computes output values for each vector in the given set of - vectors. - - - The input vectors whose output values - should be computed. - - - - - Computes output values for each vector in the given set of - vectors. - - - The input vectors whose output values - should be computed. - The location where to store the output values. - - - - - Common interface for regression models. Regression models - learn how to produce a real value (or a set of real values) y - from an input vector x. - - - The data type for the input data. Default is double[]. - - - - - Common interface for generative models. - - - - - - Predicts the probability that the input sample - has been generated by this generative model. - - - - - - Converts to and from the type. - - - - - - Returns whether this converter can convert an object of the given type to the type of this converter, using the specified context. - - An that provides a format context. - A that represents the type you want to convert from. - true if this converter can perform the conversion; otherwise, false. - - - - Converts the given object to the type of this converter, using the specified context and culture information. - - An that provides a format context. - The to use as the current culture. - The to convert. - An that represents the converted value. - Inavlid value type: " + value.GetType().FullName - value - - - - Returns whether this converter can convert the object to the specified type, using the specified context. - - An that provides a format context. - A that represents the type you want to convert to. - true if this converter can perform the conversion; otherwise, false. - - - - Converts the given value object to the specified type, using the specified context and culture information. - - An that provides a format context. - A . If null is passed, the current culture is assumed. - The to convert. - The to convert the parameter to. - An that represents the converted value. - Cannot convert null to type " + destinationType.FullName - - value must be a rational. - value - or - Inavlid destinationType: " + destinationType.FullName - destinationType - - - - - Rational number. - - - - - - Represents the number zero. - - - - - Represents the number one. - - - - - Represents the minimum finite value of a . - - - - - Represents the maximum finite value of a . - - - - - Represents an indeterminate value. - - - - - Represents positive infinity. - - - - - Represents negative infinity. - - - - - Represents the minimum positive value of a . - - - - This field has a value of 1 / 2,147,483,647. - - - This does NOT represent the minimum possible difference between two instances; some rationals may have a smaller difference. - If you try to subrtact two rationals whose difference is smaller than this value, you will get unexpected results due to overflow. - - - To check for this case, you can add this value to one of the rationals and compare to the other rational. - - if (r1 + Rational.Epsilon > r2 && r1 - Rational.Epsilon < r2) - { - // Difference between r1 and r2 is less than Rational.Epsilon. - } - - - - - - - Converts the string representation of a number to its representation. - - A string that represents a number. - The parsed value. - - - - Converts the string representation of a number to its representation. - - A string that represents a number. - Indicates the styles that can be present when parsing a number. - The parsed value. - - - - Converts the string representation of a number to its representation. - - A string that represents a number. - An object that supplies culture-specific information about the format of . - The parsed value. - - - - Converts the string representation of a number to its representation. - - A string that represents a number. - Indicates the styles that can be present when parsing a number. - An object that supplies culture-specific information about the format of . - The parsed value. - - - - Converts the string representation of a number to its representation. A return value indicates whether the conversion succeeded or failed. - - A string that represents a number. - When this method returns, contains the parsed value. - True if the conversion succeeded; otherwise false. - - - - Converts the string representation of a number to its representation. A return value indicates whether the conversion succeeded or failed. - - A string that represents a number. - Indicates the styles that can be present when parsing a number. - When this method returns, contains the parsed value. - True if the conversion succeeded; otherwise false. - - - - Converts the string representation of a number to its representation. A return value indicates whether the conversion succeeded or failed. - - A string that represents a number. - An object that supplies culture-specific information about the format of . - When this method returns, contains the parsed value. - True if the conversion succeeded; otherwise false. - - - - Converts the string representation of a number to its representation. A return value indicates whether the conversion succeeded or failed. - - A string that represents a number. - Indicates the styles that can be present when parsing a number. - An object that supplies culture-specific information about the format of . - When this method returns, contains the parsed value. - True if the conversion succeeded; otherwise false. - - - - Converts a floating-point number to a rational number. - - A floating-point number to convert to a rational number. - The maximum error allowed between the result and the input value. - A rational number. - - - - Converts a floating-point number to a rational number. - - A floating-point number to convert to a rational number. - The maximum error allowed between the result and the input value. - A rational number. - - - - Converts a floating-point decimal to a rational number. - - A floating-point number to convert to a rational number. - The maximum value that the denominator can have. - - The desired maximum error between the result and the input value. This is only used as an alternative end condition; - the actual error may be greater because of the limitation on the denominator value. - - A rational number. - - - - Returns the absolute value of a Rational. - - A Rational number. - Gets the absolute value of the Rational. - - - - Returns the smaller of two Rationals. - - A Rational number. - A Rational number. - The smaller of two Rationals. - - - - Returns the larger of two Rationals. - - A Rational number. - A Rational number. - The larger of two Rationals. - - - - Rounds a to the nearest integral value. - - The number to round. - The rounded number. - The denominator of is zero. - - - - Returns a specified number raised to a specified power. - - A Rational number. - A Rational number. - The larger of two Rationals. - - - - Calculates the quotient of two rational numbers and also returns the remainder in an output parameter. - - The dividend. - The divisor. - The remainder. - The quotient. - - - - Returns a value that indicates whether the specified evaluates to positive or negative infinity. - - A rational number. - True if evaluates to positive or negative infinity; otherwise false. - - - - Returns a value that indicates whether the specified evaluates to positive infinity. - - A rational number. - True if evaluates to positive infinity; otherwise false. - - - - Returns a value that indicates whether the specified evaluates to negative infinity. - - A rational number. - True if evaluates to negative infinity; otherwise false. - - - - Returns a value that indicates whether the specified represents an indeterminate value. - - A rational number. - True if represents an indeterminate value; otherwise false. - - - - Returns a value that indicates whether the specified evaluates to zero. - - A rational number. - True if evaluates to zero; otherwise false. - - - - Creates a new instance with a denominator of 1. - - The numerator of the . - - - - Creates a new instance. - - The numerator of the . - The denominator of the . - - - - Creates a new instance equal to a floating-point value. - - A floating-point value - - - - Gets the numerator of the current value. - - - - - Gets the numerator of the current value. - - - - - Gets the floating-point equivalent of the current value. - - - - - Gets the inverse of the current value (that is, one divided by the current value). - - - - - - Gets the negated version of the current value (that is, the current value multiplied by negative one). - - - - - - Gets the simplified version of the rational number. - - - - - Gets the simplified version of the rational number. - - - - - Gets the simplified version of the rational number. - - - - - Converts the current to a double. - - A . - - - - Converts the Rational to a string in the form of an improper fraction. - - A string representaion of the rational number. - - - - Converts this instance to its equivalent string representation. - - An object that has culture-specific formatting information. - The string representation of the . - - - - Converts the Rational to a string in the form of a mixed fraction. - - A string representaion of the rational number. - - - - Converts the Rational to a string in the form of a mixed fraction. - - The separator between the number part and the fraction part - A string representaion of the rational number. - - - - Indicates whether this instance and a specified object are equal. - - Another object to compare to. - true if the current object and are the same type and represent the same value; otherwise, false. - - - - Indicates whether this instance and a specified are strictly equal; that is, the two instances must have equal numerators and denominators. - - Another to compare to. - true if the current number and have equal numerators and denominators; otherwise, false. - - The basic Equals implementation considers unsimplified fractions to be equal to their simplified forms; e.g. 2/4 = 1/2. - This method considers those values to be different. - - - - - Returns the hash code for this instance. - - the hash code. - - - - Gets whether two values are numerically equivalent. - - A . - A . - True if the values are equivalent; otherwise false. - - - - Gets whether two values are numerically not equivalent. - - A . - A . - False if the values are equivalent; otherwise true. - - - - Gets whether a values is greater than another. - - A . - A . - True if is greater than ; otherwise false. - - - - Gets whether a values is greater than or equal to another. - - A . - A . - True if is greater than or equal to ; otherwise false. - - - - Gets whether a values is less than another. - - A . - A . - True if is less than ; otherwise false. - - - - Gets whether a values is less than or equal to another. - - A . - A . - True if is less than or equal to ; otherwise false. - - - - Gets the value. - - A . - A . - - - - Gets the negated version of a value. - - A . - A . - - - - Adds two values. - - A . - A . - The simplified sum of the values. - - - - Subtracts two values. - - A . - A . - The simplified difference of the values. - - - - Multiplies two values. - - A . - A . - The simplified product of the values. - - - - Divides two values. - - A . - A . - The simplified dividend of the values. - - - - Gets the remainder that results from dividing two values. - - A . - A . - The remainder that results from dividing the values. - - - - Increments a value. - - A . - The incremented . - - - - Decrements a value. - - A . - The idecremented . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Converts the specified to a . - - The to convert. - A . - - - - Compares this instance to another and returns an indication of their relative values. - - The value to compare to. This should be a numeric value. - A signed number indicating the relative values of this instance and . - - - - Compares this instance to another and returns an indication of their relative values. - - The to compare to. - A signed number indicating the relative values of this instance and . - - - - Converts this instance to its equivalent string representation. - - The format to use for both the numerator and the denominator. - An object that has culture-specific formatting information. - The string representation of the . - - - - Indicates whether this instance and a specified are equal. - - Another to compare to. - true if the current object and represent the same value; otherwise, false. - - - - Hyperrectangle structure. - - - - - In geometry, an n-orthotope (also called a hyperrectangle or a box) is the generalization of a rectangle for higher - dimensions, formally defined as the Cartesian product of intervals. - - - References: - - - Wikipedia contributors, "Hyperrectangle," Wikipedia, The Free Encyclopedia, - https://en.wikipedia.org/w/index.php?title=Hyperrectangle - - - - - - - - - Gets the minimum point defining the lower bound of the hyperrectangle. - - - - - - Gets the maximum point defining the upper bound of the hyperrectangle. - - - - - - Gets the number of dimensions of the hyperrectangle. - - - - - - Gets the length of each dimension. The length of the first dimension - can be referred as the width, the second as the height, and so on. - - - - - - Initializes a new instance of the struct. - - - The x-coordinate of the upper-left corner of the rectangle.. - The y-coordinate of the upper-left corner of the rectangle. - The width of the rectangle. - The height of the rectangle. - - - - - Initializes a new instance of the struct. - - - The minimum point in the hyperrectangle (the lower bound). - The maximum point in the hyperrectangle (the upper bound). - Whether the passed vectors should be copied into this instance - or used as-is. Default is true (elements from the given vectors will be copied - into new array instances). - - - - - Initializes a new instance of the struct from minimum and maximum values. - - - The minimum point in the hyperrectangle (the lower bound). - The maximum point in the hyperrectangle (the upper bound). - Whether the passed vectors should be copied into this instance - or used as-is. Default is true (elements from the given vectors will be copied - into new array instances). - - - - - Initializes a new instance of the struct from a minimum value and a size. - - - The minimum point in the hyperrectangle (the lower bound). - The size of each dimension (i.e. width, height, and so on). - Whether the passed vectors should be copied into this instance - or used as-is. Default is true (elements from the given vectors will be copied - into new array instances). - - - - - Determines if this rectangle intersects with rect. - - - - - - Determines if the specified point is contained within this Hyperrectangle structure. - - - - - - Indicates whether the current object is equal to another object of the same type. - - An object to compare with this object. - true if the current object is equal to the parameter; otherwise, false. - - - - Creates a new object that is a copy of the current instance. - - A new object that is a copy of this instance. - - - - Returns a that represents this instance. - - A that represents this instance. - - - - Returns a that represents this instance. - - The format to use.-or- A null reference (Nothing in Visual Basic) to use the default format defined for the type of the implementation. - The provider to use to format the value.-or- A null reference (Nothing in Visual Basic) to obtain the numeric format information from the current locale setting of the operating system. - A that represents this instance. - - - - Extension methods for sparse vectors. - - - - - - Parses a string containing a sparse array in LibSVM - format into a vector. - - - An array of "index:value" strings indicating - where each value belongs in the sparse vector. - Whether an intercept term should be added - at the beginning of the vector. - - - - - Parses a string containing a sparse array in LibSVM - format into a vector. - - - An array of "index:value" strings indicating - where each value belongs in the sparse vector. - Whether an intercept term should be added - at the beginning of the vector. - - - - - Converts an array of sparse vectors into a jagged matrix. - - - - - - Converts an array of sparse vectors into a jagged matrix. - - - - - - Creates a sparse vector from a dense array. - - - - - - Creates sparse vectors from dense arrays. - - - - - - Gets the maximum number of columns (dimensions) - that can be inferred from the given sparse vectors. - - - - - - Creates a sparse vector from a dictionary mapping indices to values. - - - - - - Sparse vector representation (in LibSVM format). - - - The type for the non-zero elements in this vector. - - - - - Gets or sets the vector of indices indicating the location - of the non-zero elements contained in this sparse vector. - - - - - - Gets or sets the vector of values indicating which non-zero - value happens at each position indicated in . - - - - - - Creates a sparse vector with zero elements. - - - - - - Creates a sparse vector with the maximum number of elements. - - - The maximum number of non-zero - elements that this vector can accomodate. - - - - - Creates a sparse vector from a vector of indices - and a vector of values occuring at those indices. - - - The indices for non-zero entries. - The non-zero values happening at each index. - - - - - Converts this sparse vector to a dense vector of the given length. - - - - - - Converts this sparse vector to a dense vector of the given length. - - - - - - Converts this sparse vector to a sparse representation where - the indices are intertwined with their corresponding values. - - - - - - Gets the the value stored at position . - - - - - - Creates a new object that is a copy of the current instance. - - - - A new object that is a copy of this instance. - - - - - - Performs an implicit conversion from to . - - - - - - Gets the maximum non-zero element index in the sparse vector. - - - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Determines whether this Sparse vector has elements on all indices. - - - true if this instance is full; otherwise, false. - - - - - A strongly-typed resource class, for looking up localized strings, etc. - - - - - Returns the cached ResourceManager instance used by this class. - - - - - Overrides the current thread's CurrentUICulture property for all - resource lookups using this strongly typed resource class. - - - - - Looks up a localized string similar to This algorithm does not support instance weights at this time. Please feel free to report this as an enhancement request in the project issue tracker - or even submit a pull request implementing this feature!. - - - - - Represents a byte range with minimum and maximum values. - - - - This class represents a byt range with inclusive limits, where - both minimum and maximum values of the range are included into it. - Mathematical notation of such range is [min, max]. - - - - - // create [0, 255] range - var range1 = new ByteRange(0, 255); - - // create [64, 128] range - var range2 = new ByteRange(64, 128); - - // check if values is inside of the first range - if (range1.IsInside(5)) - { - // ... - } - - // check if the second range is inside of the first range - if (range1.IsInside(range2)) - { - // ... - } - - // check if two ranges overlap - if (range1.IsOverlapping(range2)) - { - // ... - } - - - - - - - - - - - Minimum value of the range. - - - - Represents minimum value (left side limit) of the range [min, max]. - - - - - - Maximum value of the range. - - - - Represents maximum value (right side limit) of the range [min, max]. - - - - - - Gets the length of the range, defined as (max - min). - - - - - - Initializes a new instance of the class. - - - Minimum value of the range. - Maximum value of the range. - - - - - Check if the specified value is inside of the range. - - - Value to check. - - - True if the specified value is inside of the range or false otherwise. - - - - - - Check if the specified range is inside of the range. - - - Range to check. - - - True if the specified range is inside of the range or false otherwise. - - - - - - Check if the specified range overlaps with the range. - - - Range to check for overlapping. - - - True if the specified range overlaps with the range or false otherwise. - - - - - - Computes the intersection between two ranges. - - - The second range for which the intersection should be calculated. - - An new structure containing the intersection - between this range and the given as argument. - - - - - Determines whether two instances are equal. - - - - - - Determines whether two instances are not equal. - - - - - - Indicates whether the current object is equal to another object of the same type. - - - An object to compare with this object. - - - true if the current object is equal to the parameter; otherwise, false. - - - - - - Determines whether the specified , is equal to this instance. - - - The to compare with this instance. - - - true if the specified is equal to this instance; otherwise, false. - - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Returns a that represents this instance. - - - The format. - The format provider. - - - A that represents this instance. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Represents a double range with minimum and maximum values. - - - - This class represents a double range with inclusive limits, where - both minimum and maximum values of the range are included into it. - Mathematical notation of such range is [min, max]. - - - - - // create [0.25, 1.5] range - var range1 = new DoubleRange(0.25, 1.5); - - // create [1.00, 2.25] range - var range2 = new DoubleRange(1.00, 2.25); - - // check if values is inside of the first range - if (range1.IsInside(0.75)) - { - // ... - } - - // check if the second range is inside of the first range - if (range1.IsInside(range2)) - { - // ... - } - - // check if two ranges overlap - if (range1.IsOverlapping(range2)) - { - // ... - } - - - - - - - - - - - Minimum value of the range. - - - - Represents minimum value (left side limit) of the range [min, max]. - - - - - - Maximum value of the range. - - - - Represents maximum value (right side limit) of the range [min, max]. - - - - - - Gets the length of the range, defined as (max - min). - - - - - - Initializes a new instance of the class. - - - Minimum value of the range. - Maximum value of the range. - - - - - Check if the specified value is inside of the range. - - - Value to check. - - - True if the specified value is inside of the range or false otherwise. - - - - - - Check if the specified range is inside of the range. - - - Range to check. - - - True if the specified range is inside of the range or false otherwise. - - - - - - Check if the specified range overlaps with the range. - - - Range to check for overlapping. - - - True if the specified range overlaps with the range or false otherwise. - - - - - - Computes the intersection between two ranges. - - - The second range for which the intersection should be calculated. - - An new structure containing the intersection - between this range and the given as argument. - - - - - Determines whether two instances are equal. - - - - - - Determines whether two instances are not equal. - - - - - - Indicates whether the current object is equal to another object of the same type. - - - An object to compare with this object. - - - true if the current object is equal to the parameter; otherwise, false. - - - - - - Determines whether the specified , is equal to this instance. - - - The to compare with this instance. - - - true if the specified is equal to this instance; otherwise, false. - - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Returns a that represents this instance. - - - The format. - The format provider. - - - A that represents this instance. - - - - - - Converts this double-precision range into an . - - - - Specifies if inner integer range must be returned or outer range. - - Returns integer version of the range. - - - If is set to , then the - returned integer range will always fit inside of the current single precision range. - If it is set to , then current single precision range will always - fit into the returned integer range. - - - - - - Event arguments holding a buffer sent or received during some communication process. - - - - - Length of the transfered message. - - - - - Initializes a new instance of the class. - - - Message being transfered during communication process. - - - - - Initializes a new instance of the class. - - - Buffer containing the message being transferred during communication process. - Starting index of the message within the buffer. - Length of the message within the buffer. - - - - - Get the transfered message. - - - Returns copy of the transfered message. - - - - - Get the transferred message as string. - - - Returns string encoding the transferred message. - - - - - Connection failed exception. - - - The exception is thrown in the case if connection to device - has failed. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Exception's message. - - - - - Initializes a new instance of the class. - - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - - - - - Connection lost exception. - - - The exception is thrown in the case if connection to device - is lost. When the exception is caught, user may need to reconnect to the device. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Exception's message. - - - - - Initializes a new instance of the class. - - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - - Not connected exception. - - - The exception is thrown in the case if connection to device - is not established, but user requests for its services. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Exception's message. - - - - - Initializes a new instance of the class. - - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - - Device busy exception. - - - The exception is thrown in the case if access to certain device - is not available due to the fact that it is currently busy handling other request/connection. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Exception's message. - - - - - Initializes a new instance of the class. - - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - - Device error exception. - - - The exception is thrown in the case if some error happens with a device, which - may need to be reported to user. - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Exception's message. - - - - - Initializes a new instance of the class. - - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - - Structure for representing a pair of coordinates of integer type. - - - The structure is used to store a pair of integer coordinates. - - Sample usage: - - // assigning coordinates in the constructor - IntPoint p1 = new IntPoint( 10, 20 ); - // creating a point and assigning coordinates later - IntPoint p2; - p2.X = 30; - p2.Y = 40; - // calculating distance between two points - float distance = p1.DistanceTo( p2 ); - - - - - - - X coordinate. - - - - - - Y coordinate. - - - - - - Initializes a new instance of the structure. - - - X axis coordinate. - Y axis coordinate. - - - - - Calculate Euclidean distance between two points. - - - Point to calculate distance to. - - Returns Euclidean distance between this point and - points. - - - - - Calculate squared Euclidean distance between two points. - - - Point to calculate distance to. - - Returns squared Euclidean distance between this point and - points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Equality operator - checks if two points have equal coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are equal. - - - - - Inequality operator - checks if two points have different coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are not equal. - - - - - Check if this instance of equal to the specified one. - - - Another point to check equalty to. - - Return if objects are equal. - - - - - Get hash code for this instance. - - - Returns the hash code for this instance. - - - - - Implicit conversion to . - - - Integer point to convert to single precision point. - - Returns new single precision point which coordinates are implicitly converted - to floats from coordinates of the specified integer point. - - - - - Implicit conversion to . - - - Integer point to convert to double precision point. - - Returns new double precision point which coordinates are implicitly converted - to doubles from coordinates of the specified integer point. - - - - - Get string representation of the class. - - - Returns string, which contains values of the point in readable form. - - - - - Calculate Euclidean norm of the vector comprised of the point's - coordinates - distance from (0, 0) in other words. - - - Returns point's distance from (0, 0) point. - - - - - Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. - - An object to compare with this instance. - A value that indicates the relative order of the objects being compared. The return value has these meanings: Value Meaning Less than zero This instance precedes in the sort order. Zero This instance occurs in the same position in the sort order as . Greater than zero This instance follows in the sort order. - - - - Represents an integer range with minimum and maximum values. - - - - The class represents an integer range with inclusive limits, where - both minimum and maximum values of the range are included into it. - Mathematical notation of such range is [min, max]. - - - - - // create [1, 10] range - var range1 = new IntRange(1, 10); - - // create [5, 15] range - var range2 = new IntRange(5, 15); - - check if values is inside of the first range - if (range1.IsInside(7)) - { - // ... - } - - // check if the second range is inside of the first range - if (range1.IsInside(range2)) - { - // ... - } - - // check if two ranges overlap - if (range1.IsOverlapping(range2)) - { - // ... - } - - - - - - - - - - - Minimum value of the range. - - - - Represents minimum value (left side limit) of the range [min, max]. - - - - - - Maximum value of the range. - - - - Represents maximum value (right side limit) of the range [min, max]. - - - - - - Gets the length of the range, defined as (max - min). - - - - - - Initializes a new instance of the class. - - - Minimum value of the range. - Maximum value of the range. - - - - - Check if the specified value is inside of the range. - - - Value to check. - - - True if the specified value is inside of the range or false otherwise. - - - - - - Computes the intersection between two ranges. - - - The second range for which the intersection should be calculated. - - An new structure containing the intersection - between this range and the given as argument. - - - - - Check if the specified range is inside of the range. - - - Range to check. - - - True if the specified range is inside of the range or false otherwise. - - - - - - Check if the specified range overlaps with the range. - - - Range to check for overlapping. - - - True if the specified range overlaps with the range or false otherwise. - - - - - - Determines whether two instances are equal. - - - - - - Determines whether two instances are not equal. - - - - - - Indicates whether the current object is equal to another object of the same type. - - - An object to compare with this object. - - - true if the current object is equal to the parameter; otherwise, false. - - - - - - Determines whether the specified , is equal to this instance. - - - The to compare with this instance. - - - true if the specified is equal to this instance; otherwise, false. - - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Returns a that represents this instance. - - - The format. - The format provider. - - - A that represents this instance. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - - - - - Structure for representing a pair of coordinates of float type. - - - The structure is used to store a pair of floating point - coordinates with single precision. - - Sample usage: - - // assigning coordinates in the constructor - Point p1 = new Point( 10, 20 ); - // creating a point and assigning coordinates later - Point p2; - p2.X = 30; - p2.Y = 40; - // calculating distance between two points - float distance = p1.DistanceTo( p2 ); - - - - - - - X coordinate. - - - - - - Y coordinate. - - - - - - Initializes a new instance of the structure. - - - X axis coordinate. - Y axis coordinate. - - - - - Calculate Euclidean distance between two points. - - - Point to calculate distance to. - - Returns Euclidean distance between this point and - points. - - - - - Calculate squared Euclidean distance between two points. - - - Point to calculate distance to. - - Returns squared Euclidean distance between this point and - points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Addition operator - adds values of two points. - - - First point for addition. - Second point for addition. - - Returns new point which coordinates equal to sum of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Subtraction operator - subtracts values of two points. - - - Point to subtract from. - Point to subtract. - - Returns new point which coordinates equal to difference of corresponding - coordinates of specified points. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Addition operator - adds scalar to the specified point. - - - Point to increase coordinates of. - Value to add to coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point increased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Subtraction operator - subtracts scalar from the specified point. - - - Point to decrease coordinates of. - Value to subtract from coordinates of the specified point. - - Returns new point which coordinates equal to coordinates of - the specified point decreased by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Multiplication operator - multiplies coordinates of the specified point by scalar value. - - - Point to multiply coordinates of. - Multiplication factor. - - Returns new point which coordinates equal to coordinates of - the specified point multiplied by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Division operator - divides coordinates of the specified point by scalar value. - - - Point to divide coordinates of. - Division factor. - - Returns new point which coordinates equal to coordinates of - the specified point divided by specified value. - - - - - Equality operator - checks if two points have equal coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are equal. - - - - - Inequality operator - checks if two points have different coordinates. - - - First point to check. - Second point to check. - - Returns if coordinates of specified - points are not equal. - - - - - Check if this instance of equal to the specified one. - - - Another point to check equalty to. - - Return if objects are equal. - - - - - Get hash code for this instance. - - - Returns the hash code for this instance. - - - - - Explicit conversion to . - - - Single precision point to convert to integer point. - - Returns new integer point which coordinates are explicitly converted - to integers from coordinates of the specified single precision point by - casting float values to integers value. - - - - - Implicit conversion to . - - - Single precision point to convert to double precision point. - - Returns new double precision point which coordinates are implicitly converted - to doubles from coordinates of the specified single precision point. - - - - - Rounds the single precision point. - - - Returns new integer point, which coordinates equal to whole numbers - nearest to the corresponding coordinates of the single precision point. - - - - - Get string representation of the class. - - - Returns string, which contains values of the point in readable form. - - - - - Calculate Euclidean norm of the vector comprised of the point's - coordinates - distance from (0, 0) in other words. - - - Returns point's distance from (0, 0) point. - - - - - Evaluator of expressions written in reverse polish notation. - - - The class evaluates expressions writen in reverse postfix polish notation. - - The list of supported functuins is: - - Arithmetic functions: +, -, *, /; - sin - sine; - cos - cosine; - ln - natural logarithm; - exp - exponent; - sqrt - square root. - - - Arguments for these functions could be as usual constants, written as numbers, as variables, - writen as $<var_number> ($2, for example). The variable number is zero based index - of variables array. - - Sample usage: - - // expression written in polish notation - string expression = "2 $0 / 3 $1 * +"; - // variables for the expression - double[] vars = new double[] { 3, 4 }; - // expression evaluation - double result = PolishExpression.Evaluate( expression, vars ); - - - - - - - Evaluates specified expression. - - - Expression written in postfix polish notation. - Variables for the expression. - - Evaluated value of the expression. - - Unsupported function is used in the expression. - Incorrect postfix polish expression. - - - - - Represents a double range with minimum and maximum values, - where values are single-precision floating-point (float) numbers. - - - - This class represents a double range with inclusive limits, where - both minimum and maximum values of the range are included into it. - Mathematical notation of such range is [min, max]. - - - - - // create [0.25, 1.5] range - var range1 = new SingleRange(0.25f, 1.5f); - - // create [1.00, 2.25] range - var range2 = new SingleRange(1.00f, 2.25f); - - // check if values is inside of the first range - if (range1.IsInside(0.75f)) - { - // ... - } - - // check if the second range is inside of the first range - if (range1.IsInside(range2)) - { - // ... - } - - // check if two ranges overlap - if (range1.IsOverlapping(range2)) - { - // ... - } - - - - - - - - - - - Minimum value of the range. - - - - Represents minimum value (left side limit) of the range [min, max]. - - - - - - Maximum value of the range. - - - - Represents maximum value (right side limit) of the range [min, max]. - - - - - - Gets the length of the range, defined as (max - min). - - - - - - Initializes a new instance of the class. - - - Minimum value of the range. - Maximum value of the range. - - - - - Check if the specified value is inside of the range. - - - Value to check. - - - True if the specified value is inside of the range or false otherwise. - - - - - - Check if the specified range is inside of the range. - - - Range to check. - - - True if the specified range is inside of the range or false otherwise. - - - - - - Check if the specified range overlaps with the range. - - - Range to check for overlapping. - - - True if the specified range overlaps with the range or false otherwise. - - - - - - Computes the intersection between two ranges. - - - The second range for which the intersection should be calculated. - - An new structure containing the intersection - between this range and the given as argument. - - - - - Determines whether two instances are equal. - - - - - - Determines whether two instances are not equal. - - - - - - Indicates whether the current object is equal to another object of the same type. - - - An object to compare with this object. - - - true if the current object is equal to the parameter; otherwise, false. - - - - - - Determines whether the specified , is equal to this instance. - - - The to compare with this instance. - - - true if the specified is equal to this instance; otherwise, false. - - - - - - Returns a hash code for this instance. - - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - - Returns a that represents this instance. - - - - A that represents this instance. - - - - - - Returns a that represents this instance. - - - The format. - The format provider. - - - A that represents this instance. - - - - - - Performs an implicit conversion from to . - - - The range. - - - The result of the conversion. - - - - - - Converts this single-precision range into an . - - - - Specifies if inner integer range must be returned or outer range. - - Returns integer version of the range. - - - If is set to , then the - returned integer range will always fit inside of the current single precision range. - If it is set to , then current single precision range will always - fit into the returned integer range. - - - - - - Set of systems tools. - - - The class is a container of different system tools, which are used - across the framework. Some of these tools are platform specific, so their - implementation is different on different platform, like .NET and Mono. - - - - - - Determines whether the code is running under Mono. - - - - - - Copy block of unmanaged memory. - - - Destination pointer. - Source pointer. - Memory block's length to copy. - - Return's value of - pointer to destination. - - This function is required because of the fact that .NET does - not provide any way to copy unmanaged blocks, but provides only methods to - copy from unmanaged memory to managed memory and vise versa. - - - - - Copy block of unmanaged memory. - - - Destination pointer. - Source pointer. - Memory block's length to copy. - - Return's value of - pointer to destination. - - This function is required because of the fact that .NET does - not provide any way to copy unmanaged blocks, but provides only methods to - copy from unmanaged memory to managed memory and vise versa. - - - - - Fill memory region with specified value. - - - Destination pointer. - Filler byte's value. - Memory block's length to fill. - - Return's value of - pointer to destination. - - - - - Fill memory region with specified value. - - - Destination pointer. - Filler byte's value. - Memory block's length to fill. - - Return's value of - pointer to destination. - - - - - Thread safe version of the class. - - - The class inherits the and overrides - its random numbers generation methods providing thread safety by guarding call - to the base class with a lock. See documentation to for - additional information about the base class. - - - - - Initializes a new instance of the class. - - - See for more information. - - - - - Initializes a new instance of the class. - - - A number used to calculate a starting value for the pseudo-random number sequence. - If a negative number is specified, the absolute value of the number is used. - - - See for more information. - - - - - Returns a nonnegative random number. - - - Returns a 32-bit signed integer greater than or equal to zero and less than - . - - See for more information. - - - - - Returns a nonnegative random number less than the specified maximum. - - - The exclusive upper bound of the random number to be generated. - must be greater than or equal to zero. - - Returns a 32-bit signed integer greater than or equal to zero, and less than ; - that is, the range of return values ordinarily includes zero but not . - - See for more information. - - - - - Returns a random number within a specified range. - - - The inclusive lower bound of the random number returned. - The exclusive upper bound of the random number returned. - must be greater than or equal to . - - Returns a 32-bit signed integer greater than or equal to and less - than ; that is, the range of return values includes - but not . - - See for more information. - - - - - Fills the elements of a specified array of bytes with random numbers. - - - An array of bytes to contain random numbers. - - See for more information. - - - - - Returns a random number between 0.0 and 1.0. - - - Returns a double-precision floating point number greater than or equal to 0.0, and less than 1.0. - - See for more information. - - - - - Specifies that an argument, in a method or function, - must be greater than zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be lesser than zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be lesser than or equal to zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be greater than or equal to zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be real (double). - - - - - - Initializes a new instance of the class. - - - - - - Gets the minimum allowed field value. - - - - - - Gets the maximum allowed field value. - - - - - - Specifies that an argument, in a method or function, - must be real between 0 and 1. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be an integer bigger than zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be an integer less than zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be an integer smaller than or equal to zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be an integer bigger than or equal to zero. - - - - - - Initializes a new instance of the class. - - - - - - Specifies that an argument, in a method or function, - must be an integer. - - - - - - Initializes a new instance of the class. - - - - - - Gets the minimum allowed field value. - - - - - - Gets the maximum allowed field value. - - - - - - Runtime cast. - - - The target type. - The source type. - - - - - Gets the value being casted. - - - - - - Initializes a new instance of the struct. - - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Runtime cast. - - - The target type. - - - - - Gets the value being casted. - - - - - - Initializes a new instance of the struct. - - The value. - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Performs an implicit conversion from to . - - The value. - - The result of the conversion. - - - - - Static class for utility extension methods. - - - - - - Creates and adds multiple - objects with the given names at once. - - - The - to add in. - The names of the to - be created and added. - - - - DataTable table = new DataTable(); - - // Add multiple columns at once: - table.Columns.Add("columnName1", "columnName2"); - - - - - - - Creates and adds multiple - objects with the given names at once. - - - The - to add in. - The names of the s to - be created and added, alongside with their types. - - - - DataTable table = new DataTable(); - - // Add multiple columns at once: - table.Columns.Add(new OrderedDictionary>String, Type<() - { - { "columnName1", typeof(int) }, - { "columnName2", typeof(double) }, - }); - - - - - - - Gets a the value of a - associated with a particular enumeration value. - - - The enumeration type. - The enumeration value. - - The string value stored in the value's description attribute. - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Reads a struct from a stream. - - - - - - Gets the underlying buffer position for a StreamReader. - - - A StreamReader whose position will be retrieved. - - The current offset from the beginning of the - file that the StreamReader is currently located into. - - - - - Deserializes the specified stream into an object graph, but locates - types by searching all loaded assemblies and ignoring their versions. - - - The binary formatter. - The stream from which to deserialize the object graph. - - The top (root) of the object graph. - - - - - Converts an object into another type, irrespective of whether - the conversion can be done at compile time or not. This can be - used to convert generic types to numeric types during runtime. - - - The destination type. - - The value to be converted. - - The result of the conversion. - - - - - Converts an object into another type, irrespective of whether - the conversion can be done at compile time or not. This can be - used to convert generic types to numeric types during runtime. - - - The value to be converted. - The type that the value should be converted to. - - The result of the conversion. - - - - - Determines whether the given type has a public default (parameterless) constructor. - - - The type to check. - - True if the type has a public parameterless constructor; false otherwise. - - - - - Replaces the format item in a specified string with the string - representation of a corresponding object in a specified array. - - - A composite format string. - An object array that contains zero or more objects to format. - - - A copy of str in which the format items have been replaced by - the string representation of the corresponding objects in args. - - - - - - Checks whether two dictionaries have the same contents. - - - - - - Checks whether an object implements a method with the given name. - - - - - - Checks whether a type implements a method with the given name. - - - - - - Determines whether a > b. - - - - - - Determines whether a >= b. - - - - - - Determines whether a < b. - - - - - - Determines whether a <= b. - - - - - - Gets the default value for a type. This method should serve as - a programmatic equivalent to default(T). - - - The type whose default value should be retrieved. - - - - - Retrieves the memory address of a generic value type. - - - The type of the object whose address needs to be retrieved. - The object those address needs to be retrieved. - - - - - Retrieves the memory address of a generic reference type. - - - The type of the object whose address needs to be retrieved. - The object those address needs to be retrieved. - - - - - Attempts to download a file from the web multiple times before giving up. - - - The web client to use. - The URL of the file to be downloaded. - The disk location where the file should be stored. - The maximum number of attempts. - Do not overwrite if it already exists. - - - - - Algorithm Convergence Exception. - - - The algorithm convergence exception is thrown in cases where a iterative - algorithm could not converge to a finite solution. - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Dimension Mismatch Exception. - - - The dimension mismatch exception is thrown in cases where a method expects - a matrix or array object having specific or compatible dimensions, such as the inner matrix - dimensions in matrix multiplication. - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - - The name of the parameter that caused the current exception. - - - - - Initializes a new instance of the class. - - - The name of the parameter that caused the current exception. - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Non-Positive Definite Matrix Exception. - - - The non-positive definite matrix exception is thrown in cases where a method - expects a matrix to have only positive eigenvalues, such when dealing with covariance matrices. - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Non-Symmetric Matrix Exception. - - - The not symmetric matrix exception is thrown in cases where a method - expects a matrix to be symmetric but it is not. - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Singular Matrix Exception. - - - The singular matrix exception is thrown in cases where a method which - performs matrix inversions has encountered a non-invertible matrix during the process. - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - - - - - Initializes a new instance of the class. - - - Message providing some additional information. - The exception that is the cause of the current exception. - - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - The parameter is null. - - - The class name is null or is zero (0). - - - - - - Common interface for Range objects, such as , - or . A range represents the - interval between two values in the form [min, max]. - - - The type of the range. - - - - - - - - - - Minimum value of the range. - - - - Represents minimum value (left side limit) of the range [min, max]. - - - - - - Maximum value of the range. - - - - Represents maximum value (right side limit) of the range [min, max]. - - - - - - Model serializer. Can be used to serialize and deserialize (i.e. save and - load) models from the framework to and from the disk and other streams. - - - - This class uses a binding mechanism to automatically convert files saved using - older versions of the framework to the new format. If a deserialization doesn't - work, please fill in a bug report at https://github.com/accord-net/framework/issues - - - - - The first example shows the simplest way to use the serializer to persist objects: - - - - The second example shows the same, but using compression: - - - - The third and last example shows a complete example on how to create, save and re-load - a classifier from disk using serialization: - - - - - - - - Saves an object to a stream. - - - The object to be serialized. - The stream to which the object is to be serialized. - The type of compression to use. Default is None. - - - - - Saves an object to a stream. - - - The object to be serialized. - The binary formatter. - The stream to which the object is to be serialized. - The type of compression to use. Default is None. - - - - - Saves an object to a stream. - - - The object to be serialized. - The path to the file to which the object is to be serialized. - - - - - Saves an object to a stream. - - - The object to be serialized. - The path to the file to which the object is to be serialized. - The type of compression to use. Default is None. - - - - - Saves an object to a stream, represented as an array of bytes. - - - The object to be serialized. - The type of compression to use. Default is None. - - - - - Saves an object to a stream. - - - The object to be serialized. - The sequence of bytes to which the object has been serialized. - The type of compression to use. Default is None. - - - - - Loads an object from a stream. - - - The stream from which the object is to be deserialized. - The type of compression to use. Default is None. - - The deserialized machine. - - - - - Loads an object from a file. - - - The path to the file from which the object is to be deserialized. - - The deserialized object. - - - - - Loads an object from a file. - - - The path to the file from which the object is to be deserialized. - The type of compression to use. Default is None. - - The deserialized object. - - - - - Loads an object from a stream, represented as an array of bytes. - - - The byte stream containing the object to be deserialized. - The type of compression to use. Default is None. - - The deserialized object. - - - - - Loads an object from a stream. - - - The stream from which the object is to be deserialized. - The type of compression to use. Default is None. - The object to be read. This parameter can be used to avoid the - need of specifying a generic argument to this function. - - The deserialized machine. - - - - - Loads an object from a file. - - - The path to the file from which the object is to be deserialized. - The object to be read. This parameter can be used to avoid the - need of specifying a generic argument to this function. - - The deserialized object. - - - - - Loads an object from a file. - - - The path to the file from which the object is to be deserialized. - The type of compression to use. Default is None. - The object to be read. This parameter can be used to avoid the - need of specifying a generic argument to this function. - - The deserialized object. - - - - - Loads an object from a stream, represented as an array of bytes. - - - The byte stream containing the object to be deserialized. - The object to be read. This parameter can be used to avoid the - need of specifying a generic argument to this function. - The type of compression to use. Default is None. - - The deserialized object. - - - - - Loads a model from a stream. - - - The type of the model to be loaded. - The binary formatter. - The stream from which to deserialize the object graph. - The type of compression to use. Default is None. - - The deserialized object. - - - - - Performs a deep copy of an object by serializing and deserializing it. - - - The type of the model to be copied. - The object. - - A deep copy of the given object. - - - - - Retrieves a value from the SerializationInfo store. - - - The type of the value to be retrieved. - The serialization info store containing the value. - The name of the value. - The value retrieved from the info store. - - The value retrieved from the info store. - - - - - Compression algorithms supported by the . - - - - - - No serialization. - - - - - - Use GZip serialization. - - - - - diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/BasicDemo_CS.exe b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/BasicDemo_CS.exe index 9118e6fd7b4fe714858077f4ddaa09d60e189a57..c457a9a2f85c4c6a9810d1c445b7635755432eef 100644 GIT binary patch literal 129536 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

>+LDsJkLgXct5TjeKs-!t;m1lR0UR6hKgmIVc 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 JTYqTZ_`irJC7u8P delta 22208 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 Vu5kIgJNYB=47nKE9vOMs{C_!y>#G0& diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/en-US/BasicDemo_CS.resources.dll b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/en-US/BasicDemo_CS.resources.dll index c3a8eaedd29dceb19ec482390786dcfe842a47bc..9cd64fb3fb6d764b99a7e48f2975efdb22d1b9da 100644 GIT binary patch delta 35 rcmZqhY4DlQ!Iay&v8zZ{Nqi#*gV*iqRfItgJ%TtGm8=ZQ7&U4`V8D>ZUWq zq$G1wGgE`aG)v30L=*EAa|=uJ)WozTBV$A3M5DAsBV&sc(=?0iK{J`A3A5~|^WHrD z%^Icvfv_AlrW>60ZoTuDExUB-_nqxNYncQX6`;alXQ9F%4V_asv-+k_sBaM4sj|Ih z9n%{Ye=~+8AT(z%WiSI`1BOI~GzLo`Oarn^fZ{1YYysq(Go*s$k{FB_j2R4pI1$JK VsRHpWfa*+vJd5qyH#2#%001j5Pk#Ua diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.exe b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.exe index 155af9714dad6ce4eb705379d70edb8c44eb3245..3873a63fe23b035db523dd5fd7286d57c499a86b 100644 GIT binary patch delta 99 zcmZpe!r1^sEsR^3BHaCx84Q6i5eSnREP$jLgE delta 99 zcmZpe!r1^sEsR^3BHaDW7?Oa{oWYdA42TUF5*gAMEP*f$$T9(nrvR}9kZ;bA3YJS^ fFk&!fFa+X6APb}l#J2#dGX?T2wl8;Qiev%+(;gBU diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/bin/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb index f15e4fcca011d0a3f4ad61550637eb85d1eda265..dc94618ac96674459718b851a5aa2cfcf388c1f4 100644 GIT binary patch delta 106 zcmV-w0G0pL-2>F!1CV?agb0M?K#{RRjQO5Jv9U{m{sa$_v5?s;A>LPKeoDTGjNsfx z={cF!1CV?aR%`|W*a<&Iji08b($f3fxPD8sv5?s;Av2MEeQmXqH-Fe| z0`D?$62FWxD(A!MZ!l|wWKQ0_D delta 99 zcmZpe!r1^sEsR^3BHaDW7?Oa{oWYdA42TUF5*gAMEP*f$$T9(nrvR}9kZ;bA3YJS^ fFk&!fFa+X6APb}l#J2#dGX?T2wl8;Qiev%+(;gBU diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/obj/Debug/net8.0-windows7.0/ref/外科辅料和患者防护罩激光抗性测试仪.dll b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/obj/Debug/net8.0-windows7.0/ref/外科辅料和患者防护罩激光抗性测试仪.dll index 33586e6e56d4ebc0b893408c12771d75aaa8a743..3867a3c52f9d540ad55957407a3713aa6fee2f5a 100644 GIT binary patch delta 197 zcmZqZVQlDOoY29N$`SZ}V^0aQz~orjS3xFDjuZB5J$013bYvPD z2!x41n9N`SB+VGifiRW9l);F>fFX^+7$}ki7E1<;B?5Vg43BPG%RDH7`%X`Mn|5;OwF{Mf@ zw=-#&B_)}gnwc6Trde91C7PJ0m|IwyrzWN)85tWICmN+C8W~%pn5J254z>|x^*3Wk z0zz{JQwB32Heg6(NMo=B!ZaYu1Sp;Y#1=rlIYTN~E{Va2!I;4ih!cSYvPD z2!x41n9N`SB+VGifiRW9l);F>fFX^+7$}ki7E1<;B?5Vg43BPG%RDH7`%X`Mn|5;OwF{Mf@ zw=-#&B_)}gnwc6Trde91C7PJ0m|IwyrzWN)85tWICmN+C8W~%pn5J254z>|x^*3Wk z0zz{JQwB32Heg6(NMo=B!ZaYu1Sp;Y#1=rlIYTN~E{Va2!I;4ih!cS4$c`6qZ z;|hpvBFR_`*GtLCVPpha;4@qA{S}{k9E^;NxE%ph2Lm8IOhC+748cb&f|K{fR`TM{AzD3Q+T26dlHFz%_4au{QU0x121t5?KbTBB` z19*``5f;+w$O=K8V*myX4{{KqM2rG9<=nxQ#U-h^dM=42iIe@A949|xb(`GB6fjwh zSyg}yXe1~E{{sOd1LJIHEa^k7fJF?$%8xU8#IAxO2HBY)uYkd1c^*l|#lUcf$_|F0 zR>Kz5tU%`iJ;9M%3{2uVnMsUH!1QWAc_u3_D=3AtLQ=09H_)GuV1p>oQH2JgbAE0? zeqL%`iEn;NY7RI|9rNm^YeqRfItgJ%TtGm8=ZQ7&U4`V8D>ZUWq zq$G1wGgE`aG)v30L=*EAa|=uJ)WozTBV$A3M5DAsBV&sc(=?0iK{J`A3A5~|^WHrD z%^Icvfv_AlrW>60ZoTuDExUB-_nqxNYncQX6`;alXQ9F%4V_asv-+k_sBaM4sj|Ih z9n%{Ye=~+8AT(z%WiSI`1BOI~GzLo`Oarn^fZ{1YYysq(Go*s$k{FB_j2R4pI1$JK VsRHpWfa*+vJd5qyH#2#%001j5Pk#Ua diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/obj/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/obj/Debug/net8.0-windows7.0/外科辅料和患者防护罩激光抗性测试仪.pdb index f15e4fcca011d0a3f4ad61550637eb85d1eda265..dc94618ac96674459718b851a5aa2cfcf388c1f4 100644 GIT binary patch delta 106 zcmV-w0G0pL-2>F!1CV?agb0M?K#{RRjQO5Jv9U{m{sa$_v5?s;A>LPKeoDTGjNsfx z={cF!1CV?aR%`|W*a<&Iji08b($f3fxPD8sv5?s;Av2MEeQmXqH-Fe| z0`D?$62FWxD(A!MZ!l|wWKQ0_D