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

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg
  3.  * written, produced, and directed by Alan Smithee
  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. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. //Picard #include <unistd.h>
  23. #include "common.h"
  24. #include "avcodec.h"
  25. #include "dsputil.h"
  26. #include "mpegvideo.h"
  27. #include "indeo3data.h"
  28. typedef struct
  29. {
  30.   unsigned char *Ybuf;
  31.   unsigned char *Ubuf;
  32.   unsigned char *Vbuf;
  33.   unsigned char *the_buf;
  34.   unsigned int the_buf_size;
  35.   unsigned short y_w, y_h;
  36.   unsigned short uv_w, uv_h;
  37. } YUVBufs;
  38. typedef struct Indeo3DecodeContext {
  39.     AVCodecContext *avctx;
  40.     int width, height;
  41.     AVFrame frame;
  42.     YUVBufs iv_frame[2];
  43.     YUVBufs *cur_frame;
  44.     YUVBufs *ref_frame;
  45.     unsigned char *ModPred;
  46.     unsigned short *corrector_type;
  47. } Indeo3DecodeContext;
  48. static int corrector_type_0[24] = {
  49.   195, 159, 133, 115, 101,  93,  87,  77,
  50.   195, 159, 133, 115, 101,  93,  87,  77,
  51.   128,  79,  79,  79,  79,  79,  79,  79
  52. };
  53. static int corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 };
  54. static void build_modpred(Indeo3DecodeContext *s) 
  55. {
  56.   int i, j;
  57.   s->ModPred = (unsigned char *) av_malloc (8 * 128);
  58.   for (i=0; i < 128; ++i) {
  59.     s->ModPred[i+0*128] = (i > 126) ? 254 : 2*((i + 1) - ((i + 1) % 2));
  60.     s->ModPred[i+1*128] = (i == 7)  ?  20 : ((i == 119 || i == 120)
  61.  ? 236 : 2*((i + 2) - ((i + 1) % 3)));
  62.     s->ModPred[i+2*128] = (i > 125) ? 248 : 2*((i + 2) - ((i + 2) % 4));
  63.     s->ModPred[i+3*128] =  2*((i + 1) - ((i - 3) % 5));
  64.     s->ModPred[i+4*128] = (i == 8)  ?  20 : 2*((i + 1) - ((i - 3) % 6));
  65.     s->ModPred[i+5*128] =  2*((i + 4) - ((i + 3) % 7));
  66.     s->ModPred[i+6*128] = (i > 123) ? 240 : 2*((i + 4) - ((i + 4) % 8));
  67.     s->ModPred[i+7*128] =  2*((i + 5) - ((i + 4) % 9));
  68.   }
  69.   s->corrector_type = (unsigned short *) av_malloc (24 * 256 * sizeof(unsigned short));
  70.   for (i=0; i < 24; ++i) {
  71.     for (j=0; j < 256; ++j) {
  72.       s->corrector_type[i*256+j] = (j < corrector_type_0[i])
  73. ? 1 : ((j < 248 || (i == 16 && j == 248))
  74.        ? 0 : corrector_type_2[j - 248]);
  75.     }
  76.   }
  77. }
  78. static void iv_Decode_Chunk(Indeo3DecodeContext *s, unsigned char *cur, 
  79.   unsigned char *ref, int width, int height, unsigned char *buf1, 
  80.   long fflags2, unsigned char *hdr,
  81.   unsigned char *buf2, int min_width_160);
  82. #ifndef min
  83. #define min(a,b) ((a) < (b) ? (a) : (b))
  84. #endif
  85. /* ---------------------------------------------------------------------- */
  86. static void iv_alloc_frames(Indeo3DecodeContext *s) 
  87. {
  88.   int luma_width, luma_height, luma_pixels, chroma_width, chroma_height,
  89.       chroma_pixels, i;
  90.   unsigned int bufsize;
  91.   luma_width   = (s->width  + 3) & (~3);
  92.   luma_height  = (s->height + 3) & (~3);
  93.   s->iv_frame[0].y_w = s->iv_frame[0].y_h = 
  94.     s->iv_frame[0].the_buf_size = 0;
  95.   s->iv_frame[1].y_w = s->iv_frame[1].y_h = 
  96.     s->iv_frame[1].the_buf_size = 0;
  97.   s->iv_frame[1].the_buf = NULL;
  98.   chroma_width  = ((luma_width >> 2) + 3) & (~3);
  99.   chroma_height = ((luma_height>> 2) + 3) & (~3);
  100.   luma_pixels = luma_width * luma_height;
  101.   chroma_pixels = chroma_width * chroma_height;
  102.   bufsize = luma_pixels * 2 + luma_width * 3 + 
  103.     (chroma_pixels + chroma_width) * 4;
  104.   if((s->iv_frame[0].the_buf = 
  105.     (s->iv_frame[0].the_buf_size == 0 ? av_malloc(bufsize) : 
  106.       av_realloc(s->iv_frame[0].the_buf, bufsize))) == NULL)
  107.     return;
  108.   s->iv_frame[0].y_w = s->iv_frame[1].y_w = luma_width;
  109.   s->iv_frame[0].y_h = s->iv_frame[1].y_h = luma_height;
  110.   s->iv_frame[0].uv_w = s->iv_frame[1].uv_w = chroma_width;
  111.   s->iv_frame[0].uv_h = s->iv_frame[1].uv_h = chroma_height;
  112.   s->iv_frame[0].the_buf_size = bufsize;
  113.   s->iv_frame[0].Ybuf = s->iv_frame[0].the_buf + luma_width;
  114.   i = luma_pixels + luma_width * 2;
  115.   s->iv_frame[1].Ybuf = s->iv_frame[0].the_buf + i;
  116.   i += (luma_pixels + luma_width);
  117.   s->iv_frame[0].Ubuf = s->iv_frame[0].the_buf + i;
  118.   i += (chroma_pixels + chroma_width);
  119.   s->iv_frame[1].Ubuf = s->iv_frame[0].the_buf + i;
  120.   i += (chroma_pixels + chroma_width);
  121.   s->iv_frame[0].Vbuf = s->iv_frame[0].the_buf + i;
  122.   i += (chroma_pixels + chroma_width);
  123.   s->iv_frame[1].Vbuf = s->iv_frame[0].the_buf + i;
  124.   for(i = 1; i <= luma_width; i++)
  125.     s->iv_frame[0].Ybuf[-i] = s->iv_frame[1].Ybuf[-i] = 
  126.       s->iv_frame[0].Ubuf[-i] = 0x80;
  127.   for(i = 1; i <= chroma_width; i++) {
  128.     s->iv_frame[1].Ubuf[-i] = 0x80;
  129.     s->iv_frame[0].Vbuf[-i] = 0x80;
  130.     s->iv_frame[1].Vbuf[-i] = 0x80;
  131.     s->iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80;
  132.   }
  133. }
  134. /* ---------------------------------------------------------------------- */
  135. static void iv_free_func(Indeo3DecodeContext *s) 
  136. {
  137.   int i;
  138.   for(i = 0 ; i < 2 ; i++) {
  139.     if(s->iv_frame[i].the_buf != NULL) 
  140.       av_free(s->iv_frame[i].the_buf);
  141.     s->iv_frame[i].Ybuf = s->iv_frame[i].Ubuf = 
  142.       s->iv_frame[i].Vbuf = NULL;
  143.     s->iv_frame[i].the_buf = NULL;
  144.     s->iv_frame[i].the_buf_size = 0;
  145.     s->iv_frame[i].y_w = s->iv_frame[i].y_h = 0;
  146.     s->iv_frame[i].uv_w = s->iv_frame[i].uv_h = 0;
  147.   }
  148.   av_free(s->ModPred);
  149.   av_free(s->corrector_type);
  150. }
  151. /* ---------------------------------------------------------------------- */
  152. static unsigned long iv_decode_frame(Indeo3DecodeContext *s, 
  153.                                      unsigned char *buf, int buf_size) 
  154. {
  155.   unsigned int hdr_width, hdr_height,
  156.     chroma_width, chroma_height;
  157.   unsigned long fflags1, fflags2, fflags3, offs1, offs2, offs3, offs;
  158.   unsigned char *hdr_pos, *buf_pos;
  159.   buf_pos = buf;
  160.   buf_pos += 18;
  161.   fflags1 = le2me_16(*(uint16_t *)buf_pos);
  162.   buf_pos += 2;
  163.   fflags3 = le2me_32(*(uint32_t *)buf_pos);
  164.   buf_pos += 4;
  165.   fflags2 = *buf_pos++;
  166.   buf_pos += 3;
  167.   hdr_height = le2me_16(*(uint16_t *)buf_pos);
  168.   buf_pos += 2;
  169.   hdr_width = le2me_16(*(uint16_t *)buf_pos);
  170.   
  171.   if(avcodec_check_dimensions(NULL, hdr_width, hdr_height))
  172.       return -1;
  173.   
  174.   buf_pos += 2;
  175.   chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc;
  176.   chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc;
  177.   offs1 = le2me_32(*(uint32_t *)buf_pos);
  178.   buf_pos += 4;
  179.   offs2 = le2me_32(*(uint32_t *)buf_pos);
  180.   buf_pos += 4;
  181.   offs3 = le2me_32(*(uint32_t *)buf_pos);
  182.   buf_pos += 8;
  183.   hdr_pos = buf_pos;
  184.   if(fflags3 == 0x80) return 4;
  185.   if(fflags1 & 0x200) {
  186.     s->cur_frame = s->iv_frame + 1;
  187.     s->ref_frame = s->iv_frame;
  188.   } else {
  189.     s->cur_frame = s->iv_frame;
  190.     s->ref_frame = s->iv_frame + 1;
  191.   }
  192.   buf_pos = buf + 16 + offs1;
  193.   offs = le2me_32(*(uint32_t *)buf_pos);
  194.   buf_pos += 4;
  195.   iv_Decode_Chunk(s, s->cur_frame->Ybuf, s->ref_frame->Ybuf, hdr_width, 
  196.     hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, 
  197.     min(hdr_width, 160));
  198.   if (!(s->avctx->flags & CODEC_FLAG_GRAY))
  199.   {
  200.   buf_pos = buf + 16 + offs2;
  201.   offs = le2me_32(*(uint32_t *)buf_pos);
  202.   buf_pos += 4;
  203.   iv_Decode_Chunk(s, s->cur_frame->Vbuf, s->ref_frame->Vbuf, chroma_width, 
  204.     chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, 
  205.     min(chroma_width, 40));
  206.   buf_pos = buf + 16 + offs3;
  207.   offs = le2me_32(*(uint32_t *)buf_pos);
  208.   buf_pos += 4;
  209.   iv_Decode_Chunk(s, s->cur_frame->Ubuf, s->ref_frame->Ubuf, chroma_width, 
  210.     chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, 
  211.     min(chroma_width, 40));
  212.   }
  213.   return 8;
  214. }
  215. typedef struct {
  216.   long xpos;
  217.   long ypos;
  218.   long width;
  219.   long height;
  220.   long split_flag;
  221.   long split_direction;
  222.   long usl7;
  223. } ustr_t;
  224. /* ---------------------------------------------------------------------- */
  225. #define LV1_CHECK(buf1,rle_v3,lv1,lp2)  
  226.   if((lv1 & 0x80) != 0) {   
  227.     if(rle_v3 != 0)         
  228.       rle_v3 = 0;           
  229.     else {                  
  230.       rle_v3 = 1;           
  231.       buf1 -= 2;            
  232.     }                       
  233.   }                         
  234.   lp2 = 4;
  235. #define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)  
  236.   if(rle_v3 == 0) {         
  237.     rle_v2 = *buf1;         
  238.     rle_v1 = 1;             
  239.     if(rle_v2 > 32) {       
  240.       rle_v2 -= 32;         
  241.       rle_v1 = 0;           
  242.     }                       
  243.     rle_v3 = 1;             
  244.   }                         
  245.   buf1--;
  246. #define LP2_CHECK(buf1,rle_v3,lp2)  
  247.   if(lp2 == 0 && rle_v3 != 0)     
  248.     rle_v3 = 0;           
  249.   else {                  
  250.     buf1--;               
  251.     rle_v3 = 1;           
  252.   }
  253. #define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) 
  254.   rle_v2--;             
  255.   if(rle_v2 == 0) {     
  256.     rle_v3 = 0;         
  257.     buf1 += 2;          
  258.   }                     
  259.   lp2 = 4;
  260. static void iv_Decode_Chunk(Indeo3DecodeContext *s,
  261.   unsigned char *cur, unsigned char *ref, int width, int height, 
  262.   unsigned char *buf1, long fflags2, unsigned char *hdr,
  263.   unsigned char *buf2, int min_width_160)
  264. {
  265.   unsigned char bit_buf;
  266.   unsigned long bit_pos, lv, lv1, lv2;
  267.   long *width_tbl, width_tbl_arr[10];
  268.   signed char *ref_vectors;
  269.   unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2;
  270.   uint32_t *cur_lp, *ref_lp;
  271.   const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2];
  272.   unsigned short *correction_type_sp[2];
  273.   ustr_t strip_tbl[20], *strip;
  274.   int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width,
  275.     rle_v1, rle_v2, rle_v3;
  276.   unsigned short res;
  277.   bit_buf = 0;
  278.   ref_vectors = NULL;
  279.   width_tbl = width_tbl_arr + 1;
  280.   i = (width < 0 ? width + 3 : width)/4;
  281.   for(j = -1; j < 8; j++) 
  282.     width_tbl[j] = i * j;
  283.   strip = strip_tbl;
  284.   for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160);
  285.   strip->ypos = strip->xpos = 0;
  286.   for(strip->width = min_width_160; width > strip->width; strip->width *= 2);
  287.   strip->height = height;
  288.   strip->split_direction = 0;
  289.   strip->split_flag = 0;
  290.   strip->usl7 = 0;
  291.   bit_pos = 0;
  292.   rle_v1 = rle_v2 = rle_v3 = 0;
  293.   while(strip >= strip_tbl) {
  294.     if(bit_pos <= 0) {
  295.       bit_pos = 8;
  296.       bit_buf = *buf1++;
  297.     }
  298.     bit_pos -= 2;
  299.     cmd = (bit_buf >> bit_pos) & 0x03;
  300.     if(cmd == 0) {
  301.       strip++;
  302.       memcpy(strip, strip-1, sizeof(ustr_t));
  303.       strip->split_flag = 1;
  304.       strip->split_direction = 0;
  305.       strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4);
  306.       continue;
  307.     } else if(cmd == 1) {
  308.       strip++;
  309.       memcpy(strip, strip-1, sizeof(ustr_t));
  310.       strip->split_flag = 1;
  311.       strip->split_direction = 1;
  312.       strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4);
  313.       continue;
  314.     } else if(cmd == 2) {
  315.       if(strip->usl7 == 0) {
  316.         strip->usl7 = 1;
  317.         ref_vectors = NULL;
  318.         continue;
  319.       }
  320.     } else if(cmd == 3) {
  321.       if(strip->usl7 == 0) {
  322.         strip->usl7 = 1;
  323.         ref_vectors = buf2 + (*buf1 * 2);
  324.         buf1++;
  325.         continue;
  326.       }
  327.     }
  328.     cur_frm_pos = cur + width * strip->ypos + strip->xpos;
  329.     if((blks_width = strip->width) < 0) 
  330.       blks_width += 3;
  331.     blks_width >>= 2;
  332.     blks_height = strip->height;
  333.     if(ref_vectors != NULL) {
  334.       ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width +
  335.         ref_vectors[1] + strip->xpos;
  336.     } else 
  337.       ref_frm_pos = cur_frm_pos - width_tbl[4];
  338.     if(cmd == 2) {
  339.       if(bit_pos <= 0) {
  340.         bit_pos = 8;
  341.         bit_buf = *buf1++;
  342.       }
  343.       bit_pos -= 2;
  344.       cmd = (bit_buf >> bit_pos) & 0x03;
  345.       if(cmd == 0 || ref_vectors != NULL) {
  346.         for(lp1 = 0; lp1 < blks_width; lp1++) {
  347.           for(i = 0, j = 0; i < blks_height; i++, j += width_tbl[1])
  348.             ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
  349.           cur_frm_pos += 4;
  350.           ref_frm_pos += 4;
  351.         }
  352.       } else if(cmd != 1) 
  353.         return;
  354.     } else {
  355.       k = *buf1 >> 4;
  356.       j = *buf1 & 0x0f;
  357.       buf1++;
  358.       lv = j + fflags2;
  359.       if((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) {
  360.         cp2 = s->ModPred + ((lv - 8) << 7);
  361.         cp = ref_frm_pos;
  362.         for(i = 0; i < blks_width << 2; i++) { 
  363.             int v = *cp >> 1;
  364.             *(cp++) = cp2[v]; 
  365.         }
  366.       }
  367.       if(k == 1 || k == 4) {
  368.         lv = (hdr[j] & 0xf) + fflags2;
  369.         correction_type_sp[0] = s->corrector_type + (lv << 8);
  370.         correction_lp[0] = correction + (lv << 8);
  371.         lv = (hdr[j] >> 4) + fflags2;
  372.         correction_lp[1] = correction + (lv << 8);
  373.         correction_type_sp[1] = s->corrector_type + (lv << 8);
  374.       } else {
  375.         correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8);
  376.         correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8);
  377.         correction_type_sp[0] = correction_type_sp[1] = s->corrector_type + (lv << 8);
  378.         correction_lp[0] = correction_lp[1] = correction + (lv << 8);
  379.       }
  380.       switch(k) {
  381.         case 1:
  382.         case 0:                    /********** CASE 0 **********/
  383.           for( ; blks_height > 0; blks_height -= 4) {
  384.             for(lp1 = 0; lp1 < blks_width; lp1++) {
  385.               for(lp2 = 0; lp2 < 4; ) {
  386.                 k = *buf1++;
  387.                 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2];
  388.                 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2];
  389.                 switch(correction_type_sp[0][k]) {
  390.                   case 0:
  391.                     *cur_lp = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  392.                     lp2++;
  393.                     break;
  394.                   case 1:
  395.                     res = ((le2me_16(((unsigned short *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
  396.                     ((unsigned short *)cur_lp)[0] = le2me_16(res);
  397.                     res = ((le2me_16(((unsigned short *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
  398.                     ((unsigned short *)cur_lp)[1] = le2me_16(res);
  399.                     buf1++;
  400.                     lp2++;
  401.                     break;
  402.                   case 2:
  403.                     if(lp2 == 0) {
  404.                       for(i = 0, j = 0; i < 2; i++, j += width_tbl[1])
  405.                         cur_lp[j] = ref_lp[j];
  406.                       lp2 += 2;
  407.                     }
  408.                     break;
  409.                   case 3:
  410.                     if(lp2 < 2) {
  411.                       for(i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1])
  412.                         cur_lp[j] = ref_lp[j];
  413.                       lp2 = 3;
  414.                     }
  415.                     break;
  416.                   case 8:
  417.                     if(lp2 == 0) {
  418.                       RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  419.                       if(rle_v1 == 1 || ref_vectors != NULL) {
  420.                         for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  421.                           cur_lp[j] = ref_lp[j];
  422.                       }
  423.                       RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  424.                       break;
  425.                     } else {
  426.                       rle_v1 = 1;
  427.                       rle_v2 = *buf1 - 1;
  428.                     }
  429.                   case 5:
  430.                       LP2_CHECK(buf1,rle_v3,lp2)
  431.                   case 4:
  432.                     for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1])
  433.                       cur_lp[j] = ref_lp[j];
  434.                     lp2 = 4;
  435.                     break;
  436.                   case 7:
  437.                     if(rle_v3 != 0) 
  438.                       rle_v3 = 0;
  439.                     else {
  440.                       buf1--;
  441.                       rle_v3 = 1;
  442.                     }
  443.                   case 6:
  444.                     if(ref_vectors != NULL) {
  445.                       for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  446.                         cur_lp[j] = ref_lp[j];
  447.                     }
  448.                     lp2 = 4;
  449.                     break;
  450.                   case 9:
  451.                     lv1 = *buf1++;
  452.                     lv = (lv1 & 0x7F) << 1;
  453.                     lv += (lv << 8);
  454.                     lv += (lv << 16);
  455.                     for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  456.                       cur_lp[j] = lv;
  457.                     LV1_CHECK(buf1,rle_v3,lv1,lp2)
  458.                     break;
  459.                   default: 
  460.                     return;
  461.                 }
  462.               }
  463.               cur_frm_pos += 4;
  464.               ref_frm_pos += 4;
  465.             }
  466.             cur_frm_pos += ((width - blks_width) * 4);
  467.             ref_frm_pos += ((width - blks_width) * 4);
  468.           }
  469.           break;
  470.         case 4:
  471.         case 3:                    /********** CASE 3 **********/
  472.           if(ref_vectors != NULL) 
  473.             return;
  474.           flag1 = 1;
  475.           for( ; blks_height > 0; blks_height -= 8) {
  476.             for(lp1 = 0; lp1 < blks_width; lp1++) {
  477.               for(lp2 = 0; lp2 < 4; ) {
  478.                 k = *buf1++;
  479.                 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  480.                 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
  481.                 switch(correction_type_sp[lp2 & 0x01][k]) {
  482.                   case 0:
  483.                     cur_lp[width_tbl[1]] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  484.                     if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
  485.                       cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  486.                     else
  487.                       cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  488.                     lp2++;
  489.                     break;
  490.                   case 1:
  491.                     res = ((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
  492.                     ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
  493.                     res = ((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
  494.                     ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
  495.                     if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
  496.                       cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  497.                     else
  498.                       cur_lp[0] = cur_lp[width_tbl[1]];
  499.                     buf1++;
  500.                     lp2++;
  501.                     break;
  502.                   case 2:
  503.                     if(lp2 == 0) {
  504.                       for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  505.                         cur_lp[j] = *ref_lp;
  506.                       lp2 += 2;
  507.                     }
  508.                     break;
  509.                   case 3:
  510.                     if(lp2 < 2) {
  511.                       for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
  512.                         cur_lp[j] = *ref_lp;
  513.                       lp2 = 3;
  514.                     }
  515.                     break;
  516.                   case 6:
  517.                     lp2 = 4;
  518.                     break;
  519.                   case 7:
  520.                     if(rle_v3 != 0) 
  521.                       rle_v3 = 0;
  522.                     else {
  523.                       buf1--;
  524.                       rle_v3 = 1;
  525.                     }
  526.                     lp2 = 4;
  527.                     break;
  528.                   case 8:
  529.                     if(lp2 == 0) {
  530.                       RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  531.                       if(rle_v1 == 1) {
  532.                         for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  533.                           cur_lp[j] = ref_lp[j];
  534.                       }
  535.                       RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  536.                       break;
  537.                     } else {
  538.                       rle_v2 = (*buf1) - 1;
  539.                       rle_v1 = 1;
  540.                     }
  541.                   case 5:
  542.                       LP2_CHECK(buf1,rle_v3,lp2)
  543.                   case 4:
  544.                     for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
  545.                       cur_lp[j] = *ref_lp;
  546.                     lp2 = 4;
  547.                     break;
  548.                   case 9:
  549.                     av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.n");
  550.                     lv1 = *buf1++;
  551.                     lv = (lv1 & 0x7F) << 1;
  552.                     lv += (lv << 8);
  553.                     lv += (lv << 16);
  554.                     for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  555.                       cur_lp[j] = lv;
  556.                     LV1_CHECK(buf1,rle_v3,lv1,lp2)
  557.                     break;
  558.                   default: 
  559.                     return;
  560.                 }
  561.               }
  562.               cur_frm_pos += 4;
  563.             }
  564.             cur_frm_pos += (((width * 2) - blks_width) * 4);
  565.             flag1 = 0;
  566.           }
  567.           break;
  568.         case 10:                    /********** CASE 10 **********/
  569.           if(ref_vectors == NULL) {
  570.             flag1 = 1;
  571.             for( ; blks_height > 0; blks_height -= 8) {
  572.               for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
  573.                 for(lp2 = 0; lp2 < 4; ) {
  574.                   k = *buf1++;
  575.                   cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  576.                   ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
  577.                   lv1 = ref_lp[0];
  578.                   lv2 = ref_lp[1];
  579.                   if(lp2 == 0 && flag1 != 0) {
  580. #ifdef WORDS_BIGENDIAN
  581.                     lv1 = lv1 & 0xFF00FF00;
  582.                     lv1 = (lv1 >> 8) | lv1;
  583.                     lv2 = lv2 & 0xFF00FF00;
  584.                     lv2 = (lv2 >> 8) | lv2;
  585. #else
  586.                     lv1 = lv1 & 0x00FF00FF;
  587.                     lv1 = (lv1 << 8) | lv1;
  588.                     lv2 = lv2 & 0x00FF00FF;
  589.                     lv2 = (lv2 << 8) | lv2;
  590. #endif
  591.                   }
  592.                   switch(correction_type_sp[lp2 & 0x01][k]) {
  593.                     case 0:
  594.                       cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
  595.                       cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1);
  596.                       if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
  597.                         cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  598.                         cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  599.                       } else {
  600.                         cur_lp[0] = cur_lp[width_tbl[1]];
  601.                         cur_lp[1] = cur_lp[width_tbl[1]+1];
  602.                       }
  603.                       lp2++;
  604.                       break;
  605.                     case 1:
  606.                       cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1]) << 1);
  607.                       cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
  608.                       if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
  609.                         cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  610.                         cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  611.                       } else {
  612.                         cur_lp[0] = cur_lp[width_tbl[1]];
  613.                         cur_lp[1] = cur_lp[width_tbl[1]+1];
  614.                       }
  615.                       buf1++;
  616.                       lp2++;
  617.                       break;
  618.                     case 2:
  619.                       if(lp2 == 0) {
  620.                         if(flag1 != 0) {
  621.                           for(i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) {
  622.                             cur_lp[j] = lv1;
  623.                             cur_lp[j+1] = lv2;
  624.                           }
  625.                           cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  626.                           cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  627.                         } else {
  628.                           for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
  629.                             cur_lp[j] = lv1;
  630.                             cur_lp[j+1] = lv2;
  631.                           }
  632.                         }
  633.                         lp2 += 2;
  634.                       }
  635.                       break;
  636.                     case 3:
  637.                       if(lp2 < 2) {
  638.                         if(lp2 == 0 && flag1 != 0) {
  639.                           for(i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) {
  640.                             cur_lp[j] = lv1;
  641.                             cur_lp[j+1] = lv2;
  642.                           }
  643.                           cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  644.                           cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  645.                         } else {
  646.                           for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
  647.                             cur_lp[j] = lv1;
  648.                             cur_lp[j+1] = lv2;
  649.                           }
  650.                         }
  651.                         lp2 = 3;
  652.                       }
  653.                       break;
  654.                     case 8:
  655.                       if(lp2 == 0) {
  656.                         RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  657.                         if(rle_v1 == 1) {
  658.                           if(flag1 != 0) {
  659.                             for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
  660.                               cur_lp[j] = lv1;
  661.                               cur_lp[j+1] = lv2;
  662.                             }
  663.                             cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  664.                             cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  665.                           } else {
  666.                             for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
  667.                               cur_lp[j] = lv1;
  668.                               cur_lp[j+1] = lv2;
  669.                             }
  670.                           }
  671.                         }
  672.                         RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  673.                         break;
  674.                       } else {
  675.                         rle_v1 = 1;
  676.                         rle_v2 = (*buf1) - 1;
  677.                       }
  678.                     case 5:
  679.                         LP2_CHECK(buf1,rle_v3,lp2)
  680.                     case 4:
  681.                       if(lp2 == 0 && flag1 != 0) {
  682.                         for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
  683.                           cur_lp[j] = lv1;
  684.                           cur_lp[j+1] = lv2;
  685.                         }
  686.                         cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  687.                         cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  688.                       } else {
  689.                         for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
  690.                           cur_lp[j] = lv1;
  691.                           cur_lp[j+1] = lv2;
  692.                         }
  693.                       }
  694.                       lp2 = 4;
  695.                       break;
  696.                     case 6:
  697.                       lp2 = 4;
  698.                       break;
  699.                     case 7:
  700.                       if(lp2 == 0) {
  701.                         if(rle_v3 != 0) 
  702.                           rle_v3 = 0;
  703.                         else {
  704.                           buf1--;
  705.                           rle_v3 = 1;
  706.                         }
  707.                         lp2 = 4;
  708.                       }
  709.                       break;
  710.                     case 9:
  711.                       av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.n");
  712.                       lv1 = *buf1;
  713.                       lv = (lv1 & 0x7F) << 1;
  714.                       lv += (lv << 8);
  715.                       lv += (lv << 16);
  716.                       for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  717.                         cur_lp[j] = lv;
  718.                       LV1_CHECK(buf1,rle_v3,lv1,lp2)
  719.                       break;
  720.                     default: 
  721.                       return;
  722.                   }
  723.                 }
  724.                 cur_frm_pos += 8;
  725.               }
  726.               cur_frm_pos += (((width * 2) - blks_width) * 4);
  727.               flag1 = 0;
  728.             }
  729.           } else {
  730.             for( ; blks_height > 0; blks_height -= 8) {
  731.               for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
  732.                 for(lp2 = 0; lp2 < 4; ) {
  733.                   k = *buf1++;
  734.                   cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  735.                   ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
  736.                   switch(correction_type_sp[lp2 & 0x01][k]) {
  737.                     case 0:
  738.                       lv1 = correctionloworder_lp[lp2 & 0x01][k];
  739.                       lv2 = correctionhighorder_lp[lp2 & 0x01][k];
  740.                       cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
  741.                       cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
  742.                       cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
  743.                       cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
  744.                       lp2++;
  745.                       break;
  746.                     case 1:
  747.                       lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];
  748.                       lv2 = correctionloworder_lp[lp2 & 0x01][k];
  749.                       cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
  750.                       cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
  751.                       cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
  752.                       cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
  753.                       lp2++;
  754.                       break;
  755.                     case 2:
  756.                       if(lp2 == 0) {
  757.                         for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
  758.                           cur_lp[j] = ref_lp[j];
  759.                           cur_lp[j+1] = ref_lp[j+1];
  760.                         }
  761.                         lp2 += 2;
  762.                       }
  763.                       break;
  764.                     case 3:
  765.                       if(lp2 < 2) {
  766.                         for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
  767.                           cur_lp[j] = ref_lp[j];
  768.                           cur_lp[j+1] = ref_lp[j+1];
  769.                         }
  770.                         lp2 = 3;
  771.                       }
  772.                       break;
  773.                     case 8:
  774.                       if(lp2 == 0) {
  775.                         RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  776.                         for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
  777.                           ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
  778.                           ((uint32_t *)cur_frm_pos)[j+1] = ((uint32_t *)ref_frm_pos)[j+1];
  779.                         }
  780.                         RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  781.                         break;
  782.                       } else {
  783.                         rle_v1 = 1;
  784.                         rle_v2 = (*buf1) - 1;
  785.                       }
  786.                     case 5:
  787.                     case 7:
  788.                         LP2_CHECK(buf1,rle_v3,lp2)
  789.                     case 6:
  790.                     case 4:
  791.                       for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
  792.                         cur_lp[j] = ref_lp[j];
  793.                         cur_lp[j+1] = ref_lp[j+1];
  794.                       }
  795.                       lp2 = 4;
  796.                       break;
  797.                     case 9:
  798.                       av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.n");
  799.                       lv1 = *buf1;
  800.                       lv = (lv1 & 0x7F) << 1;
  801.                       lv += (lv << 8);
  802.                       lv += (lv << 16);
  803.                       for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  804.                         ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)cur_frm_pos)[j+1] = lv;
  805.                       LV1_CHECK(buf1,rle_v3,lv1,lp2)
  806.                       break;
  807.                     default: 
  808.                       return;
  809.                   }
  810.                 }
  811.                 cur_frm_pos += 8;
  812.                 ref_frm_pos += 8;
  813.               }
  814.               cur_frm_pos += (((width * 2) - blks_width) * 4);
  815.               ref_frm_pos += (((width * 2) - blks_width) * 4);
  816.             }
  817.           }
  818.           break;
  819.         case 11:                    /********** CASE 11 **********/
  820.           if(ref_vectors == NULL) 
  821.             return;
  822.           for( ; blks_height > 0; blks_height -= 8) {
  823.             for(lp1 = 0; lp1 < blks_width; lp1++) {
  824.               for(lp2 = 0; lp2 < 4; ) {
  825.                 k = *buf1++;
  826.                 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  827.                 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
  828.                 switch(correction_type_sp[lp2 & 0x01][k]) {
  829.                   case 0:
  830.                     cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  831.                     cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  832.                     lp2++;
  833.                     break;
  834.                   case 1:
  835.                     lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);
  836.                     lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]);
  837.                     res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + lv1) << 1);
  838.                     ((unsigned short *)cur_lp)[0] = le2me_16(res);
  839.                     res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + lv2) << 1);
  840.                     ((unsigned short *)cur_lp)[1] = le2me_16(res);
  841.                     res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1);
  842.                     ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
  843.                     res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1);
  844.                     ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
  845.                     lp2++;
  846.                     break;
  847.                   case 2:
  848.                     if(lp2 == 0) {
  849.                       for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  850.                         cur_lp[j] = ref_lp[j];
  851.                       lp2 += 2;
  852.                     }
  853.                     break;
  854.                   case 3:
  855.                     if(lp2 < 2) {
  856.                       for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
  857.                         cur_lp[j] = ref_lp[j];
  858.                       lp2 = 3;
  859.                     }
  860.                     break;
  861.                   case 8:
  862.                     if(lp2 == 0) {
  863.                       RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  864.                       for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  865.                         cur_lp[j] = ref_lp[j];
  866.                       RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  867.                       break;
  868.                     } else {
  869.                       rle_v1 = 1;
  870.                       rle_v2 = (*buf1) - 1;
  871.                     }
  872.                   case 5:
  873.                   case 7:
  874.                       LP2_CHECK(buf1,rle_v3,lp2)
  875.                   case 4:
  876.                   case 6:
  877.                     for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
  878.                       cur_lp[j] = ref_lp[j];
  879.                     lp2 = 4;
  880.                     break;
  881.                 case 9:
  882.                   av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.n");
  883.                   lv1 = *buf1++;
  884.                   lv = (lv1 & 0x7F) << 1;
  885.                   lv += (lv << 8);
  886.                   lv += (lv << 16);
  887.                   for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  888.                     cur_lp[j] = lv;
  889.                   LV1_CHECK(buf1,rle_v3,lv1,lp2)
  890.                   break;
  891.                   default: 
  892.                     return;
  893.                 }
  894.               }
  895.               cur_frm_pos += 4;
  896.               ref_frm_pos += 4;
  897.             }
  898.             cur_frm_pos += (((width * 2) - blks_width) * 4);
  899.             ref_frm_pos += (((width * 2) - blks_width) * 4);
  900.           }
  901.           break;
  902.         default: 
  903.           return;
  904.       }
  905.     }
  906.     if(strip < strip_tbl) 
  907.       return;
  908.     for( ; strip >= strip_tbl; strip--) {
  909.       if(strip->split_flag != 0) {
  910.         strip->split_flag = 0;
  911.         strip->usl7 = (strip-1)->usl7;
  912.         if(strip->split_direction) {
  913.           strip->xpos += strip->width;
  914.           strip->width = (strip-1)->width - strip->width;
  915.           if(region_160_width <= strip->xpos && width < strip->width + strip->xpos)
  916.             strip->width = width - strip->xpos;
  917.         } else {
  918.           strip->ypos += strip->height;
  919.           strip->height = (strip-1)->height - strip->height;
  920.         }
  921.         break;
  922.       }
  923.     }
  924.   }
  925. }
  926. static int indeo3_decode_init(AVCodecContext *avctx)
  927. {
  928.     Indeo3DecodeContext *s = avctx->priv_data;
  929.     s->avctx = avctx;
  930.     s->width = avctx->width;
  931.     s->height = avctx->height;
  932.     avctx->pix_fmt = PIX_FMT_YUV410P;
  933.     avctx->has_b_frames = 0;
  934.     build_modpred(s);
  935.     iv_alloc_frames(s);
  936.     return 0;
  937. }
  938. static int indeo3_decode_frame(AVCodecContext *avctx,
  939.                                void *data, int *data_size,
  940.                                unsigned char *buf, int buf_size)
  941. {
  942.     Indeo3DecodeContext *s=avctx->priv_data;
  943.     unsigned char *src, *dest;
  944.     int y;
  945.     iv_decode_frame(s, buf, buf_size);
  946.     if(s->frame.data[0])
  947.         avctx->release_buffer(avctx, &s->frame);
  948.     s->frame.reference = 0;
  949.     if(avctx->get_buffer(avctx, &s->frame) < 0) {
  950.         av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failedn");
  951.         return -1;
  952.     }
  953.     src = s->cur_frame->Ybuf;
  954.     dest = s->frame.data[0];
  955.     for (y = 0; y < s->height; y++) {
  956.       memcpy(dest, src, s->cur_frame->y_w);
  957.       src += s->cur_frame->y_w;
  958.       dest += s->frame.linesize[0];
  959.     }
  960.     if (!(s->avctx->flags & CODEC_FLAG_GRAY))
  961.     {
  962.     src = s->cur_frame->Ubuf;
  963.     dest = s->frame.data[1];
  964.     for (y = 0; y < s->height / 4; y++) {
  965.       memcpy(dest, src, s->cur_frame->uv_w);
  966.       src += s->cur_frame->uv_w;
  967.       dest += s->frame.linesize[1];
  968.     }
  969.     src = s->cur_frame->Vbuf;
  970.     dest = s->frame.data[2];
  971.     for (y = 0; y < s->height / 4; y++) {
  972.       memcpy(dest, src, s->cur_frame->uv_w);
  973.       src += s->cur_frame->uv_w;
  974.       dest += s->frame.linesize[2];
  975.     }
  976.     }
  977.     *data_size=sizeof(AVFrame);
  978.     *(AVFrame*)data= s->frame;
  979.     return buf_size;
  980. }
  981. static int indeo3_decode_end(AVCodecContext *avctx)
  982. {
  983.     Indeo3DecodeContext *s = avctx->priv_data;
  984.     iv_free_func(s);
  985.     return 0;
  986. }
  987. AVCodec indeo3_decoder = {
  988.     "indeo3",
  989.     CODEC_TYPE_VIDEO,
  990.     CODEC_ID_INDEO3,
  991.     sizeof(Indeo3DecodeContext),
  992.     indeo3_decode_init,
  993.     NULL,
  994.     indeo3_decode_end,
  995.     indeo3_decode_frame,
  996.     0,
  997.     NULL
  998. };