LCOV - code coverage report
Current view: top level - libavcodec - mjpegenc.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 4 100.0 %
Date: 2017-12-11 04:34:20 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * MJPEG encoder
       3             :  * Copyright (c) 2000, 2001 Fabrice Bellard
       4             :  * Copyright (c) 2003 Alex Beregszaszi
       5             :  * Copyright (c) 2003-2004 Michael Niedermayer
       6             :  *
       7             :  * Support for external huffman table, various fixes (AVID workaround),
       8             :  * aspecting, new decode_frame mechanism and apple mjpeg-b support
       9             :  *                                  by Alex Beregszaszi
      10             :  *
      11             :  * This file is part of FFmpeg.
      12             :  *
      13             :  * FFmpeg is free software; you can redistribute it and/or
      14             :  * modify it under the terms of the GNU Lesser General Public
      15             :  * License as published by the Free Software Foundation; either
      16             :  * version 2.1 of the License, or (at your option) any later version.
      17             :  *
      18             :  * FFmpeg is distributed in the hope that it will be useful,
      19             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      20             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      21             :  * Lesser General Public License for more details.
      22             :  *
      23             :  * You should have received a copy of the GNU Lesser General Public
      24             :  * License along with FFmpeg; if not, write to the Free Software
      25             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      26             :  */
      27             : 
      28             : /**
      29             :  * @file
      30             :  * MJPEG encoder.
      31             :  */
      32             : 
      33             : #ifndef AVCODEC_MJPEGENC_H
      34             : #define AVCODEC_MJPEGENC_H
      35             : 
      36             : #include <stdint.h>
      37             : 
      38             : #include "mjpeg.h"
      39             : #include "mpegvideo.h"
      40             : #include "put_bits.h"
      41             : 
      42             : /**
      43             :  * Buffer of JPEG frame data.
      44             :  *
      45             :  * Optimal Huffman table generation requires the frame data to be loaded into
      46             :  * a buffer so that the tables can be computed.
      47             :  * There are at most mb_width*mb_height*12*64 of these per frame.
      48             :  */
      49             : typedef struct MJpegHuffmanCode {
      50             :     // 0=DC lum, 1=DC chrom, 2=AC lum, 3=AC chrom
      51             :     uint8_t table_id; ///< The Huffman table id associated with the data.
      52             :     uint8_t code;     ///< The exponent.
      53             :     uint16_t mant;    ///< The mantissa.
      54             : } MJpegHuffmanCode;
      55             : 
      56             : /**
      57             :  * Holds JPEG frame data and Huffman table data.
      58             :  */
      59             : typedef struct MJpegContext {
      60             :     //FIXME use array [3] instead of lumi / chroma, for easier addressing
      61             :     uint8_t huff_size_dc_luminance[12];     ///< DC luminance Huffman table size.
      62             :     uint16_t huff_code_dc_luminance[12];    ///< DC luminance Huffman table codes.
      63             :     uint8_t huff_size_dc_chrominance[12];   ///< DC chrominance Huffman table size.
      64             :     uint16_t huff_code_dc_chrominance[12];  ///< DC chrominance Huffman table codes.
      65             : 
      66             :     uint8_t huff_size_ac_luminance[256];    ///< AC luminance Huffman table size.
      67             :     uint16_t huff_code_ac_luminance[256];   ///< AC luminance Huffman table codes.
      68             :     uint8_t huff_size_ac_chrominance[256];  ///< AC chrominance Huffman table size.
      69             :     uint16_t huff_code_ac_chrominance[256]; ///< AC chrominance Huffman table codes.
      70             : 
      71             :     /** Storage for AC luminance VLC (in MpegEncContext) */
      72             :     uint8_t uni_ac_vlc_len[64 * 64 * 2];
      73             :     /** Storage for AC chrominance VLC (in MpegEncContext) */
      74             :     uint8_t uni_chroma_ac_vlc_len[64 * 64 * 2];
      75             : 
      76             :     // Default DC tables have exactly 12 values
      77             :     uint8_t bits_dc_luminance[17];   ///< DC luminance Huffman bits.
      78             :     uint8_t val_dc_luminance[12];    ///< DC luminance Huffman values.
      79             :     uint8_t bits_dc_chrominance[17]; ///< DC chrominance Huffman bits.
      80             :     uint8_t val_dc_chrominance[12];  ///< DC chrominance Huffman values.
      81             : 
      82             :     // 8-bit JPEG has max 256 values
      83             :     uint8_t bits_ac_luminance[17];   ///< AC luminance Huffman bits.
      84             :     uint8_t val_ac_luminance[256];   ///< AC luminance Huffman values.
      85             :     uint8_t bits_ac_chrominance[17]; ///< AC chrominance Huffman bits.
      86             :     uint8_t val_ac_chrominance[256]; ///< AC chrominance Huffman values.
      87             : 
      88             :     size_t huff_ncode;               ///< Number of current entries in the buffer.
      89             :     MJpegHuffmanCode *huff_buffer;   ///< Buffer for Huffman code values.
      90             : } MJpegContext;
      91             : 
      92             : /**
      93             :  * Enum for the Huffman encoding strategy.
      94             :  */
      95             : enum HuffmanTableOption {
      96             :     HUFFMAN_TABLE_DEFAULT = 0, ///< Use the default Huffman tables.
      97             :     HUFFMAN_TABLE_OPTIMAL = 1, ///< Compute and use optimal Huffman tables.
      98             :     NB_HUFFMAN_TABLE_OPTION = 2
      99             : };
     100             : 
     101        9828 : static inline void put_marker(PutBitContext *p, enum JpegMarker code)
     102             : {
     103        9828 :     put_bits(p, 8, 0xff);
     104        9828 :     put_bits(p, 8, code);
     105        9828 : }
     106             : 
     107             : int  ff_mjpeg_encode_init(MpegEncContext *s);
     108             : void ff_mjpeg_encode_close(MpegEncContext *s);
     109             : void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64]);
     110             : 
     111             : #endif /* AVCODEC_MJPEGENC_H */

Generated by: LCOV version 1.13