亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cabac.c

?? jm_frext22.ZIP的壓縮文件,主要用于嵌入式系統(tǒng)圖象的編解碼的開發(fā).
?? C
?? 第 1 頁 / 共 4 頁
字號:

/*!
 *************************************************************************************
 * \file cabac.c
 *
 * \brief
 *    CABAC entropy coding routines
 *
 * \author
 *    Main contributors (see contributors.h for copyright, address and affiliation details)
 *    - Detlev Marpe                    <marpe@hhi.de>
 **************************************************************************************
 */

#include <stdlib.h>
#include <string.h>

#include "global.h"
#include "cabac.h"
#include "memalloc.h"
#include "elements.h"
#include "image.h"
#include "biaridecod.h"
#include "mb_access.h"

int symbolCount = 0;
int last_dquant = 0;


/***********************************************************************
 * L O C A L L Y   D E F I N E D   F U N C T I O N   P R O T O T Y P E S
 ***********************************************************************
 */
unsigned int unary_bin_decode(DecodingEnvironmentPtr dep_dp,
                              BiContextTypePtr ctx,
                              int ctx_offset);


unsigned int unary_bin_max_decode(DecodingEnvironmentPtr dep_dp,
                                  BiContextTypePtr ctx,
                                  int ctx_offset,
                                  unsigned int max_symbol);

unsigned int unary_exp_golomb_level_decode( DecodingEnvironmentPtr dep_dp,
                                            BiContextTypePtr ctx);

unsigned int unary_exp_golomb_mv_decode(DecodingEnvironmentPtr dep_dp,
                                        BiContextTypePtr ctx,
                                        unsigned int max_bin);


void CheckAvailabilityOfNeighborsCABAC()
{
  Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  PixelPos up, left;

  getNeighbour(img->current_mb_nr, -1,  0, 1, &left);
  getNeighbour(img->current_mb_nr,  0, -1, 1, &up);
  
  if (up.available)
    currMB->mb_available_up = &img->mb_data[up.mb_addr];
  else
    currMB->mb_available_up = NULL;
  
  if (left.available)
    currMB->mb_available_left = &img->mb_data[left.mb_addr];
  else
    currMB->mb_available_left = NULL;
}

void cabac_new_slice()
{
  last_dquant=0;
}

/*!
 ************************************************************************
 * \brief
 *    Allocation of contexts models for the motion info
 *    used for arithmetic decoding
 *
 ************************************************************************
 */
MotionInfoContexts* create_contexts_MotionInfo(void)
{
  MotionInfoContexts *deco_ctx;

  deco_ctx = (MotionInfoContexts*) calloc(1, sizeof(MotionInfoContexts) );
  if( deco_ctx == NULL )
    no_mem_exit("create_contexts_MotionInfo: deco_ctx");

  return deco_ctx;
}


/*!
 ************************************************************************
 * \brief
 *    Allocates of contexts models for the texture info
 *    used for arithmetic decoding
 ************************************************************************
 */
TextureInfoContexts* create_contexts_TextureInfo(void)
{
  TextureInfoContexts *deco_ctx;

  deco_ctx = (TextureInfoContexts*) calloc(1, sizeof(TextureInfoContexts) );
  if( deco_ctx == NULL )
    no_mem_exit("create_contexts_TextureInfo: deco_ctx");

  return deco_ctx;
}




/*!
 ************************************************************************
 * \brief
 *    Frees the memory of the contexts models
 *    used for arithmetic decoding of the motion info.
 ************************************************************************
 */
void delete_contexts_MotionInfo(MotionInfoContexts *deco_ctx)
{
  if( deco_ctx == NULL )
    return;

  free( deco_ctx );

  return;
}


/*!
 ************************************************************************
 * \brief
 *    Frees the memory of the contexts models
 *    used for arithmetic decoding of the texture info.
 ************************************************************************
 */
void delete_contexts_TextureInfo(TextureInfoContexts *deco_ctx)
{
  if( deco_ctx == NULL )
    return;

  free( deco_ctx );

  return;
}

