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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Cirrus Logic AccuPak (CLJR) codec
  3.  * Copyright (c) 2003 Alex Beregszaszi
  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 cljr.c
  23.  * Cirrus Logic AccuPak codec.
  24.  */
  25.  
  26. #include "avcodec.h"
  27. #include "mpegvideo.h"
  28. typedef struct CLJRContext{
  29.     AVCodecContext *avctx;
  30.     AVFrame picture;
  31.     int delta[16];
  32.     int offset[4];
  33.     GetBitContext gb;
  34. } CLJRContext;
  35. static int decode_frame(AVCodecContext *avctx, 
  36.                         void *data, int *data_size,
  37.                         uint8_t *buf, int buf_size)
  38. {
  39.     CLJRContext * const a = avctx->priv_data;
  40.     AVFrame *picture = data;
  41.     AVFrame * const p= (AVFrame*)&a->picture;
  42.     int x, y;
  43.     if(p->data[0])
  44.         avctx->release_buffer(avctx, p);
  45.     p->reference= 0;
  46.     if(avctx->get_buffer(avctx, p) < 0){
  47.         av_log(avctx, AV_LOG_ERROR, "get_buffer() failedn");
  48.         return -1;
  49.     }
  50.     p->pict_type= I_TYPE;
  51.     p->key_frame= 1;
  52.     init_get_bits(&a->gb, buf, buf_size);
  53.     for(y=0; y<avctx->height; y++){
  54.         uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ];
  55.         uint8_t *cb= &a->picture.data[1][ y*a->picture.linesize[1] ];
  56.         uint8_t *cr= &a->picture.data[2][ y*a->picture.linesize[2] ];
  57.         for(x=0; x<avctx->width; x+=4){
  58.          luma[3] = get_bits(&a->gb, 5) << 3;
  59.     luma[2] = get_bits(&a->gb, 5) << 3;
  60.     luma[1] = get_bits(&a->gb, 5) << 3;
  61.     luma[0] = get_bits(&a->gb, 5) << 3;
  62.     luma+= 4;
  63.     *(cb++) = get_bits(&a->gb, 6) << 2;
  64.     *(cr++) = get_bits(&a->gb, 6) << 2;
  65.         }
  66.     }
  67.     *picture= *(AVFrame*)&a->picture;
  68.     *data_size = sizeof(AVPicture);
  69.     emms_c();
  70.     
  71.     return buf_size;
  72. }
  73. #if 0
  74. static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
  75.     CLJRContext * const a = avctx->priv_data;
  76.     AVFrame *pict = data;
  77.     AVFrame * const p= (AVFrame*)&a->picture;
  78.     int size;
  79.     int mb_x, mb_y;
  80.     *p = *pict;
  81.     p->pict_type= I_TYPE;
  82.     p->key_frame= 1;
  83.     emms_c();
  84.     
  85.     align_put_bits(&a->pb);
  86.     while(get_bit_count(&a->pb)&31)
  87.         put_bits(&a->pb, 8, 0);
  88.     
  89.     size= get_bit_count(&a->pb)/32;
  90.     
  91.     return size*4;
  92. }
  93. #endif
  94. static void common_init(AVCodecContext *avctx){
  95.     CLJRContext * const a = avctx->priv_data;
  96.     avctx->coded_frame= (AVFrame*)&a->picture;
  97.     a->avctx= avctx;
  98. }
  99. static int decode_init(AVCodecContext *avctx){
  100.     common_init(avctx);
  101.     
  102.     avctx->pix_fmt= PIX_FMT_YUV411P;
  103.     return 0;
  104. }
  105. #if 0
  106. static int encode_init(AVCodecContext *avctx){
  107.     common_init(avctx);
  108.     
  109.     return 0;
  110. }
  111. #endif
  112. AVCodec cljr_decoder = {
  113.     "cljr",
  114.     CODEC_TYPE_VIDEO,
  115.     CODEC_ID_CLJR,
  116.     sizeof(CLJRContext),
  117.     decode_init,
  118.     NULL,
  119.     NULL,
  120.     decode_frame,
  121.     CODEC_CAP_DR1,
  122. };
  123. #if 0
  124. #ifdef CONFIG_ENCODERS
  125. AVCodec cljr_encoder = {
  126.     "cljr",
  127.     CODEC_TYPE_VIDEO,
  128.     CODEC_ID_cljr,
  129.     sizeof(CLJRContext),
  130.     encode_init,
  131.     encode_frame,
  132.     //encode_end,
  133. };
  134. #endif //CONFIG_ENCODERS
  135. #endif