home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wvis0626.zip / warpvision_20020626.zip / libavcodec / mjpeg.c < prev    next >
C/C++ Source or Header  |  2002-06-19  |  41KB  |  1,347 lines

  1. /*
  2.  * MJPEG encoder and decoder
  3.  * Copyright (c) 2000, 2001 Fabrice Bellard.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  * Support for external huffman table and various fixes (AVID workaround) by
  20.  *                                    Alex Beregszaszi <alex@naxine.org>
  21.  */
  22. //#define DEBUG
  23. #include "avcodec.h"
  24. #include "dsputil.h"
  25. #include "mpegvideo.h"
  26.  
  27. #ifdef USE_FASTMEMCPY
  28. #include "fastmemcpy.h"
  29. #endif
  30.  
  31. /* use two quantizer table (one for luminance and one for chrominance) */
  32. /* not yet working */
  33. #undef TWOMATRIXES
  34.  
  35. typedef struct MJpegContext {
  36.     UINT8 huff_size_dc_luminance[12];
  37.     UINT16 huff_code_dc_luminance[12];
  38.     UINT8 huff_size_dc_chrominance[12];
  39.     UINT16 huff_code_dc_chrominance[12];
  40.  
  41.     UINT8 huff_size_ac_luminance[256];
  42.     UINT16 huff_code_ac_luminance[256];
  43.     UINT8 huff_size_ac_chrominance[256];
  44.     UINT16 huff_code_ac_chrominance[256];
  45. } MJpegContext;
  46.  
  47. /* JPEG marker codes */
  48. typedef enum {
  49.     /* start of frame */
  50.     SOF0  = 0xc0,    /* baseline */
  51.     SOF1  = 0xc1,    /* extended sequential, huffman */
  52.     SOF2  = 0xc2,    /* progressive, huffman */
  53.     SOF3  = 0xc3,    /* lossless, huffman */
  54.  
  55.     SOF5  = 0xc5,    /* differential sequential, huffman */
  56.     SOF6  = 0xc6,    /* differential progressive, huffman */
  57.     SOF7  = 0xc7,    /* differential lossless, huffman */
  58.     JPG   = 0xc8,    /* reserved for JPEG extension */
  59.     SOF9  = 0xc9,    /* extended sequential, arithmetic */
  60.     SOF10 = 0xca,    /* progressive, arithmetic */
  61.     SOF11 = 0xcb,    /* lossless, arithmetic */
  62.  
  63.     SOF13 = 0xcd,    /* differential sequential, arithmetic */
  64.     SOF14 = 0xce,    /* differential progressive, arithmetic */
  65.     SOF15 = 0xcf,    /* differential lossless, arithmetic */
  66.  
  67.     DHT   = 0xc4,    /* define huffman tables */
  68.  
  69.     DAC   = 0xcc,    /* define arithmetic-coding conditioning */
  70.  
  71.     /* restart with modulo 8 count "m" */
  72.     RST0  = 0xd0,
  73.     RST1  = 0xd1,
  74.     RST2  = 0xd2,
  75.     RST3  = 0xd3,
  76.     RST4  = 0xd4,
  77.     RST5  = 0xd5,
  78.     RST6  = 0xd6,
  79.     RST7  = 0xd7,
  80.  
  81.     SOI   = 0xd8,    /* start of image */
  82.     EOI   = 0xd9,    /* end of image */
  83.     SOS   = 0xda,    /* start of scan */
  84.     DQT   = 0xdb,    /* define quantization tables */
  85.     DNL   = 0xdc,    /* define number of lines */
  86.     DRI   = 0xdd,    /* define restart interval */
  87.     DHP   = 0xde,    /* define hierarchical progression */
  88.     EXP   = 0xdf,    /* expand reference components */
  89.  
  90.     APP0  = 0xe0,
  91.     APP1  = 0xe1,
  92.     APP2  = 0xe2,
  93.     APP3  = 0xe3,
  94.     APP4  = 0xe4,
  95.     APP5  = 0xe5,
  96.     APP6  = 0xe6,
  97.     APP7  = 0xe7,
  98.     APP8  = 0xe8,
  99.     APP9  = 0xe9,
  100.     APP10 = 0xea,
  101.     APP11 = 0xeb,
  102.     APP12 = 0xec,
  103.     APP13 = 0xed,
  104.     APP14 = 0xee,
  105.     APP15 = 0xef,
  106.  
  107.     JPG0  = 0xf0,
  108.     JPG1  = 0xf1,
  109.     JPG2  = 0xf2,
  110.     JPG3  = 0xf3,
  111.     JPG4  = 0xf4,
  112.     JPG5  = 0xf5,
  113.     JPG6  = 0xf6,
  114.     JPG7  = 0xf7,
  115.     JPG8  = 0xf8,
  116.     JPG9  = 0xf9,
  117.     JPG10 = 0xfa,
  118.     JPG11 = 0xfb,
  119.     JPG12 = 0xfc,
  120.     JPG13 = 0xfd,
  121.  
  122.     COM   = 0xfe,    /* comment */
  123.  
  124.     TEM   = 0x01,    /* temporary private use for arithmetic coding */
  125.  
  126.     /* 0x02 -> 0xbf reserved */
  127. } JPEG_MARKER;
  128.  
  129. #if 0
  130. /* These are the sample quantization tables given in JPEG spec section K.1.
  131.  * The spec says that the values given produce "good" quality, and
  132.  * when divided by 2, "very good" quality.
  133.  */
  134. static const unsigned char std_luminance_quant_tbl[64] = {
  135.     16,  11,  10,  16,  24,  40,  51,  61,
  136.     12,  12,  14,  19,  26,  58,  60,  55,
  137.     14,  13,  16,  24,  40,  57,  69,  56,
  138.     14,  17,  22,  29,  51,  87,  80,  62,
  139.     18,  22,  37,  56,  68, 109, 103,  77,
  140.     24,  35,  55,  64,  81, 104, 113,  92,
  141.     49,  64,  78,  87, 103, 121, 120, 101,
  142.     72,  92,  95,  98, 112, 100, 103,  99
  143. };
  144. static const unsigned char std_chrominance_quant_tbl[64] = {
  145.     17,  18,  24,  47,  99,  99,  99,  99,
  146.     18,  21,  26,  66,  99,  99,  99,  99,
  147.     24,  26,  56,  99,  99,  99,  99,  99,
  148.     47,  66,  99,  99,  99,  99,  99,  99,
  149.     99,  99,  99,  99,  99,  99,  99,  99,
  150.     99,  99,  99,  99,  99,  99,  99,  99,
  151.     99,  99,  99,  99,  99,  99,  99,  99,
  152.     99,  99,  99,  99,  99,  99,  99,  99
  153. };
  154. #endif
  155.  
  156. /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
  157. /* IMPORTANT: these are only valid for 8-bit data precision! */
  158. static const UINT8 bits_dc_luminance[17] =
  159. { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
  160. static const UINT8 val_dc_luminance[] =
  161. { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  162.  
  163. static const UINT8 bits_dc_chrominance[17] =
  164. { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
  165. static const UINT8 val_dc_chrominance[] =
  166. { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  167.  
  168. static const UINT8 bits_ac_luminance[17] =
  169. { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
  170. static const UINT8 val_ac_luminance[] =
  171. { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
  172.   0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
  173.   0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
  174.   0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
  175.   0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
  176.   0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
  177.   0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
  178.   0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  179.   0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
  180.   0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
  181.   0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  182.   0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
  183.   0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
  184.   0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  185.   0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
  186.   0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
  187.   0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
  188.   0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
  189.   0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
  190.   0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  191.   0xf9, 0xfa 
  192. };
  193.  
  194. static const UINT8 bits_ac_chrominance[17] =
  195. { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
  196.  
  197. static const UINT8 val_ac_chrominance[] =
  198. { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
  199.   0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
  200.   0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
  201.   0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
  202.   0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
  203.   0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
  204.   0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
  205.   0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
  206.   0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
  207.   0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
  208.   0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
  209.   0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  210.   0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
  211.   0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
  212.   0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
  213.   0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
  214.   0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
  215.   0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
  216.   0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
  217.   0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  218.   0xf9, 0xfa 
  219. };
  220.  
  221. /* isn't this function nicer than the one in the libjpeg ? */
  222. static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code,
  223.                                 const UINT8 *bits_table, const UINT8 *val_table)
  224. {
  225.     int i, j, k,nb, code, sym;
  226.  
  227.     code = 0;
  228.     k = 0;
  229.     for(i=1;i<=16;i++) {
  230.         nb = bits_table[i];
  231.         for(j=0;j<nb;j++) {
  232.             sym = val_table[k++];
  233.             huff_size[sym] = i;
  234.             huff_code[sym] = code;
  235.             code++;
  236.         }
  237.         code <<= 1;
  238.     }
  239. }
  240.  
  241. int mjpeg_init(MpegEncContext *s)
  242. {
  243.     MJpegContext *m;
  244.     
  245.     m = av_malloc(sizeof(MJpegContext));
  246.     if (!m)
  247.         return -1;
  248.     
  249.     s->min_qcoeff=-1023;
  250.     s->max_qcoeff= 1023;
  251.     s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
  252.  
  253.     /* build all the huffman tables */
  254.     build_huffman_codes(m->huff_size_dc_luminance,
  255.                         m->huff_code_dc_luminance,
  256.                         bits_dc_luminance,
  257.                         val_dc_luminance);
  258.     build_huffman_codes(m->huff_size_dc_chrominance,
  259.                         m->huff_code_dc_chrominance,
  260.                         bits_dc_chrominance,
  261.                         val_dc_chrominance);
  262.     build_huffman_codes(m->huff_size_ac_luminance,
  263.                         m->huff_code_ac_luminance,
  264.                         bits_ac_luminance,
  265.                         val_ac_luminance);
  266.     build_huffman_codes(m->huff_size_ac_chrominance,
  267.                         m->huff_code_ac_chrominance,
  268.                         bits_ac_chrominance,
  269.                         val_ac_chrominance);
  270.     
  271.     s->mjpeg_ctx = m;
  272.     return 0;
  273. }
  274.  
  275. void mjpeg_close(MpegEncContext *s)
  276. {
  277.     av_free(s->mjpeg_ctx);
  278. }
  279.  
  280. static inline void put_marker(PutBitContext *p, int code)
  281. {
  282.     put_bits(p, 8, 0xff);
  283.     put_bits(p, 8, code);
  284. }
  285.  
  286. /* table_class: 0 = DC coef, 1 = AC coefs */
  287. static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
  288.                              const UINT8 *bits_table, const UINT8 *value_table)
  289. {
  290.     PutBitContext *p = &s->pb;
  291.     int n, i;
  292.  
  293.     put_bits(p, 4, table_class);
  294.     put_bits(p, 4, table_id);
  295.  
  296.     n = 0;
  297.     for(i=1;i<=16;i++) {
  298.         n += bits_table[i];
  299.         put_bits(p, 8, bits_table[i]);
  300.     }
  301.  
  302.     for(i=0;i<n;i++)
  303.         put_bits(p, 8, value_table[i]);
  304.  
  305.     return n + 17;
  306. }
  307.  
  308. static void jpeg_table_header(MpegEncContext *s)
  309. {
  310.     PutBitContext *p = &s->pb;
  311.     int i, j, size;
  312.     UINT8 *ptr;
  313.  
  314.     /* quant matrixes */
  315.     put_marker(p, DQT);
  316. #ifdef TWOMATRIXES
  317.     put_bits(p, 16, 2 + 2 * (1 + 64));
  318. #else
  319.     put_bits(p, 16, 2 + 1 * (1 + 64));
  320. #endif
  321.     put_bits(p, 4, 0); /* 8 bit precision */
  322.     put_bits(p, 4, 0); /* table 0 */
  323.     for(i=0;i<64;i++) {
  324.         j = zigzag_direct[i];
  325.         put_bits(p, 8, s->intra_matrix[j]);
  326.     }
  327. #ifdef TWOMATRIXES
  328.     put_bits(p, 4, 0); /* 8 bit precision */
  329.     put_bits(p, 4, 1); /* table 1 */
  330.     for(i=0;i<64;i++) {
  331.         j = zigzag_direct[i];
  332.         put_bits(p, 8, s->chroma_intra_matrix[j]);
  333.     }
  334. #endif
  335.  
  336.     /* huffman table */
  337.     put_marker(p, DHT);
  338.     flush_put_bits(p);
  339.     ptr = pbBufPtr(p);
  340.     put_bits(p, 16, 0); /* patched later */
  341.     size = 2;
  342.     size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
  343.     size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
  344.     
  345.     size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
  346.     size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
  347.     ptr[0] = size >> 8;
  348.     ptr[1] = size;
  349. }
  350.  
  351. static void jpeg_put_comments(MpegEncContext *s)
  352. {
  353.     PutBitContext *p = &s->pb;
  354.     int size;
  355.     UINT8 *ptr;
  356.  
  357. #if 0
  358.     /* JFIF header */
  359.     put_marker(p, APP0);
  360.     put_bits(p, 16, 16);
  361.     put_string(p, "JFIF"); /* this puts the trailing zero-byte too */
  362.     put_bits(p, 16, 0x101);
  363.     put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
  364.     put_bits(p, 16, 1); /* aspect: 1:1 */
  365.     put_bits(p, 16, 1);
  366.     put_bits(p, 8, 0); /* thumbnail width */
  367.     put_bits(p, 8, 0); /* thumbnail height */
  368. #endif
  369.  
  370.     /* comment */
  371.     put_marker(p, COM);
  372.     flush_put_bits(p);
  373.     ptr = pbBufPtr(p);
  374.     put_bits(p, 16, 0); /* patched later */
  375. #define VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
  376.     put_string(p, VERSION);
  377.     size = strlen(VERSION)+3;
  378. #undef VERSION
  379.     ptr[0] = size >> 8;
  380.     ptr[1] = size;
  381. }
  382.  
  383. void mjpeg_picture_header(MpegEncContext *s)
  384. {
  385.     put_marker(&s->pb, SOI);
  386.  
  387.     if (!s->mjpeg_data_only_frames)
  388.     {
  389.     jpeg_put_comments(s);    
  390.  
  391.     if (s->mjpeg_write_tables) jpeg_table_header(s);
  392.  
  393.     put_marker(&s->pb, SOF0);
  394.  
  395.     put_bits(&s->pb, 16, 17);
  396.     put_bits(&s->pb, 8, 8); /* 8 bits/component */
  397.     put_bits(&s->pb, 16, s->height);
  398.     put_bits(&s->pb, 16, s->width);
  399.     put_bits(&s->pb, 8, 3); /* 3 components */
  400.     
  401.     /* Y component */
  402.     put_bits(&s->pb, 8, 1); /* component number */
  403.     put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
  404.     put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
  405.     put_bits(&s->pb, 8, 0); /* select matrix */
  406.     
  407.     /* Cb component */
  408.     put_bits(&s->pb, 8, 2); /* component number */
  409.     put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
  410.     put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
  411. #ifdef TWOMATRIXES
  412.     put_bits(&s->pb, 8, 1); /* select matrix */
  413. #else
  414.     put_bits(&s->pb, 8, 0); /* select matrix */
  415. #endif
  416.  
  417.     /* Cr component */
  418.     put_bits(&s->pb, 8, 3); /* component number */
  419.     put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
  420.     put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
  421. #ifdef TWOMATRIXES
  422.     put_bits(&s->pb, 8, 1); /* select matrix */
  423. #else
  424.     put_bits(&s->pb, 8, 0); /* select matrix */
  425. #endif
  426.     }
  427.  
  428.     /* scan header */
  429.     put_marker(&s->pb, SOS);
  430.     put_bits(&s->pb, 16, 12); /* length */
  431.     put_bits(&s->pb, 8, 3); /* 3 components */
  432.     
  433.     /* Y component */
  434.     put_bits(&s->pb, 8, 1); /* index */
  435.     put_bits(&s->pb, 4, 0); /* DC huffman table index */
  436.     put_bits(&s->pb, 4, 0); /* AC huffman table index */
  437.     
  438.     /* Cb component */
  439.     put_bits(&s->pb, 8, 2); /* index */
  440.     put_bits(&s->pb, 4, 1); /* DC huffman table index */
  441.     put_bits(&s->pb, 4, 1); /* AC huffman table index */
  442.     
  443.     /* Cr component */
  444.     put_bits(&s->pb, 8, 3); /* index */
  445.     put_bits(&s->pb, 4, 1); /* DC huffman table index */
  446.     put_bits(&s->pb, 4, 1); /* AC huffman table index */
  447.  
  448.     put_bits(&s->pb, 8, 0); /* Ss (not used) */
  449.     put_bits(&s->pb, 8, 63); /* Se (not used) */
  450.     put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
  451. }
  452.  
  453. void mjpeg_picture_trailer(MpegEncContext *s)
  454. {
  455.     jflush_put_bits(&s->pb);
  456.     put_marker(&s->pb, EOI);
  457. }
  458.  
  459. static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
  460.                    UINT8 *huff_size, UINT16 *huff_code)
  461. {
  462.     int mant, nbits;
  463.  
  464.     if (val == 0) {
  465.         jput_bits(&s->pb, huff_size[0], huff_code[0]);
  466.     } else {
  467.         mant = val;
  468.         if (val < 0) {
  469.             val = -val;
  470.             mant--;
  471.         }
  472.         
  473.         /* compute the log (XXX: optimize) */
  474.         nbits = 0;
  475.         while (val != 0) {
  476.             val = val >> 1;
  477.             nbits++;
  478.         }
  479.             
  480.         jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
  481.         
  482.         jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
  483.     }
  484. }
  485.  
  486. static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
  487. {
  488.     int mant, nbits, code, i, j;
  489.     int component, dc, run, last_index, val;
  490.     MJpegContext *m = s->mjpeg_ctx;
  491.     UINT8 *huff_size_ac;
  492.     UINT16 *huff_code_ac;
  493.     
  494.     /* DC coef */
  495.     component = (n <= 3 ? 0 : n - 4 + 1);
  496.     dc = block[0]; /* overflow is impossible */
  497.     val = dc - s->last_dc[component];
  498.     if (n < 4) {
  499.         mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
  500.         huff_size_ac = m->huff_size_ac_luminance;
  501.         huff_code_ac = m->huff_code_ac_luminance;
  502.     } else {
  503.         mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
  504.         huff_size_ac = m->huff_size_ac_chrominance;
  505.         huff_code_ac = m->huff_code_ac_chrominance;
  506.     }
  507.     s->last_dc[component] = dc;
  508.     
  509.     /* AC coefs */
  510.     
  511.     run = 0;
  512.     last_index = s->block_last_index[n];
  513.     for(i=1;i<=last_index;i++) {
  514.         j = zigzag_direct[i];
  515.         val = block[j];
  516.         if (val == 0) {
  517.             run++;
  518.         } else {
  519.             while (run >= 16) {
  520.                 jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
  521.                 run -= 16;
  522.             }
  523.             mant = val;
  524.             if (val < 0) {
  525.                 val = -val;
  526.                 mant--;
  527.             }
  528.             
  529.             /* compute the log (XXX: optimize) */
  530.             nbits = 0;
  531.             while (val != 0) {
  532.                 val = val >> 1;
  533.                 nbits++;
  534.             }
  535.             code = (run << 4) | nbits;
  536.  
  537.             jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
  538.         
  539.             jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
  540.             run = 0;
  541.         }
  542.     }
  543.  
  544.     /* output EOB only if not already 64 values */
  545.     if (last_index < 63 || run != 0)
  546.         jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
  547. }
  548.  
  549. void mjpeg_encode_mb(MpegEncContext *s, 
  550.                      DCTELEM block[6][64])
  551. {
  552.     int i;
  553.     for(i=0;i<6;i++) {
  554.         encode_block(s, block[i], i);
  555.     }
  556. }
  557.  
  558. /******************************************/
  559. /* decoding */
  560.  
  561. /* compressed picture size */
  562. #define PICTURE_BUFFER_SIZE 100000
  563.  
  564. #define MAX_COMPONENTS 4
  565.  
  566. typedef struct MJpegDecodeContext {
  567.     AVCodecContext *avctx;
  568.     GetBitContext gb;
  569.     UINT32 header_state;
  570.     int start_code; /* current start code */
  571.     UINT8 *buf_ptr;
  572.     int buffer_size;
  573.     int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
  574.     INT16 quant_matrixes[4][64];
  575.     VLC vlcs[2][4];
  576.  
  577.     int org_width, org_height;  /* size given at codec init */
  578.     int first_picture;    /* true if decoding first picture */
  579.     int interlaced;     /* true if interlaced */
  580.     int bottom_field;   /* true if bottom field */
  581.  
  582.     int width, height;
  583.     int nb_components;
  584.     int component_id[MAX_COMPONENTS];
  585.     int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
  586.     int v_count[MAX_COMPONENTS];
  587.     int h_max, v_max; /* maximum h and v counts */
  588.     int quant_index[4];   /* quant table index for each component */
  589.     int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
  590.     UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */
  591.     int linesize[MAX_COMPONENTS];
  592.     DCTELEM block[64] __align8;
  593.     UINT8 buffer[PICTURE_BUFFER_SIZE]; 
  594.  
  595.     int buggy_avid;
  596.     int restart_interval;
  597.     int restart_count;
  598.     int interleaved_rows;
  599. } MJpegDecodeContext;
  600.  
  601. #define SKIP_REMAINING(gb, len) { \
  602.     dprintf("reamining %d bytes in marker\n", len); \
  603.     if (len) while (--len) \
  604.     skip_bits(gb, 8); \
  605. }
  606.  
  607. static int mjpeg_decode_dht(MJpegDecodeContext *s, UINT8 *buf, int buf_size);
  608.  
  609. static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table, 
  610.                       int nb_codes)
  611. {
  612.     UINT8 huff_size[256];
  613.     UINT16 huff_code[256];
  614.  
  615.     memset(huff_size, 0, sizeof(huff_size));
  616.     build_huffman_codes(huff_size, huff_code, bits_table, val_table);
  617.     
  618.     init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
  619. }
  620.  
  621. static int mjpeg_decode_init(AVCodecContext *avctx)
  622. {
  623.     MJpegDecodeContext *s = avctx->priv_data;
  624.  
  625.     s->avctx = avctx;
  626.  
  627.     s->header_state = 0;
  628.     s->mpeg_enc_ctx_allocated = 0;
  629.     s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
  630.                                                  account FF 00 case */
  631.     s->start_code = -1;
  632.     s->buf_ptr = s->buffer;
  633.     s->first_picture = 1;
  634.     s->org_width = avctx->width;
  635.     s->org_height = avctx->height;
  636.  
  637.     build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
  638.     build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
  639.     build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
  640.     build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
  641.     
  642.     if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
  643.     {
  644.     printf("mjpeg: using external huffman table\n");
  645.     mjpeg_decode_dht(s, avctx->extradata, avctx->extradata_size);
  646.     /* should check for error - but dunno */
  647.     }
  648.     return 0;
  649. }
  650.  
  651. /* quantize tables */
  652. static int mjpeg_decode_dqt(MJpegDecodeContext *s,
  653.                             UINT8 *buf, int buf_size)
  654. {
  655.     int len, index, i, j;
  656.     init_get_bits(&s->gb, buf, buf_size);
  657.     
  658.     len = get_bits(&s->gb, 16) - 2;
  659.  
  660.     while (len >= 65) {
  661.         /* only 8 bit precision handled */
  662.         if (get_bits(&s->gb, 4) != 0)
  663.     {
  664.         dprintf("dqt: 16bit precision\n");
  665.             return -1;
  666.     }
  667.         index = get_bits(&s->gb, 4);
  668.         if (index >= 4)
  669.             return -1;
  670.         dprintf("index=%d\n", index);
  671.         /* read quant table */
  672.         for(i=0;i<64;i++) {
  673.             j = zigzag_direct[i];
  674.         s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
  675.         }
  676.         len -= 65;
  677.     }
  678.     
  679.     SKIP_REMAINING(&s->gb, len);
  680.  
  681.     return 0;
  682. }
  683.  
  684. /* decode huffman tables and build VLC decoders */
  685. static int mjpeg_decode_dht(MJpegDecodeContext *s,
  686.                             UINT8 *buf, int buf_size)
  687. {
  688.     int len, index, i, class, n, v, code_max;
  689.     UINT8 bits_table[17];
  690.     UINT8 val_table[256];
  691.     
  692.     init_get_bits(&s->gb, buf, buf_size);
  693.  
  694.     len = get_bits(&s->gb, 16);
  695.     len -= 2;
  696.  
  697.     while (len > 0) {
  698.         if (len < 17)
  699.             return -1;
  700.         class = get_bits(&s->gb, 4);
  701.         if (class >= 2)
  702.             return -1;
  703.         index = get_bits(&s->gb, 4);
  704.         if (index >= 4)
  705.             return -1;
  706.         n = 0;
  707.         for(i=1;i<=16;i++) {
  708.             bits_table[i] = get_bits(&s->gb, 8);
  709.             n += bits_table[i];
  710.         }
  711.         len -= 17;
  712.         if (len < n || n > 256)
  713.             return -1;
  714.  
  715.         code_max = 0;
  716.         for(i=0;i<n;i++) {
  717.             v = get_bits(&s->gb, 8);
  718.             if (v > code_max)
  719.                 code_max = v;
  720.             val_table[i] = v;
  721.         }
  722.         len -= n;
  723.  
  724.         /* build VLC and flush previous vlc if present */
  725.         free_vlc(&s->vlcs[class][index]);
  726.         dprintf("class=%d index=%d nb_codes=%d\n",
  727.                class, index, code_max + 1);
  728.         build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1);
  729.     }
  730.     return 0;
  731. }
  732.  
  733. static int mjpeg_decode_sof0(MJpegDecodeContext *s,
  734.                              UINT8 *buf, int buf_size)
  735. {
  736.     int len, nb_components, i, width, height;
  737.  
  738.     init_get_bits(&s->gb, buf, buf_size);
  739.  
  740.     /* XXX: verify len field validity */
  741.     len = get_bits(&s->gb, 16);
  742.     /* only 8 bits/component accepted */
  743.     if (get_bits(&s->gb, 8) != 8)
  744.         return -1;
  745.     height = get_bits(&s->gb, 16);
  746.     width = get_bits(&s->gb, 16);
  747.     dprintf("sof0: picture: %dx%d\n", width, height);
  748.  
  749.     nb_components = get_bits(&s->gb, 8);
  750.     if (nb_components <= 0 ||
  751.         nb_components > MAX_COMPONENTS)
  752.         return -1;
  753.     s->nb_components = nb_components;
  754.     s->h_max = 1;
  755.     s->v_max = 1;
  756.     for(i=0;i<nb_components;i++) {
  757.         /* component id */
  758.         s->component_id[i] = get_bits(&s->gb, 8) - 1;
  759.         s->h_count[i] = get_bits(&s->gb, 4);
  760.         s->v_count[i] = get_bits(&s->gb, 4);
  761.         /* compute hmax and vmax (only used in interleaved case) */
  762.         if (s->h_count[i] > s->h_max)
  763.             s->h_max = s->h_count[i];
  764.         if (s->v_count[i] > s->v_max)
  765.             s->v_max = s->v_count[i];
  766.         s->quant_index[i] = get_bits(&s->gb, 8);
  767.         if (s->quant_index[i] >= 4)
  768.             return -1;
  769.         dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
  770.         s->v_count[i], s->component_id[i], s->quant_index[i]);
  771.     }
  772.  
  773.     /* if different size, realloc/alloc picture */
  774.     /* XXX: also check h_count and v_count */
  775.     if (width != s->width || height != s->height) {
  776.         for(i=0;i<MAX_COMPONENTS;i++)
  777.             av_freep(&s->current_picture[i]);
  778.         s->width = width;
  779.         s->height = height;
  780.         /* test interlaced mode */
  781.         if (s->first_picture &&
  782.             s->org_height != 0 &&
  783.             s->height < ((s->org_height * 3) / 4)) {
  784.             s->interlaced = 1;
  785.         s->bottom_field = 0;
  786.         }
  787.  
  788.         for(i=0;i<nb_components;i++) {
  789.             int w, h;
  790.             w = (s->width  + 8 * s->h_max - 1) / (8 * s->h_max);
  791.             h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max);
  792.             w = w * 8 * s->h_count[i];
  793.             h = h * 8 * s->v_count[i];
  794.             if (s->interlaced)
  795.                 w *= 2;
  796.             s->linesize[i] = w;
  797.             /* memory test is done in mjpeg_decode_sos() */
  798.             s->current_picture[i] = av_mallocz(w * h);
  799.         }
  800.         s->first_picture = 0;
  801.     }
  802.  
  803.     if (len != (8+(3*nb_components)))
  804.     {
  805.     dprintf("decode_sof0: error, len(%d) mismatch\n", len);
  806.     }
  807.     
  808.     return 0;
  809. }
  810.  
  811. static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
  812. {
  813.     int code, diff;
  814.  
  815.     code = get_vlc(&s->gb, &s->vlcs[0][dc_index]);
  816.     if (code < 0)
  817.     {
  818.     dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
  819.                 &s->vlcs[0][dc_index]);
  820.         return 0xffff;
  821.     }
  822.     if (code == 0) {
  823.         diff = 0;
  824.     } else {
  825.         diff = get_bits(&s->gb, code);
  826.         if ((diff & (1 << (code - 1))) == 0) 
  827.             diff = (-1 << code) | (diff + 1);
  828.     }
  829.     return diff;
  830. }
  831.  
  832. /* decode block and dequantize */
  833. static int decode_block(MJpegDecodeContext *s, DCTELEM *block, 
  834.                         int component, int dc_index, int ac_index, int quant_index)
  835. {
  836.     int nbits, code, i, j, level;
  837.     int run, val;
  838.     VLC *ac_vlc;
  839.     INT16 *quant_matrix;
  840.  
  841.     /* DC coef */
  842.     val = mjpeg_decode_dc(s, dc_index);
  843.     if (val == 0xffff) {
  844.         dprintf("error dc\n");
  845.         return -1;
  846.     }
  847.     quant_matrix = s->quant_matrixes[quant_index];
  848.     val = val * quant_matrix[0] + s->last_dc[component];
  849.     s->last_dc[component] = val;
  850.     block[0] = val;
  851.     /* AC coefs */
  852.     ac_vlc = &s->vlcs[1][ac_index];
  853.     i = 1;
  854.     for(;;) {
  855.         code = get_vlc(&s->gb, ac_vlc);
  856.         if (code < 0) {
  857.             dprintf("error ac\n");
  858.             return -1;
  859.         }
  860.         /* EOB */
  861.         if (code == 0)
  862.             break;
  863.         if (code == 0xf0) {
  864.             i += 16;
  865.         } else {
  866.             run = code >> 4;
  867.             nbits = code & 0xf;
  868.             level = get_bits(&s->gb, nbits);
  869.             if ((level & (1 << (nbits - 1))) == 0) 
  870.                 level = (-1 << nbits) | (level + 1);
  871.             i += run;
  872.             if (i >= 64) {
  873.                 dprintf("error count: %d\n", i);
  874.                 return -1;
  875.             }
  876.             j = zigzag_direct[i];
  877.             block[j] = level * quant_matrix[j];
  878.             i++;
  879.             if (i >= 64)
  880.                 break;
  881.         }
  882.     }
  883.     return 0;
  884. }
  885.  
  886. static int mjpeg_decode_sos(MJpegDecodeContext *s,
  887.                             UINT8 *buf, int buf_size)
  888. {
  889.     int len, nb_components, i, j, n, h, v, ret;
  890.     int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
  891.     int comp_index[4];
  892.     int dc_index[4];
  893.     int ac_index[4];
  894.     int nb_blocks[4];
  895.     int h_count[4];
  896.     int v_count[4];
  897.     
  898.     init_get_bits(&s->gb, buf, buf_size);
  899.     /* XXX: verify len field validity */
  900.     len = get_bits(&s->gb, 16);
  901.     nb_components = get_bits(&s->gb, 8);
  902.     /* XXX: only interleaved scan accepted */
  903.     if (nb_components != 3)
  904.     {
  905.     dprintf("decode_sos: components(%d) mismatch\n", nb_components);
  906.         return -1;
  907.     }
  908.     vmax = 0;
  909.     hmax = 0;
  910.     for(i=0;i<nb_components;i++) {
  911.         id = get_bits(&s->gb, 8) - 1;
  912.     dprintf("component: %d\n", id);
  913.         /* find component index */
  914.         for(index=0;index<s->nb_components;index++)
  915.             if (id == s->component_id[index])
  916.                 break;
  917.         if (index == s->nb_components)
  918.     {
  919.         dprintf("decode_sos: index(%d) out of components\n", index);
  920.             return -1;
  921.     }
  922.  
  923.         comp_index[i] = index;
  924.         nb_blocks[i] = s->h_count[index] * s->v_count[index];
  925.         h_count[i] = s->h_count[index];
  926.         v_count[i] = s->v_count[index];
  927.  
  928.         dc_index[i] = get_bits(&s->gb, 4);
  929.         ac_index[i] = get_bits(&s->gb, 4);
  930.  
  931.     if (dc_index[i] < 0 || ac_index[i] < 0 ||
  932.         dc_index[i] >= 4 || ac_index[i] >= 4)
  933.         goto out_of_range;
  934.     switch(s->start_code)
  935.     {
  936.         case SOF0:
  937.         if (dc_index[i] > 1 || ac_index[i] > 1)
  938.             goto out_of_range;
  939.         break;
  940.         case SOF1:
  941.         case SOF2:
  942.         if (dc_index[i] > 3 || ac_index[i] > 3)
  943.             goto out_of_range;
  944.         break;
  945.         case SOF3:
  946.         if (dc_index[i] > 3 || ac_index[i] != 0)
  947.             goto out_of_range;
  948.         break;    
  949.     }
  950.     }
  951.     skip_bits(&s->gb, 8); /* Ss */
  952.     skip_bits(&s->gb, 8); /* Se */
  953.     skip_bits(&s->gb, 8); /* Ah and Al (each are 4 bits) */
  954.  
  955.     for(i=0;i<nb_components;i++) 
  956.         s->last_dc[i] = 1024;
  957.  
  958.     if (nb_components > 1) {
  959.         /* interleaved stream */
  960.         mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
  961.         mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
  962.     } else {
  963.         h = s->h_max / s->h_count[comp_index[0]];
  964.         v = s->v_max / s->v_count[comp_index[0]];
  965.         mb_width = (s->width + h * 8 - 1) / (h * 8);
  966.         mb_height = (s->height + v * 8 - 1) / (v * 8);
  967.         nb_blocks[0] = 1;
  968.         h_count[0] = 1;
  969.         v_count[0] = 1;
  970.     }
  971.  
  972.     for(mb_y = 0; mb_y < mb_height; mb_y++) {
  973.         for(mb_x = 0; mb_x < mb_width; mb_x++) {
  974.             for(i=0;i<nb_components;i++) {
  975.                 UINT8 *ptr;
  976.                 int x, y, c;
  977.                 n = nb_blocks[i];
  978.                 c = comp_index[i];
  979.                 h = h_count[i];
  980.                 v = v_count[i];
  981.                 x = 0;
  982.                 y = 0;
  983.         if (s->restart_interval && !s->restart_count)
  984.             s->restart_count = s->restart_interval;
  985.                 for(j=0;j<n;j++) {
  986.                     memset(s->block, 0, sizeof(s->block));
  987.                     if (decode_block(s, s->block, i, 
  988.                                      dc_index[i], ac_index[i], 
  989.                                      s->quant_index[c]) < 0) {
  990.                         dprintf("error y=%d x=%d\n", mb_y, mb_x);
  991.                         ret = -1;
  992.                         goto the_end;
  993.                     }
  994. //            dprintf("mb: %d %d processed\n", mb_y, mb_x);
  995.                     ptr = s->current_picture[c] + 
  996.                         (s->linesize[c] * (v * mb_y + y) * 8) + 
  997.                         (h * mb_x + x) * 8;
  998.                     if (s->interlaced && s->bottom_field)
  999.                         ptr += s->linesize[c] >> 1;
  1000.                     ff_idct_put(ptr, s->linesize[c], s->block);
  1001.                     if (++x == h) {
  1002.                         x = 0;
  1003.                         y++;
  1004.                     }
  1005.                 }
  1006.             }
  1007.         }
  1008.     }
  1009.     ret = 0;
  1010.  the_end:
  1011.     emms_c();
  1012.     return ret;
  1013.  out_of_range:
  1014.     dprintf("decode_sos: ac/dc index out of range\n");
  1015.     return -1;
  1016. }
  1017.  
  1018. static int mjpeg_decode_dri(MJpegDecodeContext *s,
  1019.                              UINT8 *buf, int buf_size)
  1020. {
  1021.     init_get_bits(&s->gb, buf, buf_size);
  1022.  
  1023.     if (get_bits(&s->gb, 16) != 4)
  1024.     return -1;
  1025.     s->restart_interval = get_bits(&s->gb, 16);
  1026. //    printf("restart interval: %d\n", s->restart_interval);
  1027.  
  1028.     return 0;
  1029. }
  1030.  
  1031. #define FOURCC(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | d)
  1032. static int mjpeg_decode_app(MJpegDecodeContext *s,
  1033.                              UINT8 *buf, int buf_size, int start_code)
  1034. {
  1035.     int len, id;
  1036.  
  1037.     init_get_bits(&s->gb, buf, buf_size);
  1038.  
  1039.     /* XXX: verify len field validity */
  1040.     len = get_bits(&s->gb, 16);
  1041.     if (len < 5)
  1042.     return -1;
  1043.  
  1044.     id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
  1045.     len -= 6;
  1046.  
  1047.     /* buggy AVID, it puts EOI only at every 10th frame */
  1048.     /* also this fourcc is used by non-avid files too, it means
  1049.        interleaving, but it's always present in AVID files */
  1050.     if (id == FOURCC('A','V','I','1'))
  1051.     {
  1052.     /* structure:
  1053.         4bytes    AVI1
  1054.         1bytes    polarity
  1055.         1bytes    always zero
  1056.         4bytes    field_size
  1057.         4bytes    field_size_less_padding
  1058.     */
  1059.         s->buggy_avid = 1;
  1060.     if (s->first_picture)
  1061.         printf("mjpeg: workarounding buggy AVID\n");
  1062.     s->interleaved_rows = get_bits(&s->gb, 8);
  1063. #if 0
  1064.     skip_bits(&s->gb, 8);
  1065.     skip_bits(&s->gb, 32);
  1066.     skip_bits(&s->gb, 32);
  1067.     len -= 10;
  1068. #endif
  1069.     if (s->interleaved_rows)
  1070.         printf("mjpeg: interleaved rows: %d\n", s->interleaved_rows);
  1071.     goto out;
  1072.     }
  1073.     
  1074.     len -= 2;
  1075.     
  1076.     if (id == FOURCC('J','F','I','F'))
  1077.     {
  1078.     skip_bits(&s->gb, 8); /* the trailing zero-byte */
  1079.     printf("mjpeg: JFIF header found (version: %x.%x)\n",
  1080.         get_bits(&s->gb, 8), get_bits(&s->gb, 8));
  1081.     goto out;
  1082.     }
  1083.     
  1084.     /* Apple MJPEG-A */
  1085.     if ((start_code == APP1) && (len > (0x28 - 8)))
  1086.     {
  1087.     id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
  1088.     len -= 4;
  1089.         if (id == FOURCC('m','j','p','g')) /* Apple MJPEG-A */
  1090.     {
  1091. #if 0
  1092.         skip_bits(&s->gb, 32); /* field size */
  1093.         skip_bits(&s->gb, 32); /* pad field size */
  1094.         skip_bits(&s->gb, 32); /* next off */
  1095.         skip_bits(&s->gb, 32); /* quant off */
  1096.         skip_bits(&s->gb, 32); /* huff off */
  1097.         skip_bits(&s->gb, 32); /* image off */
  1098.         skip_bits(&s->gb, 32); /* scan off */
  1099.         skip_bits(&s->gb, 32); /* data off */
  1100. #endif
  1101.         if (s->first_picture)
  1102.         printf("mjpeg: Apple MJPEG-A header found\n");
  1103.     }
  1104.     }
  1105.  
  1106. out:
  1107.     /* should check for further values.. */
  1108.     SKIP_REMAINING(&s->gb, len);
  1109.  
  1110.     return 0;
  1111. }
  1112. #undef FOURCC
  1113.  
  1114. static int mjpeg_decode_com(MJpegDecodeContext *s,
  1115.                              UINT8 *buf, int buf_size)
  1116. {
  1117.     int len, i;
  1118.     UINT8 *cbuf;
  1119.  
  1120.     init_get_bits(&s->gb, buf, buf_size);
  1121.  
  1122.     /* XXX: verify len field validity */
  1123.     len = get_bits(&s->gb, 16)-2;
  1124.     cbuf = av_malloc(len+1);
  1125.  
  1126.     for (i = 0; i < len; i++)
  1127.     cbuf[i] = get_bits(&s->gb, 8);
  1128.     if (cbuf[i-1] == '\n')
  1129.     cbuf[i-1] = 0;
  1130.     else
  1131.     cbuf[i] = 0;
  1132.  
  1133.     printf("mjpeg comment: '%s'\n", cbuf);
  1134.  
  1135.     /* buggy avid, it puts EOI only at every 10th frame */
  1136.     if (!strcmp(cbuf, "AVID"))
  1137.     {
  1138.     s->buggy_avid = 1;
  1139.     if (s->first_picture)
  1140.         printf("mjpeg: workarounding buggy AVID\n");
  1141.     }
  1142.     
  1143.     av_free(cbuf);
  1144.  
  1145.     return 0;
  1146. }
  1147.  
  1148. /* return the 8 bit start code value and update the search
  1149.    state. Return -1 if no start code found */
  1150. static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end, 
  1151.                        UINT32 *header_state)
  1152. {
  1153.     UINT8 *buf_ptr;
  1154.     unsigned int state, v;
  1155.     int val;
  1156.  
  1157.     state = *header_state;
  1158.     buf_ptr = *pbuf_ptr;
  1159.     if (state) {
  1160.         /* get marker */
  1161.     found:
  1162.         if (buf_ptr < buf_end) {
  1163.             val = *buf_ptr++;
  1164.             state = 0;
  1165.         } else {
  1166.             val = -1;
  1167.         }
  1168.     } else {
  1169.         while (buf_ptr < buf_end) {
  1170.             v = *buf_ptr++;
  1171.             if (v == 0xff) {
  1172.                 state = 1;
  1173.                 goto found;
  1174.             }
  1175.         }
  1176.         val = -1;
  1177.     }
  1178.     *pbuf_ptr = buf_ptr;
  1179.     *header_state = state;
  1180.     return val;
  1181. }
  1182.  
  1183. static int mjpeg_decode_frame(AVCodecContext *avctx, 
  1184.                               void *data, int *data_size,
  1185.                               UINT8 *buf, int buf_size)
  1186. {
  1187.     MJpegDecodeContext *s = avctx->priv_data;
  1188.     UINT8 *buf_end, *buf_ptr, *buf_start;
  1189.     int len, code, input_size, i;
  1190.     AVPicture *picture = data;
  1191.     unsigned int start_code;
  1192.  
  1193.     *data_size = 0;
  1194.  
  1195.     /* no supplementary picture */
  1196.     if (buf_size == 0)
  1197.         return 0;
  1198.  
  1199.     buf_ptr = buf;
  1200.     buf_end = buf + buf_size;
  1201.     while (buf_ptr < buf_end) {
  1202.         buf_start = buf_ptr;
  1203.         /* find start next marker */
  1204.         code = find_marker(&buf_ptr, buf_end, &s->header_state);
  1205.         /* copy to buffer */
  1206.         len = buf_ptr - buf_start;
  1207.         if (len + (s->buf_ptr - s->buffer) > s->buffer_size) {
  1208.             /* data too big : flush */
  1209.             s->buf_ptr = s->buffer;
  1210.             if (code > 0)
  1211.                 s->start_code = code;
  1212.         } else {
  1213.             memcpy(s->buf_ptr, buf_start, len);
  1214.             s->buf_ptr += len;
  1215.             if (code < 0) {
  1216.                 /* nothing to do: wait next marker */
  1217.             } else if (code == 0 || code == 0xff) {
  1218.                 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */
  1219.                 /* valid marker code is between 00 and ff - alex */
  1220.                 s->buf_ptr--;
  1221.             } else {
  1222.                 /* prepare data for next start code */
  1223.                 input_size = s->buf_ptr - s->buffer;
  1224.                 start_code = s->start_code;
  1225.                 s->buf_ptr = s->buffer;
  1226.                 s->start_code = code;
  1227.                 dprintf("marker=%x\n", start_code);
  1228.                 switch(start_code) {
  1229.                 case SOI:
  1230.             s->restart_interval = 0;
  1231.                     /* nothing to do on SOI */
  1232.                     break;
  1233.                 case DQT:
  1234.                     mjpeg_decode_dqt(s, s->buffer, input_size);
  1235.                     break;
  1236.                 case DHT:
  1237.                     mjpeg_decode_dht(s, s->buffer, input_size);
  1238.                     break;
  1239.                 case SOF0:
  1240.                     mjpeg_decode_sof0(s, s->buffer, input_size);
  1241.                     break;
  1242.                 case SOS:
  1243.                     mjpeg_decode_sos(s, s->buffer, input_size);
  1244.                     if (s->start_code == EOI || s->buggy_avid || s->restart_interval) {
  1245.                         int l;
  1246.                         if (s->interlaced) {
  1247.                             s->bottom_field ^= 1;
  1248.                             /* if not bottom field, do not output image yet */
  1249.                             if (s->bottom_field)
  1250.                                 goto the_end;
  1251.                         }
  1252.                         for(i=0;i<3;i++) {
  1253.                             picture->data[i] = s->current_picture[i];
  1254.                             l = s->linesize[i];
  1255.                             if (s->interlaced)
  1256.                                 l >>= 1;
  1257.                             picture->linesize[i] = l;
  1258.                         }
  1259.                         *data_size = sizeof(AVPicture);
  1260.                         avctx->height = s->height;
  1261.                         if (s->interlaced)
  1262.                             avctx->height *= 2;
  1263.                         avctx->width = s->width;
  1264.                         /* XXX: not complete test ! */
  1265.                         switch((s->h_count[0] << 4) | s->v_count[0]) {
  1266.                         case 0x11:
  1267.                             avctx->pix_fmt = PIX_FMT_YUV444P;
  1268.                             break;
  1269.                         case 0x21:
  1270.                             avctx->pix_fmt = PIX_FMT_YUV422P;
  1271.                             break;
  1272.                         default:
  1273.                         case 0x22:
  1274.                             avctx->pix_fmt = PIX_FMT_YUV420P;
  1275.                             break;
  1276.                         }
  1277.                         /* dummy quality */
  1278.                         /* XXX: infer it with matrix */
  1279.                         avctx->quality = 3; 
  1280.                         goto the_end;
  1281.                     }
  1282.                     break;
  1283.         case DRI:
  1284.             mjpeg_decode_dri(s, s->buffer, input_size);
  1285.             break;
  1286.         case SOF1:
  1287.         case SOF2:
  1288.         case SOF3:
  1289.         case SOF5:
  1290.         case SOF6:
  1291.         case SOF7:
  1292.         case SOF9:
  1293.         case SOF10:
  1294.         case SOF11:
  1295.         case SOF13:
  1296.         case SOF14:
  1297.         case SOF15:
  1298.         case JPG:
  1299.             printf("mjpeg: unsupported coding type (%x)\n", start_code);
  1300.             return -1;
  1301.                 }
  1302. #if 1
  1303.         if (start_code >= 0xd0 && start_code <= 0xd7) {
  1304.             dprintf("restart marker: %d\n", start_code&0x0f);
  1305.         } else if (s->first_picture) {
  1306.             /* APP fields */
  1307.             if (start_code >= 0xe0 && start_code <= 0xef)
  1308.             mjpeg_decode_app(s, s->buffer, input_size, start_code);
  1309.             /* Comment */
  1310.             else if (start_code == COM)
  1311.             mjpeg_decode_com(s, s->buffer, input_size);
  1312.         }
  1313. #endif
  1314.             }
  1315.         }
  1316.     }
  1317.  the_end:
  1318.     return buf_ptr - buf;
  1319. }
  1320.  
  1321. static int mjpeg_decode_end(AVCodecContext *avctx)
  1322. {
  1323.     MJpegDecodeContext *s = avctx->priv_data;
  1324.     int i, j;
  1325.  
  1326.     for(i=0;i<MAX_COMPONENTS;i++)
  1327.         av_free(s->current_picture[i]);
  1328.     for(i=0;i<2;i++) {
  1329.         for(j=0;j<4;j++)
  1330.             free_vlc(&s->vlcs[i][j]);
  1331.     }
  1332.     return 0;
  1333. }
  1334.  
  1335. AVCodec mjpeg_decoder = {
  1336.     "mjpeg",
  1337.     CODEC_TYPE_VIDEO,
  1338.     CODEC_ID_MJPEG,
  1339.     sizeof(MJpegDecodeContext),
  1340.     mjpeg_decode_init,
  1341.     NULL,
  1342.     mjpeg_decode_end,
  1343.     mjpeg_decode_frame,
  1344.     0,
  1345.     NULL
  1346. };
  1347.