void readFieldModeInfo_CABAC( SyntaxElement *se,
                              struct inp_par *inp,
                              struct img_par *img,
                              DecodingEnvironmentPtr dep_dp)
{
  int a,b,act_ctx;
  MotionInfoContexts *ctx         = (img->currentSlice)->mot_ctx;
  Macroblock         *currMB      = &img->mb_data[img->current_mb_nr];
  
  if (currMB->mbAvailA)
    a = img->mb_data[currMB->mbAddrA].mb_field;
  else
    a = 0;
  if (currMB->mbAvailB)
    b = img->mb_data[currMB->mbAddrB].mb_field;
  else
    b=0;

  act_ctx = a + b;

  se->value1 = biari_decode_symbol (dep_dp, &ctx->mb_aff_contexts[act_ctx]);

#if TRACE
  fprintf(p_trace, "@%d %s\t\t%d\n",symbolCount++, se->tracestring, se->value1);
  fflush(p_trace);
#endif
}


int check_next_mb_and_get_field_mode_CABAC( SyntaxElement *se,
                                            struct img_par *img,
                                            struct inp_par *inp,
                                            DataPartition  *act_dp)
{
  BiContextTypePtr          mb_type_ctx_copy[4];
  BiContextTypePtr          mb_aff_ctx_copy;
  DecodingEnvironmentPtr    dep_dp_copy;

  int length;
  DecodingEnvironmentPtr    dep_dp = &(act_dp->de_cabac);

  int bframe = (img->type==B_SLICE);
  int skip   = 0;
  int field  = 0;
  int i;

  Macroblock *currMB;
  
  //get next MB
  img->current_mb_nr++;

  currMB = &img->mb_data[img->current_mb_nr];
  currMB->slice_nr = img->current_slice_nr;
  currMB->mb_field = img->mb_data[img->current_mb_nr-1].mb_field;

  CheckAvailabilityOfNeighbors();
  CheckAvailabilityOfNeighborsCABAC();
    
  //create
  dep_dp_copy = (DecodingEnvironmentPtr) calloc(1, sizeof(DecodingEnvironment) );
  for (i=0;i<4;i++)
    mb_type_ctx_copy[i] = (BiContextTypePtr) calloc(NUM_MB_TYPE_CTX, sizeof(BiContextType) );
  mb_aff_ctx_copy = (BiContextTypePtr) calloc(NUM_MB_AFF_CTX, sizeof(BiContextType) );
  
  //copy
  memcpy(dep_dp_copy,dep_dp,sizeof(DecodingEnvironment));
  length = *(dep_dp_copy->Dcodestrm_len) = *(dep_dp->Dcodestrm_len);
  for (i=0;i<4;i++)
    memcpy(mb_type_ctx_copy[i], img->currentSlice->mot_ctx->mb_type_contexts[i],NUM_MB_TYPE_CTX*sizeof(BiContextType) );
  memcpy(mb_aff_ctx_copy, img->currentSlice->mot_ctx->mb_aff_contexts,NUM_MB_AFF_CTX*sizeof(BiContextType) );


  //check_next_mb
#if TRACE
  strncpy(se->tracestring, "mb_skip_flag (of following bottom MB)", TRACESTRING_SIZE);
#endif
  last_dquant = 0;
  readMB_skip_flagInfo_CABAC(se,inp,img,dep_dp);

  skip = (bframe)? (se->value1==0 && se->value2==0) : (se->value1==0);
  if (!skip)
  {
#if TRACE
    strncpy(se->tracestring, "mb_field_decoding_flag (of following bottom MB)", TRACESTRING_SIZE);
#endif
    readFieldModeInfo_CABAC( se,inp,img,dep_dp);
    field = se->value1;
    img->mb_data[img->current_mb_nr-1].mb_field = field;
  }

  //reset
  img->current_mb_nr--;

  memcpy(dep_dp,dep_dp_copy,sizeof(DecodingEnvironment));
  *(dep_dp->Dcodestrm_len) = length;
  for (i=0;i<4;i++)
    memcpy(img->currentSlice->mot_ctx->mb_type_contexts[i],mb_type_ctx_copy[i], NUM_MB_TYPE_CTX*sizeof(BiContextType) );
  memcpy( img->currentSlice->mot_ctx->mb_aff_contexts,mb_aff_ctx_copy,NUM_MB_AFF_CTX*sizeof(BiContextType) );

  CheckAvailabilityOfNeighborsCABAC();
  
  //delete
  free(dep_dp_copy);
  for (i=0;i<4;i++)
    free(mb_type_ctx_copy[i]);
  free(mb_aff_ctx_copy);
  
  return skip;
}




