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