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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Indel Indeo 2 codec
  3.  * Copyright (c) 2005 Konstantin Shishkov
  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. /**
  22.  * @file indeo2.c
  23.  * Intel Indeo 2 decoder.
  24.  */
  25. #define ALT_BITSTREAM_READER_LE
  26. #include "avcodec.h"
  27. #include "bitstream.h"
  28. #include "indeo2data.h"
  29. typedef struct Ir2Context{
  30.     AVCodecContext *avctx;
  31.     AVFrame picture;
  32.     GetBitContext gb;
  33.     int decode_delta;
  34. } Ir2Context;
  35. #define CODE_VLC_BITS 14
  36. static VLC ir2_vlc;
  37. /* Indeo 2 codes are in range 0x01..0x7F and 0x81..0x90 */
  38. static inline int ir2_get_code(GetBitContext *gb)
  39. {
  40.     return get_vlc2(gb, ir2_vlc.table, CODE_VLC_BITS, 1) + 1;
  41. }
  42. static int ir2_decode_plane(Ir2Context *ctx, int width, int height, uint8_t *dst, int stride,
  43.                              const uint8_t *table)
  44. {
  45.     int i;
  46.     int j;
  47.     int out = 0;
  48.     int c;
  49.     int t;
  50.     
  51.     if(width&1)
  52.         return -1;
  53.     /* first line contain absolute values, other lines contain deltas */
  54.     while (out < width){
  55.         c = ir2_get_code(&ctx->gb);
  56.         if(c >= 0x80) { /* we have a run */
  57.             c -= 0x7F;
  58.             if(out + c*2 > width)
  59.                 return -1;
  60.             for (i = 0; i < c * 2; i++)
  61.                 dst[out++] = 0x80;
  62.         } else { /* copy two values from table */
  63.             dst[out++] = table[c * 2];
  64.             dst[out++] = table[(c * 2) + 1];
  65.         }
  66.     }
  67.     dst += stride;
  68.     
  69.     for (j = 1; j < height; j++){
  70.         out = 0;
  71.         while (out < width){
  72.             c = ir2_get_code(&ctx->gb);
  73.             if(c >= 0x80) { /* we have a skip */
  74.                 c -= 0x7F;
  75.                 if(out + c*2 > width)
  76.                     return -1;
  77.                 for (i = 0; i < c * 2; i++) {
  78.                     dst[out] = dst[out - stride];
  79.                     out++;
  80.                 }
  81.             } else { /* add two deltas from table */
  82.                 t = dst[out - stride] + (table[c * 2] - 128);
  83.                 t= clip_uint8(t);
  84.                 dst[out] = t;
  85.                 out++;
  86.                 t = dst[out - stride] + (table[(c * 2) + 1] - 128);
  87.                 t= clip_uint8(t);
  88.                 dst[out] = t;
  89.                 out++;
  90.             }
  91.         }
  92.         dst += stride;
  93.     }
  94.     return 0;
  95. }
  96. static int ir2_decode_plane_inter(Ir2Context *ctx, int width, int height, uint8_t *dst, int stride,
  97.                              const uint8_t *table)
  98. {
  99.     int j;
  100.     int out = 0;
  101.     int c;
  102.     int t;
  103.     if(width&1)
  104.         return -1;
  105.     for (j = 0; j < height; j++){
  106.         out = 0;
  107.         while (out < width){
  108.             c = ir2_get_code(&ctx->gb);
  109.             if(c >= 0x80) { /* we have a skip */
  110.                 c -= 0x7F;
  111.                 out += c * 2;
  112.             } else { /* add two deltas from table */
  113.                 t = dst[out] + (((table[c * 2] - 128)*3) >> 2);
  114.                 t= clip_uint8(t);
  115.                 dst[out] = t;
  116.                 out++;
  117.                 t = dst[out] + (((table[(c * 2) + 1] - 128)*3) >> 2);
  118.                 t= clip_uint8(t);
  119.                 dst[out] = t;
  120.                 out++;
  121.             }
  122.         }
  123.         dst += stride;
  124.     }
  125.     return 0;
  126. }
  127. static int ir2_decode_frame(AVCodecContext *avctx, 
  128.                         void *data, int *data_size,
  129.                         uint8_t *buf, int buf_size)
  130. {
  131.     Ir2Context * const s = avctx->priv_data;
  132.     AVFrame *picture = data;
  133.     AVFrame * const p= (AVFrame*)&s->picture;
  134.     int start;
  135.     if(p->data[0])
  136.         avctx->release_buffer(avctx, p);
  137.     p->reference = 1;
  138.     p->buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
  139.     if (avctx->reget_buffer(avctx, p)) {
  140.         av_log(s->avctx, AV_LOG_ERROR, "reget_buffer() failedn");
  141.         return -1;
  142.     }
  143.     s->decode_delta = buf[18];
  144.     
  145.     /* decide whether frame uses deltas or not */
  146. #ifndef ALT_BITSTREAM_READER_LE  
  147.     for (i = 0; i < buf_size; i++)
  148.         buf[i] = ff_reverse[buf[i]];
  149. #endif
  150.     start = 48; /* hardcoded for now */
  151.     init_get_bits(&s->gb, buf + start, buf_size - start);
  152.     if (s->decode_delta) { /* intraframe */
  153.         ir2_decode_plane(s, avctx->width, avctx->height,
  154.                          s->picture.data[0], s->picture.linesize[0], ir2_luma_table);
  155.         /* swapped U and V */
  156.         ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
  157.                          s->picture.data[2], s->picture.linesize[2], ir2_luma_table);
  158.         ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
  159.                          s->picture.data[1], s->picture.linesize[1], ir2_luma_table);
  160.     } else { /* interframe */
  161.         ir2_decode_plane_inter(s, avctx->width, avctx->height,
  162.                          s->picture.data[0], s->picture.linesize[0], ir2_luma_table);
  163.         /* swapped U and V */
  164.         ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
  165.                          s->picture.data[2], s->picture.linesize[2], ir2_luma_table);
  166.         ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
  167.                          s->picture.data[1], s->picture.linesize[1], ir2_luma_table);
  168.     }
  169.     *picture= *(AVFrame*)&s->picture;
  170.     *data_size = sizeof(AVPicture);
  171.     return buf_size;
  172. }
  173. static int ir2_decode_init(AVCodecContext *avctx){
  174.     Ir2Context * const ic = avctx->priv_data;
  175.     ic->avctx = avctx;
  176.     avctx->pix_fmt= PIX_FMT_YUV410P;
  177.     
  178.     if (!ir2_vlc.table)
  179.         init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES,
  180.                  &ir2_codes[0][1], 4, 2,
  181. #ifdef ALT_BITSTREAM_READER_LE
  182.                  &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC | INIT_VLC_LE);    
  183. #else
  184.                  &ir2_codes[0][0], 4, 2, INIT_VLC_USE_STATIC);    
  185. #endif
  186.                  
  187.     return 0;
  188. }
  189. AVCodec indeo2_decoder = {
  190.     "indeo2",
  191.     CODEC_TYPE_VIDEO,
  192.     CODEC_ID_INDEO2,
  193.     sizeof(Ir2Context),
  194.     ir2_decode_init,
  195.     NULL,
  196.     NULL,
  197.     ir2_decode_frame,
  198.     CODEC_CAP_DR1,
  199. };