/*!
 ************************************************************************
 * \brief
 *    This function is used to arithmetically decode the motion
 *    vector data of a B-frame MB.
 ************************************************************************
 */
void readMVD_CABAC( SyntaxElement *se,
                    struct inp_par *inp,
                    struct img_par *img,
                    DecodingEnvironmentPtr dep_dp)
{
  int i = img->subblock_x;
  int j = img->subblock_y;
  int a, b;
  int act_ctx;
  int act_sym;
  int mv_local_err;
  int mv_sign;
  int list_idx = se->value2 & 0x01;
  int k = (se->value2>>1); // MVD component

  PixelPos block_a, block_b;

  MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  Macroblock *currMB = &img->mb_data[img->current_mb_nr];

  getLuma4x4Neighbour(img->current_mb_nr, i, j, -1,  0, &block_a);
  getLuma4x4Neighbour(img->current_mb_nr, i, j,  0, -1, &block_b);

  if (block_b.available)
  {
    b = absm(img->mb_data[block_b.mb_addr].mvd[list_idx][block_b.y][block_b.x][k]);
    if (img->MbaffFrameFlag && (k==1)) 
    {
      if ((currMB->mb_field==0) && (img->mb_data[block_b.mb_addr].mb_field==1))
        b *= 2;
      else if ((currMB->mb_field==1) && (img->mb_data[block_b.mb_addr].mb_field==0))
        b /= 2;
    }
  }
  else
    b=0;
          
  if (block_a.available)
  {
    a = absm(img->mb_data[block_a.mb_addr].mvd[list_idx][block_a.y][block_a.x][k]);
    if (img->MbaffFrameFlag && (k==1)) 
    {
      if ((currMB->mb_field==0) && (img->mb_data[block_a.mb_addr].mb_field==1))
        a *= 2;
      else if ((currMB->mb_field==1) && (img->mb_data[block_a.mb_addr].mb_field==0))
        a /= 2;
    }
  }
  else
    a = 0;

  if ((mv_local_err=a+b)<3)
    act_ctx = 5*k;
  else
  {
    if (mv_local_err>32)
      act_ctx=5*k+3;
    else
      act_ctx=5*k+2;
  }
  se->context = act_ctx;

  act_sym = biari_decode_symbol(dep_dp,&ctx->mv_res_contexts[0][act_ctx] );

  if (act_sym != 0)
  {
    act_ctx=5*k;
    act_sym = unary_exp_golomb_mv_decode(dep_dp,ctx->mv_res_contexts[1]+act_ctx,3);
    act_sym++;
    mv_sign = biari_decode_symbol_eq_prob(dep_dp);

    if(mv_sign)
      act_sym = -act_sym;
  }
  se->value1 = act_sym;

#if TRACE
  fprintf(p_trace, "@%d %s\t\t\t%d \n",symbolCount++, se->tracestring, se->value1);
  fflush(p_trace);
#endif
}


/*!
 ************************************************************************
 * \brief
 *    This function is used to arithmetically decode the 8x8 block type.
 ************************************************************************
 */
