• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

libavcodec/mjpeg.c

Go to the documentation of this file.
00001 /*
00002  * MJPEG encoder and decoder
00003  * Copyright (c) 2000, 2001 Fabrice Bellard
00004  * Copyright (c) 2003 Alex Beregszaszi
00005  * Copyright (c) 2003-2004 Michael Niedermayer
00006  *
00007  * Support for external huffman table, various fixes (AVID workaround),
00008  * aspecting, new decode_frame mechanism and apple mjpeg-b support
00009  *                                  by Alex Beregszaszi
00010  *
00011  * This file is part of FFmpeg.
00012  *
00013  * FFmpeg is free software; you can redistribute it and/or
00014  * modify it under the terms of the GNU Lesser General Public
00015  * License as published by the Free Software Foundation; either
00016  * version 2.1 of the License, or (at your option) any later version.
00017  *
00018  * FFmpeg is distributed in the hope that it will be useful,
00019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00021  * Lesser General Public License for more details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public
00024  * License along with FFmpeg; if not, write to the Free Software
00025  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00026  */
00027 
00033 #include "mjpeg.h"
00034 
00035 
00036 #if 0
00037 /* These are the sample quantization tables given in JPEG spec section K.1.
00038  * The spec says that the values given produce "good" quality, and
00039  * when divided by 2, "very good" quality.
00040  */
00041 const unsigned char std_luminance_quant_tbl[64] = {
00042     16,  11,  10,  16,  24,  40,  51,  61,
00043     12,  12,  14,  19,  26,  58,  60,  55,
00044     14,  13,  16,  24,  40,  57,  69,  56,
00045     14,  17,  22,  29,  51,  87,  80,  62,
00046     18,  22,  37,  56,  68, 109, 103,  77,
00047     24,  35,  55,  64,  81, 104, 113,  92,
00048     49,  64,  78,  87, 103, 121, 120, 101,
00049     72,  92,  95,  98, 112, 100, 103,  99
00050 };
00051 const unsigned char std_chrominance_quant_tbl[64] = {
00052     17,  18,  24,  47,  99,  99,  99,  99,
00053     18,  21,  26,  66,  99,  99,  99,  99,
00054     24,  26,  56,  99,  99,  99,  99,  99,
00055     47,  66,  99,  99,  99,  99,  99,  99,
00056     99,  99,  99,  99,  99,  99,  99,  99,
00057     99,  99,  99,  99,  99,  99,  99,  99,
00058     99,  99,  99,  99,  99,  99,  99,  99,
00059     99,  99,  99,  99,  99,  99,  99,  99
00060 };
00061 #endif
00062 
00063 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
00064 /* IMPORTANT: these are only valid for 8-bit data precision! */
00065 const uint8_t ff_mjpeg_bits_dc_luminance[17] =
00066 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
00067 const uint8_t ff_mjpeg_val_dc[12] =
00068 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
00069 
00070 const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
00071 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
00072 
00073 const uint8_t ff_mjpeg_bits_ac_luminance[17] =
00074 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
00075 const uint8_t ff_mjpeg_val_ac_luminance[] =
00076 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
00077   0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
00078   0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
00079   0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
00080   0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
00081   0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
00082   0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
00083   0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
00084   0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
00085   0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
00086   0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
00087   0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
00088   0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
00089   0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
00090   0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
00091   0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
00092   0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
00093   0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
00094   0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
00095   0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
00096   0xf9, 0xfa
00097 };
00098 
00099 const uint8_t ff_mjpeg_bits_ac_chrominance[17] =
00100 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
00101 
00102 const uint8_t ff_mjpeg_val_ac_chrominance[] =
00103 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
00104   0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
00105   0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
00106   0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
00107   0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
00108   0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
00109   0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
00110   0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
00111   0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
00112   0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
00113   0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
00114   0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
00115   0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
00116   0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
00117   0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
00118   0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
00119   0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
00120   0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
00121   0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
00122   0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
00123   0xf9, 0xfa
00124 };
00125 
00126 /* isn't this function nicer than the one in the libjpeg ? */
00127 void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
00128                                   const uint8_t *bits_table,
00129                                   const uint8_t *val_table)
00130 {
00131     int i, j, k,nb, code, sym;
00132 
00133     code = 0;
00134     k = 0;
00135     for(i=1;i<=16;i++) {
00136         nb = bits_table[i];
00137         for(j=0;j<nb;j++) {
00138             sym = val_table[k++];
00139             huff_size[sym] = i;
00140             huff_code[sym] = code;
00141             code++;
00142         }
00143         code <<= 1;
00144     }
00145 }

Generated on Fri Sep 16 2011 17:17:39 for FFmpeg by  doxygen 1.7.1