Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * huffyuv codec for libavcodec
  3.  *
  4.  * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of
  7.  * the algorithm used
  8.  *
  9.  * This file is part of FFmpeg.
  10.  *
  11.  * FFmpeg is free software; you can redistribute it and/or
  12.  * modify it under the terms of the GNU Lesser General Public
  13.  * License as published by the Free Software Foundation; either
  14.  * version 2.1 of the License, or (at your option) any later version.
  15.  *
  16.  * FFmpeg is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19.  * Lesser General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU Lesser General Public
  22.  * License along with FFmpeg; if not, write to the Free Software
  23.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24.  */
  25.  
  26. /**
  27.  * @file
  28.  * huffyuv codec for libavcodec.
  29.  */
  30.  
  31. #include <stdint.h>
  32.  
  33. #include "libavutil/mem.h"
  34.  
  35. #include "avcodec.h"
  36. #include "huffyuv.h"
  37.  
  38. int ff_huffyuv_generate_bits_table(uint32_t *dst, const uint8_t *len_table)
  39. {
  40.     int len, index;
  41.     uint32_t bits = 0;
  42.  
  43.     for (len = 32; len > 0; len--) {
  44.         for (index = 0; index < 256; index++) {
  45.             if (len_table[index] == len)
  46.                 dst[index] = bits++;
  47.         }
  48.         if (bits & 1) {
  49.             av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
  50.             return -1;
  51.         }
  52.         bits >>= 1;
  53.     }
  54.     return 0;
  55. }
  56.  
  57. av_cold int ff_huffyuv_alloc_temp(HYuvContext *s)
  58. {
  59.     int i;
  60.  
  61.     if (s->bitstream_bpp<24) {
  62.         for (i=0; i<3; i++) {
  63.             s->temp[i]= av_malloc(s->width + 16);
  64.             if (!s->temp[i])
  65.                 return AVERROR(ENOMEM);
  66.         }
  67.     } else {
  68.         s->temp[0]= av_mallocz(4*s->width + 16);
  69.         if (!s->temp[0])
  70.             return AVERROR(ENOMEM);
  71.     }
  72.     return 0;
  73. }
  74.  
  75. av_cold void ff_huffyuv_common_init(AVCodecContext *avctx)
  76. {
  77.     HYuvContext *s = avctx->priv_data;
  78.  
  79.     s->avctx = avctx;
  80.     s->flags = avctx->flags;
  81.  
  82.     ff_dsputil_init(&s->dsp, avctx);
  83.  
  84.     s->width = avctx->width;
  85.     s->height = avctx->height;
  86.  
  87.     av_assert1(s->width > 0 && s->height > 0);
  88. }
  89.  
  90. av_cold void ff_huffyuv_common_end(HYuvContext *s)
  91. {
  92.     int i;
  93.  
  94.     for(i = 0; i < 3; i++) {
  95.         av_freep(&s->temp[i]);
  96.     }
  97. }
  98.