void readB8_typeInfo_CABAC (SyntaxElement *se,
                            struct inp_par *inp,
                            struct img_par *img,
                            DecodingEnvironmentPtr dep_dp)
{
  int act_sym = 0;
  int bframe  = (img->type==B_SLICE);

  MotionInfoContexts *ctx = (img->currentSlice)->mot_ctx;


  if (!bframe)
  {
    if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[0][1]))
    {
      act_sym = 0;
    }
    else
    {
      if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[0][3]))
      {
        if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[0][4])) act_sym = 2;
        else                                                            act_sym = 3;
      }
      else
      {
        act_sym = 1;
      }
    }
  }
  else
  {
    if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][0]))
    {
      if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][1]))
      {
        if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][2]))
        {
          if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3]))
          {
            act_sym = 10;
            if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym++;
          }
          else
          {
            act_sym = 6;
            if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym+=2;
            if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym++;
          }
        }
        else
        {
          act_sym=2;
          if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym+=2;
          if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym+=1;
        }
      }
      else
      {
        if (biari_decode_symbol (dep_dp, &ctx->b8_type_contexts[1][3])) act_sym = 1;
        else                                                            act_sym = 0;
      }
      act_sym++;
    }
    else
    {
      act_sym= 0;
    }
  }
  se->value1 = act_sym;

#if TRACE
  fprintf(p_trace, "@%d %s\t\t%d\n",symbolCount++, se->tracestring, se->value1);
  fflush(p_trace);
#endif
}

/*!
 ************************************************************************
 * \brief
 *    This function is used to arithmetically decode the macroblock
 *    type info of a given MB.
 ************************************************************************
 */
