⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indeo3.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 3 页
字号:
                            }                          }                        }                        RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)                        break;                      } else {                        rle_v1 = 1;                        rle_v2 = (*buf1) - 1;                      }                    case 5:                        LP2_CHECK(buf1,rle_v3,lp2)                    case 4:                      if(lp2 == 0 && flag1 != 0) {                        for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {                          cur_lp[j] = lv1;                          cur_lp[j+1] = lv2;                        }                        cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;                        cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;                      } else {                        for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {                          cur_lp[j] = lv1;                          cur_lp[j+1] = lv2;                        }                      }                      lp2 = 4;                      break;                    case 6:                      lp2 = 4;                      break;                    case 7:                      if(lp2 == 0) {                        if(rle_v3 != 0)                           rle_v3 = 0;                        else {                          buf1--;                          rle_v3 = 1;                        }                        lp2 = 4;                      }                      break;                    case 9:                      av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");                      lv1 = *buf1;                      lv = (lv1 & 0x7F) << 1;                      lv += (lv << 8);                      lv += (lv << 16);                      for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])                        cur_lp[j] = lv;                      LV1_CHECK(buf1,rle_v3,lv1,lp2)                      break;                    default:                       return;                  }                }                cur_frm_pos += 8;              }              cur_frm_pos += (((width * 2) - blks_width) * 4);              flag1 = 0;            }          } else {            for( ; blks_height > 0; blks_height -= 8) {              for(lp1 = 0; lp1 < blks_width; lp1 += 2) {                for(lp2 = 0; lp2 < 4; ) {                  k = *buf1++;                  cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];                  ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];                  switch(correction_type_sp[lp2 & 0x01][k]) {                    case 0:                      lv1 = correctionloworder_lp[lp2 & 0x01][k];                      lv2 = correctionhighorder_lp[lp2 & 0x01][k];                      cur_lp[0] = ((ref_lp[0] >> 1) + lv1) << 1;                      cur_lp[1] = ((ref_lp[1] >> 1) + lv2) << 1;                      cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + lv1) << 1;                      cur_lp[width_tbl[1]+1] = ((ref_lp[width_tbl[1]+1] >> 1) + lv2) << 1;                      lp2++;                      break;                    case 1:                      lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];                      lv2 = correctionloworder_lp[lp2 & 0x01][k];                      cur_lp[0] = ((ref_lp[0] >> 1) + lv1) << 1;                      cur_lp[1] = ((ref_lp[1] >> 1) + lv2) << 1;                      cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + lv1) << 1;                      cur_lp[width_tbl[1]+1] = ((ref_lp[width_tbl[1]+1] >> 1) + lv2) << 1;                      lp2++;                      break;                    case 2:                      if(lp2 == 0) {                        for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {                          cur_lp[j] = ref_lp[j];                          cur_lp[j+1] = ref_lp[j+1];                        }                        lp2 += 2;                      }                      break;                    case 3:                      if(lp2 < 2) {                        for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {                          cur_lp[j] = ref_lp[j];                          cur_lp[j+1] = ref_lp[j+1];                        }                        lp2 = 3;                      }                      break;                    case 8:                      if(lp2 == 0) {                        RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)                        for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {                          ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];                          ((uint32_t *)cur_frm_pos)[j+1] = ((uint32_t *)ref_frm_pos)[j+1];                        }                        RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)                        break;                      } else {                        rle_v1 = 1;                        rle_v2 = (*buf1) - 1;                      }                    case 5:                    case 7:                        LP2_CHECK(buf1,rle_v3,lp2)                    case 6:                    case 4:                      for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {                        cur_lp[j] = ref_lp[j];                        cur_lp[j+1] = ref_lp[j+1];                      }                      lp2 = 4;                      break;                    case 9:                      av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");                      lv1 = *buf1;                      lv = (lv1 & 0x7F) << 1;                      lv += (lv << 8);                      lv += (lv << 16);                      for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])                        ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)cur_frm_pos)[j+1] = lv;                      LV1_CHECK(buf1,rle_v3,lv1,lp2)                      break;                    default:                       return;                  }                }                cur_frm_pos += 8;                ref_frm_pos += 8;              }              cur_frm_pos += (((width * 2) - blks_width) * 4);              ref_frm_pos += (((width * 2) - blks_width) * 4);            }          }          break;        case 11:                    /********** CASE 11 **********/          if(ref_vectors == NULL)             return;          for( ; blks_height > 0; blks_height -= 8) {            for(lp1 = 0; lp1 < blks_width; lp1++) {              for(lp2 = 0; lp2 < 4; ) {                k = *buf1++;                cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];                ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];                switch(correction_type_sp[lp2 & 0x01][k]) {                  case 0:                    cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1;                    cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + correction_lp[lp2 & 0x01][k]) << 1;                    lp2++;                    break;                  case 1:                    lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);                    lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]);                    ((unsigned short *)cur_lp)[0] = ((((unsigned short *)ref_lp)[0] >> 1) + lv1) << 1;                    ((unsigned short *)cur_lp)[1] = ((((unsigned short *)ref_lp)[1] >> 1) + lv2) << 1;                    ((unsigned short *)cur_lp)[width_tbl[2]] = ((((unsigned short *)ref_lp)[width_tbl[2]] >> 1) + lv1) << 1;                    ((unsigned short *)cur_lp)[width_tbl[2]+1] = ((((unsigned short *)ref_lp)[width_tbl[2]+1] >> 1) + lv2) << 1;                    lp2++;                    break;                  case 2:                    if(lp2 == 0) {                      for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])                        cur_lp[j] = ref_lp[j];                      lp2 += 2;                    }                    break;                  case 3:                    if(lp2 < 2) {                      for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])                        cur_lp[j] = ref_lp[j];                      lp2 = 3;                    }                    break;                  case 8:                    if(lp2 == 0) {                      RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)                      for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])                        cur_lp[j] = ref_lp[j];                      RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)                      break;                    } else {                      rle_v1 = 1;                      rle_v2 = (*buf1) - 1;                    }                  case 5:                  case 7:                      LP2_CHECK(buf1,rle_v3,lp2)                  case 4:                  case 6:                    for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])                      cur_lp[j] = ref_lp[j];                    lp2 = 4;                    break;                case 9:                  av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");                  lv1 = *buf1++;                  lv = (lv1 & 0x7F) << 1;                  lv += (lv << 8);                  lv += (lv << 16);                  for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])                    cur_lp[j] = lv;                  LV1_CHECK(buf1,rle_v3,lv1,lp2)                  break;                  default:                     return;                }              }              cur_frm_pos += 4;              ref_frm_pos += 4;            }            cur_frm_pos += (((width * 2) - blks_width) * 4);            ref_frm_pos += (((width * 2) - blks_width) * 4);          }          break;        default:           return;      }    }    if(strip < strip_tbl)       return;    for( ; strip >= strip_tbl; strip--) {      if(strip->split_flag != 0) {        strip->split_flag = 0;        strip->usl7 = (strip-1)->usl7;        if(strip->split_direction) {          strip->xpos += strip->width;          strip->width = (strip-1)->width - strip->width;          if(region_160_width <= strip->xpos && width < strip->width + strip->xpos)            strip->width = width - strip->xpos;        } else {          strip->ypos += strip->height;          strip->height = (strip-1)->height - strip->height;        }        break;      }    }  }}static int indeo3_decode_init(AVCodecContext *avctx){    Indeo3DecodeContext *s = avctx->priv_data;    s->avctx = avctx;    s->width = avctx->width;    s->height = avctx->height;    avctx->pix_fmt = PIX_FMT_YUV410P;    avctx->has_b_frames = 0;    build_modpred(s);    iv_alloc_frames(s);    return 0;}static int indeo3_decode_frame(AVCodecContext *avctx,                               void *data, int *data_size,                               unsigned char *buf, int buf_size){    Indeo3DecodeContext *s=avctx->priv_data;    unsigned char *src, *dest;    int y;    iv_decode_frame(s, buf, buf_size);    if(s->frame.data[0])        avctx->release_buffer(avctx, &s->frame);    s->frame.reference = 0;    if(avctx->get_buffer(avctx, &s->frame) < 0) {        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");        return -1;    }    src = s->cur_frame->Ybuf;    dest = s->frame.data[0];    for (y = 0; y < s->height; y++) {      memcpy(dest, src, s->cur_frame->y_w);      src += s->cur_frame->y_w;      dest += s->frame.linesize[0];    }    src = s->cur_frame->Ubuf;    dest = s->frame.data[1];    for (y = 0; y < s->height / 4; y++) {      memcpy(dest, src, s->cur_frame->uv_w);      src += s->cur_frame->uv_w;      dest += s->frame.linesize[1];    }    src = s->cur_frame->Vbuf;    dest = s->frame.data[2];    for (y = 0; y < s->height / 4; y++) {      memcpy(dest, src, s->cur_frame->uv_w);      src += s->cur_frame->uv_w;      dest += s->frame.linesize[2];    }    *data_size=sizeof(AVFrame);    *(AVFrame*)data= s->frame;    return buf_size;}static int indeo3_decode_end(AVCodecContext *avctx){    Indeo3DecodeContext *s = avctx->priv_data;    iv_free_func(s);    return 0;}AVCodec indeo3_decoder = {    "indeo3",    CODEC_TYPE_VIDEO,    CODEC_ID_INDEO3,    sizeof(Indeo3DecodeContext),    indeo3_decode_init,    NULL,    indeo3_decode_end,    indeo3_decode_frame,    0,    NULL};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -