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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * ATI VCR1 codec
  3.  * Copyright (c) 2003 Michael Niedermayer
  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 vcr1.c
  22.  * ati vcr1 codec.
  23.  */
  24.  
  25. #include "avcodec.h"
  26. #include "mpegvideo.h"
  27. //#undef NDEBUG
  28. //#include <assert.h>
  29. typedef struct VCR1Context{
  30.     AVCodecContext *avctx;
  31.     AVFrame picture;
  32.     int delta[16];
  33.     int offset[4];
  34. } VCR1Context;
  35. static int decode_frame(AVCodecContext *avctx, 
  36.                         void *data, int *data_size,
  37.                         uint8_t *buf, int buf_size)
  38. {
  39.     VCR1Context * const a = avctx->priv_data;
  40.     AVFrame *picture = data;
  41.     AVFrame * const p= (AVFrame*)&a->picture;
  42.     uint8_t *bytestream= buf;
  43.     int i, x, y;
  44.     if(p->data[0])
  45.         avctx->release_buffer(avctx, p);
  46.     p->reference= 0;
  47.     if(avctx->get_buffer(avctx, p) < 0){
  48.         av_log(avctx, AV_LOG_ERROR, "get_buffer() failedn");
  49.         return -1;
  50.     }
  51.     p->pict_type= I_TYPE;
  52.     p->key_frame= 1;
  53.     for(i=0; i<16; i++){
  54.         a->delta[i]= *(bytestream++);
  55.         bytestream++;
  56.     }
  57.     
  58.     for(y=0; y<avctx->height; y++){
  59.         int offset;
  60.         uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ];
  61.         if((y&3) == 0){
  62.             uint8_t *cb= &a->picture.data[1][ (y>>2)*a->picture.linesize[1] ];
  63.             uint8_t *cr= &a->picture.data[2][ (y>>2)*a->picture.linesize[2] ];
  64.             for(i=0; i<4; i++)
  65.                 a->offset[i]= *(bytestream++);
  66.             offset= a->offset[0] - a->delta[ bytestream[2]&0xF ];
  67.             for(x=0; x<avctx->width; x+=4){
  68.                 luma[0]=( offset += a->delta[ bytestream[2]&0xF ]);
  69.                 luma[1]=( offset += a->delta[ bytestream[2]>>4  ]);
  70.                 luma[2]=( offset += a->delta[ bytestream[0]&0xF ]);
  71.                 luma[3]=( offset += a->delta[ bytestream[0]>>4  ]);
  72.                 luma += 4;
  73.                 
  74.                 *(cb++) = bytestream[3];
  75.                 *(cr++) = bytestream[1];
  76.                 
  77.                 bytestream+= 4;
  78.             }
  79.         }else{
  80.             offset= a->offset[y&3] - a->delta[ bytestream[2]&0xF ];
  81.             for(x=0; x<avctx->width; x+=8){
  82.                 luma[0]=( offset += a->delta[ bytestream[2]&0xF ]);
  83.                 luma[1]=( offset += a->delta[ bytestream[2]>>4  ]);
  84.                 luma[2]=( offset += a->delta[ bytestream[3]&0xF ]);
  85.                 luma[3]=( offset += a->delta[ bytestream[3]>>4  ]);
  86.                 luma[4]=( offset += a->delta[ bytestream[0]&0xF ]);
  87.                 luma[5]=( offset += a->delta[ bytestream[0]>>4  ]);
  88.                 luma[6]=( offset += a->delta[ bytestream[1]&0xF ]);
  89.                 luma[7]=( offset += a->delta[ bytestream[1]>>4  ]);
  90.                 luma += 8;
  91.                 bytestream+= 4;
  92.             }
  93.         }
  94.     }
  95.     *picture= *(AVFrame*)&a->picture;
  96.     *data_size = sizeof(AVPicture);
  97.     emms_c();
  98.     
  99.     return buf_size;
  100. }
  101. #if 0
  102. static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
  103.     VCR1Context * const a = avctx->priv_data;
  104.     AVFrame *pict = data;
  105.     AVFrame * const p= (AVFrame*)&a->picture;
  106.     int size;
  107.     int mb_x, mb_y;
  108.     *p = *pict;
  109.     p->pict_type= I_TYPE;
  110.     p->key_frame= 1;
  111.     emms_c();
  112.     
  113.     align_put_bits(&a->pb);
  114.     while(get_bit_count(&a->pb)&31)
  115.         put_bits(&a->pb, 8, 0);
  116.     
  117.     size= get_bit_count(&a->pb)/32;
  118.     
  119.     return size*4;
  120. }
  121. #endif
  122. static void common_init(AVCodecContext *avctx){
  123.     VCR1Context * const a = avctx->priv_data;
  124.     avctx->coded_frame= (AVFrame*)&a->picture;
  125.     a->avctx= avctx;
  126. }
  127. static int decode_init(AVCodecContext *avctx){
  128.  
  129.     common_init(avctx);
  130.     
  131.     avctx->pix_fmt= PIX_FMT_YUV410P;
  132.     return 0;
  133. }
  134. #if 0
  135. static int encode_init(AVCodecContext *avctx){
  136.  
  137.     common_init(avctx);
  138.     
  139.     return 0;
  140. }
  141. #endif
  142. AVCodec vcr1_decoder = {
  143.     "vcr1",
  144.     CODEC_TYPE_VIDEO,
  145.     CODEC_ID_VCR1,
  146.     sizeof(VCR1Context),
  147.     decode_init,
  148.     NULL,
  149.     NULL,
  150.     decode_frame,
  151.     CODEC_CAP_DR1,
  152. };
  153. #if 0
  154. #ifdef CONFIG_ENCODERS
  155. AVCodec vcr1_encoder = {
  156.     "vcr1",
  157.     CODEC_TYPE_VIDEO,
  158.     CODEC_ID_VCR1,
  159.     sizeof(VCR1Context),
  160.     encode_init,
  161.     encode_frame,
  162.     //encode_end,
  163. };
  164. #endif //CONFIG_ENCODERS
  165. #endif