/src/ffmpeg/libavcodec/mjpegenc.h
Line | Count | Source |
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 "put_bits.h" |
40 | | |
41 | | /** |
42 | | * Holds JPEG frame data and Huffman table data. |
43 | | */ |
44 | | typedef struct MJpegContext { |
45 | | int huffman; |
46 | | /* Force duplication of mjpeg matrices, useful for rtp streaming */ |
47 | | int force_duplicated_matrix; |
48 | | //FIXME use array [3] instead of lumi / chroma, for easier addressing |
49 | | uint8_t huff_size_dc_luminance[12]; ///< DC luminance Huffman table size. |
50 | | uint16_t huff_code_dc_luminance[12]; ///< DC luminance Huffman table codes. |
51 | | uint8_t huff_size_dc_chrominance[12]; ///< DC chrominance Huffman table size. |
52 | | uint16_t huff_code_dc_chrominance[12]; ///< DC chrominance Huffman table codes. |
53 | | |
54 | | uint8_t huff_size_ac_luminance[256]; ///< AC luminance Huffman table size. |
55 | | uint16_t huff_code_ac_luminance[256]; ///< AC luminance Huffman table codes. |
56 | | uint8_t huff_size_ac_chrominance[256]; ///< AC chrominance Huffman table size. |
57 | | uint16_t huff_code_ac_chrominance[256]; ///< AC chrominance Huffman table codes. |
58 | | |
59 | | /** Storage for AC luminance VLC */ |
60 | | uint8_t uni_ac_vlc_len[64 * 64 * 2]; |
61 | | /** Storage for AC chrominance VLC */ |
62 | | uint8_t uni_chroma_ac_vlc_len[64 * 64 * 2]; |
63 | | |
64 | | // Default DC tables have exactly 12 values |
65 | | uint8_t bits_dc_luminance[17]; ///< DC luminance Huffman bits. |
66 | | uint8_t val_dc_luminance[12]; ///< DC luminance Huffman values. |
67 | | uint8_t bits_dc_chrominance[17]; ///< DC chrominance Huffman bits. |
68 | | uint8_t val_dc_chrominance[12]; ///< DC chrominance Huffman values. |
69 | | |
70 | | // 8-bit JPEG has max 256 values |
71 | | uint8_t bits_ac_luminance[17]; ///< AC luminance Huffman bits. |
72 | | uint8_t val_ac_luminance[256]; ///< AC luminance Huffman values. |
73 | | uint8_t bits_ac_chrominance[17]; ///< AC chrominance Huffman bits. |
74 | | uint8_t val_ac_chrominance[256]; ///< AC chrominance Huffman values. |
75 | | |
76 | | size_t huff_ncode; ///< Number of current entries in the buffer. |
77 | | struct MJpegHuffmanCode *huff_buffer; ///< Buffer for Huffman code values. |
78 | | } MJpegContext; |
79 | | |
80 | | /** |
81 | | * Enum for the Huffman encoding strategy. |
82 | | */ |
83 | | enum HuffmanTableOption { |
84 | | HUFFMAN_TABLE_DEFAULT = 0, ///< Use the default Huffman tables. |
85 | | HUFFMAN_TABLE_OPTIMAL = 1, ///< Compute and use optimal Huffman tables. |
86 | | NB_HUFFMAN_TABLE_OPTION = 2 |
87 | | }; |
88 | | |
89 | | static inline void put_marker(PutBitContext *p, enum JpegMarker code) |
90 | 75.7k | { |
91 | 75.7k | put_bits(p, 8, 0xff); |
92 | 75.7k | put_bits(p, 8, code); |
93 | 75.7k | } Unexecuted instantiation: mpegvideo_enc.c:put_marker Unexecuted instantiation: mjpegenc.c:put_marker mjpegenc_common.c:put_marker Line | Count | Source | 90 | 75.7k | { | 91 | 75.7k | put_bits(p, 8, 0xff); | 92 | 75.7k | put_bits(p, 8, code); | 93 | 75.7k | } |
|
94 | | |
95 | | typedef struct MPVEncContext MPVEncContext; |
96 | | |
97 | | int ff_mjpeg_encode_stuffing(MPVEncContext *s); |
98 | | |
99 | | #endif /* AVCODEC_MJPEGENC_H */ |