lcl.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:31k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * LCL (LossLess Codec Library) Codec
  3.  * Copyright (c) 2002-2004 Roberto Togni
  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.  */
  20. /**
  21.  * @file lcl.c
  22.  * LCL (LossLess Codec Library) Video Codec
  23.  * Decoder for MSZH and ZLIB codecs
  24.  * Experimental encoder for ZLIB RGB24
  25.  *
  26.  * Fourcc: MSZH, ZLIB
  27.  *
  28.  * Original Win32 dll:
  29.  * Ver2.23 By Kenji Oshima 2000.09.20
  30.  * avimszh.dll, avizlib.dll
  31.  *
  32.  * A description of the decoding algorithm can be found here:
  33.  *   http://www.pcisys.net/~melanson/codecs
  34.  *
  35.  * Supports: BGR24 (RGB 24bpp)
  36.  *
  37.  */
  38. #include <stdio.h>
  39. #include <stdlib.h>
  40. #include "common.h"
  41. #include "bitstream.h"
  42. #include "avcodec.h"
  43. #ifdef CONFIG_ZLIB
  44. #include <zlib.h>
  45. #endif
  46. #define BMPTYPE_YUV 1
  47. #define BMPTYPE_RGB 2
  48. #define IMGTYPE_YUV111 0
  49. #define IMGTYPE_YUV422 1
  50. #define IMGTYPE_RGB24 2
  51. #define IMGTYPE_YUV411 3
  52. #define IMGTYPE_YUV211 4
  53. #define IMGTYPE_YUV420 5
  54. #define COMP_MSZH 0
  55. #define COMP_MSZH_NOCOMP 1
  56. #define COMP_ZLIB_HISPEED 1
  57. #define COMP_ZLIB_HICOMP 9
  58. #define COMP_ZLIB_NORMAL -1
  59. #define FLAG_MULTITHREAD 1
  60. #define FLAG_NULLFRAME 2
  61. #define FLAG_PNGFILTER 4
  62. #define FLAGMASK_UNUSED 0xf8
  63. #define CODEC_MSZH 1
  64. #define CODEC_ZLIB 3
  65. #define FOURCC_MSZH mmioFOURCC('M','S','Z','H')
  66. #define FOURCC_ZLIB mmioFOURCC('Z','L','I','B')
  67. /*
  68.  * Decoder context
  69.  */
  70. typedef struct LclContext {
  71. AVCodecContext *avctx;
  72. AVFrame pic;
  73.     PutBitContext pb;
  74.     // Image type
  75.     int imgtype;
  76.     // Compression type
  77.     int compression;
  78.     // Flags
  79.     int flags;
  80.     // Decompressed data size
  81.     unsigned int decomp_size;
  82.     // Decompression buffer
  83.     unsigned char* decomp_buf;
  84.     // Maximum compressed data size
  85.     unsigned int max_comp_size;
  86.     // Compression buffer
  87.     unsigned char* comp_buf;
  88. #ifdef CONFIG_ZLIB
  89.     z_stream zstream;
  90. #endif
  91. } LclContext;
  92. /*
  93.  *
  94.  * Helper functions
  95.  *
  96.  */
  97. static inline unsigned char fix (int pix14)
  98. {
  99.     int tmp;
  100.     tmp = (pix14 + 0x80000) >> 20;
  101.     if (tmp < 0)
  102.         return 0;
  103.     if (tmp > 255)
  104.         return 255;
  105.     return tmp;
  106. }
  107. static inline unsigned char get_b (unsigned char yq, signed char bq)
  108. {
  109.     return fix((yq << 20) + bq * 1858076);
  110. }
  111. static inline unsigned char get_g (unsigned char yq, signed char bq, signed char rq)
  112. {
  113.     return fix((yq << 20) - bq * 360857 - rq * 748830);
  114. }
  115. static inline unsigned char get_r (unsigned char yq, signed char rq)
  116. {
  117.     return fix((yq << 20) + rq * 1470103);
  118. }
  119. static unsigned int mszh_decomp(unsigned char * srcptr, int srclen, unsigned char * destptr, unsigned int destsize)
  120. {
  121.     unsigned char *destptr_bak = destptr;
  122.     unsigned char *destptr_end = destptr + destsize;
  123.     unsigned char mask = 0;
  124.     unsigned char maskbit = 0;
  125.     unsigned int ofs, cnt;
  126.   
  127.     while ((srclen > 0) && (destptr < destptr_end)) {
  128.         if (maskbit == 0) {
  129.             mask = *(srcptr++);
  130.             maskbit = 8;
  131.             srclen--;
  132.             continue;
  133.         }
  134.         if ((mask & (1 << (--maskbit))) == 0) {
  135.             if (destptr + 4 > destptr_end)
  136.                 break;
  137.             *(int*)destptr = *(int*)srcptr;
  138.             srclen -= 4;
  139.             destptr += 4;
  140.             srcptr += 4;
  141.         } else {
  142.             ofs = *(srcptr++);
  143.             cnt = *(srcptr++);
  144.             ofs += cnt * 256;;
  145.             cnt = ((cnt >> 3) & 0x1f) + 1;
  146.             ofs &= 0x7ff;
  147.             srclen -= 2;
  148.             cnt *= 4;
  149.             if (destptr + cnt > destptr_end) {
  150.                 cnt =  destptr_end - destptr;
  151.             }
  152.             for (; cnt > 0; cnt--) {
  153.                 *(destptr) = *(destptr - ofs);
  154.                 destptr++;
  155.             }
  156.         }
  157.     }
  158.     return (destptr - destptr_bak);
  159. }
  160. /*
  161.  *
  162.  * Decode a frame
  163.  *
  164.  */
  165. static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
  166. {
  167. LclContext * const c = (LclContext *)avctx->priv_data;
  168. unsigned char *encoded = (unsigned char *)buf;
  169.     unsigned int pixel_ptr;
  170.     int row, col;
  171.     unsigned char *outptr;
  172.     unsigned int width = avctx->width; // Real image width
  173.     unsigned int height = avctx->height; // Real image height
  174.     unsigned int mszh_dlen;
  175.     unsigned char yq, y1q, uq, vq;
  176.     int uqvq;
  177.     unsigned int mthread_inlen, mthread_outlen;
  178. #ifdef CONFIG_ZLIB
  179.     int zret; // Zlib return code
  180. #endif
  181.     unsigned int len = buf_size;
  182. if(c->pic.data[0])
  183. avctx->release_buffer(avctx, &c->pic);
  184. c->pic.reference = 0;
  185. c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
  186. if(avctx->get_buffer(avctx, &c->pic) < 0){
  187. av_log(avctx, AV_LOG_ERROR, "get_buffer() failedn");
  188. return -1;
  189. }
  190.     outptr = c->pic.data[0]; // Output image pointer
  191.     /* Decompress frame */
  192.     switch (avctx->codec_id) {
  193.         case CODEC_ID_MSZH:
  194.             switch (c->compression) {
  195.                 case COMP_MSZH:
  196.                     if (c->flags & FLAG_MULTITHREAD) {
  197.                         mthread_inlen = *((unsigned int*)encoded);
  198.                         mthread_outlen = *((unsigned int*)(encoded+4));
  199.                         if (mthread_outlen > c->decomp_size) // this should not happen
  200.                             mthread_outlen = c->decomp_size;
  201.                         mszh_dlen = mszh_decomp(encoded + 8, mthread_inlen, c->decomp_buf, c->decomp_size);
  202.                         if (mthread_outlen != mszh_dlen) {
  203.                             av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%d != %d)n",
  204.                                    mthread_outlen, mszh_dlen);
  205.                             return -1;
  206.                         }
  207.                         mszh_dlen = mszh_decomp(encoded + 8 + mthread_inlen, len - mthread_inlen,
  208.                                                 c->decomp_buf + mthread_outlen, c->decomp_size - mthread_outlen);
  209.                         if (mthread_outlen != mszh_dlen) {
  210.                             av_log(avctx, AV_LOG_ERROR, "Mthread2 decoded size differs (%d != %d)n",
  211.                                    mthread_outlen, mszh_dlen);
  212.                             return -1;
  213.                         }
  214.                         encoded = c->decomp_buf;
  215.                         len = c->decomp_size;
  216.                     } else {
  217.                         mszh_dlen = mszh_decomp(encoded, len, c->decomp_buf, c->decomp_size);
  218.                         if (c->decomp_size != mszh_dlen) {
  219.                             av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %d)n",
  220.                                    c->decomp_size, mszh_dlen);
  221.                             return -1;
  222.                         }
  223.                         encoded = c->decomp_buf;
  224.                         len = mszh_dlen;
  225.                     }
  226.                     break;
  227.                 case COMP_MSZH_NOCOMP:
  228.                     break;
  229.                 default:
  230.                     av_log(avctx, AV_LOG_ERROR, "BUG! Unknown MSZH compression in frame decoder.n");
  231.                     return -1;
  232.             }
  233.             break;
  234.         case CODEC_ID_ZLIB:
  235. #ifdef CONFIG_ZLIB
  236.             /* Using the original dll with normal compression (-1) and RGB format
  237.              * gives a file with ZLIB fourcc, but frame is really uncompressed.
  238.              * To be sure that's true check also frame size */
  239.             if ((c->compression == COMP_ZLIB_NORMAL) && (c->imgtype == IMGTYPE_RGB24) &&
  240.                (len == width * height * 3))
  241.                 break;
  242.             zret = inflateReset(&(c->zstream));
  243.             if (zret != Z_OK) {
  244.                 av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %dn", zret);
  245.                 return -1;
  246.             }
  247.             if (c->flags & FLAG_MULTITHREAD) {
  248.                 mthread_inlen = *((unsigned int*)encoded);
  249.                 mthread_outlen = *((unsigned int*)(encoded+4));
  250.                 if (mthread_outlen > c->decomp_size)
  251.                     mthread_outlen = c->decomp_size;
  252.                 c->zstream.next_in = encoded + 8;
  253.                 c->zstream.avail_in = mthread_inlen;
  254.                 c->zstream.next_out = c->decomp_buf;
  255.                 c->zstream.avail_out = c->decomp_size;    
  256.                 zret = inflate(&(c->zstream), Z_FINISH);
  257.                 if ((zret != Z_OK) && (zret != Z_STREAM_END)) {
  258.                     av_log(avctx, AV_LOG_ERROR, "Mthread1 inflate error: %dn", zret);
  259.                     return -1;
  260.                 }
  261.                 if (mthread_outlen != (unsigned int)(c->zstream.total_out)) {
  262.                     av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%u != %lu)n",
  263.                            mthread_outlen, c->zstream.total_out);
  264.                     return -1;
  265.                 }
  266.                 zret = inflateReset(&(c->zstream));
  267.                 if (zret != Z_OK) {
  268.                     av_log(avctx, AV_LOG_ERROR, "Mthread2 inflate reset error: %dn", zret);
  269.                     return -1;
  270.                 }
  271.                 c->zstream.next_in = encoded + 8 + mthread_inlen;
  272.                 c->zstream.avail_in = len - mthread_inlen;
  273.                 c->zstream.next_out = c->decomp_buf + mthread_outlen;
  274.                 c->zstream.avail_out = c->decomp_size - mthread_outlen;    
  275.                 zret = inflate(&(c->zstream), Z_FINISH);
  276.                 if ((zret != Z_OK) && (zret != Z_STREAM_END)) {
  277.                     av_log(avctx, AV_LOG_ERROR, "Mthread2 inflate error: %dn", zret);
  278.                     return -1;
  279.                 }
  280.                 if (mthread_outlen != (unsigned int)(c->zstream.total_out)) {
  281.                     av_log(avctx, AV_LOG_ERROR, "Mthread2 decoded size differs (%d != %lu)n",
  282.                            mthread_outlen, c->zstream.total_out);
  283.                     return -1;
  284.                 }
  285.             } else {
  286.                 c->zstream.next_in = encoded;
  287.                 c->zstream.avail_in = len;
  288.                 c->zstream.next_out = c->decomp_buf;
  289.                 c->zstream.avail_out = c->decomp_size;
  290.                 zret = inflate(&(c->zstream), Z_FINISH);
  291.                 if ((zret != Z_OK) && (zret != Z_STREAM_END)) {
  292.                     av_log(avctx, AV_LOG_ERROR, "Inflate error: %dn", zret);
  293.                     return -1;
  294.                 }
  295.                 if (c->decomp_size != (unsigned int)(c->zstream.total_out)) {
  296.                     av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %lu)n",
  297.                            c->decomp_size, c->zstream.total_out);
  298.                     return -1;
  299.                 }
  300.             }
  301.             encoded = c->decomp_buf;
  302.             len = c->decomp_size;;
  303. #else
  304.             av_log(avctx, AV_LOG_ERROR, "BUG! Zlib support not compiled in frame decoder.n");
  305.             return -1;
  306. #endif
  307.             break;
  308.         default:
  309.             av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in frame decoder compression switch.n");
  310.             return -1;
  311.     }
  312.     /* Apply PNG filter */
  313.     if ((avctx->codec_id == CODEC_ID_ZLIB) && (c->flags & FLAG_PNGFILTER)) {
  314.         switch (c->imgtype) {
  315.             case IMGTYPE_YUV111:
  316.             case IMGTYPE_RGB24:
  317.                 for (row = 0; row < height; row++) {
  318.                     pixel_ptr = row * width * 3;
  319.                     yq = encoded[pixel_ptr++];
  320.                     uqvq = encoded[pixel_ptr++];
  321.                  uqvq+=(encoded[pixel_ptr++] << 8);
  322.                     for (col = 1; col < width; col++) {
  323.                         encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
  324.                         uqvq -= (encoded[pixel_ptr+1] | (encoded[pixel_ptr+2]<<8));
  325.                         encoded[pixel_ptr+1] = (uqvq) & 0xff;
  326.                         encoded[pixel_ptr+2] = ((uqvq)>>8) & 0xff;
  327.                         pixel_ptr += 3;
  328.                     }
  329.                 }
  330.                 break;
  331.             case IMGTYPE_YUV422:
  332.                 for (row = 0; row < height; row++) {
  333.                     pixel_ptr = row * width * 2;
  334.                     yq = uq = vq =0;
  335.                     for (col = 0; col < width/4; col++) {
  336.                         encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
  337.                         encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
  338.                         encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
  339.                         encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
  340.                         encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
  341.                         encoded[pixel_ptr+5] = uq -= encoded[pixel_ptr+5];
  342.                         encoded[pixel_ptr+6] = vq -= encoded[pixel_ptr+6];
  343.                         encoded[pixel_ptr+7] = vq -= encoded[pixel_ptr+7];
  344.                         pixel_ptr += 8;
  345.                     }
  346.                 }
  347.                 break;
  348.             case IMGTYPE_YUV411:
  349.                 for (row = 0; row < height; row++) {
  350.                     pixel_ptr = row * width / 2 * 3;
  351.                     yq = uq = vq =0;
  352.                     for (col = 0; col < width/4; col++) {
  353.                         encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
  354.                         encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
  355.                         encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
  356.                         encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
  357.                         encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
  358.                         encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
  359.                         pixel_ptr += 6;
  360.                     }
  361.                 }
  362.                 break;
  363.             case IMGTYPE_YUV211:
  364.                 for (row = 0; row < height; row++) {
  365.                     pixel_ptr = row * width * 2;
  366.                     yq = uq = vq =0;
  367.                     for (col = 0; col < width/2; col++) {
  368.                         encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
  369.                         encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
  370.                         encoded[pixel_ptr+2] = uq -= encoded[pixel_ptr+2];
  371.                         encoded[pixel_ptr+3] = vq -= encoded[pixel_ptr+3];
  372.                         pixel_ptr += 4;
  373.                     }
  374.                 }
  375.                 break;
  376.             case IMGTYPE_YUV420:
  377.                 for (row = 0; row < height/2; row++) {
  378.                     pixel_ptr = row * width * 3;
  379.                     yq = y1q = uq = vq =0;
  380.                     for (col = 0; col < width/2; col++) {
  381.                         encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
  382.                         encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
  383.                         encoded[pixel_ptr+2] = y1q -= encoded[pixel_ptr+2];
  384.                         encoded[pixel_ptr+3] = y1q -= encoded[pixel_ptr+3];
  385.                         encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
  386.                         encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
  387.                         pixel_ptr += 6;
  388.                     }
  389.                 }
  390.                 break;
  391.             default:
  392.                 av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in pngfilter switch.n");
  393.                 return -1;
  394.         }
  395.     }
  396.     /* Convert colorspace */
  397.     switch (c->imgtype) {
  398.         case IMGTYPE_YUV111:
  399.             for (row = height - 1; row >= 0; row--) {
  400.                 pixel_ptr = row * c->pic.linesize[0];
  401.                 for (col = 0; col < width; col++) {
  402.                     outptr[pixel_ptr++] = get_b(encoded[0], encoded[1]);
  403.                     outptr[pixel_ptr++] = get_g(encoded[0], encoded[1], encoded[2]);
  404.                     outptr[pixel_ptr++] = get_r(encoded[0], encoded[2]);
  405.                     encoded += 3;
  406.                 }
  407.             }
  408.             break;
  409.         case IMGTYPE_YUV422:
  410.             for (row = height - 1; row >= 0; row--) {
  411.                 pixel_ptr = row * c->pic.linesize[0];
  412.                 for (col = 0; col < width/4; col++) {
  413.                     outptr[pixel_ptr++] = get_b(encoded[0], encoded[4]);
  414.                     outptr[pixel_ptr++] = get_g(encoded[0], encoded[4], encoded[6]);
  415.                     outptr[pixel_ptr++] = get_r(encoded[0], encoded[6]);
  416.                     outptr[pixel_ptr++] = get_b(encoded[1], encoded[4]);
  417.                     outptr[pixel_ptr++] = get_g(encoded[1], encoded[4], encoded[6]);
  418.                     outptr[pixel_ptr++] = get_r(encoded[1], encoded[6]);
  419.                     outptr[pixel_ptr++] = get_b(encoded[2], encoded[5]);
  420.                     outptr[pixel_ptr++] = get_g(encoded[2], encoded[5], encoded[7]);
  421.                     outptr[pixel_ptr++] = get_r(encoded[2], encoded[7]);
  422.                     outptr[pixel_ptr++] = get_b(encoded[3], encoded[5]);
  423.                     outptr[pixel_ptr++] = get_g(encoded[3], encoded[5], encoded[7]);
  424.                     outptr[pixel_ptr++] = get_r(encoded[3], encoded[7]);
  425.                     encoded += 8;
  426.                 }
  427.             }
  428.             break;
  429.         case IMGTYPE_RGB24:
  430.             for (row = height - 1; row >= 0; row--) {
  431.                 pixel_ptr = row * c->pic.linesize[0];
  432.                 for (col = 0; col < width; col++) {
  433.                     outptr[pixel_ptr++] = encoded[0];
  434.                     outptr[pixel_ptr++] = encoded[1];
  435.                     outptr[pixel_ptr++] = encoded[2];
  436.                     encoded += 3;
  437.                 }
  438.             }
  439.             break;
  440.         case IMGTYPE_YUV411:
  441.             for (row = height - 1; row >= 0; row--) {
  442.                 pixel_ptr = row * c->pic.linesize[0];
  443.                 for (col = 0; col < width/4; col++) {
  444.                     outptr[pixel_ptr++] = get_b(encoded[0], encoded[4]);
  445.                     outptr[pixel_ptr++] = get_g(encoded[0], encoded[4], encoded[5]);
  446.                     outptr[pixel_ptr++] = get_r(encoded[0], encoded[5]);
  447.                     outptr[pixel_ptr++] = get_b(encoded[1], encoded[4]);
  448.                     outptr[pixel_ptr++] = get_g(encoded[1], encoded[4], encoded[5]);
  449.                     outptr[pixel_ptr++] = get_r(encoded[1], encoded[5]);
  450.                     outptr[pixel_ptr++] = get_b(encoded[2], encoded[4]);
  451.                     outptr[pixel_ptr++] = get_g(encoded[2], encoded[4], encoded[5]);
  452.                     outptr[pixel_ptr++] = get_r(encoded[2], encoded[5]);
  453.                     outptr[pixel_ptr++] = get_b(encoded[3], encoded[4]);
  454.                     outptr[pixel_ptr++] = get_g(encoded[3], encoded[4], encoded[5]);
  455.                     outptr[pixel_ptr++] = get_r(encoded[3], encoded[5]);
  456.                     encoded += 6;
  457.                 }
  458.             }
  459.             break;
  460.         case IMGTYPE_YUV211:
  461.             for (row = height - 1; row >= 0; row--) {
  462.                 pixel_ptr = row * c->pic.linesize[0];
  463.                 for (col = 0; col < width/2; col++) {
  464.                     outptr[pixel_ptr++] = get_b(encoded[0], encoded[2]);
  465.                     outptr[pixel_ptr++] = get_g(encoded[0], encoded[2], encoded[3]);
  466.                     outptr[pixel_ptr++] = get_r(encoded[0], encoded[3]);
  467.                     outptr[pixel_ptr++] = get_b(encoded[1], encoded[2]);
  468.                     outptr[pixel_ptr++] = get_g(encoded[1], encoded[2], encoded[3]);
  469.                     outptr[pixel_ptr++] = get_r(encoded[1], encoded[3]);
  470.                     encoded += 4;
  471.                 }
  472.             }
  473.             break;
  474.         case IMGTYPE_YUV420:
  475.             for (row = height / 2 - 1; row >= 0; row--) {
  476.                 pixel_ptr = 2 * row * c->pic.linesize[0];
  477.                 for (col = 0; col < width/2; col++) {
  478.                     outptr[pixel_ptr] = get_b(encoded[0], encoded[4]);
  479.                     outptr[pixel_ptr+1] = get_g(encoded[0], encoded[4], encoded[5]);
  480.                     outptr[pixel_ptr+2] = get_r(encoded[0], encoded[5]);
  481.                     outptr[pixel_ptr+3] = get_b(encoded[1], encoded[4]);
  482.                     outptr[pixel_ptr+4] = get_g(encoded[1], encoded[4], encoded[5]);
  483.                     outptr[pixel_ptr+5] = get_r(encoded[1], encoded[5]);
  484.                     outptr[pixel_ptr-c->pic.linesize[0]] = get_b(encoded[2], encoded[4]);
  485.                     outptr[pixel_ptr-c->pic.linesize[0]+1] = get_g(encoded[2], encoded[4], encoded[5]);
  486.                     outptr[pixel_ptr-c->pic.linesize[0]+2] = get_r(encoded[2], encoded[5]);
  487.                     outptr[pixel_ptr-c->pic.linesize[0]+3] = get_b(encoded[3], encoded[4]);
  488.                     outptr[pixel_ptr-c->pic.linesize[0]+4] = get_g(encoded[3], encoded[4], encoded[5]);
  489.                     outptr[pixel_ptr-c->pic.linesize[0]+5] = get_r(encoded[3], encoded[5]);
  490.                     pixel_ptr += 6;
  491.                     encoded += 6;
  492.                 }
  493.             }
  494.             break;
  495.         default:
  496.             av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in image decoder.n");
  497.             return -1;
  498.     }
  499.     *data_size = sizeof(AVFrame);
  500.     *(AVFrame*)data = c->pic;
  501.     /* always report that the buffer was completely consumed */
  502.     return buf_size;
  503. }
  504. /*
  505.  *
  506.  * Encode a frame
  507.  *
  508.  */
  509. static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
  510.     LclContext *c = avctx->priv_data;
  511.     AVFrame *pict = data;
  512.     AVFrame * const p = &c->pic;
  513.     int i;
  514.     int zret; // Zlib return code
  515. #ifndef CONFIG_ZLIB
  516.     av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled in.n");
  517.     return -1;
  518. #else
  519.     init_put_bits(&c->pb, buf, buf_size);
  520.     
  521.     *p = *pict;
  522.     p->pict_type= FF_I_TYPE;
  523.     p->key_frame= 1;
  524.     
  525.     if(avctx->pix_fmt != PIX_FMT_BGR24){
  526.         av_log(avctx, AV_LOG_ERROR, "Format not supported!n");
  527.         return -1;
  528.     }
  529.     zret = deflateReset(&(c->zstream));
  530.     if (zret != Z_OK) {
  531.         av_log(avctx, AV_LOG_ERROR, "Deflate reset error: %dn", zret);
  532.         return -1;
  533.     }
  534.     c->zstream.next_out = c->comp_buf;
  535.     c->zstream.avail_out = c->max_comp_size;
  536.     for(i = avctx->height - 1; i >= 0; i--) {
  537.         c->zstream.next_in = p->data[0]+p->linesize[0]*i;
  538.         c->zstream.avail_in = avctx->width*3;
  539.         zret = deflate(&(c->zstream), Z_NO_FLUSH);
  540.         if (zret != Z_OK) {
  541.          av_log(avctx, AV_LOG_ERROR, "Deflate error: %dn", zret);
  542.          return -1;
  543.         }
  544.     }
  545.     zret = deflate(&(c->zstream), Z_FINISH);
  546.     if (zret != Z_STREAM_END) {
  547.         av_log(avctx, AV_LOG_ERROR, "Deflate error: %dn", zret);
  548.         return -1;
  549.     }
  550.     for (i = 0; i < c->zstream.total_out; i++)
  551.         put_bits(&c->pb, 8, c->comp_buf[i]);
  552.     flush_put_bits(&c->pb);
  553.     return c->zstream.total_out;
  554. #endif
  555. }
  556. /*
  557.  *
  558.  * Init lcl decoder
  559.  *
  560.  */
  561. static int decode_init(AVCodecContext *avctx)
  562. {
  563.     LclContext * const c = (LclContext *)avctx->priv_data;
  564.     unsigned int basesize = avctx->width * avctx->height;
  565.     unsigned int max_basesize = ((avctx->width + 3) & ~3) * ((avctx->height + 3) & ~3);
  566.     unsigned int max_decomp_size;
  567.     int zret; // Zlib return code
  568.     c->avctx = avctx;
  569.     avctx->has_b_frames = 0;
  570.     c->pic.data[0] = NULL;
  571. #ifdef CONFIG_ZLIB
  572.     // Needed if zlib unused or init aborted before inflateInit
  573.     memset(&(c->zstream), 0, sizeof(z_stream)); 
  574. #endif
  575.     if (avctx->extradata_size < 8) {
  576.         av_log(avctx, AV_LOG_ERROR, "Extradata size too small.n");
  577.         return 1;
  578.     }
  579.     if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
  580.         return 1;
  581.     }
  582.     /* Check codec type */ 
  583.     if (((avctx->codec_id == CODEC_ID_MSZH)  && (*((char *)avctx->extradata + 7) != CODEC_MSZH)) ||
  584.         ((avctx->codec_id == CODEC_ID_ZLIB)  && (*((char *)avctx->extradata + 7) != CODEC_ZLIB))) {
  585.         av_log(avctx, AV_LOG_ERROR, "Codec id and codec type mismatch. This should not happen.n");
  586.     }
  587.     /* Detect image type */
  588.     switch (c->imgtype = *((char *)avctx->extradata + 4)) {
  589.         case IMGTYPE_YUV111:
  590.             c->decomp_size = basesize * 3;
  591.             max_decomp_size = max_basesize * 3;
  592.             av_log(avctx, AV_LOG_INFO, "Image type is YUV 1:1:1.n");
  593.             break;
  594.         case IMGTYPE_YUV422:
  595.             c->decomp_size = basesize * 2;
  596.             max_decomp_size = max_basesize * 2;
  597.             av_log(avctx, AV_LOG_INFO, "Image type is YUV 4:2:2.n");
  598.             break;
  599.         case IMGTYPE_RGB24:
  600.             c->decomp_size = basesize * 3;
  601.             max_decomp_size = max_basesize * 3;
  602.             av_log(avctx, AV_LOG_INFO, "Image type is RGB 24.n");
  603.             break;
  604.         case IMGTYPE_YUV411:
  605.             c->decomp_size = basesize / 2 * 3;
  606.             max_decomp_size = max_basesize / 2 * 3;
  607.             av_log(avctx, AV_LOG_INFO, "Image type is YUV 4:1:1.n");
  608.             break;
  609.         case IMGTYPE_YUV211:
  610.             c->decomp_size = basesize * 2;
  611.             max_decomp_size = max_basesize * 2;
  612.             av_log(avctx, AV_LOG_INFO, "Image type is YUV 2:1:1.n");
  613.             break;
  614.         case IMGTYPE_YUV420:
  615.             c->decomp_size = basesize / 2 * 3;
  616.             max_decomp_size = max_basesize / 2 * 3;
  617.             av_log(avctx, AV_LOG_INFO, "Image type is YUV 4:2:0.n");
  618.             break;
  619.         default:
  620.             av_log(avctx, AV_LOG_ERROR, "Unsupported image format %d.n", c->imgtype);
  621.             return 1;
  622.     }
  623.     /* Detect compression method */
  624.     c->compression = *((char *)avctx->extradata + 5);
  625.     switch (avctx->codec_id) {
  626.         case CODEC_ID_MSZH:
  627.             switch (c->compression) {
  628.                 case COMP_MSZH:
  629.                     av_log(avctx, AV_LOG_INFO, "Compression enabled.n");
  630.                     break;
  631.                 case COMP_MSZH_NOCOMP:
  632.                     c->decomp_size = 0;
  633.                     av_log(avctx, AV_LOG_INFO, "No compression.n");
  634.                     break;
  635.                 default:
  636.                     av_log(avctx, AV_LOG_ERROR, "Unsupported compression format for MSZH (%d).n", c->compression);
  637.                     return 1;
  638.             }
  639.             break;
  640.         case CODEC_ID_ZLIB:
  641. #ifdef CONFIG_ZLIB
  642.             switch (c->compression) {
  643.                 case COMP_ZLIB_HISPEED:
  644.                     av_log(avctx, AV_LOG_INFO, "High speed compression.n");
  645.                     break;
  646.                 case COMP_ZLIB_HICOMP:
  647.                     av_log(avctx, AV_LOG_INFO, "High compression.n");
  648.                     break;
  649.                 case COMP_ZLIB_NORMAL:
  650.                     av_log(avctx, AV_LOG_INFO, "Normal compression.n");
  651.                     break;
  652.                 default:
  653.                     if ((c->compression < Z_NO_COMPRESSION) || (c->compression > Z_BEST_COMPRESSION)) {
  654.                      av_log(avctx, AV_LOG_ERROR, "Unsupported compression level for ZLIB: (%d).n", c->compression);
  655.                         return 1;
  656.                     }
  657.                     av_log(avctx, AV_LOG_INFO, "Compression level for ZLIB: (%d).n", c->compression);
  658.             }
  659. #else
  660.             av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled.n");
  661.             return 1;
  662. #endif
  663.             break;
  664.         default:
  665.             av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in compression switch.n");
  666.             return 1;
  667.     }
  668.     /* Allocate decompression buffer */
  669.     if (c->decomp_size) {
  670.         if ((c->decomp_buf = av_malloc(max_decomp_size)) == NULL) {
  671.             av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.n");
  672.             return 1;
  673.         }
  674.     }
  675.   
  676.     /* Detect flags */ 
  677.     c->flags = *((char *)avctx->extradata + 6);
  678.     if (c->flags & FLAG_MULTITHREAD)
  679.         av_log(avctx, AV_LOG_INFO, "Multithread encoder flag set.n");
  680.     if (c->flags & FLAG_NULLFRAME)
  681.         av_log(avctx, AV_LOG_INFO, "Nullframe insertion flag set.n");
  682.     if ((avctx->codec_id == CODEC_ID_ZLIB) && (c->flags & FLAG_PNGFILTER))
  683.         av_log(avctx, AV_LOG_INFO, "PNG filter flag set.n");
  684.     if (c->flags & FLAGMASK_UNUSED)
  685.         av_log(avctx, AV_LOG_ERROR, "Unknown flag set (%d).n", c->flags);
  686.     /* If needed init zlib */
  687.     if (avctx->codec_id == CODEC_ID_ZLIB) {
  688. #ifdef CONFIG_ZLIB
  689.         c->zstream.zalloc = Z_NULL;
  690.         c->zstream.zfree = Z_NULL;
  691.         c->zstream.opaque = Z_NULL;
  692.         zret = inflateInit(&(c->zstream));
  693.         if (zret != Z_OK) {
  694.             av_log(avctx, AV_LOG_ERROR, "Inflate init error: %dn", zret);
  695.             return 1;
  696.         }
  697. #else
  698.     av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled.n");
  699.     return 1;
  700. #endif
  701.     }
  702.     avctx->pix_fmt = PIX_FMT_BGR24;
  703.     return 0;
  704. }
  705. /*
  706.  *
  707.  * Init lcl encoder
  708.  *
  709.  */
  710. static int encode_init(AVCodecContext *avctx)
  711. {
  712.     LclContext *c = avctx->priv_data;
  713.     int zret; // Zlib return code
  714. #ifndef CONFIG_ZLIB
  715.     av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled.n");
  716.     return 1;
  717. #else
  718.     c->avctx= avctx;
  719.         
  720.     assert(avctx->width && avctx->height);
  721.     
  722.     avctx->extradata= av_mallocz(8);
  723.     avctx->coded_frame= &c->pic;
  724.     // Will be user settable someday
  725.     c->compression = 6;
  726.     c->flags = 0;
  727.     switch(avctx->pix_fmt){
  728.         case PIX_FMT_BGR24:
  729.             c->imgtype = IMGTYPE_RGB24;
  730.             c->decomp_size = avctx->width * avctx->height * 3;
  731.             avctx->bits_per_sample= 24;
  732.             break;
  733.         default:
  734.             av_log(avctx, AV_LOG_ERROR, "Format %d not supportedn", avctx->pix_fmt);
  735.             return -1;
  736.     }
  737.     ((uint8_t*)avctx->extradata)[0]= 4;
  738.     ((uint8_t*)avctx->extradata)[1]= 0;
  739.     ((uint8_t*)avctx->extradata)[2]= 0;
  740.     ((uint8_t*)avctx->extradata)[3]= 0;
  741.     ((uint8_t*)avctx->extradata)[4]= c->imgtype;
  742.     ((uint8_t*)avctx->extradata)[5]= c->compression;
  743.     ((uint8_t*)avctx->extradata)[6]= c->flags;
  744.     ((uint8_t*)avctx->extradata)[7]= CODEC_ZLIB;
  745.     c->avctx->extradata_size= 8;
  746.     
  747.     c->zstream.zalloc = Z_NULL;
  748.     c->zstream.zfree = Z_NULL;
  749.     c->zstream.opaque = Z_NULL;
  750.     zret = deflateInit(&(c->zstream), c->compression);
  751.     if (zret != Z_OK) {
  752.         av_log(avctx, AV_LOG_ERROR, "Deflate init error: %dn", zret);
  753.         return 1;
  754.     }
  755.         /* Conservative upper bound taken from zlib v1.2.1 source */
  756.         c->max_comp_size = c->decomp_size + ((c->decomp_size + 7) >> 3) +
  757.                            ((c->decomp_size + 63) >> 6) + 11;
  758.     if ((c->comp_buf = av_malloc(c->max_comp_size)) == NULL) {
  759.         av_log(avctx, AV_LOG_ERROR, "Can't allocate compression buffer.n");
  760.         return 1;
  761.     }
  762.     return 0;
  763. #endif
  764. }
  765. /*
  766.  *
  767.  * Uninit lcl decoder
  768.  *
  769.  */
  770. static int decode_end(AVCodecContext *avctx)
  771. {
  772. LclContext * const c = (LclContext *)avctx->priv_data;
  773. if (c->pic.data[0])
  774. avctx->release_buffer(avctx, &c->pic);
  775. #ifdef CONFIG_ZLIB
  776.     inflateEnd(&(c->zstream));
  777. #endif
  778. return 0;
  779. }
  780. /*
  781.  *
  782.  * Uninit lcl encoder
  783.  *
  784.  */
  785. static int encode_end(AVCodecContext *avctx)
  786. {
  787.     LclContext *c = avctx->priv_data;
  788.     av_freep(&avctx->extradata);
  789.     av_freep(&c->comp_buf);
  790. #ifdef CONFIG_ZLIB
  791.     deflateEnd(&(c->zstream));
  792. #endif
  793.     
  794.     return 0;
  795. }
  796. AVCodec mszh_decoder = {
  797. "mszh",
  798. CODEC_TYPE_VIDEO,
  799. CODEC_ID_MSZH,
  800. sizeof(LclContext),
  801. decode_init,
  802. NULL,
  803. decode_end,
  804. decode_frame,
  805. CODEC_CAP_DR1,
  806. };
  807. AVCodec zlib_decoder = {
  808. "zlib",
  809. CODEC_TYPE_VIDEO,
  810. CODEC_ID_ZLIB,
  811. sizeof(LclContext),
  812. decode_init,
  813. NULL,
  814. decode_end,
  815. decode_frame,
  816. CODEC_CAP_DR1,
  817. };
  818. #ifdef CONFIG_ENCODERS
  819. AVCodec zlib_encoder = {
  820.     "zlib",
  821.     CODEC_TYPE_VIDEO,
  822.     CODEC_ID_ZLIB,
  823.     sizeof(LclContext),
  824.     encode_init,
  825.     encode_frame,
  826.     encode_end,
  827. };
  828. #endif //CONFIG_ENCODERS