| Index: source/libvpx/third_party/libyuv/include/libyuv/mjpeg_decoder.h
|
| ===================================================================
|
| --- source/libvpx/third_party/libyuv/include/libyuv/mjpeg_decoder.h (revision 0)
|
| +++ source/libvpx/third_party/libyuv/include/libyuv/mjpeg_decoder.h (revision 0)
|
| @@ -0,0 +1,193 @@
|
| +/*
|
| + * Copyright 2012 The LibYuv Project Authors. All rights reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#ifndef INCLUDE_LIBYUV_MJPEG_DECODER_H_ // NOLINT
|
| +#define INCLUDE_LIBYUV_MJPEG_DECODER_H_
|
| +
|
| +#include "libyuv/basic_types.h"
|
| +
|
| +#ifdef __cplusplus
|
| +// NOTE: For a simplified public API use convert.h MJPGToI420().
|
| +
|
| +struct jpeg_common_struct;
|
| +struct jpeg_decompress_struct;
|
| +struct jpeg_source_mgr;
|
| +
|
| +namespace libyuv {
|
| +
|
| +#ifdef __cplusplus
|
| +extern "C" {
|
| +#endif
|
| +
|
| +LIBYUV_BOOL ValidateJpeg(const uint8* sample, size_t sample_size);
|
| +
|
| +#ifdef __cplusplus
|
| +} // extern "C"
|
| +#endif
|
| +
|
| +static const uint32 kUnknownDataSize = 0xFFFFFFFF;
|
| +
|
| +enum JpegSubsamplingType {
|
| + kJpegYuv420,
|
| + kJpegYuv422,
|
| + kJpegYuv411,
|
| + kJpegYuv444,
|
| + kJpegYuv400,
|
| + kJpegUnknown
|
| +};
|
| +
|
| +struct Buffer {
|
| + const uint8* data;
|
| + int len;
|
| +};
|
| +
|
| +struct BufferVector {
|
| + Buffer* buffers;
|
| + int len;
|
| + int pos;
|
| +};
|
| +
|
| +struct SetJmpErrorMgr;
|
| +
|
| +// MJPEG ("Motion JPEG") is a pseudo-standard video codec where the frames are
|
| +// simply independent JPEG images with a fixed huffman table (which is omitted).
|
| +// It is rarely used in video transmission, but is common as a camera capture
|
| +// format, especially in Logitech devices. This class implements a decoder for
|
| +// MJPEG frames.
|
| +//
|
| +// See http://tools.ietf.org/html/rfc2435
|
| +class LIBYUV_API MJpegDecoder {
|
| + public:
|
| + typedef void (*CallbackFunction)(void* opaque,
|
| + const uint8* const* data,
|
| + const int* strides,
|
| + int rows);
|
| +
|
| + static const int kColorSpaceUnknown;
|
| + static const int kColorSpaceGrayscale;
|
| + static const int kColorSpaceRgb;
|
| + static const int kColorSpaceYCbCr;
|
| + static const int kColorSpaceCMYK;
|
| + static const int kColorSpaceYCCK;
|
| +
|
| + MJpegDecoder();
|
| + ~MJpegDecoder();
|
| +
|
| + // Loads a new frame, reads its headers, and determines the uncompressed
|
| + // image format.
|
| + // Returns LIBYUV_TRUE if image looks valid and format is supported.
|
| + // If return value is LIBYUV_TRUE, then the values for all the following
|
| + // getters are populated.
|
| + // src_len is the size of the compressed mjpeg frame in bytes.
|
| + LIBYUV_BOOL LoadFrame(const uint8* src, size_t src_len);
|
| +
|
| + // Returns width of the last loaded frame in pixels.
|
| + int GetWidth();
|
| +
|
| + // Returns height of the last loaded frame in pixels.
|
| + int GetHeight();
|
| +
|
| + // Returns format of the last loaded frame. The return value is one of the
|
| + // kColorSpace* constants.
|
| + int GetColorSpace();
|
| +
|
| + // Number of color components in the color space.
|
| + int GetNumComponents();
|
| +
|
| + // Sample factors of the n-th component.
|
| + int GetHorizSampFactor(int component);
|
| +
|
| + int GetVertSampFactor(int component);
|
| +
|
| + int GetHorizSubSampFactor(int component);
|
| +
|
| + int GetVertSubSampFactor(int component);
|
| +
|
| + // Public for testability.
|
| + int GetImageScanlinesPerImcuRow();
|
| +
|
| + // Public for testability.
|
| + int GetComponentScanlinesPerImcuRow(int component);
|
| +
|
| + // Width of a component in bytes.
|
| + int GetComponentWidth(int component);
|
| +
|
| + // Height of a component.
|
| + int GetComponentHeight(int component);
|
| +
|
| + // Width of a component in bytes with padding for DCTSIZE. Public for testing.
|
| + int GetComponentStride(int component);
|
| +
|
| + // Size of a component in bytes.
|
| + int GetComponentSize(int component);
|
| +
|
| + // Call this after LoadFrame() if you decide you don't want to decode it
|
| + // after all.
|
| + LIBYUV_BOOL UnloadFrame();
|
| +
|
| + // Decodes the entire image into a one-buffer-per-color-component format.
|
| + // dst_width must match exactly. dst_height must be <= to image height; if
|
| + // less, the image is cropped. "planes" must have size equal to at least
|
| + // GetNumComponents() and they must point to non-overlapping buffers of size
|
| + // at least GetComponentSize(i). The pointers in planes are incremented
|
| + // to point to after the end of the written data.
|
| + // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded.
|
| + LIBYUV_BOOL DecodeToBuffers(uint8** planes, int dst_width, int dst_height);
|
| +
|
| + // Decodes the entire image and passes the data via repeated calls to a
|
| + // callback function. Each call will get the data for a whole number of
|
| + // image scanlines.
|
| + // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded.
|
| + LIBYUV_BOOL DecodeToCallback(CallbackFunction fn, void* opaque,
|
| + int dst_width, int dst_height);
|
| +
|
| + // The helper function which recognizes the jpeg sub-sampling type.
|
| + static JpegSubsamplingType JpegSubsamplingTypeHelper(
|
| + int* subsample_x, int* subsample_y, int number_of_components);
|
| +
|
| + private:
|
| +
|
| + void AllocOutputBuffers(int num_outbufs);
|
| + void DestroyOutputBuffers();
|
| +
|
| + LIBYUV_BOOL StartDecode();
|
| + LIBYUV_BOOL FinishDecode();
|
| +
|
| + void SetScanlinePointers(uint8** data);
|
| + LIBYUV_BOOL DecodeImcuRow();
|
| +
|
| + int GetComponentScanlinePadding(int component);
|
| +
|
| + // A buffer holding the input data for a frame.
|
| + Buffer buf_;
|
| + BufferVector buf_vec_;
|
| +
|
| + jpeg_decompress_struct* decompress_struct_;
|
| + jpeg_source_mgr* source_mgr_;
|
| + SetJmpErrorMgr* error_mgr_;
|
| +
|
| + // LIBYUV_TRUE iff at least one component has scanline padding. (i.e.,
|
| + // GetComponentScanlinePadding() != 0.)
|
| + LIBYUV_BOOL has_scanline_padding_;
|
| +
|
| + // Temporaries used to point to scanline outputs.
|
| + int num_outbufs_; // Outermost size of all arrays below.
|
| + uint8*** scanlines_;
|
| + int* scanlines_sizes_;
|
| + // Temporary buffer used for decoding when we can't decode directly to the
|
| + // output buffers. Large enough for just one iMCU row.
|
| + uint8** databuf_;
|
| + int* databuf_strides_;
|
| +};
|
| +
|
| +} // namespace libyuv
|
| +
|
| +#endif // __cplusplus
|
| +#endif // INCLUDE_LIBYUV_MJPEG_DECODER_H_ NOLINT
|
|
|