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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * ASUS V1/V2 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 asv1.c
  22.  * ASUS V1/V2 codec.
  23.  */
  24.  
  25. #include "avcodec.h"
  26. #include "dsputil.h"
  27. #include "mpegvideo.h"
  28. //#undef NDEBUG
  29. //#include <assert.h>
  30. #define VLC_BITS 6
  31. #define ASV2_LEVEL_VLC_BITS 10
  32.  
  33. typedef struct ASV1Context{
  34.     AVCodecContext *avctx;
  35.     DSPContext dsp;
  36.     AVFrame picture;
  37.     PutBitContext pb;
  38.     GetBitContext gb;
  39.     ScanTable scantable;
  40.     int inv_qscale;
  41.     int mb_width;
  42.     int mb_height;
  43.     int mb_width2;
  44.     int mb_height2;
  45.     DCTELEM __align8 block[6][64];
  46.     uint16_t __align8 intra_matrix[64];
  47.     int __align8 q_intra_matrix[64];
  48.     uint8_t *bitstream_buffer;
  49.     int bitstream_buffer_size;
  50. } ASV1Context;
  51. static const uint8_t scantab[64]={
  52.     0x00,0x08,0x01,0x09,0x10,0x18,0x11,0x19,
  53.     0x02,0x0A,0x03,0x0B,0x12,0x1A,0x13,0x1B,
  54.     0x04,0x0C,0x05,0x0D,0x20,0x28,0x21,0x29,
  55.     0x06,0x0E,0x07,0x0F,0x14,0x1C,0x15,0x1D,
  56.     0x22,0x2A,0x23,0x2B,0x30,0x38,0x31,0x39,
  57.     0x16,0x1E,0x17,0x1F,0x24,0x2C,0x25,0x2D,
  58.     0x32,0x3A,0x33,0x3B,0x26,0x2E,0x27,0x2F,
  59.     0x34,0x3C,0x35,0x3D,0x36,0x3E,0x37,0x3F,
  60. };
  61. static const uint8_t ccp_tab[17][2]={
  62.     {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5},
  63.     {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5},
  64.     {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5}, 
  65.     {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2},
  66.     {0xF,5}, //EOB
  67. };
  68. static const uint8_t level_tab[7][2]={
  69.     {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4}
  70. };
  71. static const uint8_t dc_ccp_tab[8][2]={
  72.     {0x1,2}, {0xD,4}, {0xF,4}, {0xC,4},
  73.     {0x5,3}, {0xE,4}, {0x4,3}, {0x0,2},
  74. };
  75. static const uint8_t ac_ccp_tab[16][2]={
  76.     {0x00,2}, {0x3B,6}, {0x0A,4}, {0x3A,6},
  77.     {0x02,3}, {0x39,6}, {0x3C,6}, {0x38,6},
  78.     {0x03,3}, {0x3D,6}, {0x08,4}, {0x1F,5},
  79.     {0x09,4}, {0x0B,4}, {0x0D,4}, {0x0C,4},
  80. };
  81. static const uint8_t asv2_level_tab[63][2]={
  82.     {0x3F,10},{0x2F,10},{0x37,10},{0x27,10},{0x3B,10},{0x2B,10},{0x33,10},{0x23,10},
  83.     {0x3D,10},{0x2D,10},{0x35,10},{0x25,10},{0x39,10},{0x29,10},{0x31,10},{0x21,10},
  84.     {0x1F, 8},{0x17, 8},{0x1B, 8},{0x13, 8},{0x1D, 8},{0x15, 8},{0x19, 8},{0x11, 8},
  85.     {0x0F, 6},{0x0B, 6},{0x0D, 6},{0x09, 6},
  86.     {0x07, 4},{0x05, 4},
  87.     {0x03, 2},
  88.     {0x00, 5},
  89.     {0x02, 2},
  90.     {0x04, 4},{0x06, 4},
  91.     {0x08, 6},{0x0C, 6},{0x0A, 6},{0x0E, 6},
  92.     {0x10, 8},{0x18, 8},{0x14, 8},{0x1C, 8},{0x12, 8},{0x1A, 8},{0x16, 8},{0x1E, 8},
  93.     {0x20,10},{0x30,10},{0x28,10},{0x38,10},{0x24,10},{0x34,10},{0x2C,10},{0x3C,10},
  94.     {0x22,10},{0x32,10},{0x2A,10},{0x3A,10},{0x26,10},{0x36,10},{0x2E,10},{0x3E,10},
  95. };
  96. static VLC ccp_vlc;
  97. static VLC level_vlc;
  98. static VLC dc_ccp_vlc;
  99. static VLC ac_ccp_vlc;
  100. static VLC asv2_level_vlc;
  101. static void init_vlcs(ASV1Context *a){
  102.     static int done = 0;
  103.     if (!done) {
  104.         done = 1;
  105.         init_vlc(&ccp_vlc, VLC_BITS, 17, 
  106.                  &ccp_tab[0][1], 2, 1,
  107.                  &ccp_tab[0][0], 2, 1, 1);
  108.         init_vlc(&dc_ccp_vlc, VLC_BITS, 8, 
  109.                  &dc_ccp_tab[0][1], 2, 1,
  110.                  &dc_ccp_tab[0][0], 2, 1, 1);
  111.         init_vlc(&ac_ccp_vlc, VLC_BITS, 16, 
  112.                  &ac_ccp_tab[0][1], 2, 1,
  113.                  &ac_ccp_tab[0][0], 2, 1, 1);
  114.         init_vlc(&level_vlc,  VLC_BITS, 7, 
  115.                  &level_tab[0][1], 2, 1,
  116.                  &level_tab[0][0], 2, 1, 1);
  117.         init_vlc(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63, 
  118.                  &asv2_level_tab[0][1], 2, 1,
  119.                  &asv2_level_tab[0][0], 2, 1, 1);
  120.     }
  121. }
  122. //FIXME write a reversed bitstream reader to avoid the double reverse
  123. static inline int asv2_get_bits(GetBitContext *gb, int n){
  124.     return ff_reverse[ get_bits(gb, n) << (8-n) ];
  125. }
  126. static inline void asv2_put_bits(PutBitContext *pb, int n, int v){
  127.     put_bits(pb, n, ff_reverse[ v << (8-n) ]);
  128. }
  129. static inline int asv1_get_level(GetBitContext *gb){
  130.     int code= get_vlc2(gb, level_vlc.table, VLC_BITS, 1);
  131.     if(code==3) return get_sbits(gb, 8);
  132.     else        return code - 3;
  133. }
  134. static inline int asv2_get_level(GetBitContext *gb){
  135.     int code= get_vlc2(gb, asv2_level_vlc.table, ASV2_LEVEL_VLC_BITS, 1);
  136.     if(code==31) return (int8_t)asv2_get_bits(gb, 8);
  137.     else         return code - 31;
  138. }
  139. static inline void asv1_put_level(PutBitContext *pb, int level){
  140.     unsigned int index= level + 3;
  141.     if(index <= 6) put_bits(pb, level_tab[index][1], level_tab[index][0]);
  142.     else{
  143.         put_bits(pb, level_tab[3][1], level_tab[3][0]);
  144.         put_bits(pb, 8, level&0xFF);
  145.     }
  146. }
  147. static inline void asv2_put_level(PutBitContext *pb, int level){
  148.     unsigned int index= level + 31;
  149.     if(index <= 62) put_bits(pb, asv2_level_tab[index][1], asv2_level_tab[index][0]);
  150.     else{
  151.         put_bits(pb, asv2_level_tab[31][1], asv2_level_tab[31][0]);
  152.         asv2_put_bits(pb, 8, level&0xFF);
  153.     }
  154. }
  155. static inline int asv1_decode_block(ASV1Context *a, DCTELEM block[64]){
  156.     int i;
  157.     block[0]= 8*get_bits(&a->gb, 8);
  158.     
  159.     for(i=0; i<11; i++){
  160.         const int ccp= get_vlc2(&a->gb, ccp_vlc.table, VLC_BITS, 1);
  161.         if(ccp){
  162.             if(ccp == 16) break;
  163.             if(ccp < 0 || i>=10){
  164.                 av_log(a->avctx, AV_LOG_ERROR, "coded coeff pattern damagedn");
  165.                 return -1;
  166.             }
  167.             if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4;
  168.             if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4;
  169.             if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4;
  170.             if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4;
  171.         }
  172.     }
  173.     return 0;
  174. }
  175. static inline int asv2_decode_block(ASV1Context *a, DCTELEM block[64]){
  176.     int i, count, ccp;
  177.     count= asv2_get_bits(&a->gb, 4);
  178.     
  179.     block[0]= 8*asv2_get_bits(&a->gb, 8);
  180.     
  181.     ccp= get_vlc2(&a->gb, dc_ccp_vlc.table, VLC_BITS, 1);
  182.     if(ccp){
  183.         if(ccp&4) block[a->scantable.permutated[1]]= (asv2_get_level(&a->gb) * a->intra_matrix[1])>>4;
  184.         if(ccp&2) block[a->scantable.permutated[2]]= (asv2_get_level(&a->gb) * a->intra_matrix[2])>>4;
  185.         if(ccp&1) block[a->scantable.permutated[3]]= (asv2_get_level(&a->gb) * a->intra_matrix[3])>>4;
  186.     }
  187.     for(i=1; i<count+1; i++){
  188.         const int ccp= get_vlc2(&a->gb, ac_ccp_vlc.table, VLC_BITS, 1);
  189.         if(ccp){
  190.             if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4;
  191.             if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4;
  192.             if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4;
  193.             if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4;
  194.         }
  195.     }
  196.     
  197.     return 0;
  198. }
  199. static inline void asv1_encode_block(ASV1Context *a, DCTELEM block[64]){
  200.     int i;
  201.     int nc_count=0;
  202.     
  203.     put_bits(&a->pb, 8, (block[0] + 32)>>6);
  204.     block[0]= 0;
  205.     
  206.     for(i=0; i<10; i++){
  207.         const int index= scantab[4*i];
  208.         int ccp=0;
  209.         if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8;
  210.         if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4;
  211.         if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2;
  212.         if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1;
  213.         if(ccp){
  214.             for(;nc_count; nc_count--) 
  215.                 put_bits(&a->pb, ccp_tab[0][1], ccp_tab[0][0]);
  216.             put_bits(&a->pb, ccp_tab[ccp][1], ccp_tab[ccp][0]);
  217.             
  218.             if(ccp&8) asv1_put_level(&a->pb, block[index + 0]);
  219.             if(ccp&4) asv1_put_level(&a->pb, block[index + 8]);
  220.             if(ccp&2) asv1_put_level(&a->pb, block[index + 1]);
  221.             if(ccp&1) asv1_put_level(&a->pb, block[index + 9]);
  222.         }else{
  223.             nc_count++;
  224.         }
  225.     }
  226.     put_bits(&a->pb, ccp_tab[16][1], ccp_tab[16][0]);
  227. }
  228. static inline void asv2_encode_block(ASV1Context *a, DCTELEM block[64]){
  229.     int i;
  230.     int count=0;
  231.     
  232.     for(count=63; count>3; count--){
  233.         const int index= scantab[count];
  234.         if( (block[index]*a->q_intra_matrix[index] + (1<<15))>>16 ) 
  235.             break;
  236.     }
  237.     
  238.     count >>= 2;
  239.     asv2_put_bits(&a->pb, 4, count);
  240.     asv2_put_bits(&a->pb, 8, (block[0] + 32)>>6);
  241.     block[0]= 0;
  242.     
  243.     for(i=0; i<=count; i++){
  244.         const int index= scantab[4*i];
  245.         int ccp=0;
  246.         if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8;
  247.         if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4;
  248.         if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2;
  249.         if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1;
  250.         if(i) put_bits(&a->pb, ac_ccp_tab[ccp][1], ac_ccp_tab[ccp][0]);
  251.         else  put_bits(&a->pb, dc_ccp_tab[ccp][1], dc_ccp_tab[ccp][0]);
  252.         if(ccp){
  253.             if(ccp&8) asv2_put_level(&a->pb, block[index + 0]);
  254.             if(ccp&4) asv2_put_level(&a->pb, block[index + 8]);
  255.             if(ccp&2) asv2_put_level(&a->pb, block[index + 1]);
  256.             if(ccp&1) asv2_put_level(&a->pb, block[index + 9]);
  257.         }
  258.     }
  259. }
  260. static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){
  261.     int i;
  262.     a->dsp.clear_blocks(block[0]);
  263.     
  264.     if(a->avctx->codec_id == CODEC_ID_ASV1){
  265.         for(i=0; i<6; i++){
  266.             if( asv1_decode_block(a, block[i]) < 0) 
  267.                 return -1;
  268.         }
  269.     }else{
  270.         for(i=0; i<6; i++){
  271.             if( asv2_decode_block(a, block[i]) < 0) 
  272.                 return -1;
  273.         }
  274.     }
  275.     return 0;
  276. }
  277. static inline int encode_mb(ASV1Context *a, DCTELEM block[6][64]){
  278.     int i;
  279.     
  280.     if(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb)>>3) < 30*16*16*3/2/8){
  281.         av_log(a->avctx, AV_LOG_ERROR, "encoded frame too largen");
  282.         return -1;
  283.     }
  284.     if(a->avctx->codec_id == CODEC_ID_ASV1){
  285.         for(i=0; i<6; i++)
  286.             asv1_encode_block(a, block[i]);
  287.     }else{
  288.         for(i=0; i<6; i++)
  289.             asv2_encode_block(a, block[i]);
  290.     }
  291.     return 0;
  292. }
  293. static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
  294.     DCTELEM (*block)[64]= a->block;
  295.     int linesize= a->picture.linesize[0];
  296.     
  297.     uint8_t *dest_y  = a->picture.data[0] + (mb_y * 16* linesize              ) + mb_x * 16;
  298.     uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8;
  299.     uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8;
  300.     a->dsp.idct_put(dest_y                 , linesize, block[0]);
  301.     a->dsp.idct_put(dest_y              + 8, linesize, block[1]);
  302.     a->dsp.idct_put(dest_y + 8*linesize    , linesize, block[2]);
  303.     a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
  304.     if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
  305.         a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]);
  306.         a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]);
  307.     }
  308. }
  309. static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){
  310.     DCTELEM (*block)[64]= a->block;
  311.     int linesize= a->picture.linesize[0];
  312.     int i;
  313.     
  314.     uint8_t *ptr_y  = a->picture.data[0] + (mb_y * 16* linesize              ) + mb_x * 16;
  315.     uint8_t *ptr_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8;
  316.     uint8_t *ptr_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8;
  317.     a->dsp.get_pixels(block[0], ptr_y                 , linesize);
  318.     a->dsp.get_pixels(block[1], ptr_y              + 8, linesize);
  319.     a->dsp.get_pixels(block[2], ptr_y + 8*linesize    , linesize);
  320.     a->dsp.get_pixels(block[3], ptr_y + 8*linesize + 8, linesize);
  321.     for(i=0; i<4; i++)
  322.         a->dsp.fdct(block[i]);
  323.     
  324.     if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
  325.         a->dsp.get_pixels(block[4], ptr_cb, a->picture.linesize[1]);
  326.         a->dsp.get_pixels(block[5], ptr_cr, a->picture.linesize[2]);
  327.         for(i=4; i<6; i++)
  328.             a->dsp.fdct(block[i]);
  329.     }
  330. }
  331. static int decode_frame(AVCodecContext *avctx, 
  332.                         void *data, int *data_size,
  333.                         uint8_t *buf, int buf_size)
  334. {
  335.     ASV1Context * const a = avctx->priv_data;
  336.     AVFrame *picture = data;
  337.     AVFrame * const p= (AVFrame*)&a->picture;
  338.     int mb_x, mb_y;
  339.     if(p->data[0])
  340.         avctx->release_buffer(avctx, p);
  341.     p->reference= 0;
  342.     if(avctx->get_buffer(avctx, p) < 0){
  343.         av_log(avctx, AV_LOG_ERROR, "get_buffer() failedn");
  344.         return -1;
  345.     }
  346.     p->pict_type= I_TYPE;
  347.     p->key_frame= 1;
  348.     a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
  349.     
  350.     if(avctx->codec_id == CODEC_ID_ASV1)
  351.         a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (uint32_t*)buf, buf_size/4);
  352.     else{
  353.         int i;
  354.         for(i=0; i<buf_size; i++)
  355.             a->bitstream_buffer[i]= ff_reverse[ buf[i] ];
  356.     }
  357.     init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
  358.     for(mb_y=0; mb_y<a->mb_height2; mb_y++){
  359.         for(mb_x=0; mb_x<a->mb_width2; mb_x++){
  360.             if( decode_mb(a, a->block) <0)
  361.                 return -1;
  362.              
  363.             idct_put(a, mb_x, mb_y);
  364.         }
  365.     }
  366.     if(a->mb_width2 != a->mb_width){
  367.         mb_x= a->mb_width2;
  368.         for(mb_y=0; mb_y<a->mb_height2; mb_y++){
  369.             if( decode_mb(a, a->block) <0)
  370.                 return -1;
  371.              
  372.             idct_put(a, mb_x, mb_y);
  373.         }
  374.     }
  375.     if(a->mb_height2 != a->mb_height){
  376.         mb_y= a->mb_height2;
  377.         for(mb_x=0; mb_x<a->mb_width; mb_x++){
  378.             if( decode_mb(a, a->block) <0)
  379.                 return -1;
  380.              
  381.             idct_put(a, mb_x, mb_y);
  382.         }
  383.     }
  384. #if 0    
  385. int i;
  386. printf("%d %dn", 8*buf_size, get_bits_count(&a->gb));
  387. for(i=get_bits_count(&a->gb); i<8*buf_size; i++){
  388.     printf("%d", get_bits1(&a->gb));
  389. }
  390. for(i=0; i<s->avctx->extradata_size; i++){
  391.     printf("%cn", ((uint8_t*)s->avctx->extradata)[i]);
  392. }
  393. #endif
  394.     *picture= *(AVFrame*)&a->picture;
  395.     *data_size = sizeof(AVPicture);
  396.     emms_c();
  397.     
  398.     return (get_bits_count(&a->gb)+31)/32*4;
  399. }
  400. static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
  401.     ASV1Context * const a = avctx->priv_data;
  402.     AVFrame *pict = data;
  403.     AVFrame * const p= (AVFrame*)&a->picture;
  404.     int size;
  405.     int mb_x, mb_y;
  406.     init_put_bits(&a->pb, buf, buf_size);
  407.     
  408.     *p = *pict;
  409.     p->pict_type= I_TYPE;
  410.     p->key_frame= 1;
  411.     for(mb_y=0; mb_y<a->mb_height2; mb_y++){
  412.         for(mb_x=0; mb_x<a->mb_width2; mb_x++){
  413.             dct_get(a, mb_x, mb_y);
  414.             encode_mb(a, a->block);
  415.         }
  416.     }
  417.     if(a->mb_width2 != a->mb_width){
  418.         mb_x= a->mb_width2;
  419.         for(mb_y=0; mb_y<a->mb_height2; mb_y++){
  420.             dct_get(a, mb_x, mb_y);
  421.             encode_mb(a, a->block);
  422.         }
  423.     }
  424.     if(a->mb_height2 != a->mb_height){
  425.         mb_y= a->mb_height2;
  426.         for(mb_x=0; mb_x<a->mb_width; mb_x++){
  427.             dct_get(a, mb_x, mb_y);
  428.             encode_mb(a, a->block);
  429.         }
  430.     }
  431.     emms_c();
  432.     
  433.     align_put_bits(&a->pb);
  434.     while(put_bits_count(&a->pb)&31)
  435.         put_bits(&a->pb, 8, 0);
  436.     
  437.     size= put_bits_count(&a->pb)/32;
  438.     
  439.     if(avctx->codec_id == CODEC_ID_ASV1)
  440.         a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
  441.     else{
  442.         int i;
  443.         for(i=0; i<4*size; i++)
  444.             buf[i]= ff_reverse[ buf[i] ];
  445.     }
  446.     
  447.     return size*4;
  448. }
  449. static void common_init(AVCodecContext *avctx){
  450.     ASV1Context * const a = avctx->priv_data;
  451.     dsputil_init(&a->dsp, avctx);
  452.     a->mb_width   = (avctx->width  + 15) / 16;
  453.     a->mb_height  = (avctx->height + 15) / 16;
  454.     a->mb_width2  = (avctx->width  + 0) / 16;
  455.     a->mb_height2 = (avctx->height + 0) / 16;
  456.     avctx->coded_frame= (AVFrame*)&a->picture;
  457.     a->avctx= avctx;
  458. }
  459. static int decode_init(AVCodecContext *avctx){
  460.     ASV1Context * const a = avctx->priv_data;
  461.     AVFrame *p= (AVFrame*)&a->picture;
  462.     int i;
  463.     const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
  464.  
  465.     common_init(avctx);
  466.     init_vlcs(a);
  467.     ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab);
  468.     avctx->pix_fmt= PIX_FMT_YUV420P;
  469.     a->inv_qscale= ((uint8_t*)avctx->extradata)[0];
  470.     if(a->inv_qscale == 0){
  471.         av_log(avctx, AV_LOG_ERROR, "illegal qscale 0n");
  472.         if(avctx->codec_id == CODEC_ID_ASV1)
  473.             a->inv_qscale= 6;
  474.         else
  475.             a->inv_qscale= 10;
  476.     }
  477.     for(i=0; i<64; i++){
  478.         int index= scantab[i];
  479.         a->intra_matrix[i]= 64*scale*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale;
  480.     }
  481.     p->qstride= a->mb_width;
  482.     p->qscale_table= av_malloc( p->qstride * a->mb_height);
  483.     p->quality= (32*scale + a->inv_qscale/2)/a->inv_qscale;
  484.     memset(p->qscale_table, p->quality, p->qstride*a->mb_height);
  485.     return 0;
  486. }
  487. static int encode_init(AVCodecContext *avctx){
  488.     ASV1Context * const a = avctx->priv_data;
  489.     int i;
  490.     const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
  491.     common_init(avctx);
  492.     
  493.     if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
  494.     a->inv_qscale= (32*scale*FF_QUALITY_SCALE +  avctx->global_quality/2) / avctx->global_quality;
  495.     
  496.     avctx->extradata= av_mallocz(8);
  497.     avctx->extradata_size=8;
  498.     ((uint32_t*)avctx->extradata)[0]= le2me_32(a->inv_qscale);
  499.     ((uint32_t*)avctx->extradata)[1]= le2me_32(ff_get_fourcc("ASUS"));
  500.     
  501.     for(i=0; i<64; i++){
  502.         int q= 32*scale*ff_mpeg1_default_intra_matrix[i];
  503.         a->q_intra_matrix[i]= ((a->inv_qscale<<16) + q/2) / q;
  504.     }
  505.     return 0;
  506. }
  507. static int decode_end(AVCodecContext *avctx){
  508.     ASV1Context * const a = avctx->priv_data;
  509.     av_freep(&a->bitstream_buffer);
  510.     av_freep(&a->picture.qscale_table);
  511.     a->bitstream_buffer_size=0;
  512.     
  513.     return 0;
  514. }
  515. AVCodec asv1_decoder = {
  516.     "asv1",
  517.     CODEC_TYPE_VIDEO,
  518.     CODEC_ID_ASV1,
  519.     sizeof(ASV1Context),
  520.     decode_init,
  521.     NULL,
  522.     decode_end,
  523.     decode_frame,
  524.     CODEC_CAP_DR1,
  525. };
  526. AVCodec asv2_decoder = {
  527.     "asv2",
  528.     CODEC_TYPE_VIDEO,
  529.     CODEC_ID_ASV2,
  530.     sizeof(ASV1Context),
  531.     decode_init,
  532.     NULL,
  533.     decode_end,
  534.     decode_frame,
  535.     CODEC_CAP_DR1,
  536. };
  537. #ifdef CONFIG_ENCODERS
  538. AVCodec asv1_encoder = {
  539.     "asv1",
  540.     CODEC_TYPE_VIDEO,
  541.     CODEC_ID_ASV1,
  542.     sizeof(ASV1Context),
  543.     encode_init,
  544.     encode_frame,
  545.     //encode_end,
  546. };
  547. AVCodec asv2_encoder = {
  548.     "asv2",
  549.     CODEC_TYPE_VIDEO,
  550.     CODEC_ID_ASV2,
  551.     sizeof(ASV1Context),
  552.     encode_init,
  553.     encode_frame,
  554.     //encode_end,
  555. };
  556. #endif //CONFIG_ENCODERS