1 /* 2 * Copyright 2012 The LibYuv Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef INCLUDE_LIBYUV_MJPEG_DECODER_H_ 12 #define INCLUDE_LIBYUV_MJPEG_DECODER_H_ 13 14 #include "libyuv/basic_types.h" 15 16 #ifdef __cplusplus 17 // NOTE: For a simplified public API use convert.h MJPGToI420(). 18 19 struct jpeg_common_struct; 20 struct jpeg_decompress_struct; 21 struct jpeg_source_mgr; 22 23 namespace libyuv { 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 LIBYUV_BOOL ValidateJpeg(const uint8* sample, size_t sample_size); 30 31 #ifdef __cplusplus 32 } // extern "C" 33 #endif 34 35 static const uint32 kUnknownDataSize = 0xFFFFFFFF; 36 37 enum JpegSubsamplingType { 38 kJpegYuv420, 39 kJpegYuv422, 40 kJpegYuv444, 41 kJpegYuv400, 42 kJpegUnknown 43 }; 44 45 struct Buffer { 46 const uint8* data; 47 int len; 48 }; 49 50 struct BufferVector { 51 Buffer* buffers; 52 int len; 53 int pos; 54 }; 55 56 struct SetJmpErrorMgr; 57 58 // MJPEG ("Motion JPEG") is a pseudo-standard video codec where the frames are 59 // simply independent JPEG images with a fixed huffman table (which is omitted). 60 // It is rarely used in video transmission, but is common as a camera capture 61 // format, especially in Logitech devices. This class implements a decoder for 62 // MJPEG frames. 63 // 64 // See http://tools.ietf.org/html/rfc2435 65 class LIBYUV_API MJpegDecoder { 66 public: 67 typedef void (*CallbackFunction)(void* opaque, 68 const uint8* const* data, 69 const int* strides, 70 int rows); 71 72 static const int kColorSpaceUnknown; 73 static const int kColorSpaceGrayscale; 74 static const int kColorSpaceRgb; 75 static const int kColorSpaceYCbCr; 76 static const int kColorSpaceCMYK; 77 static const int kColorSpaceYCCK; 78 79 MJpegDecoder(); 80 ~MJpegDecoder(); 81 82 // Loads a new frame, reads its headers, and determines the uncompressed 83 // image format. 84 // Returns LIBYUV_TRUE if image looks valid and format is supported. 85 // If return value is LIBYUV_TRUE, then the values for all the following 86 // getters are populated. 87 // src_len is the size of the compressed mjpeg frame in bytes. 88 LIBYUV_BOOL LoadFrame(const uint8* src, size_t src_len); 89 90 // Returns width of the last loaded frame in pixels. 91 int GetWidth(); 92 93 // Returns height of the last loaded frame in pixels. 94 int GetHeight(); 95 96 // Returns format of the last loaded frame. The return value is one of the 97 // kColorSpace* constants. 98 int GetColorSpace(); 99 100 // Number of color components in the color space. 101 int GetNumComponents(); 102 103 // Sample factors of the n-th component. 104 int GetHorizSampFactor(int component); 105 106 int GetVertSampFactor(int component); 107 108 int GetHorizSubSampFactor(int component); 109 110 int GetVertSubSampFactor(int component); 111 112 // Public for testability. 113 int GetImageScanlinesPerImcuRow(); 114 115 // Public for testability. 116 int GetComponentScanlinesPerImcuRow(int component); 117 118 // Width of a component in bytes. 119 int GetComponentWidth(int component); 120 121 // Height of a component. 122 int GetComponentHeight(int component); 123 124 // Width of a component in bytes with padding for DCTSIZE. Public for testing. 125 int GetComponentStride(int component); 126 127 // Size of a component in bytes. 128 int GetComponentSize(int component); 129 130 // Call this after LoadFrame() if you decide you don't want to decode it 131 // after all. 132 LIBYUV_BOOL UnloadFrame(); 133 134 // Decodes the entire image into a one-buffer-per-color-component format. 135 // dst_width must match exactly. dst_height must be <= to image height; if 136 // less, the image is cropped. "planes" must have size equal to at least 137 // GetNumComponents() and they must point to non-overlapping buffers of size 138 // at least GetComponentSize(i). The pointers in planes are incremented 139 // to point to after the end of the written data. 140 // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. 141 LIBYUV_BOOL DecodeToBuffers(uint8** planes, int dst_width, int dst_height); 142 143 // Decodes the entire image and passes the data via repeated calls to a 144 // callback function. Each call will get the data for a whole number of 145 // image scanlines. 146 // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. 147 LIBYUV_BOOL DecodeToCallback(CallbackFunction fn, 148 void* opaque, 149 int dst_width, 150 int dst_height); 151 152 // The helper function which recognizes the jpeg sub-sampling type. 153 static JpegSubsamplingType JpegSubsamplingTypeHelper( 154 int* subsample_x, 155 int* subsample_y, 156 int number_of_components); 157 158 private: 159 void AllocOutputBuffers(int num_outbufs); 160 void DestroyOutputBuffers(); 161 162 LIBYUV_BOOL StartDecode(); 163 LIBYUV_BOOL FinishDecode(); 164 165 void SetScanlinePointers(uint8** data); 166 LIBYUV_BOOL DecodeImcuRow(); 167 168 int GetComponentScanlinePadding(int component); 169 170 // A buffer holding the input data for a frame. 171 Buffer buf_; 172 BufferVector buf_vec_; 173 174 jpeg_decompress_struct* decompress_struct_; 175 jpeg_source_mgr* source_mgr_; 176 SetJmpErrorMgr* error_mgr_; 177 178 // LIBYUV_TRUE iff at least one component has scanline padding. (i.e., 179 // GetComponentScanlinePadding() != 0.) 180 LIBYUV_BOOL has_scanline_padding_; 181 182 // Temporaries used to point to scanline outputs. 183 int num_outbufs_; // Outermost size of all arrays below. 184 uint8*** scanlines_; 185 int* scanlines_sizes_; 186 // Temporary buffer used for decoding when we can't decode directly to the 187 // output buffers. Large enough for just one iMCU row. 188 uint8** databuf_; 189 int* databuf_strides_; 190 }; 191 192 } // namespace libyuv 193 194 #endif // __cplusplus 195 #endif // INCLUDE_LIBYUV_MJPEG_DECODER_H_ 196