void readMB_skip_flagInfo_CABAC( SyntaxElement *se,
                                 struct inp_par *inp,
                                 struct img_par *img,
                                 DecodingEnvironmentPtr dep_dp)
{
  int a, b;
  int act_ctx;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
福利视频网站一区二区三区| 日韩一级片在线播放| av不卡一区二区三区| 国产iv一区二区三区| 国产乱码精品一品二品| 国产乱码精品1区2区3区| 国产河南妇女毛片精品久久久 | 福利电影一区二区三区| 国精产品一区一区三区mba桃花| 激情综合色播五月| 精品一区二区三区久久久| 视频一区二区中文字幕| 日韩在线a电影| 欧美日韩电影在线播放| 欧美色精品天天在线观看视频| 色综合 综合色| 欧美三区在线观看| 欧美一区二区三区四区久久| 日韩精品一区国产麻豆| 久久精品视频免费| 国产精品久久99| 一区二区在线观看av| 亚洲国产精品尤物yw在线观看| 日本欧美在线看| 国产不卡高清在线观看视频| 99久久精品费精品国产一区二区 | 国产亚洲va综合人人澡精品| 亚洲国产高清不卡| 亚洲男同1069视频| 免费在线观看视频一区| 国产乱子伦视频一区二区三区 | 91麻豆视频网站| 欧美三级视频在线| 精品久久久久久亚洲综合网| 国产精品久久久久久久午夜片| 亚洲精品免费视频| 麻豆精品国产91久久久久久 | 久久久久久久av麻豆果冻| 国产精品夫妻自拍| 婷婷久久综合九色综合绿巨人| 久久精品99久久久| 99热精品国产| 精品99一区二区| 亚洲人成电影网站色mp4| 奇米影视7777精品一区二区| 国产成人精品亚洲777人妖| 欧美性色黄大片手机版| 国产午夜精品一区二区三区四区| 亚洲乱码日产精品bd| 狠狠色丁香婷婷综合| 在线观看日韩国产| 久久在线观看免费| 亚洲成av人片在线| av亚洲精华国产精华精| 日韩一卡二卡三卡四卡| 亚洲另类中文字| 国产毛片精品一区| 欧美军同video69gay| 国产精品毛片无遮挡高清| 欧美亚一区二区| 久久综合丝袜日本网| 亚洲综合在线免费观看| 国产精品综合网| 欧美一区二区三区在| 亚洲黄色在线视频| 成人精品免费视频| 欧美成va人片在线观看| 午夜精彩视频在线观看不卡| 粉嫩av一区二区三区| 精品免费日韩av| 调教+趴+乳夹+国产+精品| 97久久超碰精品国产| 久久精品一二三| 精品中文字幕一区二区| 欧美日韩在线直播| 一区二区三区不卡视频| 波多野结衣中文一区| 久久在线观看免费| 久久99久久精品| 欧美一卡二卡三卡四卡| 亚洲成av人片一区二区三区| 91蜜桃视频在线| 国产精品国产自产拍在线| 国产成人精品亚洲日本在线桃色| 欧美成人精品高清在线播放| 午夜伦理一区二区| 欧美日韩不卡视频| 亚洲v精品v日韩v欧美v专区 | 中文字幕av一区二区三区 | 日韩一级高清毛片| 亚洲成人久久影院| 国产精品白丝在线| av亚洲产国偷v产偷v自拍| 久久综合久久99| 免费观看一级特黄欧美大片| 欧美高清视频一二三区| 亚洲一二三四久久| 欧美色倩网站大全免费| 亚洲成av人影院在线观看网| 欧美日韩一级视频| 五月婷婷激情综合网| 欧美美女网站色| 午夜成人在线视频| 欧美高清hd18日本| 琪琪一区二区三区| 精品国产免费一区二区三区四区| 天堂久久久久va久久久久| 欧美日韩在线免费视频| 偷拍日韩校园综合在线| 日韩天堂在线观看| 韩国视频一区二区| 久久精品欧美日韩| eeuss国产一区二区三区| 国产精品久久久久久久久晋中| 99久久精品国产麻豆演员表| 亚洲另类在线视频| 欧美三级乱人伦电影| 无吗不卡中文字幕| 欧美成人r级一区二区三区| 国产乱子轮精品视频| 国产精品卡一卡二卡三| 色吊一区二区三区| 午夜精品免费在线| 久久综合色天天久久综合图片| 成人免费高清在线观看| 一区二区三区在线高清| 在线播放国产精品二区一二区四区 | 久久色.com| 99国产精品国产精品久久| 亚洲一区二区视频在线观看| 日韩成人免费看| 久久综合久久99| 色综合一区二区| 日韩av二区在线播放| 国产网站一区二区三区| 99精品热视频| 日韩精品1区2区3区| 久久亚洲私人国产精品va媚药| 92精品国产成人观看免费| 亚洲123区在线观看| 久久综合久久99| 91久久精品国产91性色tv| 久久精工是国产品牌吗| 中文字幕一区二区三区av| 欧美高清激情brazzers| 丰满放荡岳乱妇91ww| 亚洲va天堂va国产va久| 国产情人综合久久777777| 色av成人天堂桃色av| 精品一区免费av| 一级中文字幕一区二区| 久久综合久久综合亚洲| 欧美亚洲自拍偷拍| 国产成+人+日韩+欧美+亚洲| 亚洲午夜羞羞片| 中文av字幕一区| 欧美一二三区精品| 一本色道久久综合精品竹菊| 狠狠色丁香九九婷婷综合五月| 亚洲精品日日夜夜| 久久综合久久综合久久| 欧美日韩激情在线| 成人一道本在线| 久久精品久久综合| 亚洲成av人片一区二区三区| 国产精品天美传媒| 精品欧美乱码久久久久久1区2区| 欧美中文字幕亚洲一区二区va在线 | 麻豆freexxxx性91精品| 亚洲激情网站免费观看| 国产女主播一区| 日韩一卡二卡三卡四卡| 欧美色图12p| 97精品久久久午夜一区二区三区| 久久精品99久久久| 日韩中文字幕亚洲一区二区va在线 | 国产精品青草久久| 日韩精品一区二区三区四区| 欧美日本乱大交xxxxx| 91亚洲精华国产精华精华液| 激情综合色综合久久综合| 青青草视频一区| 无吗不卡中文字幕| 亚洲国产sm捆绑调教视频| 亚洲色图视频网| 国产精品美女www爽爽爽| 久久精品亚洲一区二区三区浴池 | 国产精品电影一区二区三区| 国产丝袜欧美中文另类| 69堂精品视频| 欧美日韩一区二区在线视频| 一本一道久久a久久精品| 成人aa视频在线观看| 国产成人综合在线播放| 精品一区精品二区高清| 777色狠狠一区二区三区| 欧美综合视频在线观看| 97精品久久久久中文字幕| caoporn国产一区二区| 成人免费毛片aaaaa**|